diff --git a/client/cmd/login.go b/client/cmd/login.go index 44e099325..a436b4c7b 100644 --- a/client/cmd/login.go +++ b/client/cmd/login.go @@ -10,6 +10,7 @@ import ( "github.com/wiretrustee/wiretrustee/client/internal" mgm "github.com/wiretrustee/wiretrustee/management/client" mgmProto "github.com/wiretrustee/wiretrustee/management/proto" + "github.com/wiretrustee/wiretrustee/util" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -23,7 +24,11 @@ var ( Use: "login", Short: "login to the Wiretrustee Management Service (first run)", RunE: func(cmd *cobra.Command, args []string) error { - InitLog(logLevel) + err := util.InitLog(logLevel, logFile) + if err != nil { + log.Errorf("failed initializing log %v", err) + return err + } config, err := internal.GetConfig(managementURL, configPath) if err != nil { diff --git a/client/cmd/root.go b/client/cmd/root.go index dd788a9a9..647014687 100644 --- a/client/cmd/root.go +++ b/client/cmd/root.go @@ -2,13 +2,11 @@ package cmd import ( "fmt" + "github.com/spf13/cobra" "github.com/wiretrustee/wiretrustee/client/internal" "os" "os/signal" "runtime" - - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) const ( @@ -21,6 +19,8 @@ var ( configPath string defaultConfigPath string logLevel string + defaultLogFile string + logFile string managementURL string rootCmd = &cobra.Command{ @@ -42,13 +42,16 @@ func init() { stopCh = make(chan int) defaultConfigPath = "/etc/wiretrustee/config.json" + defaultLogFile = "/var/log/wiretrustee/client.log" if runtime.GOOS == "windows" { defaultConfigPath = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "config.json" + defaultLogFile = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "client.log" } rootCmd.PersistentFlags().StringVar(&managementURL, "management-url", "", fmt.Sprintf("Management Service URL [http|https]://[host]:[port] (default \"%s\")", internal.ManagementURLDefault().String())) rootCmd.PersistentFlags().StringVar(&configPath, "config", defaultConfigPath, "Wiretrustee config file location") rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "sets Wiretrustee log level") + rootCmd.PersistentFlags().StringVar(&logFile, "log-file", defaultLogFile, "sets Wiretrustee log path. If console is specified the the log will be output to stdout") rootCmd.AddCommand(serviceCmd) rootCmd.AddCommand(upCmd) rootCmd.AddCommand(loginCmd) @@ -67,13 +70,3 @@ func SetupCloseHandler() { } }() } - -// InitLog parses and sets log-level input -func InitLog(logLevel string) { - level, err := log.ParseLevel(logLevel) - if err != nil { - log.Errorf("Failed parsing log-level %s: %s", logLevel, err) - os.Exit(ExitSetupFailed) - } - log.SetLevel(level) -} diff --git a/client/cmd/up.go b/client/cmd/up.go index c7fe7c336..4e7e15a7e 100644 --- a/client/cmd/up.go +++ b/client/cmd/up.go @@ -9,6 +9,7 @@ import ( mgm "github.com/wiretrustee/wiretrustee/management/client" mgmProto "github.com/wiretrustee/wiretrustee/management/proto" signal "github.com/wiretrustee/wiretrustee/signal/client" + "github.com/wiretrustee/wiretrustee/util" "golang.zx2c4.com/wireguard/wgctrl/wgtypes" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -19,12 +20,15 @@ var ( Use: "up", Short: "start wiretrustee", RunE: func(cmd *cobra.Command, args []string) error { - InitLog(logLevel) + err := util.InitLog(logLevel, logFile) + if err != nil { + log.Errorf("failed initializing log %v", err) + return err + } config, err := internal.ReadConfig(managementURL, configPath) if err != nil { log.Errorf("failed reading config %s %v", configPath, err) - //os.Exit(ExitSetupFailed) return err } @@ -32,7 +36,6 @@ var ( myPrivateKey, err := wgtypes.ParseKey(config.PrivateKey) if err != nil { log.Errorf("failed parsing Wireguard key %s: [%s]", config.PrivateKey, err.Error()) - //os.Exit(ExitSetupFailed) return err } @@ -47,7 +50,6 @@ var ( mgmClient, loginResp, err := connectToManagement(ctx, config.ManagementURL.Host, myPrivateKey, mgmTlsEnabled) if err != nil { log.Warn(err) - //os.Exit(ExitSetupFailed) return err } @@ -55,14 +57,12 @@ var ( signalClient, err := connectToSignal(ctx, loginResp.GetWiretrusteeConfig(), myPrivateKey) if err != nil { log.Error(err) - //os.Exit(ExitSetupFailed) return err } engineConfig, err := createEngineConfig(myPrivateKey, config, loginResp.GetWiretrusteeConfig(), loginResp.GetPeerConfig()) if err != nil { log.Error(err) - //os.Exit(ExitSetupFailed) return err } @@ -71,7 +71,6 @@ var ( err = engine.Start() if err != nil { log.Errorf("error while starting Wiretrustee Connection Engine: %s", err) - //os.Exit(ExitSetupFailed) return err } @@ -81,13 +80,11 @@ var ( err = mgmClient.Close() if err != nil { log.Errorf("failed closing Management Service client %v", err) - //os.Exit(ExitSetupFailed) return err } err = signalClient.Close() if err != nil { log.Errorf("failed closing Signal Service client %v", err) - //os.Exit(ExitSetupFailed) return err } @@ -95,7 +92,6 @@ var ( err = iface.Close() if err != nil { log.Errorf("failed closing Wiretrustee interface %s %v", config.WgIface, err) - //os.Exit(ExitSetupFailed) return err } diff --git a/go.mod b/go.mod index 53a62ef1c..011877ec6 100644 --- a/go.mod +++ b/go.mod @@ -23,4 +23,5 @@ require ( golang.zx2c4.com/wireguard/windows v0.4.5 google.golang.org/grpc v1.32.0 google.golang.org/protobuf v1.26.0 + gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) diff --git a/go.sum b/go.sum index 8cd41ec23..13a2b611b 100644 --- a/go.sum +++ b/go.sum @@ -11,6 +11,7 @@ cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqCl cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -499,6 +500,8 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= +gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= diff --git a/infrastructure_files/docker-compose.yml b/infrastructure_files/docker-compose.yml index b89300048..4aa600298 100644 --- a/infrastructure_files/docker-compose.yml +++ b/infrastructure_files/docker-compose.yml @@ -21,11 +21,12 @@ services: restart: unless-stopped volumes: - wiretrustee-mgmt:/var/lib/wiretrustee + - /varl/log/wiretrustee/signal.log:/var/log/wiretrustee/signal.log ports: - 10000:10000 # # port and command for Let's Encrypt validation # - 443:443 -# command: ["--letsencrypt-domain", ""] +# command: ["--letsencrypt-domain", "", "--log-file", "console"] # Management management: image: wiretrustee/management:latest @@ -33,11 +34,12 @@ services: volumes: - wiretrustee-mgmt:/var/lib/wiretrustee - ./config.json:/etc/wiretrustee/management.json +# - /var/log/wiretrustee/management.log:/var/log/wiretrustee/management.log ports: - 33073:33073 # # port and command for Let's Encrypt validation # - 443:443 -# command: ["--letsencrypt-domain", ""] +# command: ["--letsencrypt-domain", "", "--log-file", "console"] # Coturn coturn: image: coturn/coturn diff --git a/management/Dockerfile b/management/Dockerfile index 49020e8ae..3c57a226f 100644 --- a/management/Dockerfile +++ b/management/Dockerfile @@ -1,3 +1,4 @@ FROM gcr.io/distroless/base ENTRYPOINT [ "/go/bin/wiretrustee-mgmt","management"] +CMD ["--log-file", "console"] COPY wiretrustee-mgmt /go/bin/wiretrustee-mgmt \ No newline at end of file diff --git a/management/Dockerfile.debug b/management/Dockerfile.debug index 6bac95534..ec80c403d 100644 --- a/management/Dockerfile.debug +++ b/management/Dockerfile.debug @@ -1,3 +1,4 @@ FROM gcr.io/distroless/base:debug ENTRYPOINT [ "/go/bin/wiretrustee-mgmt","management","--log-level","debug"] +CMD ["--log-file", "console"] COPY wiretrustee-mgmt /go/bin/wiretrustee-mgmt \ No newline at end of file diff --git a/management/README.md b/management/README.md index 4edba5292..ce632fda1 100644 --- a/management/README.md +++ b/management/README.md @@ -18,6 +18,7 @@ Flags: Global Flags: --config string Wiretrustee config file location to write new config to (default "/etc/wiretrustee/config.json") --log-level string (default "info") + --log-file string sets Wiretrustee log path. If console is specified the the log will be output to stdout (default "/var/log/wiretrustee/management.log") ``` ## Run Management service (Docker) diff --git a/management/cmd/management.go b/management/cmd/management.go index a9568d66c..d3455567a 100644 --- a/management/cmd/management.go +++ b/management/cmd/management.go @@ -43,7 +43,10 @@ var ( Short: "start Wiretrustee Management Server", Run: func(cmd *cobra.Command, args []string) { flag.Parse() - InitLog(logLevel) + err := util.InitLog(logLevel, logFile) + if err != nil { + log.Fatalf("failed initializing log %v", err) + } config, err := loadConfig() if err != nil { diff --git a/management/cmd/root.go b/management/cmd/root.go index cc3c6c4b8..b5761062f 100644 --- a/management/cmd/root.go +++ b/management/cmd/root.go @@ -2,12 +2,10 @@ package cmd import ( "fmt" + "github.com/spf13/cobra" "os" "os/signal" "runtime" - - log "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) const ( @@ -19,6 +17,8 @@ var ( configPath string defaultConfigPath string logLevel string + defaultLogFile string + logFile string rootCmd = &cobra.Command{ Use: "wiretrustee-mgmt", @@ -39,11 +39,14 @@ func init() { stopCh = make(chan int) defaultConfigPath = "/etc/wiretrustee/management.json" + defaultLogFile = "/var/log/wiretrustee/management.log" if runtime.GOOS == "windows" { - defaultConfigPath = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "config.json" + defaultConfigPath = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "management.json" + defaultLogFile = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "management.log" } rootCmd.PersistentFlags().StringVar(&configPath, "config", defaultConfigPath, "Wiretrustee config file location to write new config to") rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "") + rootCmd.PersistentFlags().StringVar(&logFile, "log-file", defaultLogFile, "sets Wiretrustee log path. If console is specified the the log will be output to stdout") rootCmd.AddCommand(mgmtCmd) } @@ -58,13 +61,3 @@ func SetupCloseHandler() { } }() } - -// InitLog parses and sets log-level input -func InitLog(logLevel string) { - level, err := log.ParseLevel(logLevel) - if err != nil { - log.Errorf("Failed parsing log-level %s: %s", logLevel, err) - os.Exit(ExitSetupFailed) - } - log.SetLevel(level) -} diff --git a/signal/Dockerfile b/signal/Dockerfile index b85986810..581a7fe42 100644 --- a/signal/Dockerfile +++ b/signal/Dockerfile @@ -1,3 +1,4 @@ FROM gcr.io/distroless/base:debug ENTRYPOINT [ "/go/bin/wiretrustee-signal","run" ] +CMD ["--log-file", "console"] COPY wiretrustee-signal /go/bin/wiretrustee-signal \ No newline at end of file diff --git a/signal/README.md b/signal/README.md index 8af465e23..6944693c0 100644 --- a/signal/README.md +++ b/signal/README.md @@ -18,6 +18,7 @@ Flags: Global Flags: --log-level string (default "info") + --log-file string sets Wiretrustee log path. If console is specified the the log will be output to stdout (default "/var/log/wiretrustee/management.log") ``` ## Running the Signal service (Docker) diff --git a/signal/cmd/root.go b/signal/cmd/root.go index 5aa926b0a..0a364a158 100644 --- a/signal/cmd/root.go +++ b/signal/cmd/root.go @@ -2,10 +2,10 @@ package cmd import ( "fmt" - log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "os" "os/signal" + "runtime" ) const ( @@ -14,7 +14,9 @@ const ( ) var ( - logLevel string + logLevel string + defaultLogFile string + logFile string rootCmd = &cobra.Command{ Use: "wiretrustee-signal", @@ -33,10 +35,14 @@ func Execute() error { func init() { stopCh = make(chan int) + defaultLogFile = "/var/log/wiretrustee/signal.log" + if runtime.GOOS == "windows" { + defaultLogFile = os.Getenv("PROGRAMDATA") + "\\Wiretrustee\\" + "signal.log" + } rootCmd.PersistentFlags().StringVar(&logLevel, "log-level", "info", "") + rootCmd.PersistentFlags().StringVar(&logFile, "log-file", defaultLogFile, "sets Wiretrustee log path. If console is specified the the log will be output to stdout") rootCmd.AddCommand(runCmd) - InitLog(logLevel) } // SetupCloseHandler handles SIGTERM signal and exits with success @@ -50,13 +56,3 @@ func SetupCloseHandler() { } }() } - -// InitLog parses and sets log-level input -func InitLog(logLevel string) { - level, err := log.ParseLevel(logLevel) - if err != nil { - log.Errorf("Failed parsing log-level %s: %s", logLevel, err) - os.Exit(ExitSetupFailed) - } - log.SetLevel(level) -} diff --git a/signal/cmd/run.go b/signal/cmd/run.go index 2d04e2551..d06199692 100644 --- a/signal/cmd/run.go +++ b/signal/cmd/run.go @@ -8,6 +8,7 @@ import ( "github.com/wiretrustee/wiretrustee/encryption" "github.com/wiretrustee/wiretrustee/signal/proto" "github.com/wiretrustee/wiretrustee/signal/server" + "github.com/wiretrustee/wiretrustee/util" "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/keepalive" @@ -39,6 +40,10 @@ var ( Short: "start Wiretrustee Signal Server daemon", Run: func(cmd *cobra.Command, args []string) { flag.Parse() + err := util.InitLog(logLevel, logFile) + if err != nil { + log.Fatalf("failed initializing log %v", err) + } var opts []grpc.ServerOption if signalLetsencryptDomain != "" { diff --git a/util/log.go b/util/log.go new file mode 100644 index 000000000..a17eaf97e --- /dev/null +++ b/util/log.go @@ -0,0 +1,39 @@ +package util + +import ( + log "github.com/sirupsen/logrus" + "gopkg.in/natefinch/lumberjack.v2" + "io" + "path/filepath" + "time" +) + +// InitLog parses and sets log-level input +func InitLog(logLevel string, logPath string) error { + level, err := log.ParseLevel(logLevel) + if err != nil { + log.Errorf("Failed parsing log-level %s: %s", logLevel, err) + return err + } + + if logPath != "" && logPath != "console" { + lumberjackLogger := &lumberjack.Logger{ + // Log file absolute path, os agnostic + Filename: filepath.ToSlash(logPath), + MaxSize: 5, // MB + MaxBackups: 10, + MaxAge: 30, // days + Compress: true, + } + log.SetOutput(io.Writer(lumberjackLogger)) + } + + logFormatter := new(log.TextFormatter) + logFormatter.TimestampFormat = time.RFC3339 // or RFC3339 + logFormatter.FullTimestamp = true + + log.SetFormatter(logFormatter) + log.SetLevel(level) + + return nil +}