From afcdbf700dfdee503bd358f322c84e9114470f2e Mon Sep 17 00:00:00 2001 From: Michael Petretti Date: Tue, 15 Jul 2014 14:24:38 +0200 Subject: Rename and clean-up. --- src/main/java/org/openslx/satellitedaemon/App.java | 11 +- .../java/org/openslx/satellitedaemon/Globals.java | 63 +++-- .../filetransfer/FileDownloadWorker.java | 51 ++++ .../filetransfer/FileUploadWorker.java | 85 ++++++ .../filetransfer/ThriftConnection.java | 268 +++++++++++++++++++ .../satellitedaemon/ftp/FtpDownloadWorker.java | 52 ---- .../satellitedaemon/ftp/FtpUploadWorker.java | 87 ------- .../satellitedaemon/ftp/ThriftConnection.java | 289 --------------------- 8 files changed, 445 insertions(+), 461 deletions(-) create mode 100644 src/main/java/org/openslx/satellitedaemon/filetransfer/FileDownloadWorker.java create mode 100644 src/main/java/org/openslx/satellitedaemon/filetransfer/FileUploadWorker.java create mode 100644 src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java delete mode 100644 src/main/java/org/openslx/satellitedaemon/ftp/FtpDownloadWorker.java delete mode 100644 src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java delete mode 100644 src/main/java/org/openslx/satellitedaemon/ftp/ThriftConnection.java diff --git a/src/main/java/org/openslx/satellitedaemon/App.java b/src/main/java/org/openslx/satellitedaemon/App.java index cd99ec0..1805d5a 100644 --- a/src/main/java/org/openslx/satellitedaemon/App.java +++ b/src/main/java/org/openslx/satellitedaemon/App.java @@ -4,10 +4,11 @@ import java.io.IOException; import org.apache.log4j.BasicConfigurator; import org.apache.log4j.Logger; -import org.openslx.satellitedaemon.ftp.FtpDownloadWorker; -import org.openslx.satellitedaemon.ftp.FtpUploadWorker; +import org.openslx.satellitedaemon.filetransfer.FileDownloadWorker; +import org.openslx.satellitedaemon.filetransfer.FileUploadWorker; -/*********************************************************************************************** +/***********************************************************************************************/ +/** * Main class for uploading images from the HS-Server to the Satellite Server. * */ @@ -32,9 +33,9 @@ public class App log.error( "Problem with initializing the SSLContext" ); System.exit( 1 ); } - Thread uploadWorker = new Thread( new FtpUploadWorker() ); + Thread uploadWorker = new Thread( new FileUploadWorker() ); uploadWorker.start(); - Thread downloadWorker = new Thread( new FtpDownloadWorker() ); + Thread downloadWorker = new Thread( new FileDownloadWorker() ); downloadWorker.start(); } } diff --git a/src/main/java/org/openslx/satellitedaemon/Globals.java b/src/main/java/org/openslx/satellitedaemon/Globals.java index afcb3c6..a62ee9e 100644 --- a/src/main/java/org/openslx/satellitedaemon/Globals.java +++ b/src/main/java/org/openslx/satellitedaemon/Globals.java @@ -24,26 +24,28 @@ public class Globals private static boolean loadedProperties = false; private static SSLContext context = null; - /*********************************************************************************************** + /***********************************************************************************************/ + /** * If there are more ints or Strings which should be added to config/global.properties, * add to suiting enum, add a 'case' to getPropertyInt/String() and add checks to * propertiesValid(). * - * As an Example, if you want the value of the FTPSERVERIP you have to call - * Globals.getPropertyString( PropString.FTPSERVERIP ) which returns a string. + * As an Example, if you want the value of the FILETRANSFERSERVERIP you have to call + * Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ) which returns a string. */ public static enum PropInt { - FTPPORT, THRIFTPORT, BLOCKSIZE // More int's? Add them separated with "," + FILETRANSFERPORT, THRIFTPORT, BLOCKSIZE // More int's? Add them separated with "," } public static enum PropString { // More strings's? Add them separated with "," - FTPSERVERIP, KEYSTORETYPE, FTPSKEYSTOREPATH, FTPSKEYSTOREPWD, THRIFTORGANIZATIONNAME, + FILETRANSFERSERVERIP, KEYSTORETYPE, FILETRANSFERSKEYSTOREPATH, FILETRANSFERSKEYSTOREPWD, THRIFTORGANIZATIONNAME, RNDSTRINGENCRYPTALIAS, RNDSTRINGENCRYPTPASSWORD, RNDSTRINGENCRYPTPATH } - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @return * @throws IOException @@ -61,7 +63,8 @@ public class Globals return true; } - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @param props * @return @@ -71,8 +74,8 @@ public class Globals String result = null; switch ( props ) { - case FTPPORT: - result = properties.getProperty( "ftp_port" ); + case FILETRANSFERPORT: + result = properties.getProperty( "filetransfer_port" ); break; case BLOCKSIZE: result = properties.getProperty( "blockSize" ); @@ -90,7 +93,8 @@ public class Globals return Integer.valueOf( result ); } - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @param props * @return @@ -100,17 +104,17 @@ public class Globals String result = null; switch ( props ) { - case FTPSERVERIP: - result = properties.getProperty( "ftp_server_ip" ); + case FILETRANSFERSERVERIP: + result = properties.getProperty( "filetransfer_server_ip" ); break; case KEYSTORETYPE: result = properties.getProperty( "keyStore_type" ); break; - case FTPSKEYSTOREPATH: - result = properties.getProperty( "path_to_ftps_keyStore" ); + case FILETRANSFERSKEYSTOREPATH: + result = properties.getProperty( "path_to_filetransfer_keyStore" ); break; - case FTPSKEYSTOREPWD: - result = properties.getProperty( "ftps_keyStore_password" ); + case FILETRANSFERSKEYSTOREPWD: + result = properties.getProperty( "filetransfer_keyStore_password" ); break; case THRIFTORGANIZATIONNAME: result = properties.getProperty( "organization_name" ); @@ -132,23 +136,24 @@ public class Globals } // TODO: add real checks - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @return */ public static boolean propertiesValid() { - if ( Globals.getPropertyInt( PropInt.FTPPORT ) == 0 + if ( Globals.getPropertyInt( PropInt.FILETRANSFERPORT ) == 0 || Globals.getPropertyInt( PropInt.BLOCKSIZE ) == 0 || Globals.getPropertyInt( PropInt.THRIFTPORT ) == 0 - || Globals.getPropertyString( PropString.FTPSERVERIP ).isEmpty() - || Globals.getPropertyString( PropString.FTPSERVERIP ) == null + || Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ).isEmpty() + || Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ) == null || Globals.getPropertyString( PropString.KEYSTORETYPE ).isEmpty() || Globals.getPropertyString( PropString.KEYSTORETYPE ) == null - || Globals.getPropertyString( PropString.FTPSKEYSTOREPATH ).isEmpty() - || Globals.getPropertyString( PropString.FTPSKEYSTOREPATH ) == null - || Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ).isEmpty() - || Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ) == null + || Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPATH ).isEmpty() + || Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPATH ) == null + || Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPWD ).isEmpty() + || Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPWD ) == null || Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ).isEmpty() || Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ) == null || Globals.getPropertyString( PropString.RNDSTRINGENCRYPTALIAS ).isEmpty() @@ -164,17 +169,18 @@ public class Globals } } - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @return */ public static boolean masterServerSslContextInit() { - char[] passphrase = Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ).toCharArray(); + char[] passphrase = Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPWD ).toCharArray(); KeyStore keystore; try { keystore = KeyStore.getInstance( "JKS" ); - keystore.load( new FileInputStream( Globals.getPropertyString( PropString.FTPSKEYSTOREPATH ) ), passphrase ); + keystore.load( new FileInputStream( Globals.getPropertyString( PropString.FILETRANSFERSKEYSTOREPATH ) ), passphrase ); TrustManagerFactory tmf = TrustManagerFactory.getInstance( TrustManagerFactory.getDefaultAlgorithm() ); tmf.init( keystore ); context = SSLContext.getInstance( "SSLv3" ); @@ -203,7 +209,8 @@ public class Globals } - /*********************************************************************************************** + /***********************************************************************************************/ + /** * * @return */ diff --git a/src/main/java/org/openslx/satellitedaemon/filetransfer/FileDownloadWorker.java b/src/main/java/org/openslx/satellitedaemon/filetransfer/FileDownloadWorker.java new file mode 100644 index 0000000..e1ba7e9 --- /dev/null +++ b/src/main/java/org/openslx/satellitedaemon/filetransfer/FileDownloadWorker.java @@ -0,0 +1,51 @@ +package org.openslx.satellitedaemon.filetransfer; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.log4j.Logger; +import org.openslx.filetransfer.Downloader; +import org.openslx.imagemaster.thrift.iface.DownloadInfos; +import org.openslx.satellitedaemon.Globals; +import org.openslx.satellitedaemon.Globals.PropInt; +import org.openslx.satellitedaemon.Globals.PropString; +import org.openslx.satellitedaemon.db.DbImage; + + +public class FileDownloadWorker implements Runnable +{ + private static Logger log = Logger.getLogger( FileUploadWorker.class ); + + @Override + public void run() + { + while ( true ) { + List imageList = DbImage.getAllMarkedForDownload(); + log.info( "FILTRANSFERDownloadWorker: imageList Contains " + imageList.size() + " items." ); + for ( DbImage image : imageList ) { + + List range = new ArrayList(); + for (long i = 0; i < (image.fileSize / Globals.getPropertyInt( PropInt.BLOCKSIZE )); i++) { + range.add( (int) i ); + } + DownloadInfos downInfos = ThriftConnection.getDownloadInfos( image, range ); + if ( downInfos == null ) { + log.error( "The DownloadInfos returned by ThriftConnection class are null" ); + } + + Downloader d = new Downloader( Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ), downInfos.port, Globals.getMasterServerSslContext() ); + d.sendToken( downInfos.token ); + d.setOutputFilename( "/home/michael/Downloads/tescht.whatever" ); + while ( d.readMetaData() ) + d.readBinary(); + } + try { + Thread.sleep( 5 * 60 * 1000 ); + } catch ( InterruptedException e ) { + Thread.currentThread().interrupt(); + return; + } + } + + } +} diff --git a/src/main/java/org/openslx/satellitedaemon/filetransfer/FileUploadWorker.java b/src/main/java/org/openslx/satellitedaemon/filetransfer/FileUploadWorker.java new file mode 100644 index 0000000..8e66ea9 --- /dev/null +++ b/src/main/java/org/openslx/satellitedaemon/filetransfer/FileUploadWorker.java @@ -0,0 +1,85 @@ +package org.openslx.satellitedaemon.filetransfer; + +import java.util.List; +import java.util.UUID; + +import org.apache.log4j.Logger; +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; +import org.openslx.satellitedaemon.db.DbImage; + +public class FileUploadWorker implements Runnable +{ + private static Logger log = Logger.getLogger( FileUploadWorker.class ); + + @Override + public void run() + { + while ( true ) { + // This List contains all Images in the Database that should be uploaded. + List imageList = DbImage.getAllMarkedForUpload(); + log.info( "FILTRANSFERUploadWorker: 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 ); + + ImageData imDat = new ImageData( UUID.randomUUID().toString(), image.rid, + image.name, System.currentTimeMillis(), System.currentTimeMillis(), image.creator, "anyThing", + true, false, "best", "theVeryBest", image.fileSize ); + + // uploadInfo and ThriftAuthentication + String crcPath = image.path.concat( ".crc" ); + UploadInfos upInfos = ThriftConnection.getUploadInfos( imDat, crcPath ); + if ( upInfos == null ) { + log.error( "The UploadInfos returned by ThriftConnection Class are null" ); + + return; + + // FIXME: And then..? If you just continue, you'll run into a null pointer exception + + } + log.info( "Got upInfos. Trying to create Uploader with token: " + upInfos.token ); + + // creating the uploader with the "context"-item. + Uploader u = new Uploader( Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ), upInfos.port, Globals.getMasterServerSslContext() ); + u.sendToken( upInfos.token ); + + // continue sending Blocks until getMissingBlocks is empty. + while ( !upInfos.getMissingBlocks().isEmpty() ) { + // Send all Blocks from upInfos.getMissingBlocks() in ranges. + List 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 * Globals.getPropertyInt( PropInt.BLOCKSIZE ), i * Globals.getPropertyInt( PropInt.BLOCKSIZE ) ); + u.sendFile( image.path ); + start = i + 1; + } + if ( i == blocks.size() - 2 ) { + u.sendRange( start * Globals.getPropertyInt( PropInt.BLOCKSIZE ), ( blocks.size() - 1 ) * Globals.getPropertyInt( PropInt.BLOCKSIZE ) ); + u.sendFile( image.path ); + } + } + upInfos = ThriftConnection.getUploadInfos( imDat ); + } + u.close(); + } + try { + Thread.sleep( 5 * 60 * 1000 ); + // Thread.sleep( 1000 ); + } catch ( InterruptedException e ) { + Thread.currentThread().interrupt(); + return; + } + } + + } +} diff --git a/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java b/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java new file mode 100644 index 0000000..b656a84 --- /dev/null +++ b/src/main/java/org/openslx/satellitedaemon/filetransfer/ThriftConnection.java @@ -0,0 +1,268 @@ +package org.openslx.satellitedaemon.filetransfer; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.nio.ByteBuffer; +import java.security.InvalidKeyException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SignatureException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.util.List; + +import org.apache.log4j.Logger; +import org.apache.thrift.TException; +import org.apache.thrift.protocol.TBinaryProtocol; +import org.apache.thrift.protocol.TProtocol; +import org.apache.thrift.transport.TSocket; +import org.apache.thrift.transport.TTransport; +import org.openslx.imagemaster.crcchecker.CRCFile; +import org.openslx.imagemaster.thrift.iface.DownloadInfos; +import org.openslx.imagemaster.thrift.iface.ImageData; +import org.openslx.imagemaster.thrift.iface.ImageServer; +import org.openslx.imagemaster.thrift.iface.ServerAuthenticationException; +import org.openslx.imagemaster.thrift.iface.ServerSessionData; +import org.openslx.imagemaster.thrift.iface.UploadInfos; +import org.openslx.satellitedaemon.Globals; +import org.openslx.satellitedaemon.Globals.PropInt; +import org.openslx.satellitedaemon.Globals.PropString; +import org.openslx.satellitedaemon.db.DbImage; +import org.openslx.satellitedaemon.util.EncryptWithServerIdPublicKey; + +// TODO: Handle all the auto-generated catch blocks in a meaningful way + +/***********************************************************************************************/ +/** + * Handles the authentication with the Satellite Server and sends the FILTRANSFERCredentials, which + * are necessary for the upload of the image. + */ +public class ThriftConnection +{ + private static ImageServer.Client client = null; + private static ServerSessionData sSD = null; + private static Logger log = Logger.getLogger( ThriftConnection.class ); + private static CRCFile crc = null; + + /***********************************************************************************************/ + /** + * Method for getting UploadeInfos + * + * !! on the first Call !! + * + * when the CRCsum need to be transfered. + * The method calls getConnection() to check if the connection is ok + * and to get the ServerSessionData. If connection is ok, it calls + * submitImage with CRCsum in List. + * + * @return returns 'null' if there is a problem. + */ + public static UploadInfos getUploadInfos( ImageData imDat, String filename ) + { + ImageServer.Client theClient = null; + try { + theClient = getConnection(); + if ( theClient == null ) { + log.error( "Client was null!" ); + return null; + } + // .submitImage needs the List from CRCFile.getCRCs() only + // on the first time called. null afterwards. + log.info( "First call of submitImage following..." ); + crc = new CRCFile( filename ); + log.info( "Made CRCFile from " + filename ); + return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() ); + } catch ( TException e ) { + log.error("TException"); + } catch ( UnrecoverableKeyException e ) { + log.error("UnrecoverableKeyException"); + } catch ( InvalidKeyException e ) { + log.error("InvalidKeyException"); + } catch ( NoSuchAlgorithmException e ) { + log.error("NoSuchAlgorithmException"); + } catch ( CertificateException e ) { + log.error("CertificateException"); + } catch ( FileNotFoundException e ) { + log.error("FileNotFoundException"); + } catch ( KeyStoreException e ) { + log.error("KeyStoreException"); + } catch ( SignatureException e ) { + log.error("SignatureException"); + } catch ( IOException e ) { + log.error("IOException"); + } + return null; + } + + /***********************************************************************************************/ + /** + * Method for getting UploadeInfos when CRCsum was already transfered on first call. + * The method calls getConnection() to check if the connection is ok + * and to get the ServerSessionData. If connection is ok, it calls + * submitImage with sSD.sessionId, imDat and !!null!! + * + * @return returns 'null' if there is a problem. + */ + public static UploadInfos getUploadInfos( ImageData imDat ) + { + ImageServer.Client theClient = null; + try { + theClient = getConnection(); + if ( theClient == null ) { + log.error( "Client was null!" ); + return null; + } + // .submitImage needs the List from CRCFile.getCRCs() only + // on the first time called. null afterwards. + return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() ); + } catch ( TException e ) { + log.error("TException"); + } catch ( UnrecoverableKeyException e ) { + log.error("UnrecoverableKeyException"); + } catch ( InvalidKeyException e ) { + log.error("InvalidKeyException"); + } catch ( NoSuchAlgorithmException e ) { + log.error("NoSuchAlgorithmException"); + } catch ( CertificateException e ) { + log.error("CertificateException"); + } catch ( FileNotFoundException e ) { + log.error("FileNotFoundException"); + } catch ( KeyStoreException e ) { + log.error("KeyStoreException"); + } catch ( SignatureException e ) { + log.error("SignatureException"); + } catch ( IOException e ) { + log.error("IOException"); + } + return null; + } + + /***********************************************************************************************/ + /** + * Method for getting DonwloadInfos. Calls getConnection if client was null. + * You need to spezifie all Blocks you want to have in an List. + * + * @return returns 'null' if there is a problem. + */ + public static DownloadInfos getDownloadInfos( DbImage imDat, List range ) + { + ImageServer.Client theClient = null; + try { + theClient = getConnection(); + if ( theClient == null ) { + log.error( "Client was null!" ); + return null; + } + + return theClient.getImage( imDat.guid, sSD.sessionId, range ); + } catch ( TException e ) { + log.error("TException"); + } catch ( UnrecoverableKeyException e ) { + log.error("UnrecoverableKeyException"); + } catch ( InvalidKeyException e ) { + log.error("InvalidKeyException"); + } catch ( NoSuchAlgorithmException e ) { + log.error("NoSuchAlgorithmException"); + } catch ( CertificateException e ) { + log.error("CertificateException"); + } catch ( FileNotFoundException e ) { + log.error("FileNotFoundException"); + } catch ( KeyStoreException e ) { + log.error("KeyStoreException"); + } catch ( SignatureException e ) { + log.error("SignatureException"); + } catch ( IOException e ) { + log.error("IOException"); + } + return null; + } + + /***********************************************************************************************/ + /** + * This method checks if there is already a working connection. If not, + * newClient() establishes one. Also it does the Authentication if not done + * yet. + * + * @return returns the client if successful. + */ + private static ImageServer.Client getConnection() + throws UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, + FileNotFoundException, KeyStoreException, IOException, InvalidKeyException, SignatureException + { + ImageServer.Client theClient = null; + boolean isAuthenticated = false; + if ( client == null ) { + log.info( "The global client was null. Making a new client ..." ); + theClient = newClient(); + if ( theClient == null ) { + log.debug( "ThriftConnection: The client was null after newClient()" ); + return null; + } + } else { + log.info( "The global Client was already used. Setting isAuthenticated = true." ); + theClient = client; + isAuthenticated = true; + } + // try { + // isAuthenticated = theClient.ping(); + // } catch ( TException x ) { + // theClient = newClient(); + // if ( theClient == null ) { + // return null; + // } + // } + if ( !isAuthenticated ) { + log.info( "ThriftConnection: Client not yet Authenticated. Trying..." ); + String toEncrypt; + if ( theClient == null ) { + log.debug( "The client was null" ); + return null; + } + try { + toEncrypt = theClient.startServerAuthentication( Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ) ); + log.info( "The random String we want to encrypt: " + toEncrypt ); + EncryptWithServerIdPublicKey rse = new EncryptWithServerIdPublicKey( Globals.getPropertyString( PropString.RNDSTRINGENCRYPTALIAS ), + Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPASSWORD ), + Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPATH ) ); + byte[] byteArray = rse.encryptString( toEncrypt ); + sSD = theClient.serverAuthenticate( + Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ), ByteBuffer.wrap( byteArray ) ); + } catch ( ServerAuthenticationException e ) { + log.error( "ThriftConnection: ServerAuthenticationException: Server Authetication was not sucessful." ); + e.printStackTrace(); + return null; + } catch ( TException e ) { + log.error( "ThriftConnection: TException: Server Authetication was not sucessful." ); + e.printStackTrace(); + return null; + } + log.info( "is Authenticated." ); + + } + client = theClient; + return theClient; + } + + /***********************************************************************************************/ + /** + * + * @return + */ + private static ImageServer.Client newClient() + { + ImageServer.Client newClient = null; + try { + TTransport transport; + transport = new TSocket( Globals.getPropertyString( PropString.FILETRANSFERSERVERIP ), Globals.getPropertyInt( PropInt.THRIFTPORT ) ); + transport.open(); + TProtocol protocol = new TBinaryProtocol( transport ); + newClient = new ImageServer.Client( protocol ); + log.debug( "ThriftConnection: Made a new Client" ); + } catch ( TException x ) { + log.error( "ThriftConnection coudn't create new client." ); + x.printStackTrace(); + return null; + } + return newClient; + } +} diff --git a/src/main/java/org/openslx/satellitedaemon/ftp/FtpDownloadWorker.java b/src/main/java/org/openslx/satellitedaemon/ftp/FtpDownloadWorker.java deleted file mode 100644 index 73e0b03..0000000 --- a/src/main/java/org/openslx/satellitedaemon/ftp/FtpDownloadWorker.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.openslx.satellitedaemon.ftp; - -import java.util.ArrayList; -import java.util.List; - -import org.apache.log4j.Logger; -import org.openslx.filetransfer.Downloader; -import org.openslx.imagemaster.thrift.iface.DownloadInfos; -import org.openslx.satellitedaemon.Globals; -import org.openslx.satellitedaemon.Globals.PropInt; -import org.openslx.satellitedaemon.Globals.PropString; -import org.openslx.satellitedaemon.db.DbImage; - - -public class FtpDownloadWorker implements Runnable -{ - private static Logger log = Logger.getLogger( FtpUploadWorker.class ); - - @Override - public void run() - { - while ( true ) { - List imageList = DbImage.getAllMarkedForDownload(); - log.info( "FtpDownloadWorker: imageList Contains " + imageList.size() + " items." ); - for ( DbImage image : imageList ) { - - List range = new ArrayList(); - for (long i = 0; i < (image.fileSize / Globals.getPropertyInt( PropInt.BLOCKSIZE )); i++) { - range.add( (int) i ); - } - DownloadInfos downInfos = ThriftConnection.getDownloadInfos( image, range ); - if ( downInfos == null ) { - log.error( "The DownloadInfos returned by ThriftConnection class are null" ); - } - - Downloader d = new Downloader( Globals.getPropertyString( PropString.FTPSERVERIP ), downInfos.port, Globals.getMasterServerSslContext() ); - d.sendToken( downInfos.token ); - d.setOutputFilename( "/home/michael/Downloads/tescht.whatever" ); - while ( d.readMetaData() ) - d.readBinary(); - - } - try { - Thread.sleep( 5 * 60 * 1000 ); - } catch ( InterruptedException e ) { - Thread.currentThread().interrupt(); - return; - } - } - - } -} diff --git a/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java b/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java deleted file mode 100644 index 4445a2e..0000000 --- a/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java +++ /dev/null @@ -1,87 +0,0 @@ -package org.openslx.satellitedaemon.ftp; - -import java.util.List; -import java.util.UUID; - -import org.apache.log4j.Logger; -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; -import org.openslx.satellitedaemon.db.DbImage; - -// TODO: Rename all this FTP* Stuff (also the constants in Globals) now that we're not using ftp anymore - -public class FtpUploadWorker implements Runnable -{ - private static Logger log = Logger.getLogger( FtpUploadWorker.class ); - - @Override - public void run() - { - while ( true ) { - // This List contains all Images in the Database that should be uploaded. - List 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 ); - - ImageData imDat = new ImageData( UUID.randomUUID().toString(), image.rid, - image.name, System.currentTimeMillis(), System.currentTimeMillis(), image.creator, "anyThing", - true, false, "best", "theVeryBest", image.fileSize ); - - // uploadInfo and ThriftAuthentication - String crcPath = image.path.concat( ".crc" ); - UploadInfos upInfos = ThriftConnection.getUploadInfos( imDat, crcPath ); - if ( upInfos == null ) { - log.error( "The UploadInfos returned by ThriftConnection Class are null" ); - - return; - - // FIXME: And then..? If you just continue, you'll run into a null pointer exception - - } - log.info( "Got upInfos. Trying to create Uploader with token: " + upInfos.token ); - - // creating the uploader with the "context"-item. - Uploader u = new Uploader( Globals.getPropertyString( PropString.FTPSERVERIP ), upInfos.port, Globals.getMasterServerSslContext() ); - u.sendToken( upInfos.token ); - - // continue sending Blocks until getMissingBlocks is empty. - while ( !upInfos.getMissingBlocks().isEmpty() ) { - // Send all Blocks from upInfos.getMissingBlocks() in ranges. - List 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 * Globals.getPropertyInt( PropInt.BLOCKSIZE ), i * Globals.getPropertyInt( PropInt.BLOCKSIZE )); - u.sendFile( image.path ); - start = i + 1; - } - if ( i == blocks.size() - 2 ) { // TODO: != - u.sendRange( start * Globals.getPropertyInt( PropInt.BLOCKSIZE ), (blocks.size() - 1) * Globals.getPropertyInt( PropInt.BLOCKSIZE ) ); - u.sendFile( image.path ); - } - } - upInfos = ThriftConnection.getUploadInfos( imDat ); - } - u.close(); - } - try { - Thread.sleep( 5 * 60 * 1000 ); - // Thread.sleep( 1000 ); - } catch ( InterruptedException e ) { - Thread.currentThread().interrupt(); - return; - } - } - - } -} diff --git a/src/main/java/org/openslx/satellitedaemon/ftp/ThriftConnection.java b/src/main/java/org/openslx/satellitedaemon/ftp/ThriftConnection.java deleted file mode 100644 index 5d67635..0000000 --- a/src/main/java/org/openslx/satellitedaemon/ftp/ThriftConnection.java +++ /dev/null @@ -1,289 +0,0 @@ -package org.openslx.satellitedaemon.ftp; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.ByteBuffer; -import java.security.InvalidKeyException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.SignatureException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateException; -import java.util.List; - -import org.apache.log4j.Logger; -import org.apache.thrift.TException; -import org.apache.thrift.protocol.TBinaryProtocol; -import org.apache.thrift.protocol.TProtocol; -import org.apache.thrift.transport.TSocket; -import org.apache.thrift.transport.TTransport; -import org.openslx.imagemaster.crcchecker.CRCFile; -import org.openslx.imagemaster.thrift.iface.DownloadInfos; -import org.openslx.imagemaster.thrift.iface.ImageData; -import org.openslx.imagemaster.thrift.iface.ImageServer; -import org.openslx.imagemaster.thrift.iface.ServerAuthenticationException; -import org.openslx.imagemaster.thrift.iface.ServerSessionData; -import org.openslx.imagemaster.thrift.iface.UploadInfos; -import org.openslx.satellitedaemon.Globals; -import org.openslx.satellitedaemon.Globals.PropInt; -import org.openslx.satellitedaemon.Globals.PropString; -import org.openslx.satellitedaemon.db.DbImage; -import org.openslx.satellitedaemon.util.EncryptWithServerIdPublicKey; - -// TODO: Handle all the auto-generated catch blocks in a meaningful way - -/*********************************************************************************************** - * Handles the authentication with the Satellite Server and sends the FtpCredentials, which - * are necessary for the upload of the image. - */ -public class ThriftConnection -{ - private static ImageServer.Client client = null; - private static ServerSessionData sSD = null; - private static Logger log = Logger.getLogger( ThriftConnection.class ); - private static CRCFile crc = null; - - /*********************************************************************************************** - * Method for getting UploadeInfos - * - * !! on the first Call !! - * - * when the CRCsum need to be transfered. - * The method calls getConnection() to check if the connection is ok - * and to get the ServerSessionData. If connection is ok, it calls - * submitImage with CRCsum in List. - * - * @return returns 'null' if there is a problem. - */ - public static UploadInfos getUploadInfos( ImageData imDat, String filename ) - { - ImageServer.Client theClient = null; - try { - theClient = getConnection(); - if ( theClient == null ) { - log.error( "Client was null!" ); - return null; - } - // .submitImage needs the List from CRCFile.getCRCs() only - // on the first time called. null afterwards. - log.info( "First call of submitImage following..." ); - crc = new CRCFile( filename ); - log.info( "Made CRCFile from " + filename ); - return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() ); - } catch ( TException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( UnrecoverableKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( InvalidKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } 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 ( KeyStoreException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( SignatureException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( IOException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - } - - /*********************************************************************************************** - * Method for getting UploadeInfos when CRCsum was already transfered on first call. - * The method calls getConnection() to check if the connection is ok - * and to get the ServerSessionData. If connection is ok, it calls - * submitImage with sSD.sessionId, imDat and !!null!! - * - * @return returns 'null' if there is a problem. - */ - public static UploadInfos getUploadInfos( ImageData imDat ) - { - ImageServer.Client theClient = null; - try { - theClient = getConnection(); - if ( theClient == null ) { - log.error( "Client was null!" ); - return null; - } - // .submitImage needs the List from CRCFile.getCRCs() only - // on the first time called. null afterwards. - return theClient.submitImage( sSD.sessionId, imDat, crc.getCrcSums() ); - } catch ( TException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( UnrecoverableKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( InvalidKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } 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 ( KeyStoreException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( SignatureException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( IOException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - } - - /*********************************************************************************************** - * Method for getting DonwloadInfos. Calls getConnection if client was null. - * You need to spezifie all Blocks you want to have in an List. - * - * @return returns 'null' if there is a problem. - */ - public static DownloadInfos getDownloadInfos( DbImage imDat, List range ) - { - ImageServer.Client theClient = null; - try { - theClient = getConnection(); - if ( theClient == null ) { - log.error( "Client was null!" ); - return null; - } - - return theClient.getImage( imDat.guid, sSD.sessionId, range ); - } catch ( TException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( UnrecoverableKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( InvalidKeyException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } 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 ( KeyStoreException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( SignatureException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } catch ( IOException e ) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - return null; - } - - /*********************************************************************************************** - * This method checks if there is already a working connection. If not, - * newClient() establishes one. Also it does the Authentication if not done - * yet. - * - * @return returns the client if successful. - */ - private static ImageServer.Client getConnection() - throws UnrecoverableKeyException, NoSuchAlgorithmException, CertificateException, - FileNotFoundException, KeyStoreException, IOException, InvalidKeyException, SignatureException - { - ImageServer.Client theClient = null; - boolean isAuthenticated = false; - if ( client == null ) { - log.info( "The global client was null. Making a new client ..." ); - theClient = newClient(); - if ( theClient == null ) { - log.debug( "ThriftConnection: The client was null after newClient()" ); - return null; - } - } else { - log.info( "The global Client was already used. Setting isAuthenticated = true." ); - theClient = client; - isAuthenticated = true; - } - // try { - // isAuthenticated = theClient.ping(); - // } catch ( TException x ) { - // theClient = newClient(); - // if ( theClient == null ) { - // return null; - // } - // } - if ( !isAuthenticated ) { - log.info( "ThriftConnection: Client not yet Authenticated. Trying..." ); - String toEncrypt; - if ( theClient == null ) { - log.debug( "The client was null" ); - return null; - } - try { - toEncrypt = theClient.startServerAuthentication( Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ) ); - log.info( "The random String we want to encrypt: " + toEncrypt ); - EncryptWithServerIdPublicKey rse = new EncryptWithServerIdPublicKey( Globals.getPropertyString( PropString.RNDSTRINGENCRYPTALIAS ), - Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPASSWORD ), - Globals.getPropertyString( PropString.RNDSTRINGENCRYPTPATH ) ); - byte[] byteArray = rse.encryptString( toEncrypt ); - sSD = theClient.serverAuthenticate( - Globals.getPropertyString( PropString.THRIFTORGANIZATIONNAME ), ByteBuffer.wrap( byteArray ) ); - } catch ( ServerAuthenticationException e ) { - log.error( "ThriftConnection: ServerAuthenticationException: Server Authetication was not sucessful." ); - e.printStackTrace(); - return null; - } catch ( TException e ) { - log.error( "ThriftConnection: TException: Server Authetication was not sucessful." ); - e.printStackTrace(); - return null; - } - log.info( "is Authenticated." ); - - } - client = theClient; - return theClient; - } - - /*********************************************************************************************** - * - * @return - */ - private static ImageServer.Client newClient() - { - ImageServer.Client newClient = null; - try { - TTransport transport; - transport = new TSocket( Globals.getPropertyString( PropString.FTPSERVERIP ), Globals.getPropertyInt( PropInt.THRIFTPORT ) ); - transport.open(); - TProtocol protocol = new TBinaryProtocol( transport ); - newClient = new ImageServer.Client( protocol ); - log.debug( "ThriftConnection: Made a new Client" ); - } catch ( TException x ) { - log.error( "ThriftConnection coudn't create new client." ); - x.printStackTrace(); - return null; - } - return newClient; - } -} -- cgit v1.2.3-55-g7522