devroxy

VHost Proxy Server for localhost
git clone git://git.lair.cx/devroxy
Log | Files | Refs | README

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 }