mirror of
https://github.com/juanfont/headscale.git
synced 2026-04-20 07:41:31 +02:00
types: add MarshalZerologObject to domain types
Implement zerolog.LogObjectMarshaler interface on domain types for structured logging: - Node: logs node.id, node.name, machine.key (short), node.key (short), node.is_tagged, node.expired, node.online, node.tags, user.name - User: logs user.id, user.name, user.display, user.provider - PreAuthKey: logs pak.id, pak.prefix (masked), pak.reusable, pak.ephemeral, pak.used, pak.is_tagged, pak.tags - APIKey: logs api_key.id, api_key.prefix (masked), api_key.expiration Security: PreAuthKey and APIKey only log masked prefixes, never full keys or hashes. Uses zf.* constants for consistent field naming.
This commit is contained in:
@@ -13,6 +13,8 @@ import (
|
||||
v1 "github.com/juanfont/headscale/gen/go/headscale/v1"
|
||||
"github.com/juanfont/headscale/hscontrol/policy/matcher"
|
||||
"github.com/juanfont/headscale/hscontrol/util"
|
||||
"github.com/juanfont/headscale/hscontrol/util/zlog/zf"
|
||||
"github.com/rs/zerolog"
|
||||
"github.com/rs/zerolog/log"
|
||||
"go4.org/netipx"
|
||||
"google.golang.org/protobuf/types/known/timestamppb"
|
||||
@@ -487,6 +489,36 @@ func (node *Node) String() string {
|
||||
return node.Hostname
|
||||
}
|
||||
|
||||
// MarshalZerologObject implements zerolog.LogObjectMarshaler for safe logging.
|
||||
// This method is used with zerolog's EmbedObject() for flat field embedding
|
||||
// or Object() for nested logging when multiple nodes are logged.
|
||||
func (node *Node) MarshalZerologObject(e *zerolog.Event) {
|
||||
if node == nil {
|
||||
return
|
||||
}
|
||||
|
||||
e.Uint64(zf.NodeID, node.ID.Uint64())
|
||||
e.Str(zf.NodeName, node.Hostname)
|
||||
e.Str(zf.MachineKey, node.MachineKey.ShortString())
|
||||
e.Str(zf.NodeKey, node.NodeKey.ShortString())
|
||||
e.Bool(zf.NodeIsTagged, node.IsTagged())
|
||||
e.Bool(zf.NodeExpired, node.IsExpired())
|
||||
|
||||
if node.IsOnline != nil {
|
||||
e.Bool(zf.NodeOnline, *node.IsOnline)
|
||||
}
|
||||
|
||||
if len(node.Tags) > 0 {
|
||||
e.Strs(zf.NodeTags, node.Tags)
|
||||
}
|
||||
|
||||
if node.User != nil {
|
||||
e.Str(zf.UserName, node.User.Username())
|
||||
} else if node.UserID != nil {
|
||||
e.Uint(zf.UserID, *node.UserID)
|
||||
}
|
||||
}
|
||||
|
||||
// PeerChangeFromMapRequest takes a MapRequest and compares it to the node
|
||||
// to produce a PeerChange struct that can be used to updated the node and
|
||||
// inform peers about smaller changes to the node.
|
||||
@@ -719,6 +751,16 @@ func (node Node) DebugString() string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// MarshalZerologObject implements zerolog.LogObjectMarshaler for NodeView.
|
||||
// This delegates to the underlying Node's implementation.
|
||||
func (nv NodeView) MarshalZerologObject(e *zerolog.Event) {
|
||||
if !nv.Valid() {
|
||||
return
|
||||
}
|
||||
|
||||
nv.ж.MarshalZerologObject(e)
|
||||
}
|
||||
|
||||
// Owner returns the owner for display purposes.
|
||||
// For tagged nodes, returns TaggedDevices. For user-owned nodes, returns the user.
|
||||
func (nv NodeView) Owner() UserView {
|
||||
|
||||
Reference in New Issue
Block a user