client/ftpd/src/se/lu/thep/coreftpd/ProteiosFTPServerControl.java

Code
Comments
Other
Rev Date Author Line
2668 07 May 08 olle 1 /*
2668 07 May 08 olle 2  $Id$
2668 07 May 08 olle 3
2668 07 May 08 olle 4  Copyright (C) 2008 Gregory Vincic, Olle Mansson
2668 07 May 08 olle 5
2668 07 May 08 olle 6  This file is part of Proteios.
2668 07 May 08 olle 7  Available at http://www.proteios.org/
2668 07 May 08 olle 8
2668 07 May 08 olle 9  Proteios is free software; you can redistribute it and/or modify it
2668 07 May 08 olle 10  under the terms of the GNU General Public License as published by
2668 07 May 08 olle 11  the Free Software Foundation; either version 2 of the License, or
2668 07 May 08 olle 12  (at your option) any later version.
2668 07 May 08 olle 13
2668 07 May 08 olle 14  Proteios is distributed in the hope that it will be useful, but
2668 07 May 08 olle 15  WITHOUT ANY WARRANTY; without even the implied warranty of
2668 07 May 08 olle 16  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
2668 07 May 08 olle 17  General Public License for more details.
2668 07 May 08 olle 18
2668 07 May 08 olle 19  You should have received a copy of the GNU General Public License
2668 07 May 08 olle 20  along with this program; if not, write to the Free Software
2668 07 May 08 olle 21  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
2668 07 May 08 olle 22  02111-1307, USA.
2668 07 May 08 olle 23  */
2668 07 May 08 olle 24 package se.lu.thep.coreftpd;
2668 07 May 08 olle 25
2668 07 May 08 olle 26 import org.proteios.core.Application;
2668 07 May 08 olle 27 import org.proteios.core.Config;
2668 07 May 08 olle 28
2668 07 May 08 olle 29 import java.io.IOException;
2668 07 May 08 olle 30 import java.net.*;
2668 07 May 08 olle 31
2668 07 May 08 olle 32 import se.lu.thep.coreftpd.ftp_server.FTPServer;
2668 07 May 08 olle 33 import se.lu.thep.coreftpd.ftp_server.FTPSettings;
2668 07 May 08 olle 34 import se.lu.thep.coreftpd.webserver.ClassChooser;
2668 07 May 08 olle 35
2668 07 May 08 olle 36 /**
2668 07 May 08 olle 37  * This class allows scripts to control the Xerver FTP Server for Proteios.
2668 07 May 08 olle 38  * 
2668 07 May 08 olle 39  * @author Olle
2668 07 May 08 olle 40  * @version 2.0
2668 07 May 08 olle 41  */
2668 07 May 08 olle 42 public class ProteiosFTPServerControl
2668 07 May 08 olle 43 {
2668 07 May 08 olle 44   private static FTPSettings FTPS_settings = null;
2668 07 May 08 olle 45
2668 07 May 08 olle 46   /**
2668 07 May 08 olle 47    * Logger used. Used to log specific events.
2668 07 May 08 olle 48    */
2668 07 May 08 olle 49   private static final org.apache.log4j.Logger log = org.apache.log4j.LogManager
2668 07 May 08 olle 50     .getLogger("se.lu.thep.coreftpd");
2668 07 May 08 olle 51
2668 07 May 08 olle 52   private static String tmpDirPath = null;
2668 07 May 08 olle 53   
2668 07 May 08 olle 54   private static Boolean b_start_server = null;
2668 07 May 08 olle 55   
2668 07 May 08 olle 56   private static int portNoUsed = -1;
2668 07 May 08 olle 57
2668 07 May 08 olle 58   /**
2668 07 May 08 olle 59    * Control Xerver FTP Server for Proteios
2668 07 May 08 olle 60    */
2668 07 May 08 olle 61   public static void main(String[] s)
2668 07 May 08 olle 62   {
2668 07 May 08 olle 63     /*
2668 07 May 08 olle 64      * Start Application
2668 07 May 08 olle 65      */
2668 07 May 08 olle 66     Config.setConfigFileName("/ftp.properties");
2668 07 May 08 olle 67     Application.start();
2668 07 May 08 olle 68     /*
2668 07 May 08 olle 69      * Start FTP server at specified port (as default port 21 is normally
2668 07 May 08 olle 70      * used).
2668 07 May 08 olle 71      */
2668 07 May 08 olle 72     int portNo = -1;
2668 07 May 08 olle 73     //System.out.println("ProteiosFTPServerControl::main(): s.length = " + s.length);
2668 07 May 08 olle 74     log.debug("s.length = " + s.length);
2668 07 May 08 olle 75     // Parse argument array
2668 07 May 08 olle 76     if (s.length < 2)
2668 07 May 08 olle 77     {
2668 07 May 08 olle 78       printUsageInfo();
2668 07 May 08 olle 79     }
2668 07 May 08 olle 80     else
2668 07 May 08 olle 81     {
2668 07 May 08 olle 82       for (int i = 0; i < s.length; i++)
2668 07 May 08 olle 83       {
2668 07 May 08 olle 84         //System.out.println("ProteiosFTPServerControl::main(): s[" + i + "] = \"" + s[i] + "\"");
2668 07 May 08 olle 85         log.debug("s[" + i + "] = \"" + s[i] + "\"");
2668 07 May 08 olle 86         if (s[i].startsWith("-t"))
2668 07 May 08 olle 87         {
2668 07 May 08 olle 88           // Path to directory for temporary files
2668 07 May 08 olle 89           if (s[i].length() > 2)
2668 07 May 08 olle 90           {
2668 07 May 08 olle 91             tmpDirPath = s[0].substring(2);
2668 07 May 08 olle 92           }
2668 07 May 08 olle 93         }
2668 07 May 08 olle 94         else if (s[i].startsWith("-p"))
2668 07 May 08 olle 95         {
2668 07 May 08 olle 96           if (s[i].length() > 2)
2668 07 May 08 olle 97           {
2668 07 May 08 olle 98             try
2668 07 May 08 olle 99             {
2668 07 May 08 olle 100               portNo = Integer.parseInt(s[i].substring(2));
2668 07 May 08 olle 101             }
2668 07 May 08 olle 102             catch (Exception e)
2668 07 May 08 olle 103             {
2668 07 May 08 olle 104               System.out.println("Port number argument \"" + s[i].substring(2) + "\" could not be parsed to an integer");
2668 07 May 08 olle 105               log.debug("Port number argument \"" + s[i].substring(2) + "\" could not be parsed to an integer");
2668 07 May 08 olle 106               printUsageInfo();
2668 07 May 08 olle 107             }
2668 07 May 08 olle 108           }
2668 07 May 08 olle 109         }
2668 07 May 08 olle 110         else if (s[i].equals("-start"))
2668 07 May 08 olle 111         {
2668 07 May 08 olle 112           if (b_start_server == null)
2668 07 May 08 olle 113           {
2668 07 May 08 olle 114             b_start_server = true;
2668 07 May 08 olle 115           }
2668 07 May 08 olle 116           else
2668 07 May 08 olle 117           {
2668 07 May 08 olle 118             System.out.println("Only one argument \"-start\" or \"-stop\" allowed");
2668 07 May 08 olle 119             printUsageInfo();
2668 07 May 08 olle 120           }
2668 07 May 08 olle 121         }
2668 07 May 08 olle 122         else if (s[i].equals("-stop"))
2668 07 May 08 olle 123         {
2668 07 May 08 olle 124           if (b_start_server == null)
2668 07 May 08 olle 125           {
2668 07 May 08 olle 126             b_start_server = false;
2668 07 May 08 olle 127           }
2668 07 May 08 olle 128           else
2668 07 May 08 olle 129           {
2668 07 May 08 olle 130             System.out.println("Only one argument \"-start\" or \"-stop\" allowed");
2668 07 May 08 olle 131             printUsageInfo();
2668 07 May 08 olle 132           }
2668 07 May 08 olle 133         }
2668 07 May 08 olle 134       }
2668 07 May 08 olle 135     }
2668 07 May 08 olle 136     // Check input
2668 07 May 08 olle 137     if (tmpDirPath == null || tmpDirPath.equals(""))
2668 07 May 08 olle 138     {
2668 07 May 08 olle 139       System.out.println("Missing argument -tXXX (XXX = temp dir path)");
2668 07 May 08 olle 140       printUsageInfo();
2668 07 May 08 olle 141     }
2668 07 May 08 olle 142     if (b_start_server == null)
2668 07 May 08 olle 143     {
2668 07 May 08 olle 144       System.out.println("Missing argument \"-start\" or \"-stop\"");
2668 07 May 08 olle 145       printUsageInfo();
2668 07 May 08 olle 146     }
2668 07 May 08 olle 147     //System.out.println("ProteiosFTPServerControl::main(): b_start_server =  " + b_start_server);
2668 07 May 08 olle 148     //System.out.println("ProteiosFTPServerControl::main(): portNo =  " + portNo);
2668 07 May 08 olle 149     log.debug("b_start_server =  " + b_start_server);
2668 07 May 08 olle 150     log.debug("portNo =  " + portNo);
2668 07 May 08 olle 151     /*
2668 07 May 08 olle 152      * Get FTP settings
2668 07 May 08 olle 153      */
2668 07 May 08 olle 154     try
2668 07 May 08 olle 155     {
2668 07 May 08 olle 156       FTPS_settings = FTPServer.getFTPSettings();
2668 07 May 08 olle 157     }
2668 07 May 08 olle 158     catch (Exception e)
2668 07 May 08 olle 159     {
2668 07 May 08 olle 160       //System.out.println("ProteiosFTPServerControl::main(): Exception when getting FTP settings: " + e);
2668 07 May 08 olle 161       log.debug("Exception when getting FTP settings: " + e);
2668 07 May 08 olle 162     }
2668 07 May 08 olle 163     int defaultPortNo = FTPSettings.i_portNr;
2668 07 May 08 olle 164     //System.out.println("ProteiosFTPServerControl::main(): defaultPortNo =  " + defaultPortNo);
2668 07 May 08 olle 165     log.debug("defaultPortNo =  " + defaultPortNo);
2668 07 May 08 olle 166     if (portNo > 0)
2668 07 May 08 olle 167     {
2668 07 May 08 olle 168       portNoUsed = portNo;
2668 07 May 08 olle 169     }
2668 07 May 08 olle 170     else
2668 07 May 08 olle 171     {
2668 07 May 08 olle 172       portNoUsed = defaultPortNo;
2668 07 May 08 olle 173     }
2668 07 May 08 olle 174     //System.out.println("ProteiosFTPServerControl::main(): portNoUsed =  " + portNoUsed);
2668 07 May 08 olle 175     log.debug("portNoUsed =  " + portNoUsed);
2668 07 May 08 olle 176     if (b_start_server != null && b_start_server)
2668 07 May 08 olle 177     {
2668 07 May 08 olle 178       // Start FTP server at port 'portNoUsed'
2668 07 May 08 olle 179       String[] argStrings;
2668 07 May 08 olle 180       if (portNo < 1)
2668 07 May 08 olle 181       {
2668 07 May 08 olle 182         argStrings = new String[2];
2668 07 May 08 olle 183         argStrings[0] = "FTPServer";
2668 07 May 08 olle 184         argStrings[1] = "-t" + tmpDirPath;
2668 07 May 08 olle 185       }
2668 07 May 08 olle 186       else
2668 07 May 08 olle 187       {
2668 07 May 08 olle 188         argStrings = new String[3];
2668 07 May 08 olle 189         argStrings[0] = "FTPServer";
2668 07 May 08 olle 190         argStrings[1] = "-t" + tmpDirPath;
2668 07 May 08 olle 191         argStrings[2] = "-p" + portNo;
2668 07 May 08 olle 192       }
2668 07 May 08 olle 193       log
2668 07 May 08 olle 194         .debug("--------------------------------------------------------------------");
2668 07 May 08 olle 195       //System.out.println("ProteiosFTPServerControl::main(): argStrings.length = " + argStrings.length);
2668 07 May 08 olle 196       log.debug("argStrings.length = " + argStrings.length);
2668 07 May 08 olle 197       for (int i = 0; i < argStrings.length; i++)
2668 07 May 08 olle 198       {
2668 07 May 08 olle 199         //System.out.println("ProteiosFTPServerControl::main(): argStrings[" + i + "] = \"" + argStrings[i] + "\"");
2668 07 May 08 olle 200         log.debug("argStrings[" + i + "] = \"" + argStrings[i] + "\"");
2668 07 May 08 olle 201       }
2668 07 May 08 olle 202       ClassChooser.main(argStrings);
2668 07 May 08 olle 203       log
2668 07 May 08 olle 204         .debug("--------------------------------------------------------------------");
2668 07 May 08 olle 205     }
2668 07 May 08 olle 206     else
2668 07 May 08 olle 207     {
2668 07 May 08 olle 208       // Stop FTP server at port 'portNoUsed'
2668 07 May 08 olle 209       deleteLockFile();
2668 07 May 08 olle 210       // Connect to FTP server at port 'portNoUsed' to trigger stop of server
2668 07 May 08 olle 211       Socket socket = connectToSocket("localhost", portNoUsed);
2668 07 May 08 olle 212       //System.out.println("ProteiosFTPServerControl::main(): socket = " + socket);
2668 07 May 08 olle 213       log.debug("socket = " + socket);
2668 07 May 08 olle 214       if (socket != null)
2668 07 May 08 olle 215       {
2668 07 May 08 olle 216         try
2668 07 May 08 olle 217         {
2668 07 May 08 olle 218           socket.close();
2668 07 May 08 olle 219         }
2668 07 May 08 olle 220         catch(IOException e)
2668 07 May 08 olle 221         {
2668 07 May 08 olle 222           System.out.println("ProteiosFTPServerControl::main(): Exception when trying to close socket: " + e);
2668 07 May 08 olle 223           log.warn("Exception when trying to close socket: " + e);
2668 07 May 08 olle 224         }
2668 07 May 08 olle 225       }
2668 07 May 08 olle 226       socket = null;
2668 07 May 08 olle 227     }
2668 07 May 08 olle 228     //System.out.println("ProteiosFTPServerControl::main(): end");
2668 07 May 08 olle 229     log.debug("end");
2668 07 May 08 olle 230   }
2668 07 May 08 olle 231
2668 07 May 08 olle 232
2668 07 May 08 olle 233   private static void printUsageInfo()
2668 07 May 08 olle 234   {
2668 07 May 08 olle 235     System.out.println("ProteiosFTPServerControl -tXXX (XXX = temp dir path) -start|-stop [-pXX = Start FTP server on port XX]");
2668 07 May 08 olle 236     System.exit(0);
2668 07 May 08 olle 237   }
2668 07 May 08 olle 238
2668 07 May 08 olle 239
2668 07 May 08 olle 240   /**
2668 07 May 08 olle 241    * Returns the name of the lock file,
2668 07 May 08 olle 242    * concatenated from the lockfile base name,
2668 07 May 08 olle 243    * an underscore chararcter '_', the
2668 07 May 08 olle 244    * number of the port used by the FTP server,
2668 07 May 08 olle 245    * and file extension ".lck".
2668 07 May 08 olle 246    * 
2668 07 May 08 olle 247    * Example:
2668 07 May 08 olle 248    * Lock file basename = "proteios_ftp"
2668 07 May 08 olle 249    * FTP port used: 8021
2668 07 May 08 olle 250    * Lockfile name: "proteios_ftp_8021.lck"
2668 07 May 08 olle 251    * 
2668 07 May 08 olle 252    * @return String The name of the lock file
2668 07 May 08 olle 253    */
2668 07 May 08 olle 254   public static String fetchLockFileName()
2668 07 May 08 olle 255   {
2668 07 May 08 olle 256     String lockFileName = new String(FTPServer.LOCK_FILE_BASENAME + "_" + portNoUsed + ".lck");
2668 07 May 08 olle 257     return lockFileName;
2668 07 May 08 olle 258   }
2668 07 May 08 olle 259
2668 07 May 08 olle 260
2668 07 May 08 olle 261   private static void deleteLockFile()
2668 07 May 08 olle 262   {
2668 07 May 08 olle 263     String lockFilePath = new String(tmpDirPath + java.io.File.separator + fetchLockFileName());
2668 07 May 08 olle 264     //System.out.println("ProteiosFTPServerControl::deleteLockFile(): lockFilePath = \"" + lockFilePath + "\"");
2668 07 May 08 olle 265     log.debug("lockFilePath = \"" + lockFilePath + "\"");
2668 07 May 08 olle 266     java.io.File lockFile = new java.io.File(lockFilePath);
2668 07 May 08 olle 267     boolean fileDeleted = false;
2668 07 May 08 olle 268     try
2668 07 May 08 olle 269     {
2668 07 May 08 olle 270       fileDeleted = lockFile.delete();
2668 07 May 08 olle 271     }
2668 07 May 08 olle 272     catch (Exception e)
2668 07 May 08 olle 273     {
2668 07 May 08 olle 274       //System.out.println("Couldn't delete FTP server lock file \"" + lockFilePath + "\":" + e);
2668 07 May 08 olle 275       log.debug("Couldn't delete FTP server lock file \"" + lockFilePath + "\":" + e);
2668 07 May 08 olle 276     }
2668 07 May 08 olle 277   }
2668 07 May 08 olle 278
2668 07 May 08 olle 279
2668 07 May 08 olle 280     /**
2668 07 May 08 olle 281      * Connects to the given host on the given port.
2668 07 May 08 olle 282      * 
2668 07 May 08 olle 283      * @param host String Name of host
2668 07 May 08 olle 284      * @param port int Port number
2668 07 May 08 olle 285      * @return Socket The socket 
2668 07 May 08 olle 286      */
2668 07 May 08 olle 287     public static Socket connectToSocket(String host, int port)
2668 07 May 08 olle 288     {
2668 07 May 08 olle 289         //System.out.println("ProteiosFTPServerControl::connectToSocket(): host = \"" + host + "\" port = " + port);
2668 07 May 08 olle 290         log.debug("host = \"" + host + "\" port = " + port);
2668 07 May 08 olle 291         Socket socket = null;
2668 07 May 08 olle 292         try
2668 07 May 08 olle 293         {
2668 07 May 08 olle 294             socket = new Socket(host, port);
2668 07 May 08 olle 295         }
2668 07 May 08 olle 296         catch (Exception e)
2668 07 May 08 olle 297         {
2668 07 May 08 olle 298             //System.out.println("ProteiosFTPServerControl::connectToSocket(): Exception when trying to connect to host = \"" + host + "\" port = " + port + ": " + e);
2668 07 May 08 olle 299             log.debug("Exception when trying to connect to host = \"" + host + "\" port = " + port + ": " + e);
2668 07 May 08 olle 300         }
2668 07 May 08 olle 301         return socket;
2668 07 May 08 olle 302     }
2668 07 May 08 olle 303 }