/* * JobServServer * * v1.0 * * May 18, 2019 */ package JobServ; import io.grpc.Server; import io.grpc.ServerBuilder; import io.grpc.netty.GrpcSslContexts; import io.grpc.netty.NettyServerBuilder; import io.netty.handler.ssl.ClientAuth; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider; import java.io.File; import java.io.IOException; import java.util.logging.Logger; /* * The JobServServer class implements the JobServ protobuf API * It does this by extending the gRPC stub code. * Additionally, JobServServer starts and manages a daemon * Which accepts incoming connections from client. */ public class JobServServer { private static final Logger logger = Logger.getLogger(JobServServer.class.getName()); private Server server; private final int port; private final String certChainFilePath; private final String privateKeyFilePath; private final String trustCertCollectionFilePath; public JobServServer(int port, String certChainFilePath, String privateKeyFilePath, String trustCertCollectionFilePath) { this.port = port; this.certChainFilePath = certChainFilePath; this.privateKeyFilePath = privateKeyFilePath; this.trustCertCollectionFilePath = trustCertCollectionFilePath; } private SslContextBuilder getSslContextBuilder() { SslContextBuilder sslClientContextBuilder = SslContextBuilder.forServer(new File(certChainFilePath), new File(privateKeyFilePath)); sslClientContextBuilder.trustManager(new File(trustCertCollectionFilePath)); sslClientContextBuilder.clientAuth(ClientAuth.REQUIRE); return GrpcSslContexts.configure(sslClientContextBuilder); } // starts the GRPC API Server private void start() throws IOException { // TODO: this should be passed in from a configuration manager server = NettyServerBuilder.forPort(port) .addService(new ShellServerService()) .sslContext(getSslContextBuilder().build()) .build() .start(); logger.info("Server initialized!"); Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { // JVM shutdown might break logger functionality // so investigate this.... logger.info("Shutting down server"); JobServServer.this.stop(); } }); } private void stop() { if (server != null) { server.shutdown(); } } // spinlock for main() private void blockUntilShutdown() throws InterruptedException { if (server != null) { server.awaitTermination(); } } // Main function. starts GRPC server and spins until server is shutdown public static void main(String[] args) throws IOException, InterruptedException { int port = 8448; // TODO: port and key/cert files should be handled by a config manager if(args.length < 3) { System.out.println("Usage: ./jobserv-server certchain privatekey truststore"); return; } final JobServServer server = new JobServServer(8448, args[0], args[1], args[2]); server.start(); server.blockUntilShutdown(); } }