main.go (2127B)
1 package main 2 3 import ( 4 "context" 5 "crypto/tls" 6 "flag" 7 "net/http" 8 "os" 9 "os/signal" 10 "path" 11 "syscall" 12 "time" 13 14 "devroxy/internal/certificates" 15 "devroxy/internal/devroxy" 16 17 "github.com/rs/zerolog" 18 "github.com/rs/zerolog/log" 19 ) 20 21 var ( 22 flagAddr = flag.String("addr", ":443", "Address that server listening for.") 23 flagBinds = flag.String("binds", "", "Bind file location. if omitted, devroxy runs in-memory mode.") 24 flagRootCert = flag.String("ca-cert", "root.pem", "Root CA certificate. if omitted, server will listen for http request.") 25 flagRootKey = flag.String("ca-key", "root-key.pem", "Root CA private key. if omitted, server will listen for http request.") 26 ) 27 28 const ( 29 ReadTimeout = time.Second 30 WriteTimeout = time.Second 31 ) 32 33 func main() { 34 flag.Parse() 35 zerolog.TimeFieldFormat = zerolog.TimeFormatUnix 36 37 log.Debug(). 38 Str("addr", *flagAddr). 39 Msg("address") 40 41 d := devroxy.New(*flagAddr) 42 43 if len(*flagBinds) > 0 { 44 err := d.LoadBinds(*flagBinds) 45 if err != nil && !os.IsNotExist(err) { 46 log.Fatal().Err(err).Msg("failed to load binds file") 47 } 48 } 49 50 caRoot := devroxy.GetConfDir("certs") 51 ca, err := certificates.NewCA( 52 caRoot, 53 path.Join(caRoot, *flagRootCert), 54 path.Join(caRoot, *flagRootKey), 55 ) 56 if err != nil { 57 log.Fatal(). 58 Err(err). 59 Msg("failed to initialize ca") 60 } 61 62 server := &http.Server{ 63 Addr: *flagAddr, 64 Handler: d.Handler(), 65 ReadTimeout: ReadTimeout, 66 WriteTimeout: WriteTimeout, 67 TLSConfig: &tls.Config{GetCertificate: ca.GetCertificate}, 68 } 69 70 errChan := make(chan error, 1) 71 go func() { 72 log.Info(). 73 Str("addr", *flagAddr). 74 Msg("server started") 75 err := server.ListenAndServeTLS("", "") 76 if err != http.ErrServerClosed { 77 errChan <- err 78 } 79 }() 80 81 sigChan := make(chan os.Signal) 82 signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) 83 84 select { 85 case err := <-errChan: 86 if err != nil { 87 log.Fatal().Err(err).Msg("failed to start the server") 88 } 89 90 case <-sigChan: 91 signal.Stop(sigChan) 92 close(sigChan) 93 94 err := server.Shutdown(context.Background()) 95 if err != nil { 96 log.Fatal().Err(err).Msg("shutdown failed") 97 } 98 } 99 }