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.
101 lines
1.9 KiB
101 lines
1.9 KiB
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"git.wownero.com/onionltd/monero-multisig-broker/logger"
|
|
"git.wownero.com/onionltd/monero-multisig-broker/members"
|
|
"git.wownero.com/onionltd/monero-multisig-broker/messagelog"
|
|
"github.com/jessevdk/go-flags"
|
|
"github.com/labstack/echo/v4"
|
|
"go.uber.org/zap"
|
|
"net/http"
|
|
"os"
|
|
"os/signal"
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
func run() error {
|
|
cfg, err := setupConfig()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
rootLogger, err := setupLogger(cfg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
httpdLogger := rootLogger.Named("httpd")
|
|
|
|
router := setupRouter()
|
|
|
|
server := server{
|
|
logger: httpdLogger,
|
|
config: cfg,
|
|
router: router,
|
|
messageLog: messagelog.New(),
|
|
memberDB: members.NewDatabase(),
|
|
}
|
|
server.routes()
|
|
|
|
// Handle termination signals
|
|
sigCh := make(chan os.Signal, 1)
|
|
signal.Notify(sigCh, os.Interrupt)
|
|
|
|
go func() {
|
|
<-sigCh
|
|
rootLogger.Warn("received a termination signal")
|
|
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
|
|
_ = router.Shutdown(ctx)
|
|
}()
|
|
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(1)
|
|
|
|
go func() {
|
|
defer wg.Done()
|
|
if err := router.Start(cfg.Listen); err != nil {
|
|
if err != http.ErrServerClosed {
|
|
rootLogger.Error("http server error", zap.Error(err))
|
|
die()
|
|
}
|
|
}
|
|
}()
|
|
|
|
wg.Wait()
|
|
return nil
|
|
}
|
|
|
|
func setupConfig() (*config, error) {
|
|
cfg := &config{}
|
|
parser := flags.NewParser(cfg, flags.HelpFlag)
|
|
if _, err := parser.Parse(); err != nil {
|
|
return nil, fmt.Errorf("failed to parse configuration: %s", err)
|
|
}
|
|
return cfg, nil
|
|
}
|
|
|
|
func setupLogger(cfg *config) (*zap.Logger, error) {
|
|
return logger.DefaultConfigWithLogLevel(cfg.LogLevel).Build()
|
|
}
|
|
|
|
func setupRouter() *echo.Echo {
|
|
e := echo.New()
|
|
e.HideBanner = true
|
|
e.HidePort = true
|
|
return e
|
|
}
|
|
|
|
func die() {
|
|
p, _ := os.FindProcess(os.Getpid())
|
|
_ = p.Signal(os.Interrupt)
|
|
}
|
|
|
|
func main() {
|
|
if err := run(); err != nil {
|
|
fmt.Fprintf(os.Stderr, "%s\n", err)
|
|
os.Exit(1)
|
|
}
|
|
}
|