diff options
Diffstat (limited to 'internal')
| -rw-r--r-- | internal/api/api.go | 10 | ||||
| -rw-r--r-- | internal/config/config.go | 4 | ||||
| -rw-r--r-- | internal/config/v2/convert.go | 2 | ||||
| -rw-r--r-- | internal/config/v2/v2.go | 6 | ||||
| -rw-r--r-- | internal/discovery/discovery.go | 24 | ||||
| -rw-r--r-- | internal/discovery/manager.go | 5 | ||||
| -rw-r--r-- | internal/failover/monitor.go | 19 | ||||
| -rw-r--r-- | internal/log/log.go | 140 | ||||
| -rw-r--r-- | internal/server/custom.go | 4 | ||||
| -rw-r--r-- | internal/server/institute.go | 4 | ||||
| -rw-r--r-- | internal/server/secureinternet.go | 4 |
11 files changed, 54 insertions, 168 deletions
diff --git a/internal/api/api.go b/internal/api/api.go index 4ee82b0..c34a0b0 100644 --- a/internal/api/api.go +++ b/internal/api/api.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "net/http" "net/url" "time" @@ -16,7 +17,6 @@ import ( "codeberg.org/eduVPN/eduvpn-common/internal/api/endpoints" "codeberg.org/eduVPN/eduvpn-common/internal/api/profiles" httpw "codeberg.org/eduVPN/eduvpn-common/internal/http" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/internal/wireguard" "codeberg.org/eduVPN/eduvpn-common/types/protocol" "codeberg.org/eduVPN/eduvpn-common/types/server" @@ -186,7 +186,7 @@ func (a *API) authorizedRetry(ctx context.Context, method string, endpoint strin // Only retry authorized if we get an HTTP 401 // TODO: Can the OAuth client handle this instead? if errors.As(err, &statErr) && statErr.Status == 401 { - log.Logger.Debugf("Got a 401 error after HTTP method: %s, endpoint: %s. Marking token as expired...", method, endpoint) + slog.Debug("Got a HTTP 401. Marking tokens as expired...", "HTTP method", method, "endpoint", endpoint) // Mark the token as expired and retry, so we trigger the refresh flow a.oauth.SetTokenExpired() h, body, err = a.authorized(ctx, method, endpoint, opts) @@ -196,7 +196,7 @@ func (a *API) authorizedRetry(ctx context.Context, method string, endpoint strin if err != nil && errors.As(err, &tErr) { // Mark the token as invalid and retry, so we trigger the authorization flow a.oauth.SetTokenRenew() - log.Logger.Debugf("the tokens were invalid, trying again...") + slog.Debug("The tokens were invalid, trying again...") if autherr := a.authorize(ctx); autherr != nil { return nil, nil, autherr } @@ -376,12 +376,12 @@ type OAuthLogger struct{} // Logf logs a message with parameters func (ol *OAuthLogger) Logf(msg string, params ...any) { - log.Logger.Debugf(msg, params...) + slog.Debug("OAuth log", "log", fmt.Sprintf(msg, params...)) } // Log logs a message func (ol *OAuthLogger) Log(msg string) { - log.Logger.Debugf("%s", msg) + slog.Debug("OAuth log", "log", msg) } func init() { diff --git a/internal/config/config.go b/internal/config/config.go index 9e924c1..06da9b3 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -4,6 +4,7 @@ package config import ( "encoding/json" + "log/slog" "os" "path" @@ -11,7 +12,6 @@ import ( "codeberg.org/eduVPN/eduvpn-common/internal/config/v1" "codeberg.org/eduVPN/eduvpn-common/internal/config/v2" "codeberg.org/eduVPN/eduvpn-common/internal/discovery" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/internal/util" ) @@ -91,7 +91,7 @@ func NewFromDirectory(dir string) *Config { } err := cfg.Load() if err != nil { - log.Logger.Debugf("failed to load configuration: %v", err) + slog.Debug("failed to load configuration", "error", err) } if cfg.V2 == nil { cfg.V2 = &v2.V2{} diff --git a/internal/config/v2/convert.go b/internal/config/v2/convert.go index f50ffaf..675d274 100644 --- a/internal/config/v2/convert.go +++ b/internal/config/v2/convert.go @@ -1,11 +1,11 @@ package v2 import ( + "maps" "time" "codeberg.org/eduVPN/eduvpn-common/internal/config/v1" "codeberg.org/eduVPN/eduvpn-common/types/server" - "maps" ) func v1AuthTime(st time.Time, ost time.Time) time.Time { diff --git a/internal/config/v2/v2.go b/internal/config/v2/v2.go index d23d26d..7851cb8 100644 --- a/internal/config/v2/v2.go +++ b/internal/config/v2/v2.go @@ -4,11 +4,11 @@ package v2 import ( "errors" "fmt" + "log/slog" "net/url" "time" "codeberg.org/eduVPN/eduvpn-common/internal/discovery" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/types/server" ) @@ -215,7 +215,7 @@ func convertCustom(u string) server.Server { dn := u pu, err := url.Parse(u) if err != nil { - log.Logger.Errorf("failed to parse server hostname: %v", err) + slog.Error("failed to parse server hostname", "error", err) } else { dn = pu.Hostname() } @@ -272,7 +272,7 @@ func (cfg *V2) PublicList(disco *discovery.Discovery) *server.List { g.Profiles = v.Profiles ret.Custom = append(ret.Custom, g) default: - log.Logger.Errorf("no such server type in list: '%v'", k.T) + slog.Error("no such server type in list", "type", k.T) continue } } diff --git a/internal/discovery/discovery.go b/internal/discovery/discovery.go index 3fcb68c..81163f8 100644 --- a/internal/discovery/discovery.go +++ b/internal/discovery/discovery.go @@ -6,12 +6,12 @@ import ( "encoding/json" "errors" "fmt" + "log/slog" "net/http" "time" httpw "codeberg.org/eduVPN/eduvpn-common/internal/http" "codeberg.org/eduVPN/eduvpn-common/internal/levenshtein" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/internal/verify" discotypes "codeberg.org/eduVPN/eduvpn-common/types/discovery" ) @@ -129,13 +129,13 @@ func (discovery *Discovery) file(ctx context.Context, jsonFile string, previousV if lms != "" { lm, err := http.ParseTime(lms) if err != nil { - log.Logger.Warningf("failed to parse 'Last-Modified' header: %v", err) + slog.Warn("failed to parse 'Last-Modified' header", "error", err) } else { newUpdate = lm - log.Logger.Debugf("got 'Last-Modified' header: %v", lm) + slog.Debug("got 'Last-Modified' header", "value", lm) } } else { - log.Logger.Warningf("no 'Last-Modified' header found") + slog.Warn("no 'Last-Modified' header found") } // Get signature @@ -339,22 +339,22 @@ func (discovery *Discovery) Organizations(ctx context.Context) (*Organizations, statErr := &httpw.StatusError{} if errors.As(err, &statErr) { if statErr.Status != 304 { - log.Logger.Warningf("failed to get fresh organizations: %v", err) + slog.Warn("failed to get fresh organization", "error", err) } else { discovery.OrganizationList.Timestamp = time.Now() - log.Logger.Debugf("got 304 for discovery, organization_list.json not modified") + slog.Debug("got HTTP 304 for discovery, organization_list.json is not modified") err = nil } } // Return previous with an error orgs, perr := discovery.previousOrganizations() if perr != nil { - log.Logger.Warningf("failed to get previous discovery organizations: %v", perr) + slog.Warn("failed to get previous discovery organizations", "error", perr) } return orgs, false, err } if len(jsonDecode.List) == 0 { - log.Logger.Warningf("fresh organization list is empty") + slog.Warn("fresh organization list is empty") } else { discovery.OrganizationList = jsonDecode } @@ -379,22 +379,22 @@ func (discovery *Discovery) Servers(ctx context.Context) (*Servers, bool, error) statErr := &httpw.StatusError{} if errors.As(err, &statErr) { if statErr.Status != 304 { - log.Logger.Warningf("failed to get fresh servers: %v", err) + slog.Warn("failed to get fresh servers", "error", err) } else { discovery.ServerList.Timestamp = time.Now() - log.Logger.Debugf("got 304 for discovery, server_list.json not modified") + slog.Debug("got HTTP 304 for discovery, server_list.json is not modified") err = nil } } // Return previous with an error srvs, perr := discovery.previousServers() if perr != nil { - log.Logger.Warningf("failed to get previous discovery servers: %v", perr) + slog.Warn("failed to get previous discovery server", "error", perr) } return srvs, false, err } if len(jsonDecode.List) == 0 { - log.Logger.Warningf("fresh server list is empty") + slog.Warn("fresh server list is empty") } else { discovery.ServerList = jsonDecode } diff --git a/internal/discovery/manager.go b/internal/discovery/manager.go index 6a78486..134525b 100644 --- a/internal/discovery/manager.go +++ b/internal/discovery/manager.go @@ -2,9 +2,8 @@ package discovery import ( "context" + "log/slog" "sync" - - "codeberg.org/eduVPN/eduvpn-common/internal/log" ) // Manager is the discovery struct that is cached @@ -68,7 +67,7 @@ func (m *Manager) Startup(ctx context.Context, cb func()) { m.lock(false) discoCopy, err := m.disco.Copy() if err != nil { - log.Logger.Warningf("internal error, failed to clone discovery, %v", err) + slog.Warn("failed to clone discovery", "error", err) return } m.unlock(false) diff --git a/internal/failover/monitor.go b/internal/failover/monitor.go index a29c711..5efdbd0 100644 --- a/internal/failover/monitor.go +++ b/internal/failover/monitor.go @@ -3,9 +3,8 @@ package failover import ( "context" "fmt" + "log/slog" "time" - - "codeberg.org/eduVPN/eduvpn-common/internal/log" ) type sender interface { @@ -44,7 +43,7 @@ func (m *DroppedConMon) dropped(startBytes int64) (bool, error) { if err != nil { return false, err } - log.Logger.Debugf("[Failover] Alive check, current Rx bytes: %d, start Rx bytes: %d", b, startBytes) + slog.Debug("Failover alive check", "rx bytes", b, "start bytes", startBytes) return b <= startBytes, nil } @@ -71,17 +70,17 @@ func (m *DroppedConMon) Start(ctx context.Context, gateway string, mtuSize int) // Send a ping and wait for max 2 seconds // If we have then increased Rx bytes we return early if err = p.Send(1); err != nil { - log.Logger.Debugf("[Failover] First ping failed, exiting...") + slog.Debug("Failover first ping failed, exiting...") return false, err } - log.Logger.Debugf("[Failover] Now we are doing alive check") + slog.Debug("Failover doing alive check") // Read the pong, if we got the echo reply then everything is fine, early return if err = p.Read(time.Now().Add(m.pInterval)); err == nil { - log.Logger.Debugf("[Failover] Got early pong, exiting...") + slog.Debug("Failover got early pong, exiting...") return false, err } - log.Logger.Debugf("[Failover] Error reading pong: %v", err) + slog.Debug("Failover error reading pong", "error", err) // Create a new ticker that executes our ping function every 'interval' seconds // It starts immediately and stops when we reach the end @@ -89,15 +88,15 @@ func (m *DroppedConMon) Start(ctx context.Context, gateway string, mtuSize int) defer ticker.Stop() // Otherwise send n pings, without waiting for pong and then check if dropped - log.Logger.Debugf("[Failover] Starting by sending pings and not waiting for pong...") + slog.Debug("Failover started by sending pings and not waiting for a pong...") // Loop until the max drop counter // We begin with 2 as this is used as the sequence number for ping // and we have already sent a ping for s := 2; s <= m.pDropped; s++ { - log.Logger.Debugf("[Failover] Sending ping: %d, with size: %d", s, mtuSize) + slog.Debug("Failover sending ping", "ping", s, "size", mtuSize) // Send a ping and return if an error occurs if err := p.Send(s); err != nil { - log.Logger.Debugf("[Failover] A ping failed, exiting...") + slog.Debug("Failover ping failed, exiting...") return false, err } // Wait for the next tick to continue diff --git a/internal/log/log.go b/internal/log/log.go index e47a743..d4a9bf5 100644 --- a/internal/log/log.go +++ b/internal/log/log.go @@ -4,146 +4,34 @@ package log import ( "fmt" "io" - "log" + "log/slog" "os" "path" "codeberg.org/eduVPN/eduvpn-common/internal/util" ) -// FileLogger defines the type of logger that this package implements -// As the name suggests, it saves the log to a file. -type FileLogger struct { - // Level indicates which maximum level this logger actually forwards to the file - Level Level - - // file represents a pointer to the open log file - file *os.File -} - -// Logger is the global logger instance -var Logger *FileLogger - -// Level is the level of log, e.g. debug -type Level int8 - -const ( - // LevelNotSet indicates level not set, not allowed. - LevelNotSet Level = iota - - // LevelDebug indicates that the message is not an error but is there for debugging. - LevelDebug - - // LevelInfo indicates that the message is not an error but is there for additional information. - LevelInfo - - // LevelWarning indicates only a warning, the app still functions. - LevelWarning - - // LevelError indicates a generic error, the app still functions but some functionality might not work. - LevelError - - // LevelFatal indicates a fatal error, the app cannot function correctly when such an error occurs. - LevelFatal -) - -// String returns the string of each level. -func (e Level) String() string { - switch e { - case LevelNotSet: - return "NOTSET" - case LevelDebug: - return "DEBUG" - case LevelInfo: - return "INFO" - case LevelWarning: - return "WARNING" - case LevelError: - return "ERROR" - case LevelFatal: - return "FATAL" - default: - return "UNKNOWN" - } -} - -// Init initializes the logger by forwarding a max level 'level' and a directory 'directory' where the log should be stored -// If the logger cannot be initialized, for example an error in opening the log file, an error is returned. -func (logger *FileLogger) Init(lvl Level, dir string) error { +// Init initializes the logger by setting a max level 'level' and a directory 'directory' where the log should be stored +// internally, it uses slog, so any package just imports slog +func Init(lvl slog.Level, dir string) (*os.File, error) { err := util.EnsureDirectory(dir) if err != nil { - return err + return nil, err } + name := path.Join(dir, "log") f, err := os.OpenFile( - logger.filename(dir), + name, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o666, ) if err != nil { - return fmt.Errorf("failed creating log: %w", err) + return nil, fmt.Errorf("failed creating log: %w", err) } multi := io.MultiWriter(os.Stdout, f) - log.SetOutput(multi) - logger.file = f - logger.Level = lvl - return nil -} - -// Inherit logs an error with a message and params using the error level verbosity of the error. -// The message is always prefixed with the error. -func (logger *FileLogger) Inherit(err error, msg string) { - if err == nil { - return - } - s := "%s %s" - logger.Errorf(s, err.Error(), msg) -} - -// Debugf logs a message with parameters as level LevelDebug. -func (logger *FileLogger) Debugf(msg string, params ...any) { - logger.log(LevelDebug, msg, params...) -} - -// Infof logs a message with parameters as level LevelInfo. -func (logger *FileLogger) Infof(msg string, params ...any) { - logger.log(LevelInfo, msg, params...) -} - -// Warningf logs a message with parameters as level LevelWarning. -func (logger *FileLogger) Warningf(msg string, params ...any) { - logger.log(LevelWarning, msg, params...) -} - -// Errorf logs a message with parameters as level LevelError. -func (logger *FileLogger) Errorf(msg string, params ...any) { - logger.log(LevelError, msg, params...) -} - -// Fatalf logs a message with parameters as level LevelFatal. -func (logger *FileLogger) Fatalf(msg string, params ...any) { - logger.log(LevelFatal, msg, params...) -} - -// Close closes the logger by closing the internal file. -func (logger *FileLogger) Close() error { - return logger.file.Close() -} - -// filename returns the filename of the logger by returning the full path as a string. -func (logger *FileLogger) filename(directory string) string { - return path.Join(directory, "log") -} - -// log logs as level 'level' a message 'msg' with parameters 'params'. -func (logger *FileLogger) log(lvl Level, msg string, params ...any) { - if lvl >= logger.Level && logger.Level != LevelNotSet { - fMsg := fmt.Sprintf(msg, params...) - f := fmt.Sprintf("- Go - %s - %s", lvl.String(), fMsg) - // To log file - log.Println(f) - } -} - -func init() { - Logger = &FileLogger{} + handler := slog.NewTextHandler(multi, &slog.HandlerOptions{ + Level: lvl, + }) + logger := slog.New(handler) + slog.SetDefault(logger) + return f, nil } diff --git a/internal/server/custom.go b/internal/server/custom.go index fe240e7..0940084 100644 --- a/internal/server/custom.go +++ b/internal/server/custom.go @@ -2,11 +2,11 @@ package server import ( "context" + "log/slog" "time" "codeberg.org/eduVPN/eduvpn-common/internal/api" "codeberg.org/eduVPN/eduvpn-common/internal/config/v2" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/types/server" "github.com/jwijenbergh/eduoauth-go" ) @@ -45,7 +45,7 @@ func (s *Servers) AddCustom(ctx context.Context, id string, ot *int64) error { // authorization has failed, remove the server again rerr := s.config.RemoveServer(id, server.TypeCustom) if rerr != nil { - log.Logger.Warningf("could not remove custom server: '%s' after failing authorization: %v", id, rerr) + slog.Warn("could not remove custom server after failing authorization", "server", id, "error", rerr) } return err } diff --git a/internal/server/institute.go b/internal/server/institute.go index 8948443..348e895 100644 --- a/internal/server/institute.go +++ b/internal/server/institute.go @@ -2,12 +2,12 @@ package server import ( "context" + "log/slog" "time" "codeberg.org/eduVPN/eduvpn-common/internal/api" "codeberg.org/eduVPN/eduvpn-common/internal/config/v2" "codeberg.org/eduVPN/eduvpn-common/internal/discovery" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/types/server" "github.com/jwijenbergh/eduoauth-go" ) @@ -57,7 +57,7 @@ func (s *Servers) AddInstitute(ctx context.Context, discom *discovery.Manager, i // authorization has failed, remove the server again rerr := s.config.RemoveServer(dsrv.BaseURL, server.TypeInstituteAccess) if rerr != nil { - log.Logger.Warningf("could not remove institute access server: '%s' after failing authorization: %v", dsrv.BaseURL, rerr) + slog.Warn("Could not remove institute access server after failing authorization", "server", dsrv.BaseURL, "error", rerr) } return err } diff --git a/internal/server/secureinternet.go b/internal/server/secureinternet.go index 1b786ed..f97cef1 100644 --- a/internal/server/secureinternet.go +++ b/internal/server/secureinternet.go @@ -3,12 +3,12 @@ package server import ( "context" "errors" + "log/slog" "time" "codeberg.org/eduVPN/eduvpn-common/internal/api" "codeberg.org/eduVPN/eduvpn-common/internal/config/v2" "codeberg.org/eduVPN/eduvpn-common/internal/discovery" - "codeberg.org/eduVPN/eduvpn-common/internal/log" "codeberg.org/eduVPN/eduvpn-common/internal/util" "codeberg.org/eduVPN/eduvpn-common/types/server" "github.com/jwijenbergh/eduoauth-go" @@ -76,7 +76,7 @@ func (s *Servers) AddSecure(ctx context.Context, discom *discovery.Manager, orgI // authorization has failed, remove the server again rerr := s.config.RemoveServer(orgID, server.TypeSecureInternet) if rerr != nil { - log.Logger.Warningf("could not remove secure internet server: '%s' after failing authorization: %v", orgID, rerr) + slog.Warn("could not remove secure internet server after failing authorization", "server", orgID, "error", rerr) } return err } |
