summaryrefslogblamecommitdiffstats
path: root/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java
blob: 3ee624ee240211365c0cf5455a0364dd59ffef57 (plain) (tree)
1
2
3
4
5
6
7
8
9
10

                                        
                               
                                     
                           
                                            



                                               
                      
 
                                


                                         
                               
                                         
                                                      
                                                        


                                                      



                                                
                                                                              



                         
                                
                                                                                                 
                                                                                  
                                                                                                          

                                                            
                                                           
                                                                                                                    


                                                                                                                                              

                                                                                                                          
                                     








                                                                                                                                                     
 



                                                                                                                           
                                         









































                                                                                                                                                                             
                                 
 



                                                              
                                                                                  




                                                    
 
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<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 );
				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<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 );
			} catch ( InterruptedException e ) {
				log.error( "FtpUploadWorker: Sleep interrupted" );
				e.printStackTrace();
			}
		}

	}
}