1package cmd
2
3import (
4	"net/http"
5	"os"
6	"os/signal"
7	"syscall"
8	"time"
9
10	"github.com/0xERR0R/blocky/config"
11	"github.com/0xERR0R/blocky/evt"
12	"github.com/0xERR0R/blocky/log"
13	"github.com/0xERR0R/blocky/server"
14	"github.com/0xERR0R/blocky/util"
15
16	"github.com/spf13/cobra"
17)
18
19//nolint:gochecknoglobals
20var (
21	done chan bool
22)
23
24func newServeCommand() *cobra.Command {
25	return &cobra.Command{
26		Use:   "serve",
27		Args:  cobra.NoArgs,
28		Short: "start blocky DNS server (default command)",
29		Run:   startServer,
30	}
31}
32
33func startServer(_ *cobra.Command, _ []string) {
34	printBanner()
35
36	config.LoadConfig(configPath, true)
37	log.ConfigureLogger(config.GetConfig().LogLevel, config.GetConfig().LogFormat, config.GetConfig().LogTimestamp)
38
39	configureHTTPClient(config.GetConfig())
40
41	signals := make(chan os.Signal, 1)
42	done = make(chan bool, 1)
43
44	signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
45
46	srv, err := server.NewServer(config.GetConfig())
47	util.FatalOnError("cant start server: ", err)
48
49	srv.Start()
50
51	go func() {
52		<-signals
53		log.Log().Infof("Terminating...")
54		srv.Stop()
55		done <- true
56	}()
57
58	evt.Bus().Publish(evt.ApplicationStarted, util.Version, util.BuildTime)
59	<-done
60}
61
62func configureHTTPClient(cfg *config.Config) {
63	http.DefaultTransport = &http.Transport{
64		Dial:                (util.Dialer(cfg)).Dial,
65		TLSHandshakeTimeout: 5 * time.Second,
66	}
67}
68
69func printBanner() {
70	log.Log().Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
71	log.Log().Info("_/                                                              _/")
72	log.Log().Info("_/                                                              _/")
73	log.Log().Info("_/       _/        _/                      _/                   _/")
74	log.Log().Info("_/      _/_/_/    _/    _/_/      _/_/_/  _/  _/    _/    _/    _/")
75	log.Log().Info("_/     _/    _/  _/  _/    _/  _/        _/_/      _/    _/     _/")
76	log.Log().Info("_/    _/    _/  _/  _/    _/  _/        _/  _/    _/    _/      _/")
77	log.Log().Info("_/   _/_/_/    _/    _/_/      _/_/_/  _/    _/    _/_/_/       _/")
78	log.Log().Info("_/                                                    _/        _/")
79	log.Log().Info("_/                                               _/_/           _/")
80	log.Log().Info("_/                                                              _/")
81	log.Log().Info("_/                                                              _/")
82	log.Log().Infof("_/  Version: %-18s Build time: %-18s  _/", util.Version, util.BuildTime)
83	log.Log().Info("_/                                                              _/")
84	log.Log().Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
85}
86