summaryrefslogtreecommitdiffstats
path: root/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java')
-rw-r--r--src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java196
1 files changed, 79 insertions, 117 deletions
diff --git a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java
index 12b5701..9340706 100644
--- a/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java
+++ b/src/main/java/org/openslx/imagemaster/serverconnection/ConnectionHandler.java
@@ -1,17 +1,11 @@
package org.openslx.imagemaster.serverconnection;
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.UnrecoverableKeyException;
-import java.security.cert.CertificateException;
+import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@@ -20,16 +14,22 @@ import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
-import org.apache.commons.lang.mutable.MutableInt;
import org.apache.log4j.Logger;
+import org.openslx.bwlp.thrift.iface.ImagePublishData;
+import org.openslx.bwlp.thrift.iface.InvocationError;
+import org.openslx.bwlp.thrift.iface.TInvocationException;
+import org.openslx.bwlp.thrift.iface.TTransferRejectedException;
+import org.openslx.bwlp.thrift.iface.TransferInformation;
import org.openslx.filetransfer.Downloader;
-import org.openslx.filetransfer.FileRange;
import org.openslx.filetransfer.IncomingEvent;
import org.openslx.filetransfer.Listener;
import org.openslx.filetransfer.Uploader;
-import org.openslx.filetransfer.WantRangeCallback;
import org.openslx.imagemaster.Globals;
-import org.openslx.imagemaster.db.DbImage;
+import org.openslx.imagemaster.crcchecker.CrcFile;
+import org.openslx.imagemaster.db.mappers.DbOsVirt;
+import org.openslx.imagemaster.db.mappers.DbUser;
+import org.openslx.imagemaster.util.RandomString;
+import org.openslx.imagemaster.util.Util;
/**
* Class to handle all incoming and outgoing connections.
@@ -41,8 +41,8 @@ public class ConnectionHandler implements IncomingEvent
private static Logger log = Logger.getLogger( ConnectionHandler.class );
private static SSLContext sslContext;
- private static Map<String, UploadingImage> pendingIncomingUploads = new ConcurrentHashMap<>();
- private static Map<String, DbImage> pendingIncomingDownloads = new ConcurrentHashMap<>();
+ private static Map<String, AbstractTransfer> pendingIncomingUploads = new ConcurrentHashMap<>();
+ private static Map<String, AbstractTransfer> pendingIncomingDownloads = new ConcurrentHashMap<>();
private static IncomingEvent eventHandler = new ConnectionHandler();
private static ThreadPoolExecutor uploadPool = new ThreadPoolExecutor( 0, 5, 6, TimeUnit.MINUTES, new SynchronousQueue<Runnable>() );
private static ThreadPoolExecutor downloadPool = new ThreadPoolExecutor( 0, 5, 6, TimeUnit.MINUTES, new SynchronousQueue<Runnable>() );
@@ -61,40 +61,75 @@ public class ConnectionHandler implements IncomingEvent
sslContext = SSLContext.getInstance( "SSLv3" );
KeyManager[] keyManagers = kmf.getKeyManagers();
sslContext.init( keyManagers, null, null );
- listener = new Listener( eventHandler, sslContext, Globals.getSslSocketPort() );
+ listener = new Listener( eventHandler, sslContext, Globals.getSslSocketPort(), 15000 );
listener.start();
- } catch ( FileNotFoundException e ) {
- log.error( "Could not find keystore." );
- System.exit( 2 );
- } catch ( KeyStoreException e ) {
- log.error( "KeyStore implemenation not supported." );
- System.exit( 2 );
- } catch ( NoSuchAlgorithmException e ) {
- log.error( "Could not find such Algorithm" );
- System.exit( 2 );
- } catch ( CertificateException e ) {
- log.error( "Certificate unvalid." );
- System.exit( 2 );
- } catch ( IOException e ) {
- log.error( "Could not read keyfile" );
- System.exit( 2 );
- } catch ( UnrecoverableKeyException e ) {
- log.error( "Key in keystore is not valid" );
- System.exit( 2 );
- } catch ( KeyManagementException e ) {
- log.error( "Context initialization failed." );
+ } catch ( Exception e ) {
+ log.error( "Initialization failed.", e );
System.exit( 2 );
}
}
/**
+ * Checks if this image is already uploading and returns a new list with missing blocks if so.
+ * Puts the new image into processing list else.
+ *
+ * @param serverSessionId The uploading server
+ * @param imageData The data of the image
+ * @return
+ * @throws UploadException If some error occurred during the process
+ */
+ public static TransferInformation getUploadInfos( ImagePublishData imageData, List<Integer> crcSums )
+ throws TTransferRejectedException, TInvocationException
+ {
+ // check image data
+ if ( Util.isEmpty( imageData.imageName ) )
+ throw new TInvocationException( InvocationError.INVALID_DATA, "Image name not set" );
+ if ( !DbUser.exists( imageData.user ) )
+ throw new TInvocationException( InvocationError.INVALID_DATA, "Invalid or missing image owner" );
+ if ( DbOsVirt.osExists( imageData.osId ) )
+ throw new TInvocationException( InvocationError.INVALID_DATA, "Content operating system not set" );
+ if ( DbOsVirt.virtExists( imageData.virtId ) )
+ throw new TInvocationException( InvocationError.INVALID_DATA, "Content virtualizer system not set" );
+ if ( imageData.fileSize <= 0 )
+ throw new TInvocationException( InvocationError.INVALID_DATA, "File size is too small" );
+
+ log.debug( "A satellite is submitting " + imageData.imageVersionId );
+
+ final String uuid = imageData.imageVersionId;
+ final String filepathRelative;
+ final CrcFile crcFile;
+ if ( crcSums == null ) {
+ crcFile = null;
+ } else {
+ crcFile = new CrcFile( crcSums );
+ }
+ ImagePublishData image;
+
+ synchronized ( pendingIncomingUploads ) {
+ /*
+ // check if image is already uploading
+ if ( ( image = uploadingImages.get( uuid ) ) == null ) {
+ // TODO insert new image to DB
+ uploadingImages.put( uuid, image );
+ }
+ */
+ }
+
+ final String token = RandomString.generate( 50, false );
+
+ // TODO addUpload( token, image );
+ // TODO Set crc file on image - if there is already a crc file assigned, this does nothing
+ return new TransferInformation( token, Globals.getPlainSocketPort(), Globals.getSslSocketPort() );
+ }
+
+ /**
* Add a new allowed incoming upload connection
* for the given token and image.
*
* @param token The unique token
* @param image Image being uploaded
*/
- public static void addUpload( String token, UploadingImage image )
+ public static void addUpload( String token, AbstractTransfer image )
{
pendingIncomingUploads.put( token, image );
log.debug( "Added upload" );
@@ -107,7 +142,7 @@ public class ConnectionHandler implements IncomingEvent
* @param token The unique token
* @param image Image being uploaded
*/
- public static void addDownload( String token, DbImage image )
+ public static void addDownload( String token, AbstractTransfer image )
{
pendingIncomingDownloads.put( token, image );
log.debug( "Added download" );
@@ -117,94 +152,21 @@ public class ConnectionHandler implements IncomingEvent
* Server is uploading - client is downloading!
*/
@Override
- public void incomingUploader( final Uploader uploader )
+ public void incomingDownloadRequest( final Uploader uploader )
{
- String token = uploader.getToken();
- // check token to identify the client
- if ( token == null ) {
- uploader.sendErrorCode( "No token available." );
- uploader.close( null );
- return;
- }
-
- final DbImage image = pendingIncomingDownloads.remove( token );
- if ( image == null ) {
- uploader.sendErrorCode( "Token not accepted." );
- uploader.close( null );
- return;
- }
-
- try {
- uploadPool.execute( new Runnable() {
- @Override
- public void run()
- {
- uploader.upload( image.getAbsolutePath() );
- }
- } );
- } catch ( RejectedExecutionException e ) {
- uploader.sendErrorCode( "Too many concurrent uploads." );
- uploader.close( null );
- }
+ // TODO
+ uploader.sendErrorCode( "Too many concurrent uploads." );
+ uploader.cancel();
}
/**
* Server is downloading - client is uploading!
*/
@Override
- public void incomingDownloader( final Downloader downloader ) throws IOException
+ public void incomingUploadRequest( final Downloader downloader ) throws IOException
{
- log.debug( "Client wants to upload" );
- String token = downloader.getToken();
- if ( token == null )
- {
- downloader.sendErrorCode( "No token available." );
- downloader.close( null );
- return;
- }
-
- final UploadingImage image = pendingIncomingUploads.remove( token );
- if ( image == null ) {
- downloader.sendErrorCode( "Token not accepted." );
- downloader.close( null );
- return;
- }
- final MutableInt lastBlock = new MutableInt( -1 );
-
- try {
- downloadPool.execute( new Runnable() {
- @Override
- public void run()
- {
- downloader.download( image.getAbsolutePath(), new WantRangeCallback() {
- @Override
- public FileRange get()
- {
- if ( lastBlock.intValue() != -1 ) {
- image.setNeedsCheck( lastBlock.intValue() );
- image.increaseTransmittedTimes( lastBlock.intValue() );
- }
- // get start of range.
- int blockNumber = image.getNextMissingBlock();
- if ( blockNumber == -1 ) {
- log.debug( "Download complete." );
- return null;
- }
- lastBlock.setValue( blockNumber );
- log.debug( "Block " + blockNumber + " was transmitted " + image.getTimesTransmitted( blockNumber ) + " time(s)." );
-
- long startOfRange = image.getNextMissingBlock() * Globals.blockSize;
- long endOfRange = Math.min( startOfRange + Globals.blockSize, image.getFileSize() );
- FileRange range = new FileRange( startOfRange, endOfRange );
- return range;
- }
- } );
- image.updateDb();
- }
- } );
- } catch ( RejectedExecutionException e ) {
- downloader.sendErrorCode( "Too many concurrent downloads." );
- downloader.close( null );
- }
+ // TODO
+ downloader.sendErrorCode( "Too many concurrent downloads." );
+ downloader.cancel();
}
}