001    /*
002     * Copyright 2001-2005 The Apache Software Foundation
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package examples;
017    
018    import java.io.IOException;
019    import java.io.PrintWriter;
020    import java.net.InetAddress;
021    import org.apache.commons.net.ProtocolCommandListener;
022    import org.apache.commons.net.ftp.FTPClient;
023    import org.apache.commons.net.ftp.FTPReply;
024    
025    /***
026     * This is an example program demonstrating how to use the FTPClient class.
027     * This program arranges a server to server file transfer that transfers
028     * a file from host1 to host2.  Keep in mind, this program might only work
029     * if host2 is the same as the host you run it on (for security reasons,
030     * some ftp servers only allow PORT commands to be issued with a host
031     * argument equal to the client host).
032     * <p>
033     * Usage: ftp <host1> <user1> <pass1> <file1> <host2> <user2> <pass2> <file2>
034     * <p>
035     ***/
036    public final class server2serverFTP
037    {
038    
039        public static final void main(String[] args)
040        {
041            String server1, username1, password1, file1;
042            String server2, username2, password2, file2;
043            FTPClient ftp1, ftp2;
044            ProtocolCommandListener listener;
045    
046            if (args.length < 8)
047            {
048                System.err.println(
049                    "Usage: ftp <host1> <user1> <pass1> <file1> <host2> <user2> <pass2> <file2>"
050                );
051                System.exit(1);
052            }
053    
054            server1 = args[0];
055            username1 = args[1];
056            password1 = args[2];
057            file1 = args[3];
058            server2 = args[4];
059            username2 = args[5];
060            password2 = args[6];
061            file2 = args[7];
062    
063            listener = new PrintCommandListener(new PrintWriter(System.out));
064            ftp1 = new FTPClient();
065            ftp1.addProtocolCommandListener(listener);
066            ftp2 = new FTPClient();
067            ftp2.addProtocolCommandListener(listener);
068    
069            try
070            {
071                int reply;
072                ftp1.connect(server1);
073                System.out.println("Connected to " + server1 + ".");
074    
075                reply = ftp1.getReplyCode();
076    
077                if (!FTPReply.isPositiveCompletion(reply))
078                {
079                    ftp1.disconnect();
080                    System.err.println("FTP server1 refused connection.");
081                    System.exit(1);
082                }
083            }
084            catch (IOException e)
085            {
086                if (ftp1.isConnected())
087                {
088                    try
089                    {
090                        ftp1.disconnect();
091                    }
092                    catch (IOException f)
093                    {
094                        // do nothing
095                    }
096                }
097                System.err.println("Could not connect to server1.");
098                e.printStackTrace();
099                System.exit(1);
100            }
101    
102            try
103            {
104                int reply;
105                ftp2.connect(server2);
106                System.out.println("Connected to " + server2 + ".");
107    
108                reply = ftp2.getReplyCode();
109    
110                if (!FTPReply.isPositiveCompletion(reply))
111                {
112                    ftp2.disconnect();
113                    System.err.println("FTP server2 refused connection.");
114                    System.exit(1);
115                }
116            }
117            catch (IOException e)
118            {
119                if (ftp2.isConnected())
120                {
121                    try
122                    {
123                        ftp2.disconnect();
124                    }
125                    catch (IOException f)
126                    {
127                        // do nothing
128                    }
129                }
130                System.err.println("Could not connect to server2.");
131                e.printStackTrace();
132                System.exit(1);
133            }
134    
135    __main:
136            try
137            {
138                if (!ftp1.login(username1, password1))
139                {
140                    System.err.println("Could not login to " + server1);
141                    break __main;
142                }
143    
144                if (!ftp2.login(username2, password2))
145                {
146                    System.err.println("Could not login to " + server2);
147                    break __main;
148                }
149    
150                // Let's just assume success for now.
151                ftp2.enterRemotePassiveMode();
152    
153                ftp1.enterRemoteActiveMode(InetAddress.getByName(ftp2.getPassiveHost()),
154                                           ftp2.getPassivePort());
155    
156                // Although you would think the store command should be sent to server2
157                // first, in reality, ftp servers like wu-ftpd start accepting data
158                // connections right after entering passive mode.  Additionally, they
159                // don't even send the positive preliminary reply until after the
160                // transfer is completed (in the case of passive mode transfers).
161                // Therefore, calling store first would hang waiting for a preliminary
162                // reply.
163                if (ftp1.remoteRetrieve(file1) && ftp2.remoteStoreUnique(file2))
164                {
165                    //      if(ftp1.remoteRetrieve(file1) && ftp2.remoteStore(file2)) {
166                    // We have to fetch the positive completion reply.
167                    ftp1.completePendingCommand();
168                    ftp2.completePendingCommand();
169                }
170                else
171                {
172                    System.err.println(
173                        "Couldn't initiate transfer.  Check that filenames are valid.");
174                    break __main;
175                }
176    
177            }
178            catch (IOException e)
179            {
180                e.printStackTrace();
181                System.exit(1);
182            }
183            finally
184            {
185                try
186                {
187                    if (ftp1.isConnected())
188                    {
189                        ftp1.logout();
190                        ftp1.disconnect();
191                    }
192                }
193                catch (IOException e)
194                {
195                    // do nothing
196                }
197    
198                try
199                {
200                    if (ftp2.isConnected())
201                    {
202                        ftp2.logout();
203                        ftp2.disconnect();
204                    }
205                }
206                catch (IOException e)
207                {
208                    // do nothing
209                }
210            }
211        }
212    }