diff options
Diffstat (limited to 'src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java')
-rw-r--r-- | src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java | 104 |
1 files changed, 66 insertions, 38 deletions
diff --git a/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java b/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java index 13f3ae8..3ee624e 100644 --- a/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java +++ b/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java @@ -1,23 +1,23 @@ package org.openslx.satellitedaemon.ftp; -import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; +import java.security.KeyManagementException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.util.List; -import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; -import org.apache.commons.net.ftp.FTP; -import org.apache.commons.net.ftp.FTPSClient; import org.apache.log4j.Logger; -import org.openslx.imagemaster.thrift.iface.FtpCredentials; +import org.openslx.filetransfer.Uploader; import org.openslx.imagemaster.thrift.iface.ImageData; +import org.openslx.imagemaster.thrift.iface.UploadInfos; import org.openslx.satellitedaemon.Globals; import org.openslx.satellitedaemon.Globals.PropInt; import org.openslx.satellitedaemon.Globals.PropString; @@ -31,50 +31,78 @@ public class FtpUploadWorker implements Runnable public void run() { while ( true ) { + // This List contains all Images in the Database that should be uploaded. List<DbImage> imageList = DbImage.getAllMarkedForUpload(); log.info( "FtpUploadWorker: imageList Contains " + imageList.size() + " items." ); + + // Upload one Image after the other. for ( DbImage image : imageList ) { // TODO: still some fields for ImageData, which i can't fill with info from DbImage. ImageData imDat = new ImageData( image.guid, image.rid, image.name, System.currentTimeMillis(), System.currentTimeMillis(), image.creator, "anyThing", true, false, "best", "theVeryBest", image.fileSize ); - - FtpCredentials ftpc = ThriftConnection.getFtpCredentials( imDat ); - if ( ftpc == null ) { - log.error( "The FtpCredentials are null" ); - } - + char[] passphrase = Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ).toCharArray(); + KeyStore keystore; try { - TrustManagerFactory trustManagerFactory = TrustManagerFactory - .getInstance( KeyManagerFactory.getDefaultAlgorithm() ); - KeyStore keystore = KeyStore.getInstance( Globals.getPropertyString( PropString.KEYSTORETYPE ) ); - keystore.load( new FileInputStream( new File( - Globals.getPropertyString( PropString.FTPSKEYSTOREPATH ) ) ), - Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ).toCharArray() ); - trustManagerFactory.init( keystore ); - TrustManager trustManager = trustManagerFactory.getTrustManagers()[0]; - FTPSClient ftpClient = new FTPSClient( "SSL", true ); - ftpClient.setTrustManager( trustManager ); - try { - ftpClient.connect( Globals.getPropertyString( PropString.FTPSERVERIP ), Globals.getPropertyInt( PropInt.FTPPORT ) ); - if ( !ftpClient.login( ftpc.username, ftpc.password ) ) { - log.error( "FTP problem. Coundn't log in!" ); - } - File file = new File( image.path ); - FileInputStream fis = new FileInputStream( file ); - ftpClient.setFileType( FTP.BINARY_FILE_TYPE ); - ftpClient.storeFile( image.name, fis ); - ThriftConnection.finishedUpload( ftpc.username, imDat ); + + // All the necessary KeyStore handling for the "context"-item. + keystore = KeyStore.getInstance( "JKS" ); + keystore.load( new FileInputStream( Globals.getPropertyString( PropString.FTPSKEYSTOREPATH ) ), passphrase ); + TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() ); + tmf.init( keystore ); + SSLContext context = SSLContext.getInstance( "SSLv3" ); + TrustManager[] trustManagers = tmf.getTrustManagers(); + context.init( null, trustManagers, null ); - } catch ( IOException e ) { - log.error( "FtpUploadWorker: Error creating the FileInputStream" ); - } finally { - ftpClient.disconnect(); - log.info( "FtpUploadWorker: ftpClient disconnected" ); + // uploadInfo and ThriftAuthentication + UploadInfos upInfos = ThriftConnection.getUploadInfos( imDat ); + if ( upInfos == null ) { + log.error( "The UploadInfos returned by ThriftConnection Class are null" ); } - } catch ( NoSuchAlgorithmException | KeyStoreException | CertificateException | IOException e ) { - log.debug( "FtpUploadWorker: Problem with Keystore ore FtpsClient creation." ); + + // creating the uploader with the "context"-item. + Uploader u = new Uploader( Globals.getPropertyString( PropString.FTPSERVERIP ), Globals.getPropertyInt( PropInt.FTPPORT ), context ); + u.sendToken( upInfos.token ); + + // continue sending Blocks until getMissingBlocks is empty. + while ( !upInfos.getMissingBlocks().isEmpty() ) { + // Send all Blocks from upInfos.getMissingBlocks() in ranges. + List<Integer> blocks = upInfos.getMissingBlocks(); + int start = 0; + for ( int i = 0; i < blocks.size() - 1; i++ ) { + if ( blocks.get( i ) != ( blocks.get( i + 1 ) - 1 ) ) { + u.sendRange( start, i ); + u.sendFile( image.path ); + start = i + 1; + } + if ( i == blocks.size() - 2 ) { + u.sendRange( start, blocks.size() - 1 ); + u.sendFile( image.path ); + } + } + } + upInfos = ThriftConnection.getUploadInfos( imDat ); + + } catch ( NoSuchAlgorithmException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch ( CertificateException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch ( FileNotFoundException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch ( IOException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch ( KeyStoreException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch ( KeyManagementException e ) { + // TODO Auto-generated catch block + e.printStackTrace(); } + } try { Thread.sleep( 5 * 60 * 1000 ); |