summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/satellitedaemon/ftp/FtpUploadWorker.java
blob: 4fe2d61007935d83574a73f185aa2291b1d92a11 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
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 java.util.UUID;

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.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 );
				
				ImageData imDat = new ImageData( UUID.randomUUID().toString(), 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
					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;
					}
					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, 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 ) ) {
//								log.info( "Sending Blocks numbered from " + start + " up to " + i );
//								u.sendRange( start *16*1024*1024, i*16*1024*1024 );
//								u.sendFile( image.path );
//								log.info( "... DONE!" );
//								start = i + 1;
//							}
//							if ( i == blocks.size() - 2 ) {
//								log.info( "Sending Blocks numbered from " + start + " up to " + i );
//								u.sendRange( start*16*1024*1024, (blocks.size() - 1)*16*1024*1024 );
//								u.sendFile( image.path );
//							}
//						}
//					}
//					upInfos = ThriftConnection.getUploadInfos( imDat );
					log.info("Using file:" + image.path );
					u.sendRange( 254, 254 + 255 );
					u.sendFile( image.path );
					

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

	}
}