package org.openslx.satellitedaemon.ftp; 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.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; 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 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 ); char[] passphrase = Globals.getPropertyString( PropString.FTPSKEYSTOREPWD ).toCharArray(); KeyStore keystore; try { // 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 ); // uploadInfo and ThriftAuthentication UploadInfos upInfos = ThriftConnection.getUploadInfos( imDat ); if ( upInfos == null ) { log.error( "The UploadInfos returned by ThriftConnection Class are null" ); } // 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 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 ); } catch ( InterruptedException e ) { log.error( "FtpUploadWorker: Sleep interrupted" ); e.printStackTrace(); } } } }