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
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()
|
|
}
|
|
|