2020-01-12 18:23:35 +01:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"blocky/config"
|
|
|
|
"blocky/server"
|
2020-03-11 22:52:27 +01:00
|
|
|
"context"
|
2020-03-09 22:34:10 +01:00
|
|
|
"flag"
|
2020-03-11 22:52:27 +01:00
|
|
|
"fmt"
|
|
|
|
"net"
|
|
|
|
"net/http"
|
2020-01-12 18:23:35 +01:00
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
2020-03-11 22:52:27 +01:00
|
|
|
"time"
|
2020-01-12 18:23:35 +01:00
|
|
|
|
|
|
|
prefixed "github.com/x-cray/logrus-prefixed-formatter"
|
|
|
|
|
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
log "github.com/sirupsen/logrus"
|
|
|
|
)
|
|
|
|
|
|
|
|
//nolint:gochecknoglobals
|
|
|
|
var version = "undefined"
|
|
|
|
|
|
|
|
//nolint:gochecknoglobals
|
|
|
|
var buildTime = "undefined"
|
|
|
|
|
|
|
|
func main() {
|
2020-03-09 22:34:10 +01:00
|
|
|
configPath := flag.String("config", "./config.yml", "Path to config file.")
|
|
|
|
flag.Parse()
|
|
|
|
|
|
|
|
cfg := config.NewConfig(*configPath)
|
2020-01-12 18:23:35 +01:00
|
|
|
configureLog(&cfg)
|
|
|
|
|
|
|
|
printBanner()
|
|
|
|
|
2020-03-11 22:52:27 +01:00
|
|
|
configureHTTPClient(&cfg)
|
|
|
|
|
2020-01-12 18:23:35 +01:00
|
|
|
signals := make(chan os.Signal)
|
|
|
|
done := make(chan bool)
|
|
|
|
|
|
|
|
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
|
|
|
|
|
|
|
|
server, err := server.NewServer(&cfg)
|
|
|
|
if err != nil {
|
|
|
|
log.Fatal("cant start server ", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
server.Start()
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
<-signals
|
|
|
|
log.Infof("Terminating...")
|
|
|
|
server.Stop()
|
|
|
|
done <- true
|
|
|
|
}()
|
|
|
|
|
|
|
|
<-done
|
|
|
|
}
|
|
|
|
|
2020-03-11 22:52:27 +01:00
|
|
|
func configureHTTPClient(cfg *config.Config) {
|
|
|
|
if cfg.BootstrapDNS != (config.Upstream{}) {
|
|
|
|
if cfg.BootstrapDNS.Net == "tcp" || cfg.BootstrapDNS.Net == "udp" {
|
|
|
|
dns := net.JoinHostPort(cfg.BootstrapDNS.Host, fmt.Sprint(cfg.BootstrapDNS.Port))
|
|
|
|
log.Debugf("using %s as bootstrap dns server", dns)
|
|
|
|
|
|
|
|
r := &net.Resolver{
|
|
|
|
PreferGo: true,
|
|
|
|
Dial: func(ctx context.Context, network, address string) (net.Conn, error) {
|
|
|
|
d := net.Dialer{
|
|
|
|
Timeout: time.Millisecond * time.Duration(2000),
|
|
|
|
}
|
|
|
|
return d.DialContext(ctx, cfg.BootstrapDNS.Net, dns)
|
|
|
|
}}
|
|
|
|
|
|
|
|
http.DefaultTransport = &http.Transport{
|
|
|
|
Dial: (&net.Dialer{
|
|
|
|
Timeout: 5 * time.Second,
|
|
|
|
Resolver: r,
|
|
|
|
}).Dial,
|
|
|
|
TLSHandshakeTimeout: 5 * time.Second,
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
log.Fatal("bootstrap dns net should be udp or tcs")
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-01-12 18:23:35 +01:00
|
|
|
func configureLog(cfg *config.Config) {
|
|
|
|
if level, err := log.ParseLevel(cfg.LogLevel); err != nil {
|
|
|
|
log.Fatalf("invalid log level %s %v", cfg.LogLevel, err)
|
|
|
|
} else {
|
|
|
|
log.SetLevel(level)
|
|
|
|
}
|
|
|
|
|
|
|
|
logFormatter := &prefixed.TextFormatter{
|
|
|
|
TimestampFormat: "2006-01-02 15:04:05",
|
|
|
|
FullTimestamp: true,
|
|
|
|
ForceFormatting: true,
|
|
|
|
ForceColors: true,
|
|
|
|
QuoteEmptyFields: true}
|
|
|
|
|
|
|
|
logFormatter.SetColorScheme(&prefixed.ColorScheme{
|
|
|
|
PrefixStyle: "blue+b",
|
|
|
|
TimestampStyle: "white+h",
|
|
|
|
})
|
|
|
|
|
|
|
|
logrus.SetFormatter(logFormatter)
|
|
|
|
}
|
|
|
|
|
|
|
|
func printBanner() {
|
|
|
|
log.Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
|
|
|
|
log.Info("_/ _/")
|
|
|
|
log.Info("_/ _/")
|
|
|
|
log.Info("_/ _/ _/ _/ _/")
|
|
|
|
log.Info("_/ _/_/_/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/")
|
|
|
|
log.Info("_/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/")
|
|
|
|
log.Info("_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/")
|
|
|
|
log.Info("_/ _/_/_/ _/ _/_/ _/_/_/ _/ _/ _/_/_/ _/")
|
|
|
|
log.Info("_/ _/ _/")
|
|
|
|
log.Info("_/ _/_/ _/")
|
|
|
|
log.Info("_/ _/")
|
|
|
|
log.Info("_/ _/")
|
|
|
|
log.Infof("_/ Version: %-18s Build time: %-18s _/", version, buildTime)
|
|
|
|
log.Info("_/ _/")
|
|
|
|
log.Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
|
|
|
|
}
|