/* * 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.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.SslProvider; import javax.net.ssl.SSLException; 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 SslContext ssl; /* * Constructor * Sets port and builds sslContext */ public JobServServer(int port, String serverCert, String privateKey, String trustStore) throws SSLException { this.port = port; SslContextBuilder sslContextBuilder = SslContextBuilder.forServer(new File(serverCert), new File(privateKey)); // Mutual TLS trust store and require client auth sslContextBuilder.trustManager(new File(trustStore)); sslContextBuilder.clientAuth(ClientAuth.REQUIRE); this.ssl = GrpcSslContexts.configure(sslContextBuilder).build(); } /* * start() * this initializes the server */ private void start() throws IOException { // TODO: this should be passed in from a configuration manager server = NettyServerBuilder.forPort(port) .addService(new ShellServerService()) .sslContext(this.ssl) .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(); } }); } /* * stop() * This is called when ctrl+c is pressed */ private void stop() { if (server != null) { server.shutdown(); } } /* * blockUntilShutdown() * This is more or less the main loop of the server. * It spins until shutdown is called. */ private void blockUntilShutdown() throws InterruptedException { if (server != null) { server.awaitTermination(); } } /* * main() * Entrypoint of hte server * parses args and initializes a server object. * calls server main loop. */ 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 cert privatekey truststore"); return; } JobServServer server; try{ server = new JobServServer(8448, args[0], args[1], args[2]); } catch (SSLException e) { System.out.println(e.getMessage()); return; } server.start(); server.blockUntilShutdown(); } }