Skip to content
File

Blob: cmd/specter/app.go

go75 lines
1package specter
2 
3import (
4 "context"
5 "fmt"
6 "runtime"
7 
8 "go.miragespace.co/specter/cmd/client"
9 "go.miragespace.co/specter/cmd/dns"
10 "go.miragespace.co/specter/cmd/server"
11 "go.miragespace.co/specter/spec"
12 "go.miragespace.co/specter/spec/errata"
13 
14 "github.com/urfave/cli/v3"
15 "go.uber.org/zap"
16 "go.uber.org/zap/zapcore"
17)
18 
19var (
20 App = cli.Command{
21 Name: "specter",
22 Usage: fmt.Sprintf("build for %s on %s", runtime.GOARCH, runtime.GOOS),
23 Version: spec.BuildVersion,
24 Copyright: "miragespace.com, licensed under MIT.\nSee https://github.com/zllovesuki/specter/blob/main/ThirdPartyLicenses.txt for third-party licenses.",
25 Description: "like ngrok, but more ambitious with DHT for flavor",
26 Flags: []cli.Flag{
27 &cli.BoolFlag{
28 Name: "verbose",
29 Value: false,
30 Usage: "enable verbose logging",
31 },
32 },
33 Commands: []*cli.Command{
34 dns.Generate(),
35 server.Generate(),
36 client.Generate(),
37 },
38 Before: ConfigLogger,
39 }
40)
41 
42func ConfigLogger(ctx context.Context, cmd *cli.Command) (context.Context, error) {
43 var config zap.Config
44 if cmd.Bool("verbose") {
45 config = zap.NewDevelopmentConfig()
46 config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
47 } else {
48 config = zap.NewProductionConfig()
49 }
50 // Redirect everything to stderr
51 config.OutputPaths = []string{"stderr"}
52 logger, err := config.Build()
53 if err != nil {
54 return ctx, err
55 }
56 _, err = zap.RedirectStdLogAt(logger.With(zap.String("subsystem", "unknown")), zapcore.InfoLevel)
57 if err != nil {
58 return ctx, fmt.Errorf("redirecting stdlog output: %w", err)
59 }
60 cmd.Root().Metadata["logger"] = logger
61 
62 return ctx, ConfigApp(cmd)
63}
64 
65func ConfigApp(cmd *cli.Command) error {
66 logger := cmd.Root().Metadata["logger"].(*zap.Logger)
67 if errata.ConfigUDPRecvBuffer() {
68 logger.Debug("errata: net.core.rmem_max is set to 33554432 (32MiB)")
69 }
70 if errata.ConfigUDPSendBuffer() {
71 logger.Debug("errata: net.core.wmem_max is set to 33554432 (32MiB)")
72 }
73 return nil
74}