tailscale/util
Brad Fitzpatrick b6e17df646 cmd/tailscaled, util/syspolicy: add JSON syspolicy file support
Tailscaled had no way to seed device-scope syspolicy settings short of
environment variables or a custom store wired up out of tree. Add a
--syspolicy-file flag whose default points at a well-known JSON file
that, when present, is parsed as a map[string]any and registered as a
device-scope policy source. The default path is
/etc/tailscale/syspolicy.json on every non-Windows platform (Linux, the
BSDs, illumos/Solaris, and tailscaled-without-the-GUI on macOS) and
%ProgramData%\Tailscale\syspolicy.json on Windows. The flag lets users
running tailscaled by hand (development, custom installs) point it at
an alternate file, and "" disables the load entirely.

JSON values map to setting types as expected: strings to
StringValue/PreferenceOptionValue/VisibilityValue/DurationValue (e.g.
"24h" parsed by time.ParseDuration), booleans to BooleanValue, numbers
to IntegerValue, and string arrays to StringListValue. The file is
validated against the registered setting definitions at load time so
unknown keys and value/type mismatches fail startup loudly rather than
producing surprising defaults at first read.

When HuJSON support is linked into the build (default; opt out with
ts_omit_hujsonconf), the file may use HuJSON (comments, trailing
commas). With ts_omit_hujsonconf it must be pure standard JSON. This
mirrors the pattern used by ipn/conffile.

On Windows the JSON file and the existing HKLM registry store both
register at DeviceScope. rsop merges later-registered same-scope
sources over earlier ones, so per-key values in the file override the
registry while keys absent from the file fall back to the registry.

The loader is registered via a feature.Hook from a file gated by
!ts_omit_syspolicy, and called from main after flag parsing. tsnet
still does not depend on the root syspolicy package, so embedders
don't pick this up implicitly.

Fixes #20305

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
Change-Id: Ie6326461c14efb226979ac162998a9c6373ce493
2026-06-30 13:10:16 -07:00
..
backoff all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
bufiox derp,types,util: use bufio Peek+Discard for allocation-free fast reads (#19067) 2026-03-24 10:52:20 -04:00
checkchange all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
cibuild util/cibuild, cache_key_test: skip TestTsgoRevInCacheKey outside Tailscale CI 2026-05-14 15:55:05 -07:00
clientmetric all: fix six tests that failed with -count=2 2026-04-13 18:52:57 -07:00
cloudenv util/cloudenv: detect Hetzner Cloud 2026-06-23 11:10:59 -07:00
cloudinfo all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
cmpver util/cmpver: add a test for comparing three-digit versions 2026-06-25 10:02:50 +01:00
codegen all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
ctxkey all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
deephash cmd/vet/lowerell, drive/driveimpl: forbid variables named "l" or "I" 2026-05-04 14:03:28 -07:00
def util: add parse fallback helpers (#20022) 2026-06-15 15:58:51 -07:00
dirwalk all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
dnsname all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
eventbus all: don't repeat the the word "the" unnecessarily 2026-06-18 16:32:08 +01:00
execqueue all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
goroutines all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
groupmember all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
hashx all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
httphdr all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
httpm util/httpm: open .git/index to defeat Go test caching 2026-04-15 15:44:19 -07:00
limiter all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
lineiter all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
lineread all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
linuxfw wgengine/router/osrouter,util/linuxfw: remove orphaned tailnet addrs (#20199) 2026-06-24 13:41:36 -07:00
lru all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
mak all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
multierr all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
must all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
nocasemaps all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
osdiag util/osdiag: fix typo in comment (reciever -> receiver) 2026-03-23 12:54:38 +00:00
osshare all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
osuser util/osuser: extend id command fallback for group IDs to freebsd 2026-03-09 08:39:07 +00:00
precompress all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
progresstracking all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
prompt all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
qrcodes all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
quarantine all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
race all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
racebuild all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
rands all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
reload all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
ringlog all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
safediff all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
set util/set: add iterator support to Set[T] (#20159) 2026-06-18 00:12:56 -07:00
singleflight all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
slicesx all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
stringsx all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
syspolicy cmd/tailscaled, util/syspolicy: add JSON syspolicy file support 2026-06-30 13:10:16 -07:00
testenv all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
truncate all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
usermetric all: remove AUTHORS file and references to it 2026-01-23 15:49:45 -08:00
vizerror all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00
winutil all: don't repeat the the word "the" unnecessarily 2026-06-18 16:32:08 +01:00
zstdframe all: use Go 1.26 things, run most gofix modernizers 2026-03-06 13:32:03 -08:00