From f8bffd8391a19bfbae78c97d3a78158df02d64ee Mon Sep 17 00:00:00 2001 From: Dane Everitt Date: Thu, 28 May 2020 22:07:53 -0700 Subject: [PATCH] Start the process of migrating from zap to a cleaner CLI output for logs --- api/api.go | 14 +++--- cmd/root.go | 79 ++++++++++++++++++------------ config/config.go | 4 +- config/config_system.go | 12 ++--- environment/docker.go | 6 +-- go.mod | 3 ++ go.sum | 41 ++++++++++++++++ loggers/cli/cli.go | 93 ++++++++++++++++++++++++++++++++++++ server/environment_docker.go | 22 ++++----- server/server.go | 10 ++-- server/state.go | 2 +- sftp/server.go | 9 ++-- 12 files changed, 226 insertions(+), 69 deletions(-) create mode 100644 loggers/cli/cli.go diff --git a/api/api.go b/api/api.go index d4f136f..a3bb98f 100644 --- a/api/api.go +++ b/api/api.go @@ -4,9 +4,9 @@ import ( "bytes" "encoding/json" "fmt" + "github.com/apex/log" "github.com/pkg/errors" "github.com/pterodactyl/wings/config" - "go.uber.org/zap" "io/ioutil" "net/http" "strings" @@ -58,13 +58,11 @@ func (r *PanelRequest) logDebug(req *http.Request) { headers[k] = []string{v[0][0:15] + "(redacted)"} } - - zap.S().Debugw( - "making request to external HTTP endpoint", - zap.String("method", req.Method), - zap.String("endpoint", req.URL.String()), - zap.Any("headers", headers), - ) + log.WithFields(log.Fields{ + "method": req.Method, + "endpoint": req.URL.String(), + "headers": headers, + }).Debug("making request to external HTTP endpoint") } func (r *PanelRequest) Get(url string) (*http.Response, error) { diff --git a/cmd/root.go b/cmd/root.go index 144cc87..71c7656 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,7 +3,9 @@ package cmd import ( "crypto/tls" "fmt" + "github.com/apex/log" "github.com/mitchellh/colorstring" + "github.com/pterodactyl/wings/loggers/cli" "net/http" "os" "path" @@ -93,10 +95,10 @@ func rootCmdRun(*cobra.Command, []string) { panic(err) } - zap.S().Infof("using configuration from path: %s", c.GetPath()) + log.WithField("path", c.GetPath()).Info("loading configuration from path") if c.Debug { - zap.S().Debugw("running in debug mode") - zap.S().Infow("certificate checking is disabled") + log.Debug("running in debug mode") + log.Info("certificate checking is disabled") http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{ InsecureSkipVerify: true, @@ -107,42 +109,47 @@ func rootCmdRun(*cobra.Command, []string) { config.SetDebugViaFlag(debug) if err := c.System.ConfigureDirectories(); err != nil { - zap.S().Panicw("failed to configure system directories for pterodactyl", zap.Error(err)) - return + log.Fatal("failed to configure system directories for pterodactyl") + panic(err) } - zap.S().Infof("checking for pterodactyl system user \"%s\"", c.System.Username) + log.WithField("username", c.System.Username).Info("checking for pterodactyl system user") if su, err := c.EnsurePterodactylUser(); err != nil { - zap.S().Panicw("failed to create pterodactyl system user", zap.Error(err)) + log.Error("failed to create pterodactyl system user") + panic(err) return } else { - zap.S().Infow("configured system user", zap.String("username", su.Username), zap.String("uid", su.Uid), zap.String("gid", su.Gid)) + log.WithFields(log.Fields{ + "username": su.Username, + "uid": su.Uid, + "gid": su.Gid, + }).Info("configured system user successfully") } - zap.S().Infow("beginning file permission setting on server data directories") + log.Info("beginning file permission setting on server data directories") if err := c.EnsureFilePermissions(); err != nil { - zap.S().Errorw("failed to properly chown data directories", zap.Error(err)) + log.WithField("error", err).Error("failed to properly chown data directories") } else { - zap.S().Infow("finished ensuring file permissions") + log.Info("finished ensuring file permissions") } if err := server.LoadDirectory(); err != nil { - zap.S().Fatalw("failed to load server configurations", zap.Error(errors.WithStack(err))) + log.WithField("error", err).Fatal("failed to load server configurations") return } if err := environment.ConfigureDocker(&c.Docker); err != nil { - zap.S().Fatalw("failed to configure docker environment", zap.Error(errors.WithStack(err))) + log.WithField("error", err).Fatal("failed to configure docker environment") os.Exit(1) } if err := c.WriteToDisk(); err != nil { - zap.S().Errorw("failed to save configuration to disk", zap.Error(errors.WithStack(err))) + log.WithField("error", err).Error("failed to save configuration to disk") } // Just for some nice log output. for _, s := range server.GetServers().All() { - zap.S().Infow("loaded configuration for server", zap.String("server", s.Uuid)) + log.WithField("server", s.Uuid).Info("loaded configuration for server") } // Create a new WaitGroup that limits us to 4 servers being bootstrapped at a time @@ -154,18 +161,23 @@ func rootCmdRun(*cobra.Command, []string) { wg.Add() go func(s *server.Server) { - defer wg.Done() + // Required for tracing purposes. + var err error + + defer func() { + s.Log().Trace("ensuring server environment exists").Stop(&err) + wg.Done() + }() // Create a server environment if none exists currently. This allows us to recover from Docker // being reinstalled on the host system for example. - zap.S().Infow("ensuring environment exists", zap.String("server", s.Uuid)) - if err := s.Environment.Create(); err != nil { - zap.S().Errorw("failed to create an environment for server", zap.String("server", s.Uuid), zap.Error(err)) + if err = s.Environment.Create(); err != nil { + s.Log().WithField("error", err).Error("failed to process environment") } r, err := s.Environment.IsRunning() if err != nil { - zap.S().Errorw("error checking server environment status", zap.String("server", s.Uuid), zap.Error(err)) + s.Log().WithField("error", err).Error("error checking server environment status") } // If the server is currently running on Docker, mark the process as being in that state. @@ -175,13 +187,9 @@ func rootCmdRun(*cobra.Command, []string) { // This will also validate that a server process is running if the last tracked state we have // is that it was running, but we see that the container process is not currently running. if r || (!r && s.IsRunning()) { - zap.S().Infow("detected server is running, re-attaching to process", zap.String("server", s.Uuid)) + s.Log().Info("detected server is running, re-attaching to process...") if err := s.Environment.Start(); err != nil { - zap.S().Warnw( - "failed to properly start server detected as already running", - zap.String("server", s.Uuid), - zap.Error(errors.WithStack(err)), - ) + s.Log().WithField("error", errors.WithStack(err)).Warn("failed to properly start server detected as already running") } return @@ -201,26 +209,32 @@ func rootCmdRun(*cobra.Command, []string) { // Ensure the archive directory exists. if err := os.MkdirAll(c.System.ArchiveDirectory, 0755); err != nil { - zap.S().Errorw("failed to create archive directory", zap.Error(err)) + log.WithField("error", err).Error("failed to create archive directory") } // Ensure the backup directory exists. if err := os.MkdirAll(c.System.BackupDirectory, 0755); err != nil { - zap.S().Errorw("failed to create backup directory", zap.Error(err)) + log.WithField("error", err).Error("failed to create backup directory") } - zap.S().Infow("configuring webserver", zap.Bool("ssl", c.Api.Ssl.Enabled), zap.String("host", c.Api.Host), zap.Int("port", c.Api.Port)) + log.WithFields(log.Fields{ + "ssl": c.Api.Ssl.Enabled, + "host": c.Api.Host, + "port": c.Api.Port, + }).Info("configuring webserver...") r := router.Configure() addr := fmt.Sprintf("%s:%d", c.Api.Host, c.Api.Port) if c.Api.Ssl.Enabled { if err := r.RunTLS(addr, c.Api.Ssl.CertificateFile, c.Api.Ssl.KeyFile); err != nil { - zap.S().Fatalw("failed to configure HTTPS server", zap.Error(err)) + log.WithField("error", err).Fatal("failed to configure HTTPS server") + os.Exit(1) } } else { if err := r.Run(addr); err != nil { - zap.S().Fatalw("failed to configure HTTP server", zap.Error(err)) + log.WithField("error", err).Fatal("failed to configure HTTP server") + os.Exit(1) } } } @@ -250,6 +264,9 @@ func configureLogging(debug bool) error { zap.ReplaceGlobals(logger) + log.SetHandler(cli.Default) + log.SetLevel(log.DebugLevel) + return nil } diff --git a/config/config.go b/config/config.go index 2490a27..755de18 100644 --- a/config/config.go +++ b/config/config.go @@ -3,10 +3,10 @@ package config import ( "errors" "fmt" + "github.com/apex/log" "github.com/cobaugh/osrelease" "github.com/creasty/defaults" "github.com/gbrlsnchs/jwt/v3" - "go.uber.org/zap" "gopkg.in/yaml.v2" "io/ioutil" "os" @@ -296,7 +296,7 @@ func (c *Configuration) EnsureFilePermissions() error { gid, _ := strconv.Atoi(su.Gid) if err := os.Chown(path.Join(c.System.Data, f.Name()), uid, gid); err != nil { - zap.S().Warnw("failed to chown server directory", zap.String("directory", f.Name()), zap.Error(err)) + log.WithField("error", err).WithField("directory", f.Name()).Warn("failed to chown server directory") } }(file) } diff --git a/config/config_system.go b/config/config_system.go index 968988b..ef252f7 100644 --- a/config/config_system.go +++ b/config/config_system.go @@ -1,7 +1,7 @@ package config import ( - "go.uber.org/zap" + "github.com/apex/log" "os" "path" ) @@ -57,27 +57,27 @@ type SystemConfiguration struct { // Ensures that all of the system directories exist on the system. These directories are // created so that only the owner can read the data, and no other users. func (sc *SystemConfiguration) ConfigureDirectories() error { - zap.S().Debugw("ensuring root data directory exists", zap.String("path", sc.RootDirectory)) + log.WithField("path", sc.RootDirectory).Debug("ensuring root data directory exists") if err := os.MkdirAll(sc.RootDirectory, 0700); err != nil { return err } - zap.S().Debugw("ensuring log directory exists", zap.String("path", sc.LogDirectory)) + log.WithField("path", sc.LogDirectory).Debug("ensuring log directory exists") if err := os.MkdirAll(path.Join(sc.LogDirectory, "/install"), 0700); err != nil { return err } - zap.S().Debugw("ensuring server data directory exists", zap.String("path", sc.Data)) + log.WithField("path", sc.Data).Debug("ensuring server data directory exists") if err := os.MkdirAll(sc.Data, 0700); err != nil { return err } - zap.S().Debugw("ensuring archive data directory exists", zap.String("path", sc.ArchiveDirectory)) + log.WithField("path", sc.ArchiveDirectory).Debug("ensuring archive data directory exists") if err := os.MkdirAll(sc.ArchiveDirectory, 0700); err != nil { return err } - zap.S().Debugw("ensuring backup data directory exists", zap.String("path", sc.BackupDirectory)) + log.WithField("path", sc.BackupDirectory).Debug("ensuring backup data directory exists") if err := os.MkdirAll(sc.BackupDirectory, 0700); err != nil { return err } diff --git a/environment/docker.go b/environment/docker.go index 8083a06..c2a4e3e 100644 --- a/environment/docker.go +++ b/environment/docker.go @@ -2,12 +2,12 @@ package environment import ( "context" + "github.com/apex/log" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/network" "github.com/docker/docker/client" "github.com/pterodactyl/wings/config" - "go.uber.org/zap" ) // Configures the required network for the docker environment. @@ -20,10 +20,10 @@ func ConfigureDocker(c *config.DockerConfiguration) error { resource, err := cli.NetworkInspect(context.Background(), c.Network.Name, types.NetworkInspectOptions{}) if err != nil && client.IsErrNotFound(err) { - zap.S().Infow("creating missing pterodactyl0 interface, this could take a few seconds...") + log.Info("creating missing pterodactyl0 interface, this could take a few seconds...") return createDockerNetwork(cli, c) } else if err != nil { - zap.S().Fatalw("failed to create required docker network for containers", zap.Error(err)) + log.WithField("error", err).Fatal("failed to create required docker network for containers") } switch resource.Driver { diff --git a/go.mod b/go.mod index 591753a..2f5b4ca 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,7 @@ require ( github.com/Jeffail/gabs/v2 v2.2.0 github.com/Microsoft/go-winio v0.4.7 // indirect github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect + github.com/apex/log v1.3.0 github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a github.com/aws/aws-sdk-go v1.30.14 // indirect github.com/beevik/etree v1.1.0 @@ -27,6 +28,7 @@ require ( github.com/docker/docker v0.0.0-20180422163414-57142e89befe github.com/docker/go-connections v0.4.0 github.com/docker/go-units v0.3.3 // indirect + github.com/fatih/color v1.9.0 github.com/gabriel-vasile/mimetype v0.1.4 github.com/gbrlsnchs/jwt/v3 v3.0.0-rc.0 github.com/ghodss/yaml v1.0.0 @@ -40,6 +42,7 @@ require ( github.com/imdario/mergo v0.3.8 github.com/klauspost/pgzip v1.2.3 github.com/magiconair/properties v1.8.1 + github.com/mattn/go-colorable v0.1.4 github.com/mattn/go-shellwords v1.0.10 // indirect github.com/mholt/archiver/v3 v3.3.0 github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db diff --git a/go.sum b/go.sum index 89d3e3e..c63597c 100644 --- a/go.sum +++ b/go.sum @@ -18,11 +18,19 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6 h1:bZ28Hqta7TFAK3Q08CMvv8y3/8ATaEqv2nGoc6yff6c= github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U= +github.com/apex/log v1.3.0 h1:1fyfbPvUwD10nMoh3hY6MXzvZShJQn9/ck7ATgAt5pA= +github.com/apex/log v1.3.0/go.mod h1:jd8Vpsr46WAe3EZSQ/IUMs2qQD/GOycT5rPWCO1yGcs= +github.com/apex/logs v0.0.4/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo= +github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy8kCu4PNA+aP7WUV72eXWJeP9/r3/K9aLE= +github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a h1:idn718Q4B6AGu/h5Sxe66HYVdqdGu2l9Iebqhi/AEoA= github.com/asaskevich/govalidator v0.0.0-20190424111038-f61b66f89f4a/go.mod h1:lB+ZfQJz7igIIfQNfa7Ml4HSf2uFQQRzpGGRXenZAgY= +github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.30.14 h1:vZfX2b/fknc9wKcytbLWykM7in5k6dbQ8iHTJDUP1Ng= github.com/aws/aws-sdk-go v1.30.14/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59 h1:WWB576BN5zNSZc/M9d/10pqEx5VHNhaQ/yOVAkmj5Yo= +github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I= github.com/beevik/etree v1.1.0 h1:T0xke/WvNtMoCqgzPhkX2r4rjY3GDZFi+FjpRZY2Jbs= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= @@ -59,6 +67,10 @@ github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/dsnet/compress v0.0.1 h1:PlZu0n3Tuv04TzpfPbrnI0HW/YwodEXDS+oPKahKF0Q= github.com/dsnet/compress v0.0.1/go.mod h1:Aw8dCMJ7RioblQeTqt88akK31OvO8Dhf5JflhBbQEHo= github.com/dsnet/golib v0.0.0-20171103203638-1ea166775780/go.mod h1:Lj+Z9rebOhdfkVLjJ8T6VcRQv3SXugXy999NBtR9aFY= +github.com/fatih/color v1.7.0 h1:DkWD4oS2D8LGGgTQ6IvwJJXSL5Vp2ffcQg58nFV38Ys= +github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= +github.com/fatih/color v1.9.0 h1:8xPHl4/q1VyqGIPif1F+1V3Y3lSmrq01EabUW3CoW5s= +github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/gabriel-vasile/mimetype v0.1.4 h1:5mcsq3+DXypREUkW+1juhjeKmE/XnWgs+paHMJn7lf8= @@ -73,6 +85,7 @@ github.com/gin-gonic/gin v1.6.2 h1:88crIK23zO6TqlQBt+f9FrPJNKm9ZEr7qjp9vl/d5TM= github.com/gin-gonic/gin v1.6.2/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.4.0 h1:MP4Eh7ZCb31lleYCFuwm0oe4/YGak+5l1vA2NOE80nA= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= @@ -121,6 +134,7 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174 h1:WlZsjVhE8Af9IcZDGgJGQpNflI3+MJSBhsgT5PCtzBQ= github.com/hinshun/vt10x v0.0.0-20180616224451-1954e6464174/go.mod h1:DqJ97dSdRW1W22yXSB90986pcOyQ7r45iio1KN2ez1A= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334 h1:VHgatEHNcBFEB7inlalqfNqw65aNkM1lGX2yt3NmbS8= github.com/iancoleman/strcase v0.0.0-20191112232945-16388991a334/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/icza/dyno v0.0.0-20200205103839-49cb13720835 h1:f1irK5f03uGGj+FjgQfZ5VhdKNVQVJ4skHsedzVohQ4= @@ -129,9 +143,11 @@ github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0= github.com/json-iterator/go v1.1.9 h1:9yzud/Ht36ygwatGx56VwCZtlI/2AD15T1X2sjSuGns= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= @@ -157,6 +173,7 @@ github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.4 h1:5Myjjh3JY/NaAi4IsUbHADytDyl1VE1Y9PXDlL+P/VQ= github.com/kr/pty v1.1.4/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= @@ -169,9 +186,14 @@ github.com/magefile/mage v1.9.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQ github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.2 h1:/bC9yWikZXAL9uJdulbSfyVNIR3n3trXl+v8+1sx8mU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.4 h1:snbPLB8fVfU9iwbbo30TPtbLRzwWu6aJS6Xh4eaaviA= +github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-shellwords v1.0.10 h1:Y7Xqm8piKOO3v10Thp7Z36h4FYFjt5xB//6XvOrs2Gw= @@ -197,6 +219,8 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA github.com/nwaples/rardecode v1.0.0 h1:r7vGuS5akxOnR4JQSkko62RJ1ReCMXxQRPtxsiFMBOs= github.com/nwaples/rardecode v1.0.0/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/opencontainers/go-digest v1.0.0-rc1 h1:WzifXhOVOEOuFYOJAW6aQqW0TooG2iki3E3Ii+WN7gQ= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= @@ -238,17 +262,22 @@ github.com/pterodactyl/sftp-server v1.1.2/go.mod h1:KjSONrenRr1oCh94QIVAU6yEzMe+ github.com/remeh/sizedwaitgroup v0.0.0-20180822144253-5e7302b12cce h1:aP+C+YbHZfOQlutA4p4soHi7rVUqHQdWEVMSkHfDTqY= github.com/remeh/sizedwaitgroup v0.0.0-20180822144253-5e7302b12cce/go.mod h1:3j2R4OIe/SeS6YDhICBy22RWjJC5eNCJ1V+9+NVNYlo= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94 h1:G04eS0JkAIVZfaJLjla9dNxkJCPiKIGZlw9AfOhzOD0= github.com/sabhiram/go-gitignore v0.0.0-20180611051255-d3107576ba94/go.mod h1:b18R55ulyQ/h3RaWyloPyER7fWQVZvimKKhnI5OfrJQ= +github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM= +github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -269,6 +298,11 @@ github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJy github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/tj/assert v0.0.0-20171129193455-018094318fb0/go.mod h1:mZ9/Rh9oLWpLLDRpvE+3b7gP/C2YyLFYxNmcLnPTMe0= +github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0= +github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao= +github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= +github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/uber-go/zap v1.9.1/go.mod h1:GY+83l3yxBcBw2kmHu/sAWwItnTn+ynxHCRo+WiIQOY= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= @@ -312,6 +346,7 @@ go.uber.org/zap v1.15.0/go.mod h1:Mb2vm2krFEG5DV0W9qcHBYFtp/Wku1cvYaqPsS/WYfc= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181025213731-e84da0312774/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190530122614-20be4c3c3ed5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -336,6 +371,7 @@ golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.2.0 h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -360,12 +396,14 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a h1:WXEvlFVvvGxCJLG6REjsT03i golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200413165638-669c56c373c4 h1:opSr2sbRXk5X5/givKrrKj9HXxFpW2sdCiP8MJSKLQY= @@ -413,12 +451,15 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= diff --git a/loggers/cli/cli.go b/loggers/cli/cli.go new file mode 100644 index 0000000..8e82227 --- /dev/null +++ b/loggers/cli/cli.go @@ -0,0 +1,93 @@ +package cli + +import ( + "fmt" + "github.com/apex/log" + "github.com/apex/log/handlers/cli" + color2 "github.com/fatih/color" + "github.com/mattn/go-colorable" + "github.com/pkg/errors" + "io" + "os" + "sync" + "time" +) + +var Default = New(os.Stderr) + +var bold = color2.New(color2.Bold) + +var Strings = [...]string{ + log.DebugLevel: "DEBUG", + log.InfoLevel: " INFO", + log.WarnLevel: " WARN", + log.ErrorLevel: "ERROR", + log.FatalLevel: "FATAL", +} + +type Handler struct { + mu sync.Mutex + Writer io.Writer + Padding int +} + +func New(w io.Writer) *Handler { + if f, ok := w.(*os.File); ok { + return &Handler{Writer: colorable.NewColorable(f), Padding: 2} + } + + return &Handler{Writer: w, Padding: 2} +} + +type tracer interface { + StackTrace() errors.StackTrace +} + +// HandleLog implements log.Handler. +func (h *Handler) HandleLog(e *log.Entry) error { + color := cli.Colors[e.Level] + level := Strings[e.Level] + names := e.Fields.Names() + + h.mu.Lock() + defer h.mu.Unlock() + + color.Fprintf(h.Writer, "%s: [%s] %-25s", bold.Sprintf("%*s", h.Padding+1, level), time.Now().Format(time.StampMilli), e.Message) + + for _, name := range names { + if name == "source" { + continue + } + + fmt.Fprintf(h.Writer, " %s=%v", color.Sprint(name), e.Fields.Get(name)) + } + + fmt.Fprintln(h.Writer) + + for _, name := range names { + if name != "error" { + continue + } + + if err, ok := e.Fields.Get("error").(error); ok { + if e, ok := errors.Cause(err).(tracer); ok { + st := e.StackTrace() + + l := len(st) + if l > 5 { + l = 5 + } + + br := color2.New(color2.Bold, color2.FgRed) + + fmt.Fprintf(h.Writer, "\n%s%+v\n\n", br.Sprintf("Stacktrace:"), st[0:l]) + } else { + fmt.Printf("\n\nINVALID TRACER\n\n") + } + } else { + fmt.Printf("\n\nINVALID ERROR\n\n") + } + } + + return nil +} diff --git a/server/environment_docker.go b/server/environment_docker.go index adf38bd..afccf29 100644 --- a/server/environment_docker.go +++ b/server/environment_docker.go @@ -6,6 +6,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/apex/log" "github.com/docker/docker/api/types" "github.com/docker/docker/api/types/container" "github.com/docker/docker/api/types/mount" @@ -15,7 +16,6 @@ import ( "github.com/pkg/errors" "github.com/pterodactyl/wings/api" "github.com/pterodactyl/wings/config" - "go.uber.org/zap" "io" "os" "strconv" @@ -141,7 +141,7 @@ func (d *DockerEnvironment) InSituUpdate() error { // state. This ensures that unexpected container deletion while Wings is running does // not result in the server becoming unbootable. func (d *DockerEnvironment) OnBeforeStart() error { - zap.S().Infow("syncing server configuration with Panel", zap.String("server", d.Server.Uuid)) + d.Server.Log().Info("syncing server configuration with panel") if err := d.Server.Sync(); err != nil { return err } @@ -422,7 +422,7 @@ func (d *DockerEnvironment) Attach() error { d.attached = true go func() { if err := d.EnableResourcePolling(); err != nil { - zap.S().Warnw("failed to enabled resource polling on server", zap.String("server", d.Server.Uuid), zap.Error(errors.WithStack(err))) + d.Server.Log().WithField("error", errors.WithStack(err)).Warn("failed to enable resource polling on server") } }() @@ -470,7 +470,7 @@ func (d *DockerEnvironment) FollowConsoleOutput() error { } if err := s.Err(); err != nil { - zap.S().Warnw("error processing scanner line in console output", zap.String("server", d.Server.Uuid), zap.Error(err)) + d.Server.Log().WithField("error", err).Warn("error processing scanner line in console output") } }(reader) @@ -500,7 +500,7 @@ func (d *DockerEnvironment) EnableResourcePolling() error { if err := dec.Decode(&v); err != nil { if err != io.EOF { - zap.S().Warnw("encountered error processing server stats; stopping collection", zap.Error(err)) + d.Server.Log().WithField("error", err).Warn("encountered error processing server stats, stopping collection") } d.DisableResourcePolling() @@ -576,12 +576,10 @@ func (d *DockerEnvironment) ensureImageExists(c *client.Client) error { for _, img := range images { for _, t := range img.RepoTags { if t == d.Server.Container.Image { - zap.S().Warnw( - "unable to pull requested image from remote source, however the image exists locally", - zap.String("server", d.Server.Uuid), - zap.String("image", d.Server.Container.Image), - zap.Error(err), - ) + d.Server.Log().WithFields(log.Fields{ + "image": d.Server.Container.Image, + "error": errors.New(err.Error()), + }).Warn("unable to pull requested image from remote source, however the image exists locally") // Okay, we found a matching container image, in that case just go ahead and return // from this function, since there is nothing else we need to do here. @@ -594,7 +592,7 @@ func (d *DockerEnvironment) ensureImageExists(c *client.Client) error { } defer out.Close() - zap.S().Debugw("pulling docker image... this could take a bit of time", zap.String("image", d.Server.Container.Image)) + log.WithField("image", d.Server.Container.Image).Debug("pulling docker image... this could take a bit of time") // I'm not sure what the best approach here is, but this will block execution until the image // is done being pulled, which is what we need. diff --git a/server/server.go b/server/server.go index 82deffe..b510185 100644 --- a/server/server.go +++ b/server/server.go @@ -2,13 +2,13 @@ package server import ( "fmt" + "github.com/apex/log" "github.com/creasty/defaults" "github.com/patrickmn/go-cache" "github.com/pkg/errors" "github.com/pterodactyl/wings/api" "github.com/pterodactyl/wings/config" "github.com/remeh/sizedwaitgroup" - "go.uber.org/zap" "math" "os" "strings" @@ -194,13 +194,13 @@ func LoadDirectory() error { s, err := FromConfiguration(data) if err != nil { - zap.S().Errorw("failed to load server, skipping...", zap.String("server", uuid), zap.Error(err)) + log.WithField("server", uuid).WithField("error", err).Error("failed to load server, skipping...") return } if state, exists := states[s.Uuid]; exists { s.SetState(state) - zap.S().Debugw("loaded server state from cache", zap.String("server", s.Uuid), zap.String("state", s.GetState())) + s.Log().WithField("state", s.GetState()).Debug("loaded server state from cache file") } servers.Add(s) @@ -282,6 +282,10 @@ eloop: return out } +func (s *Server) Log() *log.Entry { + return log.WithField("server", s.Uuid) +} + // Syncs the state of the server on the Panel with Wings. This ensures that we're always // using the state of the server from the Panel and allows us to not require successful // API calls to Wings to do things. diff --git a/server/state.go b/server/state.go index a4d8a36..39648f7 100644 --- a/server/state.go +++ b/server/state.go @@ -82,7 +82,7 @@ func (s *Server) SetState(state string) error { s.State = state // Emit the event to any listeners that are currently registered. - zap.S().Debugw("saw server status change event", zap.String("server", s.Uuid), zap.String("status", s.State)) + s.Log().WithField("status", s.State).Debug("saw server status change event") s.Events().Publish(StatusEvent, s.State) // Release the lock as it is no longer needed for the following actions. diff --git a/sftp/server.go b/sftp/server.go index 54d8012..c554ce9 100644 --- a/sftp/server.go +++ b/sftp/server.go @@ -1,6 +1,7 @@ package sftp import ( + "github.com/apex/log" "github.com/pkg/errors" "github.com/pterodactyl/sftp-server" "github.com/pterodactyl/wings/api" @@ -38,7 +39,7 @@ func Initialize(config *config.Configuration) error { // a long running operation. go func(instance *sftp_server.Server) { if err := c.Initalize(); err != nil { - zap.S().Named("sftp").Errorw("failed to initialize SFTP subsystem", zap.Error(errors.WithStack(err))) + log.WithField("subsystem", "sftp").WithField("error", errors.WithStack(err)).Error("failed to initialize SFTP subsystem") } }(c) @@ -73,7 +74,8 @@ func validateDiskSpace(fs sftp_server.FileSystem) bool { // the server's UUID if the credentials were valid. func validateCredentials(c sftp_server.AuthenticationRequest) (*sftp_server.AuthenticationResponse, error) { resp, err := api.NewRequester().ValidateSftpCredentials(c) - zap.S().Named("sftp").Debugw("validating credentials for SFTP connection", zap.String("username", c.User)) + + log.WithFields(log.Fields{"subsystem": "sftp", "username": c.User}).Debug("validating credentials for SFTP connection") if err != nil { return resp, err } @@ -86,6 +88,7 @@ func validateCredentials(c sftp_server.AuthenticationRequest) (*sftp_server.Auth return resp, errors.New("no matching server with UUID found") } - zap.S().Named("sftp").Debugw("matched user to server instance, credentials successfully validated", zap.String("username", c.User), zap.String("server", s.Uuid)) + s.Log().WithFields(log.Fields{"subsystem": "sftp", "username": c.User}).Debug("matched user to server instance, credentials successfully validated") + return resp, err }