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