summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/ftp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/ftp')
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/FtpCredentialsScheduler.java61
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/ImageProcessor.java48
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtpServer.java43
-rw-r--r--src/main/java/org/openslx/imagemaster/ftp/MasterFtplet.java4
4 files changed, 89 insertions, 67 deletions
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<String, FtpCredentials> 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<String, Long> 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<String, ImageData> 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<DbImage> uploadingImages = DbImage.getUploadingImages();
+
+ log.info( uploadingImages.size() + " image(s) are uploading" );
+
+ if (uploadingImages.isEmpty()) return;
+
+ Iterator<DbImage> 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<String, FtpCredentials> users = new HashMap<>();
// key: ftpUsername, value: createTime
- public final HashMap<String, Long> timeouts = new HashMap<>();
+ public final HashMap<String, Long> 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<FtpIoSession> 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;
}