From 4a9a329339c3e955bb85651733ded5bfc91794b1 Mon Sep 17 00:00:00 2001 From: Kristoffer Dalby Date: Thu, 5 Feb 2026 13:59:26 +0000 Subject: [PATCH] all: use lowercase log messages Go style recommends that log messages and error strings should not be capitalized (unless beginning with proper nouns or acronyms) and should not end with punctuation. This change normalizes all zerolog .Msg() and .Msgf() calls to start with lowercase letters, following Go conventions and making logs more consistent across the codebase. --- cmd/headscale/cli/configtest.go | 2 +- cmd/headscale/cli/mockoidc.go | 13 +++++----- cmd/headscale/cli/root.go | 4 ++-- cmd/headscale/cli/serve.go | 4 ++-- cmd/headscale/cli/users.go | 4 ++-- cmd/headscale/cli/utils.go | 6 ++--- hscontrol/app.go | 24 +++++++++---------- hscontrol/auth.go | 4 ++-- hscontrol/db/db.go | 18 +++++++------- hscontrol/db/ip.go | 2 +- hscontrol/db/node.go | 4 ++-- hscontrol/derp/server/derp_server.go | 36 +++++++++++++++------------- hscontrol/grpcv1.go | 6 ++--- hscontrol/mapper/batcher_lockfree.go | 4 ++-- hscontrol/mapper/mapper.go | 10 ++++---- hscontrol/noise.go | 6 ++--- hscontrol/oidc.go | 2 +- hscontrol/policy/v2/filter.go | 2 +- hscontrol/poll.go | 2 +- hscontrol/state/state.go | 16 ++++++------- hscontrol/types/config.go | 4 ++-- hscontrol/types/users.go | 2 +- 22 files changed, 90 insertions(+), 85 deletions(-) diff --git a/cmd/headscale/cli/configtest.go b/cmd/headscale/cli/configtest.go index d469885b..0247249e 100644 --- a/cmd/headscale/cli/configtest.go +++ b/cmd/headscale/cli/configtest.go @@ -16,7 +16,7 @@ var configTestCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { _, err := newHeadscaleServerWithConfig() if err != nil { - log.Fatal().Caller().Err(err).Msg("Error initializing") + log.Fatal().Caller().Err(err).Msg("error initializing") } }, } diff --git a/cmd/headscale/cli/mockoidc.go b/cmd/headscale/cli/mockoidc.go index c0e30841..9668f880 100644 --- a/cmd/headscale/cli/mockoidc.go +++ b/cmd/headscale/cli/mockoidc.go @@ -36,7 +36,7 @@ var mockOidcCmd = &cobra.Command{ Run: func(cmd *cobra.Command, args []string) { err := mockOIDC() if err != nil { - log.Error().Err(err).Msgf("Error running mock OIDC server") + log.Error().Err(err).Msgf("error running mock OIDC server") os.Exit(1) } }, @@ -81,7 +81,7 @@ func mockOIDC() error { log.Info().Interface(zf.Users, users).Msg("loading users from JSON") - log.Info().Msgf("Access token TTL: %s", accessTTL) + log.Info().Msgf("access token TTL: %s", accessTTL) port, err := strconv.Atoi(portStr) if err != nil { @@ -102,8 +102,9 @@ func mockOIDC() error { if err != nil { return err } - log.Info().Msgf("Mock OIDC server listening on %s", listener.Addr().String()) - log.Info().Msgf("Issuer: %s", mock.Issuer()) + + log.Info().Msgf("mock OIDC server listening on %s", listener.Addr().String()) + log.Info().Msgf("issuer: %s", mock.Issuer()) c := make(chan struct{}) <-c @@ -136,10 +137,10 @@ func getMockOIDC(clientID string, clientSecret string, users []mockoidc.MockUser mock.AddMiddleware(func(h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - log.Info().Msgf("Request: %+v", r) + log.Info().Msgf("request: %+v", r) h.ServeHTTP(w, r) if r.Response != nil { - log.Info().Msgf("Response: %+v", r.Response) + log.Info().Msgf("response: %+v", r.Response) } }) }) diff --git a/cmd/headscale/cli/root.go b/cmd/headscale/cli/root.go index d7cdabb6..4eaf0586 100644 --- a/cmd/headscale/cli/root.go +++ b/cmd/headscale/cli/root.go @@ -48,12 +48,12 @@ func initConfig() { if cfgFile != "" { err := types.LoadConfig(cfgFile, true) if err != nil { - log.Fatal().Caller().Err(err).Msgf("Error loading config file %s", cfgFile) + log.Fatal().Caller().Err(err).Msgf("error loading config file %s", cfgFile) } } else { err := types.LoadConfig("", false) if err != nil { - log.Fatal().Caller().Err(err).Msgf("Error loading config") + log.Fatal().Caller().Err(err).Msgf("error loading config") } } diff --git a/cmd/headscale/cli/serve.go b/cmd/headscale/cli/serve.go index 8f05f851..e777b029 100644 --- a/cmd/headscale/cli/serve.go +++ b/cmd/headscale/cli/serve.go @@ -29,12 +29,12 @@ var serveCmd = &cobra.Command{ fmt.Println(squibbleErr.Diff) } - log.Fatal().Caller().Err(err).Msg("Error initializing") + log.Fatal().Caller().Err(err).Msg("error initializing") } err = app.Serve() if err != nil && !errors.Is(err, http.ErrServerClosed) { - log.Fatal().Caller().Err(err).Msg("Headscale ran into an error and had to shut down.") + log.Fatal().Caller().Err(err).Msg("headscale ran into an error and had to shut down") } }, } diff --git a/cmd/headscale/cli/users.go b/cmd/headscale/cli/users.go index 28e5e324..282c7a6c 100644 --- a/cmd/headscale/cli/users.go +++ b/cmd/headscale/cli/users.go @@ -82,7 +82,7 @@ var createUserCmd = &cobra.Command{ defer cancel() defer conn.Close() - log.Trace().Interface(zf.Client, client).Msg("Obtained gRPC client") + log.Trace().Interface(zf.Client, client).Msg("obtained gRPC client") request := &v1.CreateUserRequest{Name: userName} @@ -108,7 +108,7 @@ var createUserCmd = &cobra.Command{ request.PictureUrl = pictureURL } - log.Trace().Interface(zf.Request, request).Msg("Sending CreateUser request") + log.Trace().Interface(zf.Request, request).Msg("sending CreateUser request") response, err := client.CreateUser(ctx, request) if err != nil { ErrorOutput( diff --git a/cmd/headscale/cli/utils.go b/cmd/headscale/cli/utils.go index 67434b92..dabc7884 100644 --- a/cmd/headscale/cli/utils.go +++ b/cmd/headscale/cli/utils.go @@ -93,7 +93,7 @@ func newHeadscaleCLIWithConfig() (context.Context, v1.HeadscaleServiceClient, *g // If we are not connecting to a local server, require an API key for authentication apiKey := cfg.CLI.APIKey if apiKey == "" { - log.Fatal().Caller().Msgf("HEADSCALE_CLI_API_KEY environment variable needs to be set.") + log.Fatal().Caller().Msgf("HEADSCALE_CLI_API_KEY environment variable needs to be set") } grpcOptions = append(grpcOptions, grpc.WithPerRPCCredentials(tokenAuth{ @@ -119,10 +119,10 @@ func newHeadscaleCLIWithConfig() (context.Context, v1.HeadscaleServiceClient, *g } } - log.Trace().Caller().Str(zf.Address, address).Msg("Connecting via gRPC") + log.Trace().Caller().Str(zf.Address, address).Msg("connecting via gRPC") conn, err := grpc.DialContext(ctx, address, grpcOptions...) if err != nil { - log.Fatal().Caller().Err(err).Msgf("Could not connect: %v", err) + log.Fatal().Caller().Err(err).Msgf("could not connect: %v", err) os.Exit(-1) // we get here if logging is suppressed (i.e., json output) } diff --git a/hscontrol/app.go b/hscontrol/app.go index f0217172..ca81a17a 100644 --- a/hscontrol/app.go +++ b/hscontrol/app.go @@ -140,19 +140,19 @@ func NewHeadscale(cfg *types.Config) (*Headscale, error) { ephemeralGC := db.NewEphemeralGarbageCollector(func(ni types.NodeID) { node, ok := app.state.GetNodeByID(ni) if !ok { - log.Error().Uint64("node.id", ni.Uint64()).Msg("Ephemeral node deletion failed") - log.Debug().Caller().Uint64("node.id", ni.Uint64()).Msg("Ephemeral node deletion failed because node not found in NodeStore") + log.Error().Uint64("node.id", ni.Uint64()).Msg("ephemeral node deletion failed") + log.Debug().Caller().Uint64("node.id", ni.Uint64()).Msg("ephemeral node deletion failed because node not found in NodeStore") return } policyChanged, err := app.state.DeleteNode(node) if err != nil { - log.Error().Err(err).EmbedObject(node).Msg("Ephemeral node deletion failed") + log.Error().Err(err).EmbedObject(node).Msg("ephemeral node deletion failed") return } app.Change(policyChanged) - log.Debug().Caller().EmbedObject(node).Msg("Ephemeral node deleted because garbage collection timeout reached") + log.Debug().Caller().EmbedObject(node).Msg("ephemeral node deleted because garbage collection timeout reached") }) app.ephemeralGC = ephemeralGC @@ -286,7 +286,7 @@ func (h *Headscale) scheduledTasks(ctx context.Context) { } case <-derpTickerChan: - log.Info().Msg("Fetching DERPMap updates") + log.Info().Msg("fetching DERPMap updates") derpMap, err := backoff.Retry(ctx, func() (*tailcfg.DERPMap, error) { derpMap, err := derp.GetDERPMap(h.cfg.DERP) if err != nil { @@ -506,7 +506,7 @@ func (h *Headscale) Serve() error { } versionInfo := types.GetVersionInfo() - log.Info().Str("version", versionInfo.Version).Str("commit", versionInfo.Commit).Msg("Starting Headscale") + log.Info().Str("version", versionInfo.Version).Str("commit", versionInfo.Commit).Msg("starting headscale") log.Info(). Str("minimum_version", capver.TailscaleVersion(capver.MinSupportedCapabilityVersion)). Msg("Clients with a lower minimum version will be rejected") @@ -662,7 +662,7 @@ func (h *Headscale) Serve() error { var grpcServer *grpc.Server var grpcListener net.Listener if tlsConfig != nil || h.cfg.GRPCAllowInsecure { - log.Info().Msgf("Enabling remote gRPC at %s", h.cfg.GRPCAddr) + log.Info().Msgf("enabling remote gRPC at %s", h.cfg.GRPCAddr) grpcOptions := []grpc.ServerOption{ grpc.ChainUnaryInterceptor( @@ -940,13 +940,13 @@ func (h *Headscale) getTLSSettings() (*tls.Config, error) { } } else if h.cfg.TLS.CertPath == "" { if !strings.HasPrefix(h.cfg.ServerURL, "http://") { - log.Warn().Msg("Listening without TLS but ServerURL does not start with http://") + log.Warn().Msg("listening without TLS but ServerURL does not start with http://") } return nil, err } else { if !strings.HasPrefix(h.cfg.ServerURL, "https://") { - log.Warn().Msg("Listening with TLS but ServerURL does not start with https://") + log.Warn().Msg("listening with TLS but ServerURL does not start with https://") } tlsConfig := &tls.Config{ @@ -970,7 +970,7 @@ func readOrCreatePrivateKey(path string) (*key.MachinePrivate, error) { privateKey, err := os.ReadFile(path) if errors.Is(err, os.ErrNotExist) { - log.Info().Str("path", path).Msg("No private key file at path, creating...") + log.Info().Str("path", path).Msg("no private key file at path, creating...") machineKey := key.NewMachine() @@ -1023,7 +1023,7 @@ type acmeLogger struct { func (l *acmeLogger) RoundTrip(req *http.Request) (*http.Response, error) { resp, err := l.rt.RoundTrip(req) if err != nil { - log.Error().Err(err).Str("url", req.URL.String()).Msg("ACME request failed") + log.Error().Err(err).Str("url", req.URL.String()).Msg("acme request failed") return nil, err } @@ -1031,7 +1031,7 @@ func (l *acmeLogger) RoundTrip(req *http.Request) (*http.Response, error) { defer resp.Body.Close() body, _ := io.ReadAll(resp.Body) - log.Error().Int("status_code", resp.StatusCode).Str("url", req.URL.String()).Bytes("body", body).Msg("ACME request returned error") + log.Error().Int("status_code", resp.StatusCode).Str("url", req.URL.String()).Bytes("body", body).Msg("acme request returned error") } return resp, nil diff --git a/hscontrol/auth.go b/hscontrol/auth.go index d502cd31..a1ba0a3b 100644 --- a/hscontrol/auth.go +++ b/hscontrol/auth.go @@ -320,7 +320,7 @@ func (h *Headscale) reqToNewRegisterResponse( nodeToRegister.Node.Expiry = &req.Expiry } - log.Info().Msgf("New followup node registration using key: %s", newRegID) + log.Info().Msgf("new followup node registration using key: %s", newRegID) h.state.SetRegistrationCacheEntry(newRegID, nodeToRegister) return &tailcfg.RegisterResponse{ @@ -451,7 +451,7 @@ func (h *Headscale) handleRegisterInteractive( nodeToRegister, ) - log.Info().Msgf("Starting node registration using key: %s", registrationId) + log.Info().Msgf("starting node registration using key: %s", registrationId) return &tailcfg.RegisterResponse{ AuthURL: h.authProvider.AuthURL(registrationId), diff --git a/hscontrol/db/db.go b/hscontrol/db/db.go index dcc9e78d..b1a6d52b 100644 --- a/hscontrol/db/db.go +++ b/hscontrol/db/db.go @@ -245,11 +245,11 @@ AND auth_key_id NOT IN ( Migrate: func(tx *gorm.DB) error { // Only run on SQLite if cfg.Database.Type != types.DatabaseSqlite { - log.Info().Msg("Skipping schema migration on non-SQLite database") + log.Info().Msg("skipping schema migration on non-SQLite database") return nil } - log.Info().Msg("Starting schema recreation with table renaming") + log.Info().Msg("starting schema recreation with table renaming") // Rename existing tables to _old versions tablesToRename := []string{"users", "pre_auth_keys", "api_keys", "nodes", "policies"} @@ -258,7 +258,7 @@ AND auth_key_id NOT IN ( var routesExists bool err := tx.Raw("SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='routes'").Row().Scan(&routesExists) if err == nil && routesExists { - log.Info().Msg("Dropping leftover routes table") + log.Info().Msg("dropping leftover routes table") if err := tx.Exec("DROP TABLE routes").Error; err != nil { return fmt.Errorf("dropping routes table: %w", err) } @@ -425,11 +425,11 @@ AND auth_key_id NOT IN ( // Drop old tables only after everything succeeds for _, table := range tablesToRename { if err := tx.Exec("DROP TABLE IF EXISTS " + table + "_old").Error; err != nil { - log.Warn().Str("table", table+"_old").Err(err).Msg("Failed to drop old table, but migration succeeded") + log.Warn().Str("table", table+"_old").Err(err).Msg("failed to drop old table, but migration succeeded") } } - log.Info().Msg("Schema recreation completed successfully") + log.Info().Msg("schema recreation completed successfully") return nil }, @@ -595,12 +595,12 @@ AND auth_key_id NOT IN ( // 1. Load policy from file or database based on configuration policyData, err := PolicyBytes(tx, cfg) if err != nil { - log.Warn().Err(err).Msg("Failed to load policy, skipping RequestTags migration (tags will be validated on node reconnect)") + log.Warn().Err(err).Msg("failed to load policy, skipping RequestTags migration (tags will be validated on node reconnect)") return nil } if len(policyData) == 0 { - log.Info().Msg("No policy found, skipping RequestTags migration (tags will be validated on node reconnect)") + log.Info().Msg("no policy found, skipping RequestTags migration (tags will be validated on node reconnect)") return nil } @@ -618,7 +618,7 @@ AND auth_key_id NOT IN ( // 3. Create PolicyManager (handles HuJSON parsing, groups, nested tags, etc.) polMan, err := policy.NewPolicyManager(policyData, users, nodes.ViewSlice()) if err != nil { - log.Warn().Err(err).Msg("Failed to parse policy, skipping RequestTags migration (tags will be validated on node reconnect)") + log.Warn().Err(err).Msg("failed to parse policy, skipping RequestTags migration (tags will be validated on node reconnect)") return nil } @@ -935,7 +935,7 @@ func runMigrations(cfg types.DatabaseConfig, dbConn *gorm.DB, migrations *gormig } for _, migrationID := range migrationIDs { - log.Trace().Caller().Str("migration_id", migrationID).Msg("Running migration") + log.Trace().Caller().Str("migration_id", migrationID).Msg("running migration") needsFKDisabled := migrationsRequiringFKDisabled[migrationID] if needsFKDisabled { diff --git a/hscontrol/db/ip.go b/hscontrol/db/ip.go index c6a223bc..7e6016ea 100644 --- a/hscontrol/db/ip.go +++ b/hscontrol/db/ip.go @@ -283,7 +283,7 @@ func (db *HSDatabase) BackfillNodeIPs(i *IPAllocator) ([]string, error) { } for _, node := range nodes { - log.Trace().Caller().EmbedObject(node).Msg("IP backfill check started because node found in database") + log.Trace().Caller().EmbedObject(node).Msg("ip backfill check started because node found in database") changed := false // IPv4 prefix is set, but node ip is missing, alloc diff --git a/hscontrol/db/node.go b/hscontrol/db/node.go index a9101938..f8885db4 100644 --- a/hscontrol/db/node.go +++ b/hscontrol/db/node.go @@ -370,7 +370,7 @@ func RegisterNodeForTest(tx *gorm.DB, node types.Node, ipv4 *netip.Addr, ipv6 *n logEvent = logEvent.Str(zf.UserName, "none") } - logEvent.Msg("Registering test node") + logEvent.Msg("registering test node") // If the a new node is registered with the same machine key, to the same user, // update the existing node. @@ -418,7 +418,7 @@ func RegisterNodeForTest(tx *gorm.DB, node types.Node, ipv4 *netip.Addr, ipv6 *n node.Hostname, err = util.NormaliseHostname(node.Hostname) if err != nil { newHostname := util.InvalidString() - log.Info().Err(err).Str(zf.InvalidHostname, node.Hostname).Str(zf.NewHostname, newHostname).Msgf("Invalid hostname, replacing") + log.Info().Err(err).Str(zf.InvalidHostname, node.Hostname).Str(zf.NewHostname, newHostname).Msgf("invalid hostname, replacing") node.Hostname = newHostname } diff --git a/hscontrol/derp/server/derp_server.go b/hscontrol/derp/server/derp_server.go index 474306e5..8f1545ba 100644 --- a/hscontrol/derp/server/derp_server.go +++ b/hscontrol/derp/server/derp_server.go @@ -54,7 +54,7 @@ func NewDERPServer( derpKey key.NodePrivate, cfg *types.DERPConfig, ) (*DERPServer, error) { - log.Trace().Caller().Msg("Creating new embedded DERP server") + log.Trace().Caller().Msg("creating new embedded DERP server") server := derpserver.New(derpKey, util.TSLogfWrapper()) // nolint // zerolinter complains if cfg.ServerVerifyClients { @@ -100,11 +100,11 @@ func (d *DERPServer) GenerateRegion() (tailcfg.DERPRegion, error) { if debugUseDERPIP { ips, err := net.LookupIP(host) if err != nil { - log.Error().Caller().Err(err).Msgf("Failed to resolve DERP hostname %s to IP, using hostname", host) + log.Error().Caller().Err(err).Msgf("failed to resolve DERP hostname %s to IP, using hostname", host) } else if len(ips) > 0 { // Use the first IP address ipStr := ips[0].String() - log.Info().Caller().Msgf("HEADSCALE_DEBUG_DERP_USE_IP: Resolved %s to %s", host, ipStr) + log.Info().Caller().Msgf("HEADSCALE_DEBUG_DERP_USE_IP: resolved %s to %s", host, ipStr) host = ipStr } } @@ -136,8 +136,8 @@ func (d *DERPServer) GenerateRegion() (tailcfg.DERPRegion, error) { } localDERPregion.Nodes[0].STUNPort = portSTUN - log.Info().Caller().Msgf("DERP region: %+v", localDERPregion) - log.Info().Caller().Msgf("DERP Nodes[0]: %+v", localDERPregion.Nodes[0]) + log.Info().Caller().Msgf("derp region: %+v", localDERPregion) + log.Info().Caller().Msgf("derp nodes[0]: %+v", localDERPregion.Nodes[0]) return localDERPregion, nil } @@ -222,7 +222,7 @@ func (d *DERPServer) servePlain(writer http.ResponseWriter, req *http.Request) { hijacker, ok := writer.(http.Hijacker) if !ok { - log.Error().Caller().Msg("DERP requires Hijacker interface from Gin") + log.Error().Caller().Msg("derp requires Hijacker interface from Gin") writer.Header().Set("Content-Type", "text/plain") writer.WriteHeader(http.StatusInternalServerError) _, err := writer.Write([]byte("HTTP does not support general TCP support")) @@ -238,7 +238,7 @@ func (d *DERPServer) servePlain(writer http.ResponseWriter, req *http.Request) { netConn, conn, err := hijacker.Hijack() if err != nil { - log.Error().Caller().Err(err).Msgf("Hijack failed") + log.Error().Caller().Err(err).Msgf("hijack failed") writer.Header().Set("Content-Type", "text/plain") writer.WriteHeader(http.StatusInternalServerError) _, err = writer.Write([]byte("HTTP does not support general TCP support")) @@ -251,7 +251,8 @@ func (d *DERPServer) servePlain(writer http.ResponseWriter, req *http.Request) { return } - log.Trace().Caller().Msgf("Hijacked connection from %v", req.RemoteAddr) + + log.Trace().Caller().Msgf("hijacked connection from %v", req.RemoteAddr) if !fastStart { pubKey := d.key.Public() @@ -342,11 +343,12 @@ func (d *DERPServer) ServeSTUN() { if err != nil { log.Fatal().Msgf("failed to open STUN listener: %v", err) } - log.Info().Msgf("STUN server started at %s", packetConn.LocalAddr()) + + log.Info().Msgf("stun server started at %s", packetConn.LocalAddr()) udpConn, ok := packetConn.(*net.UDPConn) if !ok { - log.Fatal().Msg("STUN listener is not a UDP listener") + log.Fatal().Msg("stun listener is not a UDP listener") } serverSTUNListener(context.Background(), udpConn) } @@ -364,7 +366,8 @@ func serverSTUNListener(ctx context.Context, packetConn *net.UDPConn) { if ctx.Err() != nil { return } - log.Error().Caller().Err(err).Msgf("STUN ReadFrom") + + log.Error().Caller().Err(err).Msgf("stun ReadFrom") // Rate limit error logging - wait before retrying, but respect context cancellation select { @@ -375,16 +378,17 @@ func serverSTUNListener(ctx context.Context, packetConn *net.UDPConn) { continue } - log.Trace().Caller().Msgf("STUN request from %v", udpAddr) + + log.Trace().Caller().Msgf("stun request from %v", udpAddr) pkt := buf[:bytesRead] if !stun.Is(pkt) { - log.Trace().Caller().Msgf("UDP packet is not STUN") + log.Trace().Caller().Msgf("udp packet is not stun") continue } txid, err := stun.ParseBindingRequest(pkt) if err != nil { - log.Trace().Caller().Err(err).Msgf("STUN parse error") + log.Trace().Caller().Err(err).Msgf("stun parse error") continue } @@ -393,7 +397,7 @@ func serverSTUNListener(ctx context.Context, packetConn *net.UDPConn) { res := stun.Response(txid, netip.AddrPortFrom(addr, uint16(udpAddr.Port))) _, err = packetConn.WriteTo(res, udpAddr) if err != nil { - log.Trace().Caller().Err(err).Msgf("Issue writing to UDP") + log.Trace().Caller().Err(err).Msgf("issue writing to UDP") continue } @@ -413,7 +417,7 @@ type DERPVerifyTransport struct { func (t *DERPVerifyTransport) RoundTrip(req *http.Request) (*http.Response, error) { buf := new(bytes.Buffer) if err := t.handleVerifyRequest(req, buf); err != nil { - log.Error().Caller().Err(err).Msg("Failed to handle client verify request: ") + log.Error().Caller().Err(err).Msg("failed to handle client verify request") return nil, err } diff --git a/hscontrol/grpcv1.go b/hscontrol/grpcv1.go index 75156a1b..f31eceeb 100644 --- a/hscontrol/grpcv1.go +++ b/hscontrol/grpcv1.go @@ -236,7 +236,7 @@ func (api headscaleV1APIServer) RegisterNode( // Generate ephemeral registration key for tracking this registration flow in logs registrationKey, err := util.GenerateRegistrationKey() if err != nil { - log.Warn().Err(err).Msg("Failed to generate registration key") + log.Warn().Err(err).Msg("failed to generate registration key") registrationKey = "" // Continue without key if generation fails } @@ -546,7 +546,7 @@ func (api headscaleV1APIServer) BackfillNodeIPs( ctx context.Context, request *v1.BackfillNodeIPsRequest, ) (*v1.BackfillNodeIPsResponse, error) { - log.Trace().Caller().Msg("Backfill called") + log.Trace().Caller().Msg("backfill called") if !request.Confirmed { return nil, errors.New("not confirmed, aborting") @@ -823,7 +823,7 @@ func (api headscaleV1APIServer) Health( } if healthErr != nil { - log.Error().Err(healthErr).Msg("Health check failed") + log.Error().Err(healthErr).Msg("health check failed") } return response, healthErr diff --git a/hscontrol/mapper/batcher_lockfree.go b/hscontrol/mapper/batcher_lockfree.go index 88b5c4f2..ea195c0c 100644 --- a/hscontrol/mapper/batcher_lockfree.go +++ b/hscontrol/mapper/batcher_lockfree.go @@ -119,14 +119,14 @@ func (b *LockFreeBatcher) RemoveNode(id types.NodeID, c chan<- *tailcfg.MapRespo nodeConn, exists := b.nodes.Load(id) if !exists { - nlog.Debug().Caller().Msg("RemoveNode called for non-existent node") + nlog.Debug().Caller().Msg("removeNode called for non-existent node") return false } // Remove specific connection removed := nodeConn.removeConnectionByChannel(c) if !removed { - nlog.Debug().Caller().Msg("RemoveNode: channel not found, connection already removed or invalid") + nlog.Debug().Caller().Msg("removeNode: channel not found, connection already removed or invalid") return false } diff --git a/hscontrol/mapper/mapper.go b/hscontrol/mapper/mapper.go index a3b932d6..47d222b4 100644 --- a/hscontrol/mapper/mapper.go +++ b/hscontrol/mapper/mapper.go @@ -328,7 +328,7 @@ func writeDebugMapResponse( fmt.Sprintf("%s-%s.json", now, t), ) - log.Trace().Msgf("Writing MapResponse to %s", mapResponsePath) + log.Trace().Msgf("writing MapResponse to %s", mapResponsePath) err = os.WriteFile(mapResponsePath, body, perms) if err != nil { panic(err) @@ -357,7 +357,7 @@ func ReadMapResponsesFromDirectory(dir string) (map[types.NodeID][]tailcfg.MapRe nodeIDu, err := strconv.ParseUint(node.Name(), 10, 64) if err != nil { - log.Error().Err(err).Msgf("Parsing node ID from dir %s", node.Name()) + log.Error().Err(err).Msgf("parsing node ID from dir %s", node.Name()) continue } @@ -365,7 +365,7 @@ func ReadMapResponsesFromDirectory(dir string) (map[types.NodeID][]tailcfg.MapRe files, err := os.ReadDir(path.Join(dir, node.Name())) if err != nil { - log.Error().Err(err).Msgf("Reading dir %s", node.Name()) + log.Error().Err(err).Msgf("reading dir %s", node.Name()) continue } @@ -380,14 +380,14 @@ func ReadMapResponsesFromDirectory(dir string) (map[types.NodeID][]tailcfg.MapRe body, err := os.ReadFile(path.Join(dir, node.Name(), file.Name())) if err != nil { - log.Error().Err(err).Msgf("Reading file %s", file.Name()) + log.Error().Err(err).Msgf("reading file %s", file.Name()) continue } var resp tailcfg.MapResponse err = json.Unmarshal(body, &resp) if err != nil { - log.Error().Err(err).Msgf("Unmarshalling file %s", file.Name()) + log.Error().Err(err).Msgf("unmarshalling file %s", file.Name()) continue } diff --git a/hscontrol/noise.go b/hscontrol/noise.go index ad6bca53..8578c918 100644 --- a/hscontrol/noise.go +++ b/hscontrol/noise.go @@ -51,7 +51,7 @@ func (h *Headscale) NoiseUpgradeHandler( writer http.ResponseWriter, req *http.Request, ) { - log.Trace().Caller().Msgf("Noise upgrade handler for client %s", req.RemoteAddr) + log.Trace().Caller().Msgf("noise upgrade handler for client %s", req.RemoteAddr) upgrade := req.Header.Get("Upgrade") if upgrade == "" { @@ -60,7 +60,7 @@ func (h *Headscale) NoiseUpgradeHandler( // be passed to Headscale. Let's give them a hint. log.Warn(). Caller(). - Msg("No Upgrade header in TS2021 request. If headscale is behind a reverse proxy, make sure it is configured to pass WebSockets through.") + Msg("no upgrade header in TS2021 request. If headscale is behind a reverse proxy, make sure it is configured to pass WebSockets through.") http.Error(writer, "Internal error", http.StatusInternalServerError) return @@ -279,7 +279,7 @@ func (ns *noiseServer) NoiseRegistrationHandler( writer.WriteHeader(http.StatusOK) if err := json.NewEncoder(writer).Encode(registerResponse); err != nil { - log.Error().Caller().Err(err).Msg("NoiseRegistrationHandler: failed to encode RegisterResponse") + log.Error().Caller().Err(err).Msg("noise registration handler: failed to encode RegisterResponse") return } diff --git a/hscontrol/oidc.go b/hscontrol/oidc.go index 7013b8ed..1d71dcef 100644 --- a/hscontrol/oidc.go +++ b/hscontrol/oidc.go @@ -169,7 +169,7 @@ func (a *AuthProviderOIDC) RegisterHandler( a.registrationCache.Set(state, registrationInfo) authURL := a.oauth2Config.AuthCodeURL(state, extras...) - log.Debug().Caller().Msgf("Redirecting to %s for authentication", authURL) + log.Debug().Caller().Msgf("redirecting to %s for authentication", authURL) http.Redirect(writer, req, authURL, http.StatusFound) } diff --git a/hscontrol/policy/v2/filter.go b/hscontrol/policy/v2/filter.go index 71540ea8..7a7c6629 100644 --- a/hscontrol/policy/v2/filter.go +++ b/hscontrol/policy/v2/filter.go @@ -351,7 +351,7 @@ func (pol *Policy) compileSSHPolicy( // Resolve sources once - we'll use them differently for each destination type srcIPs, err := rule.Sources.Resolve(pol, users, nodes) if err != nil { - log.Trace().Caller().Err(err).Msgf("SSH policy compilation failed resolving source ips for rule %+v", rule) + log.Trace().Caller().Err(err).Msgf("ssh policy compilation failed resolving source ips for rule %+v", rule) } if srcIPs == nil || len(srcIPs.Prefixes()) == 0 { diff --git a/hscontrol/poll.go b/hscontrol/poll.go index 81a96154..8d729df5 100644 --- a/hscontrol/poll.go +++ b/hscontrol/poll.go @@ -308,7 +308,7 @@ func (m *mapSession) writeMap(msg *tailcfg.MapResponse) error { if f, ok := m.w.(http.Flusher); ok { f.Flush() } else { - m.log.Error().Caller().Msg("ResponseWriter does not implement http.Flusher, cannot flush") + m.log.Error().Caller().Msg("responseWriter does not implement http.Flusher, cannot flush") } } diff --git a/hscontrol/state/state.go b/hscontrol/state/state.go index 0d91a24a..1521f792 100644 --- a/hscontrol/state/state.go +++ b/hscontrol/state/state.go @@ -280,7 +280,7 @@ func (s *State) CreateUser(user types.User) (*types.User, change.Change, error) c = change.PolicyChange() } - log.Info().Str(zf.UserName, user.Name).Msg("User created") + log.Info().Str(zf.UserName, user.Name).Msg("user created") return &user, c, nil } @@ -487,7 +487,7 @@ func (s *State) Connect(id types.NodeID) []change.Change { c := []change.Change{change.NodeOnlineFor(node)} - log.Info().EmbedObject(node).Msg("Node connected") + log.Info().EmbedObject(node).Msg("node connected") // Use the node's current routes for primary route update // AllApprovedRoutes() returns only the intersection of announced AND approved routes @@ -515,7 +515,7 @@ func (s *State) Disconnect(id types.NodeID) ([]change.Change, error) { return nil, fmt.Errorf("node not found: %d", id) } - log.Info().EmbedObject(node).Msg("Node disconnected") + log.Info().EmbedObject(node).Msg("node disconnected") // Special error handling for disconnect - we log errors but continue // because NodeStore is already updated and we need to notify peers @@ -523,7 +523,7 @@ func (s *State) Disconnect(id types.NodeID) ([]change.Change, error) { if err != nil { // Log error but don't fail the disconnection - NodeStore is already updated // and we need to send change notifications to peers - log.Error().Err(err).EmbedObject(node).Msg("Failed to update last seen in database") + log.Error().Err(err).EmbedObject(node).Msg("failed to update last seen in database") c = change.Change{} } @@ -905,7 +905,7 @@ func (s *State) AutoApproveRoutes(nv types.NodeView) (change.Change, error) { return change.Change{}, err } - log.Info().EmbedObject(nv).Strs(zf.RoutesApproved, util.PrefixesToString(approved)).Msg("Routes approved") + log.Info().EmbedObject(nv).Strs(zf.RoutesApproved, util.PrefixesToString(approved)).Msg("routes approved") return c, nil } @@ -1441,7 +1441,7 @@ func (s *State) processReauthTags( Strs(zf.CurrentTags, node.Tags). Bool(zf.IsTagged, node.IsTagged()). Bool(zf.WasAuthKeyTagged, wasAuthKeyTagged) - logEvent.Msg("Processing RequestTags during reauth") + logEvent.Msg("processing RequestTags during reauth") // Empty RequestTags means untag node (transition to user-owned) if len(requestTags) == 0 { @@ -1952,14 +1952,14 @@ func (s *State) updatePolicyManagerUsers() (change.Change, error) { return change.Change{}, fmt.Errorf("listing users for policy update: %w", err) } - log.Debug().Caller().Int("user.count", len(users)).Msg("Policy manager user update initiated because user list modification detected") + log.Debug().Caller().Int("user.count", len(users)).Msg("policy manager user update initiated because user list modification detected") changed, err := s.polMan.SetUsers(users) if err != nil { return change.Change{}, fmt.Errorf("updating policy manager users: %w", err) } - log.Debug().Caller().Bool("policy.changed", changed).Msg("Policy manager user update completed because SetUsers operation finished") + log.Debug().Caller().Bool("policy.changed", changed).Msg("policy manager user update completed because SetUsers operation finished") if changed { return change.PolicyChange(), nil diff --git a/hscontrol/types/config.go b/hscontrol/types/config.go index 4068d72e..4b0cd240 100644 --- a/hscontrol/types/config.go +++ b/hscontrol/types/config.go @@ -403,7 +403,7 @@ func LoadConfig(path string, isFile bool) error { if err := viper.ReadInConfig(); err != nil { if _, ok := err.(viper.ConfigFileNotFoundError); ok { - log.Warn().Msg("No config file found, using defaults") + log.Warn().Msg("no config file found, using defaults") return nil } @@ -450,7 +450,7 @@ func validateServerConfig() error { depr.Log() if viper.IsSet("dns.extra_records") && viper.IsSet("dns.extra_records_path") { - log.Fatal().Msg("Fatal config error: dns.extra_records and dns.extra_records_path are mutually exclusive. Please remove one of them from your config file") + log.Fatal().Msg("fatal config error: dns.extra_records and dns.extra_records_path are mutually exclusive. Please remove one of them from your config file") } // Collect any validation errors and return them all at once diff --git a/hscontrol/types/users.go b/hscontrol/types/users.go index d2522d34..3ce2235e 100644 --- a/hscontrol/types/users.go +++ b/hscontrol/types/users.go @@ -392,7 +392,7 @@ func (u *User) FromClaim(claims *OIDCClaims, emailVerifiedRequired bool) { if err == nil { u.Name = claims.Username } else { - log.Debug().Caller().Err(err).Msgf("Username %s is not valid", claims.Username) + log.Debug().Caller().Err(err).Msgf("username %s is not valid", claims.Username) } if claims.EmailVerified || !FlexibleBoolean(emailVerifiedRequired) {