2020-04-08 23:03:07 +02:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
2023-10-07 22:21:40 +02:00
|
|
|
"context"
|
2022-05-06 22:34:08 +02:00
|
|
|
"fmt"
|
2020-04-08 23:03:07 +02:00
|
|
|
"os"
|
|
|
|
"os/signal"
|
|
|
|
"syscall"
|
|
|
|
|
2021-08-25 22:06:34 +02:00
|
|
|
"github.com/0xERR0R/blocky/config"
|
|
|
|
"github.com/0xERR0R/blocky/evt"
|
|
|
|
"github.com/0xERR0R/blocky/log"
|
|
|
|
"github.com/0xERR0R/blocky/server"
|
|
|
|
"github.com/0xERR0R/blocky/util"
|
2021-02-22 22:29:34 +01:00
|
|
|
|
2020-04-08 23:03:07 +02:00
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
|
|
|
//nolint:gochecknoglobals
|
2020-05-04 22:20:13 +02:00
|
|
|
var (
|
2022-05-06 22:34:08 +02:00
|
|
|
done = make(chan bool, 1)
|
2022-04-22 22:12:35 +02:00
|
|
|
isConfigMandatory = true
|
2023-09-20 17:23:28 +02:00
|
|
|
signals = make(chan os.Signal, 1)
|
2021-02-08 21:57:59 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
func newServeCommand() *cobra.Command {
|
|
|
|
return &cobra.Command{
|
2024-05-26 20:45:30 +02:00
|
|
|
Use: "serve",
|
|
|
|
Args: cobra.NoArgs,
|
|
|
|
Short: "start blocky DNS server (default command)",
|
|
|
|
RunE: startServer,
|
|
|
|
PersistentPreRunE: initConfigPreRun,
|
|
|
|
SilenceUsage: true,
|
2020-05-04 22:20:13 +02:00
|
|
|
}
|
2021-02-08 21:57:59 +01:00
|
|
|
}
|
2020-05-04 22:20:13 +02:00
|
|
|
|
2022-05-06 22:34:08 +02:00
|
|
|
func startServer(_ *cobra.Command, _ []string) error {
|
2020-05-04 22:20:13 +02:00
|
|
|
printBanner()
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2022-04-22 22:12:35 +02:00
|
|
|
cfg, err := config.LoadConfig(configPath, isConfigMandatory)
|
2022-05-06 22:34:08 +02:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("unable to load configuration: %w", err)
|
|
|
|
}
|
2021-02-26 22:42:00 +01:00
|
|
|
|
2023-11-21 18:53:39 +01:00
|
|
|
log.Configure(&cfg.Log)
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2020-05-04 22:20:13 +02:00
|
|
|
signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2023-10-07 22:21:40 +02:00
|
|
|
ctx, cancelFn := context.WithCancel(context.Background())
|
|
|
|
defer cancelFn()
|
|
|
|
|
|
|
|
srv, err := server.NewServer(ctx, cfg)
|
2022-05-06 22:34:08 +02:00
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("can't start server: %w", err)
|
|
|
|
}
|
|
|
|
|
2022-05-10 09:09:50 +02:00
|
|
|
const errChanSize = 10
|
|
|
|
errChan := make(chan error, errChanSize)
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2023-10-07 22:21:40 +02:00
|
|
|
srv.Start(ctx, errChan)
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2023-09-20 17:23:28 +02:00
|
|
|
var terminationErr error
|
|
|
|
|
2020-05-04 22:20:13 +02:00
|
|
|
go func() {
|
2022-05-06 22:34:08 +02:00
|
|
|
select {
|
|
|
|
case <-signals:
|
|
|
|
log.Log().Infof("Terminating...")
|
2024-01-27 04:07:26 +01:00
|
|
|
util.LogOnError(ctx, "can't stop server: ", srv.Stop(ctx))
|
2022-05-06 22:34:08 +02:00
|
|
|
done <- true
|
|
|
|
|
2022-05-16 21:25:33 +02:00
|
|
|
case err := <-errChan:
|
|
|
|
log.Log().Error("server start failed: ", err)
|
2023-09-20 17:23:28 +02:00
|
|
|
terminationErr = err
|
2022-05-06 22:34:08 +02:00
|
|
|
done <- true
|
|
|
|
}
|
2020-05-04 22:20:13 +02:00
|
|
|
}()
|
2020-04-08 23:03:07 +02:00
|
|
|
|
2021-05-05 22:38:22 +02:00
|
|
|
evt.Bus().Publish(evt.ApplicationStarted, util.Version, util.BuildTime)
|
2020-05-04 22:20:13 +02:00
|
|
|
<-done
|
2022-05-06 22:34:08 +02:00
|
|
|
|
2023-09-20 17:23:28 +02:00
|
|
|
return terminationErr
|
2020-04-08 23:03:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func printBanner() {
|
2021-02-25 23:36:39 +01:00
|
|
|
log.Log().Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
|
|
|
|
log.Log().Info("_/ _/")
|
|
|
|
log.Log().Info("_/ _/")
|
|
|
|
log.Log().Info("_/ _/ _/ _/ _/")
|
|
|
|
log.Log().Info("_/ _/_/_/ _/ _/_/ _/_/_/ _/ _/ _/ _/ _/")
|
|
|
|
log.Log().Info("_/ _/ _/ _/ _/ _/ _/ _/_/ _/ _/ _/")
|
|
|
|
log.Log().Info("_/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/")
|
|
|
|
log.Log().Info("_/ _/_/_/ _/ _/_/ _/_/_/ _/ _/ _/_/_/ _/")
|
|
|
|
log.Log().Info("_/ _/ _/")
|
|
|
|
log.Log().Info("_/ _/_/ _/")
|
|
|
|
log.Log().Info("_/ _/")
|
|
|
|
log.Log().Info("_/ _/")
|
2021-05-05 22:38:22 +02:00
|
|
|
log.Log().Infof("_/ Version: %-18s Build time: %-18s _/", util.Version, util.BuildTime)
|
2021-02-25 23:36:39 +01:00
|
|
|
log.Log().Info("_/ _/")
|
|
|
|
log.Log().Info("_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/")
|
2020-04-08 23:03:07 +02:00
|
|
|
}
|