handler_windows.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. package syspolicy
  4. import (
  5. "errors"
  6. "fmt"
  7. "tailscale.com/util/clientmetric"
  8. "tailscale.com/util/winutil"
  9. )
  10. var (
  11. windowsErrors = clientmetric.NewCounter("windows_syspolicy_errors")
  12. windowsAny = clientmetric.NewGauge("windows_syspolicy_any")
  13. )
  14. type windowsHandler struct{}
  15. func init() {
  16. RegisterHandler(NewCachingHandler(windowsHandler{}))
  17. keyList := []struct {
  18. isSet func(Key) bool
  19. keys []Key
  20. }{
  21. {
  22. isSet: func(k Key) bool {
  23. _, err := handler.ReadString(string(k))
  24. return err == nil
  25. },
  26. keys: stringKeys,
  27. },
  28. {
  29. isSet: func(k Key) bool {
  30. _, err := handler.ReadBoolean(string(k))
  31. return err == nil
  32. },
  33. keys: boolKeys,
  34. },
  35. {
  36. isSet: func(k Key) bool {
  37. _, err := handler.ReadUInt64(string(k))
  38. return err == nil
  39. },
  40. keys: uint64Keys,
  41. },
  42. }
  43. var anySet bool
  44. for _, l := range keyList {
  45. for _, k := range l.keys {
  46. if !l.isSet(k) {
  47. continue
  48. }
  49. clientmetric.NewGauge(fmt.Sprintf("windows_syspolicy_%s", k)).Set(1)
  50. anySet = true
  51. }
  52. }
  53. if anySet {
  54. windowsAny.Set(1)
  55. }
  56. }
  57. func (windowsHandler) ReadString(key string) (string, error) {
  58. s, err := winutil.GetPolicyString(key)
  59. if errors.Is(err, winutil.ErrNoValue) {
  60. err = ErrNoSuchKey
  61. } else if err != nil {
  62. windowsErrors.Add(1)
  63. }
  64. return s, err
  65. }
  66. func (windowsHandler) ReadUInt64(key string) (uint64, error) {
  67. value, err := winutil.GetPolicyInteger(key)
  68. if errors.Is(err, winutil.ErrNoValue) {
  69. err = ErrNoSuchKey
  70. } else if err != nil {
  71. windowsErrors.Add(1)
  72. }
  73. return value, err
  74. }
  75. func (windowsHandler) ReadBoolean(key string) (bool, error) {
  76. value, err := winutil.GetPolicyInteger(key)
  77. if errors.Is(err, winutil.ErrNoValue) {
  78. err = ErrNoSuchKey
  79. } else if err != nil {
  80. windowsErrors.Add(1)
  81. }
  82. return value != 0, err
  83. }
  84. func (windowsHandler) ReadStringArray(key string) ([]string, error) {
  85. value, err := winutil.GetPolicyStringArray(key)
  86. if errors.Is(err, winutil.ErrNoValue) {
  87. err = ErrNoSuchKey
  88. } else if err != nil {
  89. windowsErrors.Add(1)
  90. }
  91. return value, err
  92. }