From 287ad92152c530b400a5405a4672a41d92e4d368 Mon Sep 17 00:00:00 2001 From: Nils Schwabe Date: Mon, 28 Apr 2014 18:18:59 +0200 Subject: Add ftp users and images in processing list are remembered --- .../imagemaster/ftp/FtpCredentialsScheduler.java | 61 +++++++++++----------- .../openslx/imagemaster/ftp/ImageProcessor.java | 48 +++++++++++++++-- .../openslx/imagemaster/ftp/MasterFtpServer.java | 43 +++++---------- .../org/openslx/imagemaster/ftp/MasterFtplet.java | 4 +- 4 files changed, 89 insertions(+), 67 deletions(-) (limited to 'src/main/java/org/openslx/imagemaster/ftp') diff --git a/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java index 62d16dc..8cd72df 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java +++ b/src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java @@ -9,50 +9,49 @@ import java.util.TimerTask; import org.apache.log4j.Logger; import org.openslx.imagemaster.App; import org.openslx.imagemaster.Globals; -import org.openslx.imagemaster.thrift.iface.FtpCredentials; import org.openslx.imagemaster.util.Util; public class FtpCredentialsScheduler extends TimerTask { + private static Logger log = Logger.getLogger( FtpCredentialsScheduler.class ); public static final long timeout = Long.valueOf( Globals.getPropertyInt( Globals.PropInt.FTPTIMEOUT ) ) * 60L * 1000L; // timeout in ms - - static { - log.info( "timeout is:" + timeout ); - } @Override public void run() { - // check all folders - for ( Map.Entry entry : App.ftpServer.users.entrySet() ) { - if (entry == null) continue; - String sessionId = entry.getKey(); - String username = entry.getValue().username; - File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username ); - if ( !dir.exists() ) - continue; - File[] list = dir.listFiles(); - if ( list.length == 1 ) { - if ( ( new Date().getTime() - list[0].lastModified() ) >= timeout ) { - log.info( username + "'s files are too old. Deleting him and his folder." ); - Util.deleteFolder( dir ); - App.ftpServer.removeUser( sessionId ); - ImageProcessor.removeImageFromProcessList( username ); - } - } else if ( list.length > 1 ) { - log.info( username + " uploaded too many files. Deleting his account and his folder." ); - Util.deleteFolder( dir ); - App.ftpServer.removeUser( sessionId ); - ImageProcessor.removeImageFromProcessList( username ); - } else { - // check the creation time of the user - if ( ( System.currentTimeMillis() - App.ftpServer.timeouts.get( username ) ) >= timeout ) { - log.info( username + " did nothing for too long. Deleting him and his folder" ); + synchronized ( App.ftpServer.users ) { + // check all folders + for ( Map.Entry entry : App.ftpServer.users.entrySet() ) { + if ( entry == null ) + continue; + String username = entry.getKey(); + File dir = new File( Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username ); + if ( !dir.exists() ) + continue; + File[] list = dir.listFiles(); + if ( list.length == 1 ) { + if ( ( new Date().getTime() - list[0].lastModified() ) >= timeout ) { + // TODO: test if his file is complete by checking the file size + log.info( username + "'s files are too old. Deleting him and his folder." ); + Util.deleteFolder( dir ); + App.ftpServer.removeUser( username ); + ImageProcessor.removeImageFromProcessList( username ); + } + } else if ( list.length > 1 ) { + log.info( "User '" + username + "' uploaded too many files. Deleting his account and his folder." ); Util.deleteFolder( dir ); - App.ftpServer.removeUser( sessionId ); + App.ftpServer.removeUser( username ); ImageProcessor.removeImageFromProcessList( username ); + } else { + // check the creation time of the user + if ( ( System.currentTimeMillis() - App.ftpServer.users.get( username ) ) >= timeout ) { + log.info( username + " did nothing for too long. Deleting him and his folder" ); + Util.deleteFolder( dir ); + App.ftpServer.removeUser( username ); + ImageProcessor.removeImageFromProcessList( username ); + } } } } diff --git a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java index 3169aec..b7e96a4 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java +++ b/src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java @@ -2,9 +2,13 @@ package org.openslx.imagemaster.ftp; import java.io.File; import java.util.HashMap; +import java.util.Iterator; +import java.util.List; import org.apache.log4j.Logger; +import org.openslx.imagemaster.App; import org.openslx.imagemaster.Globals; +import org.openslx.imagemaster.Globals.PropInt; import org.openslx.imagemaster.db.DbImage; import org.openslx.imagemaster.thrift.iface.ImageData; @@ -12,10 +16,43 @@ public class ImageProcessor { private static Logger log = Logger.getLogger( ImageProcessor.class ); + // key: ftpUser, value: imageData private static HashMap images = new HashMap<>(); + + /** + * After (re)starting server: check dead !uploading! images in database + */ + public static void checkUploading() { + long timeout = Globals.getPropertyInt( PropInt.FTPTIMEOUT ) * 60L * 1000L; + List uploadingImages = DbImage.getUploadingImages(); + + log.info( uploadingImages.size() + " image(s) are uploading" ); + + if (uploadingImages.isEmpty()) return; + + Iterator iter = uploadingImages.iterator(); + while (iter.hasNext()) { + DbImage dbImage = iter.next(); + if (System.currentTimeMillis() - dbImage.timestamp.getTime() >= timeout) { + DbImage.delete( dbImage.UUID ); + log.info( "Deleted dbimage from db: " + dbImage.UUID + " due to timeout"); + } else { + // add ftpUser to list + synchronized ( App.ftpServer.users ) { + App.ftpServer.users.put( dbImage.ftpUser, dbImage.timestamp.getTime() ); + } + log.info( "Added user '" + dbImage.ftpUser + "' to list again." ); + + // add image to process list again + ImageData imageData = new ImageData( dbImage.UUID, dbImage.imageVersion, dbImage.imageName, dbImage.imageCreateTime.getTime(), dbImage.imageUpdateTime.getTime(), dbImage.imageOwner, dbImage.contentOperatingSystem, dbImage.isValid, dbImage.isDeleted, dbImage.shortDescription, dbImage.longDescription, dbImage.fileSize ); + images.put( dbImage.ftpUser, imageData ); + log.info( "Added image to processlist again: " + dbImage.UUID ); + } + } + } /** - * Processes an image after upload + * Process an image after upload * * @param username the user that uploaded the file * @param filename the name of the file that was uploaded (_no_ absolute path) @@ -32,7 +69,7 @@ public class ImageProcessor // move image to right location String oldFileName = Globals.getPropertyString( Globals.PropString.FTPBASEDIR ) + "/" + username + "/" + filename; - String newFileName = Globals.getPropertyString( Globals.PropString.IMAGEDIR ) + "/" + images.get( username ).uuid; + String newFileName = Globals.getPropertyString( Globals.PropString.IMAGEDIR ) + "/" + images.get( username ).uuid + ".vmdk"; File imageFile = new File( oldFileName ); @@ -70,7 +107,8 @@ public class ImageProcessor if ( imageData.uuid.isEmpty() || imageData.imageName.isEmpty() || imageData.imageOwner.isEmpty() || imageData.conentOperatingSystem.isEmpty() || imageData.imageShortDescription.isEmpty() - || imageData.imageLongDescription.isEmpty() ) { + || imageData.imageLongDescription.isEmpty() + || imageData.fileSize == 0) { return false; } @@ -81,7 +119,7 @@ public class ImageProcessor } // if everything went fine, add image to db - DbImage.insert( imageData ); + DbImage.insert( imageData, System.currentTimeMillis(), username); // and to processinglist images.put( username, imageData ); @@ -99,7 +137,7 @@ public class ImageProcessor return false; } - DbImage.delete( images.get( username )); + DbImage.delete( images.get( username ).uuid ); images.remove( username ); log.info( "Deleted image from process list and db. (User: " + username + ")" ); diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java index 19671e3..e3514f6 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java +++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java @@ -1,8 +1,6 @@ package org.openslx.imagemaster.ftp; import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -34,10 +32,8 @@ public class MasterFtpServer implements Runnable private FtpServer server; private UserManager userManager; private Listener listener; - // key: serverSessionId, value: FtpCredentials - public final HashMap users = new HashMap<>(); // key: ftpUsername, value: createTime - public final HashMap timeouts = new HashMap<>(); + public final HashMap users = new HashMap<>(); private boolean ini = false; public void init( int port ) @@ -66,15 +62,6 @@ public class MasterFtpServer implements Runnable // create user manager PropertiesUserManagerFactory userManagerFactory = new PropertiesUserManagerFactory(); File userFile = new File( "src/main/properties/ftp.properties" ); - // clear user file to avoid dead users - PrintWriter writer = null; - try { - writer = new PrintWriter(userFile); - } catch ( FileNotFoundException e ) { - } finally { - writer.print(""); - writer.close(); - } userManagerFactory.setFile( userFile ); userManagerFactory.setPasswordEncryptor( new SaltedPasswordEncryptor() ); userManager = userManagerFactory.createUserManager(); @@ -116,8 +103,9 @@ public class MasterFtpServer implements Runnable try { userManager.save( user ); ftpCredentials = new FtpCredentials( generatedUser, generatedPass ); - users.put( serverSessionId, ftpCredentials ); - timeouts.put( ftpCredentials.username, System.currentTimeMillis()); + synchronized ( users ) { + users.put( ftpCredentials.username, System.currentTimeMillis()); + } } catch ( FtpException e ) { } @@ -127,43 +115,38 @@ public class MasterFtpServer implements Runnable return ftpCredentials; } - public boolean removeUser( final String serverSessionId ) + public boolean removeUser( final String username ) { - if ( !users.containsKey( serverSessionId ) ) + if ( !users.containsKey( username ) ) return false; try { - log.info( "Closing session" ); // first find active session and close it Iterator iter = listener.getActiveSessions().iterator(); while (iter.hasNext()) { FtpIoSession session = (FtpIoSession) iter.next(); if (session.getUser() == null) continue; - if (session.getUser().getName() == users.get( serverSessionId ).username) { + if (session.getUser().getName() == username) { session.close(); } } - log.info( "Deleting user" ); // afterwards delete user - userManager.delete( users.get( serverSessionId ).username ); - log.info( "removing user from timeout list" ); - // remove user from both maps - timeouts.remove( users.remove( serverSessionId ).username ); + userManager.delete( username ); + // remove user from map (cache) + synchronized ( users ) { + users.remove( username ); + } return true; } catch ( FtpException e ) { return false; } } - public FtpCredentials getCredentialsFromSessionId( String serverSessionId ) - { - return users.get( serverSessionId ); - } - @Override public void run() { try { + //if (!ini) throw new Exception("FTP server needs to be initalized."); log.info( "Starting FTP Sever" ); server.start(); } catch ( FtpException e1 ) { diff --git a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java index 0e113fe..5e12628 100644 --- a/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java +++ b/src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java @@ -49,7 +49,9 @@ public class MasterFtplet implements Ftplet public FtpletResult onConnect( FtpSession session ) throws FtpException, IOException { - log.info( session.getUser().getName() + " connected" ); + if (session.getUser() != null) { + log.info( session.getUser().getName() + " connected" ); + } return null; } -- cgit v1.2.3-55-g7522