package main import ( "context" "crypto/tls" "crypto/x509" "io" "log" "net/http" "os" "go.fixergrid.net/servicedemon/pkg/pubsub" "go.fixergrid.net/servicedemon/pkg/registrar" ) type noopHandler struct { http.HandlerFunc } func wrapHandlefunc(h http.HandlerFunc) noopHandler { return noopHandler{ HandlerFunc: h, } } func (h noopHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { h.HandlerFunc(w, req) } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() logger := log.New(os.Stdout, "main: ", log.LstdFlags|log.Lshortfile) logger.Println("Starting .... the >HUB<") pubsub := pubsub.New() repo := registrar.NewRepo() r := registrar.NewRegistrar( pubsub, repo, registrar.WithLogger(log.New(os.Stdout, "registrar: ", log.LstdFlags|log.Lshortfile)), ) al := registrar.NewApprovalListener( pubsub, nil, repo, registrar.OptionLog(log.New(os.Stdout, "approvalListener: ", log.LstdFlags|log.Lshortfile)), ) go al.Run(ctx) mux := http.NewServeMux() mux.HandleFunc("/register", r.HandleRegistration) mux.Handle("/approvals/", http.StripPrefix("/approvals/", wrapHandlefunc(r.HandleApproval))) certFile, err := os.Open("./certs/ca.pem") if err != nil { logger.Fatalf("failed to open ca.pem: %v", err) } caCert, err := io.ReadAll(certFile) if err != nil { logger.Fatalf("failed to read in ca: %v", err) } pool := x509.NewCertPool() pool.AppendCertsFromPEM(caCert) server := &http.Server{ Addr: ":3001", TLSConfig: &tls.Config{ ClientCAs: pool, ClientAuth: tls.RequireAndVerifyClientCert, }, } server.Handler = mux log.Println(server.ListenAndServeTLS("./certs/combined.pem", "./certs/server-key.pem")) }