package be.visualstation.vmagent.cli;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.InputStreamEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.ssl.SSLContextBuilder;
import org.apache.http.ssl.TrustStrategy;
import org.slf4j.Logger;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URI;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.time.Instant;
public class FileUpload implements Runnable {
final static Logger logger = org.slf4j.LoggerFactory.getLogger(FileUpload.class);
File source = null;
String destination = null;
URI uri = null;
public FileUpload(File source, URI uri){
this.source = source;
this.destination = destination;
this.uri = uri;
}
public static HttpClient createHttpClient_AcceptsUntrustedCerts() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException {
HttpClientBuilder b = HttpClientBuilder.create();
SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {
public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
return true;
}
}).build();
b.setSslcontext( sslContext);
HostnameVerifier hostnameVerifier = SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER;
SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, hostnameVerifier);
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", sslSocketFactory)
.build();
PoolingHttpClientConnectionManager connMgr = new PoolingHttpClientConnectionManager( socketFactoryRegistry);
b.setConnectionManager( connMgr);
HttpClient client = b.build();
return client;
}
@Override
public void run() {
HttpClient httpClient = null;
try {
Instant i1 = Instant.now();
logger.info("File transfer started @ " + i1.toString() + " for " + this.source.getName() + " (Size: " + Long.toString(this.source.length()) + " bytes).");
httpClient = createHttpClient_AcceptsUntrustedCerts();
HttpPut httpPut = new HttpPut(this.uri);
InputStreamEntity reqEntity = new InputStreamEntity(new FileInputStream(this.source), this.source.length(), ContentType.DEFAULT_BINARY);
// VMware ESX Server does not support chunked data.
reqEntity.setChunked(false);
httpPut.setEntity(reqEntity);
HttpResponse httpResponse = httpClient.execute(httpPut);
logger.info(httpResponse.getEntity().toString());
Instant i2 = Instant.now();
long ns = java.time.Duration.between(i1,i2).toNanos();
logger.info(String.format("File Transfer Duration: %s ns.",Long.toString(ns)));
double seconds = ns / 1000000000;
double rate = this.source.length() / seconds;
logger.info("Average Transfer Rate: " + Double.toString(rate) + "B/s.");
} catch (KeyStoreException e) {
logger.error(e.toString());
} catch (NoSuchAlgorithmException e) {
logger.error(e.toString());
} catch (KeyManagementException e) {
logger.error(e.toString());
} catch (ClientProtocolException e) {
logger.error(e.toString());
} catch (IOException e) {
logger.error(e.toString());
}
}
}