You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

128 lines
2.5 KiB

package main
import (
"context"
"crypto/tls"
"fmt"
"io/ioutil"
"log"
"net"
"net/http"
"os"
"os/signal"
"sync"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"src.whiteboxsystems.nl/decozo/okapi"
"src.whiteboxsystems.nl/decozo/okapidemo/cryptoutil"
)
var rpcPort = "8888"
var srvaddr = "0.0.0.0:" + rpcPort
var extRpcAddr = "localhost:" + rpcPort
var patientIf = "0.0.0.0:8085"
var binFolder = "./bin/arm64"
func loadCert(name string) *tls.Certificate {
_, err := os.Stat(fmt.Sprintf("certs/%s.crt", name))
if err != nil {
_, _, certPem, keyPem, err := cryptoutil.GenCert("whitebox", "whitebox")
if err != nil {
panic(err)
}
if err != nil {
panic(err)
}
if err := ioutil.WriteFile(fmt.Sprintf("certs/%s.crt", name), []byte(certPem), 0600); err != nil {
panic(err)
}
if err := ioutil.WriteFile(fmt.Sprintf("certs/%s.key", name), []byte(keyPem), 0600); err != nil {
panic(err)
}
}
certificate, err := tls.LoadX509KeyPair(fmt.Sprintf("certs/%s.crt", name), fmt.Sprintf("certs/%s.key", name))
if err != nil {
panic("Load client certification failed: " + err.Error())
}
return &certificate
}
func loadKeyPair() credentials.TransportCredentials {
certificate := loadCert("client")
tlsConfig := &tls.Config{
ClientAuth: tls.RequestClientCert,
Certificates: []tls.Certificate{*certificate},
}
return credentials.NewTLS(tlsConfig)
}
func main() {
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
wg := &sync.WaitGroup{}
if os.Getenv("BIN_FOLDER") != "" {
binFolder = os.Getenv("BIN_FOLDER")
}
if ext := os.Getenv("EXT_ADDR"); ext != "" {
extRpcAddr = ext + ":" + rpcPort
}
openapisrv := NewServer()
openapisrv.LoadData("./data/data.db")
opts := []grpc.ServerOption{
grpc.Creds(loadKeyPair()),
}
grpcServer := grpc.NewServer(opts...)
go func() {
lis, err := net.Listen("tcp", srvaddr)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
okapi.RegisterOkAPIServer(grpcServer, openapisrv)
log.Printf("RPC Listening on %v", srvaddr)
wg.Add(1)
grpcServer.Serve(lis)
}()
srv := NewUIServer(patientIf)
srv.data = openapisrv.data
go func() {
wg.Add(1)
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
panic(err)
}
}()
<-stop
go func() {
grpcServer.GracefulStop()
wg.Done()
log.Println("Shutdown RPC server")
}()
go func() {
log.Println("Shutdown UI server...")
srv.Shutdown(context.Background())
wg.Done()
log.Println("UI Server shutdown...")
}()
wg.Wait()
}