tailcfg: add some omitzero, adjust some omitempty to omitzero
Updates tailscale/corp#25406 Change-Id: I7832dbe3dce3774bcc831e3111feb75bcc9e021d Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
committed by
Brad Fitzpatrick
parent
3b865d7c33
commit
5b0c57f497
+113
-113
@@ -255,9 +255,9 @@ func (u StableNodeID) IsZero() bool {
|
|||||||
// have a general gmail address login associated with the user.
|
// have a general gmail address login associated with the user.
|
||||||
type User struct {
|
type User struct {
|
||||||
ID UserID
|
ID UserID
|
||||||
DisplayName string // if non-empty overrides Login field
|
DisplayName string // if non-empty overrides Login field
|
||||||
ProfilePicURL string // if non-empty overrides Login field
|
ProfilePicURL string `json:",omitzero"` // if non-empty overrides Login field
|
||||||
Created time.Time
|
Created time.Time `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Login is a user from a specific identity provider, not associated with any
|
// Login is a user from a specific identity provider, not associated with any
|
||||||
@@ -268,7 +268,7 @@ type Login struct {
|
|||||||
Provider string // "google", "github", "okta_foo", etc.
|
Provider string // "google", "github", "okta_foo", etc.
|
||||||
LoginName string // an email address or "email-ish" string (like alice@github)
|
LoginName string // an email address or "email-ish" string (like alice@github)
|
||||||
DisplayName string // from the IdP
|
DisplayName string // from the IdP
|
||||||
ProfilePicURL string // from the IdP
|
ProfilePicURL string `json:",omitzero"` // from the IdP
|
||||||
}
|
}
|
||||||
|
|
||||||
// A UserProfile is display-friendly data for a [User].
|
// A UserProfile is display-friendly data for a [User].
|
||||||
@@ -278,7 +278,7 @@ type UserProfile struct {
|
|||||||
ID UserID
|
ID UserID
|
||||||
LoginName string // "alice@smith.com"; for display purposes only (provider is not listed)
|
LoginName string // "alice@smith.com"; for display purposes only (provider is not listed)
|
||||||
DisplayName string // "Alice Smith"
|
DisplayName string // "Alice Smith"
|
||||||
ProfilePicURL string `json:",omitempty"`
|
ProfilePicURL string `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *UserProfile) Equal(p2 *UserProfile) bool {
|
func (p *UserProfile) Equal(p2 *UserProfile) bool {
|
||||||
@@ -345,13 +345,13 @@ type Node struct {
|
|||||||
User UserID
|
User UserID
|
||||||
|
|
||||||
// Sharer, if non-zero, is the user who shared this node, if different than User.
|
// Sharer, if non-zero, is the user who shared this node, if different than User.
|
||||||
Sharer UserID `json:",omitempty"`
|
Sharer UserID `json:",omitzero"`
|
||||||
|
|
||||||
Key key.NodePublic
|
Key key.NodePublic
|
||||||
KeyExpiry time.Time // the zero value if this node does not expire
|
KeyExpiry time.Time `json:",omitzero"` // the zero value if this node does not expire
|
||||||
KeySignature tkatype.MarshaledSignature `json:",omitempty"`
|
KeySignature tkatype.MarshaledSignature `json:",omitempty"`
|
||||||
Machine key.MachinePublic
|
Machine key.MachinePublic `json:",omitzero"`
|
||||||
DiscoKey key.DiscoPublic
|
DiscoKey key.DiscoPublic `json:",omitzero"`
|
||||||
|
|
||||||
// Addresses are the IP addresses of this Node directly.
|
// Addresses are the IP addresses of this Node directly.
|
||||||
Addresses []netip.Prefix
|
Addresses []netip.Prefix
|
||||||
@@ -361,7 +361,7 @@ type Node struct {
|
|||||||
// As of CapabilityVersion 112, this may be nil (null or undefined) on the wire
|
// As of CapabilityVersion 112, this may be nil (null or undefined) on the wire
|
||||||
// to mean the same as Addresses. Internally, it is always filled in with
|
// to mean the same as Addresses. Internally, it is always filled in with
|
||||||
// its possibly-implicit value.
|
// its possibly-implicit value.
|
||||||
AllowedIPs []netip.Prefix
|
AllowedIPs []netip.Prefix `json:",omitzero"` // _not_ omitempty; only nil is special
|
||||||
|
|
||||||
Endpoints []netip.AddrPort `json:",omitempty"` // IP+port (public via STUN, and local LANs)
|
Endpoints []netip.AddrPort `json:",omitempty"` // IP+port (public via STUN, and local LANs)
|
||||||
|
|
||||||
@@ -375,18 +375,18 @@ type Node struct {
|
|||||||
// this field. See tailscale/tailscale#14636. Do not use this field in code
|
// this field. See tailscale/tailscale#14636. Do not use this field in code
|
||||||
// other than in the upgradeNode func, which canonicalizes it to HomeDERP
|
// other than in the upgradeNode func, which canonicalizes it to HomeDERP
|
||||||
// if it arrives as a LegacyDERPString string on the wire.
|
// if it arrives as a LegacyDERPString string on the wire.
|
||||||
LegacyDERPString string `json:"DERP,omitempty"` // DERP-in-IP:port ("127.3.3.40:N") endpoint
|
LegacyDERPString string `json:"DERP,omitzero"` // DERP-in-IP:port ("127.3.3.40:N") endpoint
|
||||||
|
|
||||||
// HomeDERP is the modern version of the DERP string field, with just an
|
// HomeDERP is the modern version of the DERP string field, with just an
|
||||||
// integer. The client advertises support for this as of capver 111.
|
// integer. The client advertises support for this as of capver 111.
|
||||||
//
|
//
|
||||||
// HomeDERP may be zero if not (yet) known, but ideally always be non-zero
|
// HomeDERP may be zero if not (yet) known, but ideally always be non-zero
|
||||||
// for magicsock connectivity to function normally.
|
// for magicsock connectivity to function normally.
|
||||||
HomeDERP int `json:",omitempty"` // DERP region ID of the node's home DERP
|
HomeDERP int `json:",omitzero"` // DERP region ID of the node's home DERP
|
||||||
|
|
||||||
Hostinfo HostinfoView
|
Hostinfo HostinfoView `json:",omitzero"`
|
||||||
Created time.Time
|
Created time.Time `json:",omitzero"`
|
||||||
Cap CapabilityVersion `json:",omitempty"` // if non-zero, the node's capability version; old servers might not send
|
Cap CapabilityVersion `json:",omitzero"` // if non-zero, the node's capability version; old servers might not send
|
||||||
|
|
||||||
// Tags are the list of ACL tags applied to this node.
|
// Tags are the list of ACL tags applied to this node.
|
||||||
// Tags take the form of `tag:<value>` where value starts
|
// Tags take the form of `tag:<value>` where value starts
|
||||||
@@ -453,25 +453,25 @@ type Node struct {
|
|||||||
// it do anything. It is the tailscaled client's job to double-check the
|
// it do anything. It is the tailscaled client's job to double-check the
|
||||||
// MapResponse's PacketFilter to verify that its AllowedIPs will not be
|
// MapResponse's PacketFilter to verify that its AllowedIPs will not be
|
||||||
// accepted by the packet filter.
|
// accepted by the packet filter.
|
||||||
UnsignedPeerAPIOnly bool `json:",omitempty"`
|
UnsignedPeerAPIOnly bool `json:",omitzero"`
|
||||||
|
|
||||||
// The following three computed fields hold the various names that can
|
// The following three computed fields hold the various names that can
|
||||||
// be used for this node in UIs. They are populated from controlclient
|
// be used for this node in UIs. They are populated from controlclient
|
||||||
// (not from control) by calling node.InitDisplayNames. These can be
|
// (not from control) by calling node.InitDisplayNames. These can be
|
||||||
// used directly or accessed via node.DisplayName or node.DisplayNames.
|
// used directly or accessed via node.DisplayName or node.DisplayNames.
|
||||||
|
|
||||||
ComputedName string `json:",omitempty"` // MagicDNS base name (for normal non-shared-in nodes), FQDN (without trailing dot, for shared-in nodes), or Hostname (if no MagicDNS)
|
ComputedName string `json:",omitzero"` // MagicDNS base name (for normal non-shared-in nodes), FQDN (without trailing dot, for shared-in nodes), or Hostname (if no MagicDNS)
|
||||||
computedHostIfDifferent string // hostname, if different than ComputedName, otherwise empty
|
computedHostIfDifferent string // hostname, if different than ComputedName, otherwise empty
|
||||||
ComputedNameWithHost string `json:",omitempty"` // either "ComputedName" or "ComputedName (computedHostIfDifferent)", if computedHostIfDifferent is set
|
ComputedNameWithHost string `json:",omitzero"` // either "ComputedName" or "ComputedName (computedHostIfDifferent)", if computedHostIfDifferent is set
|
||||||
|
|
||||||
// DataPlaneAuditLogID is the per-node logtail ID used for data plane audit logging.
|
// DataPlaneAuditLogID is the per-node logtail ID used for data plane audit logging.
|
||||||
DataPlaneAuditLogID string `json:",omitempty"`
|
DataPlaneAuditLogID string `json:",omitzero"`
|
||||||
|
|
||||||
// Expired is whether this node's key has expired. Control may send
|
// Expired is whether this node's key has expired. Control may send
|
||||||
// this; clients are only allowed to set this from false to true. On
|
// this; clients are only allowed to set this from false to true. On
|
||||||
// the client, this is calculated client-side based on a timestamp sent
|
// the client, this is calculated client-side based on a timestamp sent
|
||||||
// from control, to avoid clock skew issues.
|
// from control, to avoid clock skew issues.
|
||||||
Expired bool `json:",omitempty"`
|
Expired bool `json:",omitzero"`
|
||||||
|
|
||||||
// SelfNodeV4MasqAddrForThisPeer is the IPv4 that this peer knows the current node as.
|
// SelfNodeV4MasqAddrForThisPeer is the IPv4 that this peer knows the current node as.
|
||||||
// It may be empty if the peer knows the current node by its native
|
// It may be empty if the peer knows the current node by its native
|
||||||
@@ -486,7 +486,7 @@ type Node struct {
|
|||||||
// This only applies to traffic originating from the current node to the
|
// This only applies to traffic originating from the current node to the
|
||||||
// peer or any of its subnets. Traffic originating from subnet routes will
|
// peer or any of its subnets. Traffic originating from subnet routes will
|
||||||
// not be masqueraded (e.g. in case of --snat-subnet-routes).
|
// not be masqueraded (e.g. in case of --snat-subnet-routes).
|
||||||
SelfNodeV4MasqAddrForThisPeer *netip.Addr `json:",omitempty"`
|
SelfNodeV4MasqAddrForThisPeer *netip.Addr `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
|
|
||||||
// SelfNodeV6MasqAddrForThisPeer is the IPv6 that this peer knows the current node as.
|
// SelfNodeV6MasqAddrForThisPeer is the IPv6 that this peer knows the current node as.
|
||||||
// It may be empty if the peer knows the current node by its native
|
// It may be empty if the peer knows the current node by its native
|
||||||
@@ -501,17 +501,17 @@ type Node struct {
|
|||||||
// This only applies to traffic originating from the current node to the
|
// This only applies to traffic originating from the current node to the
|
||||||
// peer or any of its subnets. Traffic originating from subnet routes will
|
// peer or any of its subnets. Traffic originating from subnet routes will
|
||||||
// not be masqueraded (e.g. in case of --snat-subnet-routes).
|
// not be masqueraded (e.g. in case of --snat-subnet-routes).
|
||||||
SelfNodeV6MasqAddrForThisPeer *netip.Addr `json:",omitempty"`
|
SelfNodeV6MasqAddrForThisPeer *netip.Addr `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
|
|
||||||
// IsWireGuardOnly indicates that this is a non-Tailscale WireGuard peer, it
|
// IsWireGuardOnly indicates that this is a non-Tailscale WireGuard peer, it
|
||||||
// is not expected to speak Disco or DERP, and it must have Endpoints in
|
// is not expected to speak Disco or DERP, and it must have Endpoints in
|
||||||
// order to be reachable.
|
// order to be reachable.
|
||||||
IsWireGuardOnly bool `json:",omitempty"`
|
IsWireGuardOnly bool `json:",omitzero"`
|
||||||
|
|
||||||
// IsJailed indicates that this node is jailed and should not be allowed
|
// IsJailed indicates that this node is jailed and should not be allowed
|
||||||
// initiate connections, however outbound connections to it should still be
|
// initiate connections, however outbound connections to it should still be
|
||||||
// allowed.
|
// allowed.
|
||||||
IsJailed bool `json:",omitempty"`
|
IsJailed bool `json:",omitzero"`
|
||||||
|
|
||||||
// ExitNodeDNSResolvers is the list of DNS servers that should be used when this
|
// ExitNodeDNSResolvers is the list of DNS servers that should be used when this
|
||||||
// node is marked IsWireGuardOnly and being used as an exit node.
|
// node is marked IsWireGuardOnly and being used as an exit node.
|
||||||
@@ -827,10 +827,10 @@ type Location struct {
|
|||||||
// Because it contains pointers (slices), this type should not be used
|
// Because it contains pointers (slices), this type should not be used
|
||||||
// as a value type.
|
// as a value type.
|
||||||
type Hostinfo struct {
|
type Hostinfo struct {
|
||||||
IPNVersion string `json:",omitempty"` // version of this code (in version.Long format)
|
IPNVersion string `json:",omitzero"` // version of this code (in version.Long format)
|
||||||
FrontendLogID string `json:",omitempty"` // logtail ID of frontend instance
|
FrontendLogID string `json:",omitzero"` // logtail ID of frontend instance
|
||||||
BackendLogID string `json:",omitempty"` // logtail ID of backend instance
|
BackendLogID string `json:",omitzero"` // logtail ID of backend instance
|
||||||
OS string `json:",omitempty"` // operating system the client runs on (a version.OS value)
|
OS string `json:",omitzero"` // operating system the client runs on (a version.OS value)
|
||||||
|
|
||||||
// OSVersion is the version of the OS, if available.
|
// OSVersion is the version of the OS, if available.
|
||||||
//
|
//
|
||||||
@@ -842,25 +842,25 @@ type Hostinfo struct {
|
|||||||
// string on Linux, like "Debian 10.4; kernel=xxx; container; env=kn" and so
|
// string on Linux, like "Debian 10.4; kernel=xxx; container; env=kn" and so
|
||||||
// on. As of Tailscale 1.32, this is simply the kernel version on Linux, like
|
// on. As of Tailscale 1.32, this is simply the kernel version on Linux, like
|
||||||
// "5.10.0-17-amd64".
|
// "5.10.0-17-amd64".
|
||||||
OSVersion string `json:",omitempty"`
|
OSVersion string `json:",omitzero"`
|
||||||
|
|
||||||
Container opt.Bool `json:",omitempty"` // best-effort whether the client is running in a container
|
Container opt.Bool `json:",omitzero"` // best-effort whether the client is running in a container
|
||||||
Env string `json:",omitempty"` // a hostinfo.EnvType in string form
|
Env string `json:",omitzero"` // a hostinfo.EnvType in string form
|
||||||
Distro string `json:",omitempty"` // "debian", "ubuntu", "nixos", ...
|
Distro string `json:",omitzero"` // "debian", "ubuntu", "nixos", ...
|
||||||
DistroVersion string `json:",omitempty"` // "20.04", ...
|
DistroVersion string `json:",omitzero"` // "20.04", ...
|
||||||
DistroCodeName string `json:",omitempty"` // "jammy", "bullseye", ...
|
DistroCodeName string `json:",omitzero"` // "jammy", "bullseye", ...
|
||||||
|
|
||||||
// App is used to disambiguate Tailscale clients that run using tsnet.
|
// App is used to disambiguate Tailscale clients that run using tsnet.
|
||||||
App string `json:",omitempty"` // "k8s-operator", "golinks", ...
|
App string `json:",omitzero"` // "k8s-operator", "golinks", ...
|
||||||
|
|
||||||
Desktop opt.Bool `json:",omitempty"` // if a desktop was detected on Linux
|
Desktop opt.Bool `json:",omitzero"` // if a desktop was detected on Linux
|
||||||
Package string `json:",omitempty"` // Tailscale package to disambiguate ("choco", "appstore", etc; "" for unknown)
|
Package string `json:",omitzero"` // Tailscale package to disambiguate ("choco", "appstore", etc; "" for unknown)
|
||||||
DeviceModel string `json:",omitempty"` // mobile phone model ("Pixel 3a", "iPhone12,3")
|
DeviceModel string `json:",omitzero"` // mobile phone model ("Pixel 3a", "iPhone12,3")
|
||||||
PushDeviceToken string `json:",omitempty"` // macOS/iOS APNs device token for notifications (and Android in the future)
|
PushDeviceToken string `json:",omitzero"` // macOS/iOS APNs device token for notifications (and Android in the future)
|
||||||
Hostname string `json:",omitempty"` // name of the host the client runs on
|
Hostname string `json:",omitzero"` // name of the host the client runs on
|
||||||
ShieldsUp bool `json:",omitempty"` // indicates whether the host is blocking incoming connections
|
ShieldsUp bool `json:",omitzero"` // indicates whether the host is blocking incoming connections
|
||||||
ShareeNode bool `json:",omitempty"` // indicates this node exists in netmap because it's owned by a shared-to user
|
ShareeNode bool `json:",omitzero"` // indicates this node exists in netmap because it's owned by a shared-to user
|
||||||
NoLogsNoSupport bool `json:",omitempty"` // indicates that the user has opted out of sending logs and support
|
NoLogsNoSupport bool `json:",omitzero"` // indicates that the user has opted out of sending logs and support
|
||||||
// WireIngress indicates that the node would like to be wired up server-side
|
// WireIngress indicates that the node would like to be wired up server-side
|
||||||
// (DNS, etc) to be able to use Tailscale Funnel, even if it's not currently
|
// (DNS, etc) to be able to use Tailscale Funnel, even if it's not currently
|
||||||
// enabled. For example, the user might only use it for intermittent
|
// enabled. For example, the user might only use it for intermittent
|
||||||
@@ -868,38 +868,38 @@ type Hostinfo struct {
|
|||||||
// away, even if it's disabled most of the time. As an optimization, this is
|
// away, even if it's disabled most of the time. As an optimization, this is
|
||||||
// only sent if IngressEnabled is false, as IngressEnabled implies that this
|
// only sent if IngressEnabled is false, as IngressEnabled implies that this
|
||||||
// option is true.
|
// option is true.
|
||||||
WireIngress bool `json:",omitempty"`
|
WireIngress bool `json:",omitzero"`
|
||||||
IngressEnabled bool `json:",omitempty"` // if the node has any funnel endpoint enabled
|
IngressEnabled bool `json:",omitzero"` // if the node has any funnel endpoint enabled
|
||||||
AllowsUpdate bool `json:",omitempty"` // indicates that the node has opted-in to admin-console-drive remote updates
|
AllowsUpdate bool `json:",omitzero"` // indicates that the node has opted-in to admin-console-drive remote updates
|
||||||
Machine string `json:",omitempty"` // the current host's machine type (uname -m)
|
Machine string `json:",omitzero"` // the current host's machine type (uname -m)
|
||||||
GoArch string `json:",omitempty"` // GOARCH value (of the built binary)
|
GoArch string `json:",omitzero"` // GOARCH value (of the built binary)
|
||||||
GoArchVar string `json:",omitempty"` // GOARM, GOAMD64, etc (of the built binary)
|
GoArchVar string `json:",omitzero"` // GOARM, GOAMD64, etc (of the built binary)
|
||||||
GoVersion string `json:",omitempty"` // Go version binary was built with
|
GoVersion string `json:",omitzero"` // Go version binary was built with
|
||||||
RoutableIPs []netip.Prefix `json:",omitempty"` // set of IP ranges this client can route
|
RoutableIPs []netip.Prefix `json:",omitempty"` // set of IP ranges this client can route
|
||||||
RequestTags []string `json:",omitempty"` // set of ACL tags this node wants to claim
|
RequestTags []string `json:",omitempty"` // set of ACL tags this node wants to claim
|
||||||
WoLMACs []string `json:",omitempty"` // MAC address(es) to send Wake-on-LAN packets to wake this node (lowercase hex w/ colons)
|
WoLMACs []string `json:",omitempty"` // MAC address(es) to send Wake-on-LAN packets to wake this node (lowercase hex w/ colons)
|
||||||
Services []Service `json:",omitempty"` // services advertised by this machine
|
Services []Service `json:",omitempty"` // services advertised by this machine
|
||||||
NetInfo *NetInfo `json:",omitempty"`
|
NetInfo *NetInfo `json:",omitzero"`
|
||||||
SSH_HostKeys []string `json:"sshHostKeys,omitempty"` // if advertised
|
SSH_HostKeys []string `json:"sshHostKeys,omitempty"` // if advertised
|
||||||
Cloud string `json:",omitempty"`
|
Cloud string `json:",omitzero"`
|
||||||
Userspace opt.Bool `json:",omitempty"` // if the client is running in userspace (netstack) mode
|
Userspace opt.Bool `json:",omitzero"` // if the client is running in userspace (netstack) mode
|
||||||
UserspaceRouter opt.Bool `json:",omitempty"` // if the client's subnet router is running in userspace (netstack) mode
|
UserspaceRouter opt.Bool `json:",omitzero"` // if the client's subnet router is running in userspace (netstack) mode
|
||||||
AppConnector opt.Bool `json:",omitempty"` // if the client is running the app-connector service
|
AppConnector opt.Bool `json:",omitzero"` // if the client is running the app-connector service
|
||||||
ServicesHash string `json:",omitempty"` // opaque hash of the most recent list of tailnet services, change in hash indicates config should be fetched via c2n
|
ServicesHash string `json:",omitzero"` // opaque hash of the most recent list of tailnet services, change in hash indicates config should be fetched via c2n
|
||||||
ExitNodeID StableNodeID `json:",omitzero"` // the client’s selected exit node, empty when unselected.
|
ExitNodeID StableNodeID `json:",omitzero"` // the client’s selected exit node, empty when unselected.
|
||||||
|
|
||||||
// Location represents geographical location data about a
|
// Location represents geographical location data about a
|
||||||
// Tailscale host. Location is optional and only set if
|
// Tailscale host. Location is optional and only set if
|
||||||
// explicitly declared by a node.
|
// explicitly declared by a node.
|
||||||
Location *Location `json:",omitempty"`
|
Location *Location `json:",omitzero"`
|
||||||
|
|
||||||
TPM *TPMInfo `json:",omitempty"` // TPM device metadata, if available
|
TPM *TPMInfo `json:",omitzero"` // TPM device metadata, if available
|
||||||
// StateEncrypted reports whether the node state is stored encrypted on
|
// StateEncrypted reports whether the node state is stored encrypted on
|
||||||
// disk. The actual mechanism is platform-specific:
|
// disk. The actual mechanism is platform-specific:
|
||||||
// * Apple nodes use the Keychain
|
// * Apple nodes use the Keychain
|
||||||
// * Linux and Windows nodes use the TPM
|
// * Linux and Windows nodes use the TPM
|
||||||
// * Android apps use EncryptedSharedPreferences
|
// * Android apps use EncryptedSharedPreferences
|
||||||
StateEncrypted opt.Bool `json:",omitempty"`
|
StateEncrypted opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// NOTE: any new fields containing pointers in this type
|
// NOTE: any new fields containing pointers in this type
|
||||||
// require changes to Hostinfo.Equal.
|
// require changes to Hostinfo.Equal.
|
||||||
@@ -913,25 +913,25 @@ type TPMInfo struct {
|
|||||||
// https://trustedcomputinggroup.org/resource/vendor-id-registry/,
|
// https://trustedcomputinggroup.org/resource/vendor-id-registry/,
|
||||||
// for example "MSFT" for Microsoft.
|
// for example "MSFT" for Microsoft.
|
||||||
// Read from TPM_PT_MANUFACTURER.
|
// Read from TPM_PT_MANUFACTURER.
|
||||||
Manufacturer string `json:",omitempty"`
|
Manufacturer string `json:",omitzero"`
|
||||||
// Vendor is a vendor ID string, up to 16 characters.
|
// Vendor is a vendor ID string, up to 16 characters.
|
||||||
// Read from TPM_PT_VENDOR_STRING_*.
|
// Read from TPM_PT_VENDOR_STRING_*.
|
||||||
Vendor string `json:",omitempty"`
|
Vendor string `json:",omitzero"`
|
||||||
// Model is a vendor-defined TPM model.
|
// Model is a vendor-defined TPM model.
|
||||||
// Read from TPM_PT_VENDOR_TPM_TYPE.
|
// Read from TPM_PT_VENDOR_TPM_TYPE.
|
||||||
Model int `json:",omitempty"`
|
Model int `json:",omitzero"`
|
||||||
// FirmwareVersion is the version number of the firmware.
|
// FirmwareVersion is the version number of the firmware.
|
||||||
// Read from TPM_PT_FIRMWARE_VERSION_*.
|
// Read from TPM_PT_FIRMWARE_VERSION_*.
|
||||||
FirmwareVersion uint64 `json:",omitempty"`
|
FirmwareVersion uint64 `json:",omitzero"`
|
||||||
// SpecRevision is the TPM 2.0 spec revision encoded as a single number. All
|
// SpecRevision is the TPM 2.0 spec revision encoded as a single number. All
|
||||||
// revisions can be found at
|
// revisions can be found at
|
||||||
// https://trustedcomputinggroup.org/resource/tpm-library-specification/.
|
// https://trustedcomputinggroup.org/resource/tpm-library-specification/.
|
||||||
// Before revision 184, TCG used the "01.83" format for revision 183.
|
// Before revision 184, TCG used the "01.83" format for revision 183.
|
||||||
SpecRevision int `json:",omitempty"`
|
SpecRevision int `json:",omitzero"`
|
||||||
|
|
||||||
// FamilyIndicator is the TPM spec family, like "2.0".
|
// FamilyIndicator is the TPM spec family, like "2.0".
|
||||||
// Read from TPM_PT_FAMILY_INDICATOR.
|
// Read from TPM_PT_FAMILY_INDICATOR.
|
||||||
FamilyIndicator string `json:",omitempty"`
|
FamilyIndicator string `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Present reports whether a TPM device is present on this machine.
|
// Present reports whether a TPM device is present on this machine.
|
||||||
@@ -1016,37 +1016,37 @@ func (v HostinfoView) TailscaleSSHEnabled() bool { return v.ж.TailscaleSSHEnabl
|
|||||||
type NetInfo struct {
|
type NetInfo struct {
|
||||||
// MappingVariesByDestIP says whether the host's NAT mappings
|
// MappingVariesByDestIP says whether the host's NAT mappings
|
||||||
// vary based on the destination IP.
|
// vary based on the destination IP.
|
||||||
MappingVariesByDestIP opt.Bool
|
MappingVariesByDestIP opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// WorkingIPv6 is whether the host has IPv6 internet connectivity.
|
// WorkingIPv6 is whether the host has IPv6 internet connectivity.
|
||||||
WorkingIPv6 opt.Bool
|
WorkingIPv6 opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// OSHasIPv6 is whether the OS supports IPv6 at all, regardless of
|
// OSHasIPv6 is whether the OS supports IPv6 at all, regardless of
|
||||||
// whether IPv6 internet connectivity is available.
|
// whether IPv6 internet connectivity is available.
|
||||||
OSHasIPv6 opt.Bool
|
OSHasIPv6 opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// WorkingUDP is whether the host has UDP internet connectivity.
|
// WorkingUDP is whether the host has UDP internet connectivity.
|
||||||
WorkingUDP opt.Bool
|
WorkingUDP opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// WorkingICMPv4 is whether ICMPv4 works.
|
// WorkingICMPv4 is whether ICMPv4 works.
|
||||||
// Empty means not checked.
|
// Empty means not checked.
|
||||||
WorkingICMPv4 opt.Bool
|
WorkingICMPv4 opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// HavePortMap is whether we have an existing portmap open
|
// HavePortMap is whether we have an existing portmap open
|
||||||
// (UPnP, PMP, or PCP).
|
// (UPnP, PMP, or PCP).
|
||||||
HavePortMap bool `json:",omitempty"`
|
HavePortMap bool `json:",omitzero"`
|
||||||
|
|
||||||
// UPnP is whether UPnP appears present on the LAN.
|
// UPnP is whether UPnP appears present on the LAN.
|
||||||
// Empty means not checked.
|
// Empty means not checked.
|
||||||
UPnP opt.Bool
|
UPnP opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// PMP is whether NAT-PMP appears present on the LAN.
|
// PMP is whether NAT-PMP appears present on the LAN.
|
||||||
// Empty means not checked.
|
// Empty means not checked.
|
||||||
PMP opt.Bool
|
PMP opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// PCP is whether PCP appears present on the LAN.
|
// PCP is whether PCP appears present on the LAN.
|
||||||
// Empty means not checked.
|
// Empty means not checked.
|
||||||
PCP opt.Bool
|
PCP opt.Bool `json:",omitzero"`
|
||||||
|
|
||||||
// PreferredDERP is this node's preferred (home) DERP region ID.
|
// PreferredDERP is this node's preferred (home) DERP region ID.
|
||||||
// This is where the node expects to be contacted to begin a
|
// This is where the node expects to be contacted to begin a
|
||||||
@@ -1055,10 +1055,10 @@ type NetInfo struct {
|
|||||||
// that are located elsewhere) but PreferredDERP is the region ID
|
// that are located elsewhere) but PreferredDERP is the region ID
|
||||||
// that the node subscribes to traffic at.
|
// that the node subscribes to traffic at.
|
||||||
// Zero means disconnected or unknown.
|
// Zero means disconnected or unknown.
|
||||||
PreferredDERP int
|
PreferredDERP int `json:",omitzero"`
|
||||||
|
|
||||||
// LinkType is the current link type, if known.
|
// LinkType is the current link type, if known.
|
||||||
LinkType string `json:",omitempty"` // "wired", "wifi", "mobile" (LTE, 4G, 3G, etc)
|
LinkType string `json:",omitzero"` // "wired", "wifi", "mobile" (LTE, 4G, 3G, etc)
|
||||||
|
|
||||||
// DERPLatency is the fastest recent time to reach various
|
// DERPLatency is the fastest recent time to reach various
|
||||||
// DERP STUN servers, in seconds. The map key is the
|
// DERP STUN servers, in seconds. The map key is the
|
||||||
@@ -1076,7 +1076,7 @@ type NetInfo struct {
|
|||||||
// "{nft,ift}-REASON", like "nft-forced" or "ipt-default". Empty means
|
// "{nft,ift}-REASON", like "nft-forced" or "ipt-default". Empty means
|
||||||
// either not Linux or a configuration in which the host firewall rules
|
// either not Linux or a configuration in which the host firewall rules
|
||||||
// are not managed by tailscaled.
|
// are not managed by tailscaled.
|
||||||
FirewallMode string `json:",omitempty"`
|
FirewallMode string `json:",omitzero"`
|
||||||
|
|
||||||
// Update BasicallyEqual when adding fields.
|
// Update BasicallyEqual when adding fields.
|
||||||
}
|
}
|
||||||
@@ -1364,8 +1364,8 @@ type MapRequest struct {
|
|||||||
// For current values and history, see the CapabilityVersion type's docs.
|
// For current values and history, see the CapabilityVersion type's docs.
|
||||||
Version CapabilityVersion
|
Version CapabilityVersion
|
||||||
|
|
||||||
Compress string // "zstd" or "" (no compression)
|
Compress string `json:",omitzero"` // "zstd" or "" (no compression)
|
||||||
KeepAlive bool // whether server should send keep-alives back to us
|
KeepAlive bool `json:",omitzero"` // whether server should send keep-alives back to us
|
||||||
NodeKey key.NodePublic
|
NodeKey key.NodePublic
|
||||||
DiscoKey key.DiscoPublic
|
DiscoKey key.DiscoPublic
|
||||||
|
|
||||||
@@ -1388,7 +1388,7 @@ type MapRequest struct {
|
|||||||
//
|
//
|
||||||
// If true and Version >= 68, the server should treat this as a read-only
|
// If true and Version >= 68, the server should treat this as a read-only
|
||||||
// request and ignore any Hostinfo or other fields that might be set.
|
// request and ignore any Hostinfo or other fields that might be set.
|
||||||
Stream bool
|
Stream bool `json:",omitzero"`
|
||||||
|
|
||||||
// Hostinfo is the client's current Hostinfo. Although it is always included
|
// Hostinfo is the client's current Hostinfo. Although it is always included
|
||||||
// in the request, the server may choose to ignore it when Stream is true
|
// in the request, the server may choose to ignore it when Stream is true
|
||||||
@@ -1405,14 +1405,14 @@ type MapRequest struct {
|
|||||||
//
|
//
|
||||||
// The server may choose to ignore the request for any reason and start a
|
// The server may choose to ignore the request for any reason and start a
|
||||||
// new map session. This is only applicable when Stream is true.
|
// new map session. This is only applicable when Stream is true.
|
||||||
MapSessionHandle string `json:",omitempty"`
|
MapSessionHandle string `json:",omitzero"`
|
||||||
|
|
||||||
// MapSessionSeq is the sequence number in the map session identified by
|
// MapSessionSeq is the sequence number in the map session identified by
|
||||||
// MapSesssionHandle that was most recently processed by the client.
|
// MapSesssionHandle that was most recently processed by the client.
|
||||||
// It is only applicable when MapSessionHandle is specified.
|
// It is only applicable when MapSessionHandle is specified.
|
||||||
// If the server chooses to honor the MapSessionHandle request, only sequence
|
// If the server chooses to honor the MapSessionHandle request, only sequence
|
||||||
// numbers greater than this value will be returned.
|
// numbers greater than this value will be returned.
|
||||||
MapSessionSeq int64 `json:",omitempty"`
|
MapSessionSeq int64 `json:",omitzero"`
|
||||||
|
|
||||||
// Endpoints are the client's magicsock UDP ip:port endpoints (IPv4 or IPv6).
|
// Endpoints are the client's magicsock UDP ip:port endpoints (IPv4 or IPv6).
|
||||||
// These can be ignored if Stream is true and Version >= 68.
|
// These can be ignored if Stream is true and Version >= 68.
|
||||||
@@ -1423,7 +1423,7 @@ type MapRequest struct {
|
|||||||
// TKAHead describes the hash of the latest AUM applied to the local
|
// TKAHead describes the hash of the latest AUM applied to the local
|
||||||
// tailnet key authority, if one is operating.
|
// tailnet key authority, if one is operating.
|
||||||
// It is encoded as tka.AUMHash.MarshalText.
|
// It is encoded as tka.AUMHash.MarshalText.
|
||||||
TKAHead string `json:",omitempty"`
|
TKAHead string `json:",omitzero"`
|
||||||
|
|
||||||
// ReadOnly was set when client just wanted to fetch the MapResponse,
|
// ReadOnly was set when client just wanted to fetch the MapResponse,
|
||||||
// without updating their Endpoints. The intended use was for clients to
|
// without updating their Endpoints. The intended use was for clients to
|
||||||
@@ -1431,7 +1431,7 @@ type MapRequest struct {
|
|||||||
// update.
|
// update.
|
||||||
//
|
//
|
||||||
// Deprecated: always false as of Version 68.
|
// Deprecated: always false as of Version 68.
|
||||||
ReadOnly bool `json:",omitempty"`
|
ReadOnly bool `json:",omitzero"`
|
||||||
|
|
||||||
// OmitPeers is whether the client is okay with the Peers list being omitted
|
// OmitPeers is whether the client is okay with the Peers list being omitted
|
||||||
// in the response.
|
// in the response.
|
||||||
@@ -1447,7 +1447,7 @@ type MapRequest struct {
|
|||||||
// If OmitPeers is true, Stream is false, but ReadOnly is true,
|
// If OmitPeers is true, Stream is false, but ReadOnly is true,
|
||||||
// then all the response fields are included. (This is what the client does
|
// then all the response fields are included. (This is what the client does
|
||||||
// when initially fetching the DERP map.)
|
// when initially fetching the DERP map.)
|
||||||
OmitPeers bool `json:",omitempty"`
|
OmitPeers bool `json:",omitzero"`
|
||||||
|
|
||||||
// DebugFlags is a list of strings specifying debugging and
|
// DebugFlags is a list of strings specifying debugging and
|
||||||
// development features to enable in handling this map
|
// development features to enable in handling this map
|
||||||
@@ -1467,7 +1467,7 @@ type MapRequest struct {
|
|||||||
// identifies this specific connection to the server. The server may choose to
|
// identifies this specific connection to the server. The server may choose to
|
||||||
// use this handle to identify the connection for debugging or testing
|
// use this handle to identify the connection for debugging or testing
|
||||||
// purposes. It has no semantic meaning.
|
// purposes. It has no semantic meaning.
|
||||||
ConnectionHandleForTest string `json:",omitempty"`
|
ConnectionHandleForTest string `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// PortRange represents a range of UDP or TCP port numbers.
|
// PortRange represents a range of UDP or TCP port numbers.
|
||||||
@@ -1758,7 +1758,7 @@ type DNSConfig struct {
|
|||||||
// in the network map, aka MagicDNS.
|
// in the network map, aka MagicDNS.
|
||||||
// Despite the (legacy) name, does not necessarily cause request
|
// Despite the (legacy) name, does not necessarily cause request
|
||||||
// proxying to be enabled.
|
// proxying to be enabled.
|
||||||
Proxied bool `json:",omitempty"`
|
Proxied bool `json:",omitzero"`
|
||||||
|
|
||||||
// Nameservers are the IP addresses of the global nameservers to use.
|
// Nameservers are the IP addresses of the global nameservers to use.
|
||||||
//
|
//
|
||||||
@@ -1795,7 +1795,7 @@ type DNSConfig struct {
|
|||||||
// TempCorpIssue13969 is a temporary (2023-08-16) field for an internal hack day prototype.
|
// TempCorpIssue13969 is a temporary (2023-08-16) field for an internal hack day prototype.
|
||||||
// It contains a user inputed URL that should have a list of domains to be blocked.
|
// It contains a user inputed URL that should have a list of domains to be blocked.
|
||||||
// See https://github.com/tailscale/corp/issues/13969.
|
// See https://github.com/tailscale/corp/issues/13969.
|
||||||
TempCorpIssue13969 string `json:",omitempty"`
|
TempCorpIssue13969 string `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNSRecord is an extra DNS record to add to MagicDNS.
|
// DNSRecord is an extra DNS record to add to MagicDNS.
|
||||||
@@ -1807,7 +1807,7 @@ type DNSRecord struct {
|
|||||||
// Type is the DNS record type.
|
// Type is the DNS record type.
|
||||||
// Empty means A or AAAA, depending on value.
|
// Empty means A or AAAA, depending on value.
|
||||||
// Other values are currently ignored.
|
// Other values are currently ignored.
|
||||||
Type string `json:",omitempty"`
|
Type string `json:",omitzero"`
|
||||||
|
|
||||||
// Value is the IP address in string form.
|
// Value is the IP address in string form.
|
||||||
// TODO(bradfitz): if we ever add support for record types
|
// TODO(bradfitz): if we ever add support for record types
|
||||||
@@ -1855,11 +1855,11 @@ type PingRequest struct {
|
|||||||
|
|
||||||
// URLIsNoise, if true, means that the client should hit URL over the Noise
|
// URLIsNoise, if true, means that the client should hit URL over the Noise
|
||||||
// transport instead of TLS.
|
// transport instead of TLS.
|
||||||
URLIsNoise bool `json:",omitempty"`
|
URLIsNoise bool `json:",omitzero"`
|
||||||
|
|
||||||
// Log is whether to log about this ping in the success case.
|
// Log is whether to log about this ping in the success case.
|
||||||
// For failure cases, the client will log regardless.
|
// For failure cases, the client will log regardless.
|
||||||
Log bool `json:",omitempty"`
|
Log bool `json:",omitzero"`
|
||||||
|
|
||||||
// Types is the types of ping that are initiated. Can be any PingType, comma
|
// Types is the types of ping that are initiated. Can be any PingType, comma
|
||||||
// separated, e.g. "disco,TSMP"
|
// separated, e.g. "disco,TSMP"
|
||||||
@@ -1869,10 +1869,10 @@ type PingRequest struct {
|
|||||||
// node's c2n handler and the HTTP response sent in a POST to URL. For c2n,
|
// node's c2n handler and the HTTP response sent in a POST to URL. For c2n,
|
||||||
// the value of URLIsNoise is ignored and only the Noise transport (back to
|
// the value of URLIsNoise is ignored and only the Noise transport (back to
|
||||||
// the control plane) will be used, as if URLIsNoise were true.
|
// the control plane) will be used, as if URLIsNoise were true.
|
||||||
Types string `json:",omitempty"`
|
Types string `json:",omitzero"`
|
||||||
|
|
||||||
// IP is the ping target, when needed by the PingType(s) given in Types.
|
// IP is the ping target, when needed by the PingType(s) given in Types.
|
||||||
IP netip.Addr
|
IP netip.Addr `json:",omitzero"`
|
||||||
|
|
||||||
// Payload is the ping payload.
|
// Payload is the ping payload.
|
||||||
//
|
//
|
||||||
@@ -3043,29 +3043,29 @@ type SSHRecordingAttempt struct {
|
|||||||
// See QueryFeatureResponse for response structure.
|
// See QueryFeatureResponse for response structure.
|
||||||
type QueryFeatureRequest struct {
|
type QueryFeatureRequest struct {
|
||||||
// Feature is the string identifier for a feature.
|
// Feature is the string identifier for a feature.
|
||||||
Feature string `json:",omitempty"`
|
Feature string `json:",omitzero"`
|
||||||
// NodeKey is the client's current node key.
|
// NodeKey is the client's current node key.
|
||||||
NodeKey key.NodePublic `json:",omitempty"`
|
NodeKey key.NodePublic `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryFeatureResponse is the response to an QueryFeatureRequest.
|
// QueryFeatureResponse is the response to an QueryFeatureRequest.
|
||||||
// See cli.enableFeatureInteractive for usage.
|
// See cli.enableFeatureInteractive for usage.
|
||||||
type QueryFeatureResponse struct {
|
type QueryFeatureResponse struct {
|
||||||
// Complete is true when the feature is already enabled.
|
// Complete is true when the feature is already enabled.
|
||||||
Complete bool `json:",omitempty"`
|
Complete bool `json:",omitzero"`
|
||||||
|
|
||||||
// Text holds lines to display in the CLI with information
|
// Text holds lines to display in the CLI with information
|
||||||
// about the feature and how to enable it.
|
// about the feature and how to enable it.
|
||||||
//
|
//
|
||||||
// Lines are separated by newline characters. The final
|
// Lines are separated by newline characters. The final
|
||||||
// newline may be omitted.
|
// newline may be omitted.
|
||||||
Text string `json:",omitempty"`
|
Text string `json:",omitzero"`
|
||||||
|
|
||||||
// URL is the link for the user to visit to take action on
|
// URL is the link for the user to visit to take action on
|
||||||
// enabling the feature.
|
// enabling the feature.
|
||||||
//
|
//
|
||||||
// When empty, there is no action for this user to take.
|
// When empty, there is no action for this user to take.
|
||||||
URL string `json:",omitempty"`
|
URL string `json:",omitzero"`
|
||||||
|
|
||||||
// ShouldWait specifies whether the CLI should block and
|
// ShouldWait specifies whether the CLI should block and
|
||||||
// wait for the user to enable the feature.
|
// wait for the user to enable the feature.
|
||||||
@@ -3078,7 +3078,7 @@ type QueryFeatureResponse struct {
|
|||||||
//
|
//
|
||||||
// The CLI can watch the IPN notification bus for changes in
|
// The CLI can watch the IPN notification bus for changes in
|
||||||
// required node capabilities to know when to continue.
|
// required node capabilities to know when to continue.
|
||||||
ShouldWait bool `json:",omitempty"`
|
ShouldWait bool `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// WebClientAuthResponse is the response to a web client authentication request
|
// WebClientAuthResponse is the response to a web client authentication request
|
||||||
@@ -3088,15 +3088,15 @@ type WebClientAuthResponse struct {
|
|||||||
// ID is a unique identifier for the session auth request.
|
// ID is a unique identifier for the session auth request.
|
||||||
// It can be supplied to "/machine/webclient/wait" to pause until
|
// It can be supplied to "/machine/webclient/wait" to pause until
|
||||||
// the session authentication has been completed.
|
// the session authentication has been completed.
|
||||||
ID string `json:",omitempty"`
|
ID string `json:",omitzero"`
|
||||||
|
|
||||||
// URL is the link for the user to visit to authenticate the session.
|
// URL is the link for the user to visit to authenticate the session.
|
||||||
//
|
//
|
||||||
// When empty, there is no action for the user to take.
|
// When empty, there is no action for the user to take.
|
||||||
URL string `json:",omitempty"`
|
URL string `json:",omitzero"`
|
||||||
|
|
||||||
// Complete is true when the session authentication has been completed.
|
// Complete is true when the session authentication has been completed.
|
||||||
Complete bool `json:",omitempty"`
|
Complete bool `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// OverTLSPublicKeyResponse is the JSON response to /key?v=<n>
|
// OverTLSPublicKeyResponse is the JSON response to /key?v=<n>
|
||||||
@@ -3172,10 +3172,10 @@ type PeerChange struct {
|
|||||||
|
|
||||||
// DERPRegion, if non-zero, means that NodeID's home DERP
|
// DERPRegion, if non-zero, means that NodeID's home DERP
|
||||||
// region ID is now this number.
|
// region ID is now this number.
|
||||||
DERPRegion int `json:",omitempty"`
|
DERPRegion int `json:",omitzero"`
|
||||||
|
|
||||||
// Cap, if non-zero, means that NodeID's capability version has changed.
|
// Cap, if non-zero, means that NodeID's capability version has changed.
|
||||||
Cap CapabilityVersion `json:",omitempty"`
|
Cap CapabilityVersion `json:",omitzero"`
|
||||||
|
|
||||||
// CapMap, if non-nil, means that NodeID's capability map has changed.
|
// CapMap, if non-nil, means that NodeID's capability map has changed.
|
||||||
CapMap NodeCapMap `json:",omitempty"`
|
CapMap NodeCapMap `json:",omitempty"`
|
||||||
@@ -3185,23 +3185,23 @@ type PeerChange struct {
|
|||||||
Endpoints []netip.AddrPort `json:",omitempty"`
|
Endpoints []netip.AddrPort `json:",omitempty"`
|
||||||
|
|
||||||
// Key, if non-nil, means that the NodeID's wireguard public key changed.
|
// Key, if non-nil, means that the NodeID's wireguard public key changed.
|
||||||
Key *key.NodePublic `json:",omitempty"`
|
Key *key.NodePublic `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
|
|
||||||
// KeySignature, if non-nil, means that the signature of the wireguard
|
// KeySignature, if non-nil, means that the signature of the wireguard
|
||||||
// public key has changed.
|
// public key has changed.
|
||||||
KeySignature tkatype.MarshaledSignature `json:",omitempty"`
|
KeySignature tkatype.MarshaledSignature `json:",omitempty"`
|
||||||
|
|
||||||
// DiscoKey, if non-nil, means that the NodeID's discokey changed.
|
// DiscoKey, if non-nil, means that the NodeID's discokey changed.
|
||||||
DiscoKey *key.DiscoPublic `json:",omitempty"`
|
DiscoKey *key.DiscoPublic `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
|
|
||||||
// Online, if non-nil, means that the NodeID's online status changed.
|
// Online, if non-nil, means that the NodeID's online status changed.
|
||||||
Online *bool `json:",omitempty"`
|
Online *bool `json:",omitzero"`
|
||||||
|
|
||||||
// LastSeen, if non-nil, means that the NodeID's online status changed.
|
// LastSeen, if non-nil, means that the NodeID's online status changed.
|
||||||
LastSeen *time.Time `json:",omitempty"`
|
LastSeen *time.Time `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
|
|
||||||
// KeyExpiry, if non-nil, changes the NodeID's key expiry.
|
// KeyExpiry, if non-nil, changes the NodeID's key expiry.
|
||||||
KeyExpiry *time.Time `json:",omitempty"`
|
KeyExpiry *time.Time `json:",omitzero"` // TODO: de-pointer: tailscale/tailscale#17978
|
||||||
}
|
}
|
||||||
|
|
||||||
// DerpMagicIP is a fake WireGuard endpoint IP address that means to
|
// DerpMagicIP is a fake WireGuard endpoint IP address that means to
|
||||||
@@ -3279,14 +3279,14 @@ const (
|
|||||||
// POST https://<control-plane>/machine/audit-log
|
// POST https://<control-plane>/machine/audit-log
|
||||||
type AuditLogRequest struct {
|
type AuditLogRequest struct {
|
||||||
// Version is the client's current CapabilityVersion.
|
// Version is the client's current CapabilityVersion.
|
||||||
Version CapabilityVersion `json:",omitempty"`
|
Version CapabilityVersion `json:",omitzero"`
|
||||||
// NodeKey is the client's current node key.
|
// NodeKey is the client's current node key.
|
||||||
NodeKey key.NodePublic `json:",omitzero"`
|
NodeKey key.NodePublic `json:",omitzero"`
|
||||||
// Action is the action to be logged. It must correspond to a known action in the control plane.
|
// Action is the action to be logged. It must correspond to a known action in the control plane.
|
||||||
Action ClientAuditAction `json:",omitempty"`
|
Action ClientAuditAction `json:",omitzero"`
|
||||||
// Details is an opaque string, specific to the action being logged. Empty strings may not
|
// Details is an opaque string, specific to the action being logged. Empty strings may not
|
||||||
// be valid depending on the action being logged.
|
// be valid depending on the action being logged.
|
||||||
Details string `json:",omitempty"`
|
Details string `json:",omitzero"`
|
||||||
// Timestamp is the time at which the audit log was generated on the node.
|
// Timestamp is the time at which the audit log was generated on the node.
|
||||||
Timestamp time.Time `json:",omitzero"`
|
Timestamp time.Time `json:",omitzero"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user