summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorClaire Wang <clairew@users.noreply.github.com>2023-12-05 17:13:05 -0500
committerGitHub <noreply@github.com>2023-12-05 17:13:05 -0500
commit47db67fef57c803dd555bbc4fdc27d084efeec5f (patch)
treef2affe32ba5814b109e218fd5e017eafed6e8968
parenta95b3cbfa8b1b8dc5de581de70cee7bf96c0ed67 (diff)
downloadtailscale-47db67fef57c803dd555bbc4fdc27d084efeec5f.tar.xz
tailscale-47db67fef57c803dd555bbc4fdc27d084efeec5f.zip
util/syspolicy: add policy counters (#10471)
Fixes tailscale/corp#16138 Signed-off-by: Claire Wang <claire@tailscale.com>
-rw-r--r--util/syspolicy/handler_windows.go55
-rw-r--r--util/syspolicy/policy_keys.go30
2 files changed, 85 insertions, 0 deletions
diff --git a/util/syspolicy/handler_windows.go b/util/syspolicy/handler_windows.go
index c259bf96c..668fd3db2 100644
--- a/util/syspolicy/handler_windows.go
+++ b/util/syspolicy/handler_windows.go
@@ -5,21 +5,72 @@ package syspolicy
import (
"errors"
+ "fmt"
+ "tailscale.com/util/clientmetric"
"tailscale.com/util/winutil"
)
+var (
+ windowsErrors = clientmetric.NewCounter("windows_mdm_setting_errors")
+ windowsAny = clientmetric.NewGauge("windows_mdm_setting_any")
+)
+
type windowsHandler struct{}
func init() {
RegisterHandler(NewCachingHandler(windowsHandler{}))
+
+ keyList := []struct {
+ isSet func(Key) bool
+ keys []Key
+ }{
+ {
+ isSet: func(k Key) bool {
+ _, err := handler.ReadString(string(k))
+ return err == nil
+ },
+ keys: stringKeys,
+ },
+ {
+ isSet: func(k Key) bool {
+ _, err := handler.ReadBoolean(string(k))
+ return err == nil
+ },
+ keys: boolKeys,
+ },
+ {
+ isSet: func(k Key) bool {
+ _, err := handler.ReadUInt64(string(k))
+ return err == nil
+ },
+ keys: uint64Keys,
+ },
+ }
+
+ var anySet bool
+ for _, l := range keyList {
+ for _, k := range l.keys {
+ if !l.isSet(k) {
+ continue
+ }
+ clientmetric.NewGauge(fmt.Sprintf("windows_mdm_setting_%s", k)).Set(1)
+ anySet = true
+ }
+ }
+ if anySet {
+ windowsAny.Set(1)
+ }
}
func (windowsHandler) ReadString(key string) (string, error) {
s, err := winutil.GetPolicyString(key)
if errors.Is(err, winutil.ErrNoValue) {
err = ErrNoSuchKey
+ } else if err != nil {
+ windowsErrors.Add(1)
}
+
return s, err
}
@@ -27,6 +78,8 @@ func (windowsHandler) ReadUInt64(key string) (uint64, error) {
value, err := winutil.GetPolicyInteger(key)
if errors.Is(err, winutil.ErrNoValue) {
err = ErrNoSuchKey
+ } else if err != nil {
+ windowsErrors.Add(1)
}
return value, err
}
@@ -35,6 +88,8 @@ func (windowsHandler) ReadBoolean(key string) (bool, error) {
value, err := winutil.GetPolicyInteger(key)
if errors.Is(err, winutil.ErrNoValue) {
err = ErrNoSuchKey
+ } else if err != nil {
+ windowsErrors.Add(1)
}
return value != 0, err
}
diff --git a/util/syspolicy/policy_keys.go b/util/syspolicy/policy_keys.go
index c90f7b5cc..75393f9b2 100644
--- a/util/syspolicy/policy_keys.go
+++ b/util/syspolicy/policy_keys.go
@@ -50,3 +50,33 @@ const (
// The default is "user-decides" unless otherwise stated.
PostureChecking Key = "PostureChecking"
)
+
+var stringKeys = []Key{
+ ControlURL,
+ LogTarget,
+ Tailnet,
+ ExitNodeID,
+ ExitNodeIP,
+ EnableIncomingConnections,
+ EnableServerMode,
+ ExitNodeAllowLANAccess,
+ EnableTailscaleDNS,
+ EnableTailscaleSubnets,
+ AdminConsoleVisibility,
+ NetworkDevicesVisibility,
+ TestMenuVisibility,
+ UpdateMenuVisibility,
+ RunExitNodeVisibility,
+ PreferencesMenuVisibility,
+ ExitNodeMenuVisibility,
+ AutoUpdateVisibility,
+ KeyExpirationNoticeTime,
+ PostureChecking,
+}
+
+var boolKeys = []Key{
+ LogSCMInteractions,
+ FlushDNSOnSessionUnlock,
+}
+
+var uint64Keys = []Key{}