From 51925d2a7beb973f70b97b777aad4e61b86840ce Mon Sep 17 00:00:00 2001 From: Alejandro Mery Date: Fri, 22 Dec 2023 20:51:04 +0000 Subject: [PATCH] penne: serve and dump commands Signed-off-by: Alejandro Mery --- cmd/penne/config.go | 58 +++++++++++++++++++++++++++++++++++++++++++++ cmd/penne/dump.go | 55 ++++++++++++++++++++++++++++++++++++++++++ cmd/penne/logger.go | 47 ++++++++++++++++++++++++++++++++++++ cmd/penne/main.go | 32 ++++++++++++++++++++++++- cmd/penne/serve.go | 33 ++++++++++++++++++++++++++ go.mod | 7 ++++++ go.sum | 22 +++++++++++++++++ 7 files changed, 253 insertions(+), 1 deletion(-) create mode 100644 cmd/penne/config.go create mode 100644 cmd/penne/dump.go create mode 100644 cmd/penne/logger.go create mode 100644 cmd/penne/serve.go diff --git a/cmd/penne/config.go b/cmd/penne/config.go new file mode 100644 index 0000000..12ada77 --- /dev/null +++ b/cmd/penne/config.go @@ -0,0 +1,58 @@ +package main + +import ( + "context" + + "github.com/spf13/pflag" + + "darvaza.org/penne/pkg/config" + "darvaza.org/penne/pkg/server" + "darvaza.org/slog" +) + +const ( + configFileFlag = "config" + configFileShortFlag = "f" + configFileDefault = CmdName + ".{conf,json,toml,yaml,yml}" +) + +var confLoader = config.Loader[server.Config]{ + Base: CmdName, +} + +func loadConfigFileFlag(ctx context.Context, log slog.Logger, + flag *pflag.Flag) (*server.Config, error) { + // + init := func(cfg *server.Config) error { + cfg.Context = ctx + cfg.Logger = log + return nil + } + + cfg, err := confLoader.LoadFileFlag(flag, init) + if err != nil { + log.Error().WithField(slog.ErrorFieldName, err).Print("LoadConfigFile") + return nil, err + } + return cfg, nil +} + +func prepareConfig(ctx context.Context, flags *pflag.FlagSet) (*server.Config, error) { + log, err := newLogger(nil, flags) + if err != nil { + return nil, err + } + + flag := flags.Lookup(configFileFlag) + cfg, err := loadConfigFileFlag(ctx, log, flag) + if err != nil { + return nil, err + } + + return cfg, nil +} + +func init() { + pFlags := rootCmd.PersistentFlags() + pFlags.StringP(configFileFlag, configFileShortFlag, configFileDefault, "config file to use") +} diff --git a/cmd/penne/dump.go b/cmd/penne/dump.go new file mode 100644 index 0000000..c9da6f3 --- /dev/null +++ b/cmd/penne/dump.go @@ -0,0 +1,55 @@ +package main + +import ( + "context" + "os" + + "github.com/spf13/cobra" + + "darvaza.org/sidecar/pkg/config" +) + +const ( + // DefaultDumpFormat indicates the format used by `penne dump` if none + // is specified. + DefaultDumpFormat = "toml" + + dumpFormatFlag = "format" +) + +var dumpCmd = &cobra.Command{ + Use: "dump", + Short: "prints out the configuration", + Args: cobra.NoArgs, + + RunE: func(cmd *cobra.Command, _ []string) error { + flags := cmd.Flags() + + ctx := context.TODO() + cfg, err := prepareConfig(ctx, flags) + if err != nil { + return err + } + + encFormat, err := flags.GetString(dumpFormatFlag) + if err != nil { + return err + } + + enc, err := config.NewEncoder(encFormat) + if err != nil { + return err + } + + _, err = enc.WriteTo(cfg, os.Stdout) + return err + }, +} + +func init() { + flags := dumpCmd.Flags() + flags.StringP(dumpFormatFlag, "F", DefaultDumpFormat, + "file format for the dump (yaml, toml or json)") + + rootCmd.AddCommand(dumpCmd) +} diff --git a/cmd/penne/logger.go b/cmd/penne/logger.go new file mode 100644 index 0000000..415fdef --- /dev/null +++ b/cmd/penne/logger.go @@ -0,0 +1,47 @@ +package main + +import ( + "io" + + "github.com/spf13/pflag" + + "darvaza.org/sidecar/pkg/logger/zerolog" + "darvaza.org/slog" +) + +func newLogger(w io.Writer, flags *pflag.FlagSet) (slog.Logger, error) { + level := slog.Error + + if flags != nil { + verbosity, err := flags.GetCount(verbosityFlag) + if err != nil { + return nil, err + } + + level += slog.LogLevel(verbosity) + switch { + case level < slog.Error: + level = slog.Error + case level > slog.Debug: + level = slog.Debug + } + } + + log := zerolog.New(w, level) + return log, nil +} + +func mustLogger(w io.Writer, flags *pflag.FlagSet) slog.Logger { + log, err := newLogger(w, flags) + if err != nil { + panic(err) + } + return log +} + +const verbosityFlag = "verbose" + +func init() { + pFlags := rootCmd.PersistentFlags() + pFlags.CountP(verbosityFlag, "v", "increase verbosity") +} diff --git a/cmd/penne/main.go b/cmd/penne/main.go index 117537c..e73172e 100644 --- a/cmd/penne/main.go +++ b/cmd/penne/main.go @@ -1,4 +1,34 @@ // Package main implements the Penne server package main -func main() {} +import ( + "os" + + "github.com/spf13/cobra" + + "darvaza.org/sidecar/pkg/service" + "darvaza.org/slog" +) + +const ( + // CmdName is the name of this executable + CmdName = "penne" +) + +var rootCmd = &cobra.Command{ + Use: CmdName, + Short: "penne resolves names", +} + +func main() { + err := rootCmd.Execute() + code, err := service.AsExitStatus(err) + + if err != nil { + mustLogger(nil, nil).Error(). + WithField(slog.ErrorFieldName, err). + Print() + } + + os.Exit(code) +} diff --git a/cmd/penne/serve.go b/cmd/penne/serve.go new file mode 100644 index 0000000..d36e905 --- /dev/null +++ b/cmd/penne/serve.go @@ -0,0 +1,33 @@ +package main + +import ( + "context" + + "github.com/spf13/cobra" + + "darvaza.org/penne/pkg/server" +) + +var serveCmd = &cobra.Command{ + Use: "serve", + Short: "Run DNS server", + Args: cobra.NoArgs, + RunE: func(cmd *cobra.Command, _ []string) error { + ctx := context.Background() + cfg, err := prepareConfig(ctx, cmd.Flags()) + if err != nil { + return err + } + + srv, err := server.New(cfg) + if err != nil { + return err + } + + return srv.ListenAndServe() + }, +} + +func init() { + rootCmd.AddCommand(serveCmd) +} diff --git a/go.mod b/go.mod index 5c8a6d2..3fae3d0 100644 --- a/go.mod +++ b/go.mod @@ -6,17 +6,21 @@ require darvaza.org/sidecar v0.0.9 require ( darvaza.org/core v0.11.0 + darvaza.org/sidecar/pkg/service v0.0.4 darvaza.org/slog v0.5.4 darvaza.org/slog/handlers/discard v0.4.6 ) require ( github.com/mgechev/revive v1.3.4 + github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 ) require ( darvaza.org/darvaza/shared/config v0.2.5 // indirect + darvaza.org/slog/handlers/filter v0.4.6 // indirect + darvaza.org/slog/handlers/zerolog v0.4.6 // indirect github.com/BurntSushi/toml v1.3.2 // indirect github.com/amery/defaults v0.1.0 // indirect github.com/chavacava/garif v0.1.0 // indirect @@ -26,6 +30,8 @@ require ( github.com/go-playground/locales v0.14.1 // indirect github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.16.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/kardianos/service v1.2.2 // indirect github.com/leodido/go-urn v1.2.4 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -35,6 +41,7 @@ require ( github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rs/zerolog v1.31.0 // indirect golang.org/x/crypto v0.16.0 // indirect golang.org/x/net v0.19.0 // indirect golang.org/x/sys v0.15.0 // indirect diff --git a/go.sum b/go.sum index 2b6e916..56087dd 100644 --- a/go.sum +++ b/go.sum @@ -4,16 +4,24 @@ darvaza.org/darvaza/shared/config v0.2.5 h1:A4XYgKMkGgYuvxPDfPuoWSNHUXVSUGlBs2Lm darvaza.org/darvaza/shared/config v0.2.5/go.mod h1:yYxZLw5Be6pnfAn79IcVfUhqKpMzCxKYbqmUMjAebsU= darvaza.org/sidecar v0.0.9 h1:7I3BItBpeLQR7ab93K8qxxl3VZacixtnnbozK1pB4L0= darvaza.org/sidecar v0.0.9/go.mod h1:jPDSezJAZKYHwN2aX1H1rEglPTIU/PI3MTzaZO5dvBM= +darvaza.org/sidecar/pkg/service v0.0.4 h1:L6FHIdAemdQMGGzOUekKvkuvVIhwe+qBMt+ZsB1l0IU= +darvaza.org/sidecar/pkg/service v0.0.4/go.mod h1:ovR95RPbyZv+MS8B5vYjgRR+YxzIflfesmJW+35OR40= darvaza.org/slog v0.5.4 h1:xzlWVzYh4tuZLnj4A9tOHXfn/SAEIkApXPvK3YDiW9g= darvaza.org/slog v0.5.4/go.mod h1:QFtY3QoQ7xxww85umlEKPcMCNzqNrHYqnj53KehsmBU= darvaza.org/slog/handlers/discard v0.4.6 h1:TatHJn34y6eKQzNRHSo6lGZnJg4SLOGaWstlvwwOyrE= darvaza.org/slog/handlers/discard v0.4.6/go.mod h1:AG8WKr7m11NPPzvHW/b8nCT5RvYR9RZcIT/NWUOoMAo= +darvaza.org/slog/handlers/filter v0.4.6 h1:AI5AQDyXS534QeXIV54pAKxplA6AVZNr4H2PEmAXT0k= +darvaza.org/slog/handlers/filter v0.4.6/go.mod h1:MGTKdlnA/FanOn3GU2mltzwBn41HgSxxNeWUQEKFbl8= +darvaza.org/slog/handlers/zerolog v0.4.6 h1:Di+FXUD2R2pKUrynaidyXzS0WsrEiwbL11LQlQzwZv4= +darvaza.org/slog/handlers/zerolog v0.4.6/go.mod h1:r5B9/FQ256R3Wo5vFLOa2YarM2P8WOjVjFn8xHikNjk= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/amery/defaults v0.1.0 h1:4AhTgLUnj8BPjVRBzg4+/cSCwPWPT6+yWCM4rD6Feyc= github.com/amery/defaults v0.1.0/go.mod h1:duOYkvd60q8XOL1+vdSHx5ABTGDMU2iFKr5xJnMEpBk= github.com/chavacava/garif v0.1.0 h1:2JHa3hbYf5D9dsgseMKAmc/MZ109otzgNFk5s87H9Pc= github.com/chavacava/garif v0.1.0/go.mod h1:XMyYCkEL58DF0oyW4qDjjnPWONs2HBqYKI+UIPD+Gww= +github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -31,7 +39,12 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.16.0 h1:x+plE831WK4vaKHO/jpgUGsvLKIqRRkz6M78GuJAfGE= github.com/go-playground/validator/v10 v10.16.0/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kardianos/service v1.2.2 h1:ZvePhAHfvo0A7Mftk/tEzqEZ7Q4lgnR8sGz4xu1YX60= +github.com/kardianos/service v1.2.2/go.mod h1:CIMRFEJVL+0DS1a3Nx06NaMn4Dz63Ng6O7dl0qH0zVM= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= @@ -39,6 +52,7 @@ github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNa github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= @@ -60,6 +74,12 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.10.1-0.20230524175051-ec119421bb97 h1:3RPlVWzZ/PDqmVuf/FKHARG5EMid/tl7cv54Sw/QRVY= +github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.31.0 h1:FcTR3NnLWW+NnTwwhFWiJSZr4ECLpqCm6QsEnyvbV4A= +github.com/rs/zerolog v1.31.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -76,8 +96,10 @@ golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa h1:FRnLl4eNAQl8hwxVVC17teOw8 golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/sys v0.0.0-20201015000850-e3ed0017c211/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=