From d39e972e595a2f39526f323584e2991863c27502 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Wed, 29 Sep 2021 12:19:16 -0700 Subject: [PATCH] version/updates: start of version updates policy package Signed-off-by: Brad Fitzpatrick --- version/updates/rules.json | 38 +++++++++++++++++++++++++ version/updates/updates.go | 50 +++++++++++++++++++++++++++++++++ version/updates/updates_test.go | 28 ++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 version/updates/rules.json create mode 100644 version/updates/updates.go create mode 100644 version/updates/updates_test.go diff --git a/version/updates/rules.json b/version/updates/rules.json new file mode 100644 index 000000000..d623977e5 --- /dev/null +++ b/version/updates/rules.json @@ -0,0 +1,38 @@ +{ + "tests": [ + { + "os": "linux", + "distro": "synology", + "ver": "1.14.5", + "want": "", + }, + { + "os": "windows", + "ver": "1.2.1", + "want": "update/security", + }, + ], + "rules": [ + { + "ver": "1.12.3", + "os": "linux", + "distro": "synology", + "then": "stop", + }, + { + "os": "windows", + "thenRules": [], + "elseRules": [], + }, + { + "ver": "<1.2.3", + "os": "windows", + "then": "update/security: some notes", + }, + { + "ver": "<1.14", + "now": ">=2020-09-29", + "then": "update", + }, + ], +} diff --git a/version/updates/updates.go b/version/updates/updates.go new file mode 100644 index 000000000..df39e6bd9 --- /dev/null +++ b/version/updates/updates.go @@ -0,0 +1,50 @@ +// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Packate updates is an evalator for a update policy file that controls +// when users get update available notifications (and which types). +// +// It's used and hot reloaded by several servers. It permits us to +// centralize and test the update policy. +package updates + +type Policy struct { + Tests []*Test + Rules []*Rule +} + +type Test struct { + OS string + Distro string // "synology" on Linux + Ver string // "1.2.3-tXXXX-gXXX" + Want string // "", "update", "update/security" +} + +type Rule struct { + // Ver, if non-empty, matches the version number. + // If it begins with an operator ("<", "<=", then the comparison + // is done semantically based on semver, not lexically. + Ver string + + // OS, if non-empty, matches the node operating system. + // Possible values: "linux", "windows", "macOS", "iOS", or + // else a runtime.GOOS value (except not "darwin" or "ios"). + OS string + + // Package, if non-empty, matches the packaging variant. + // Possible values: "choco", "appstore", "macsys", "tailscaled". + Package string + + // Distro, if non-empty, matches the node's distro. + // Possible values: "synology". + Distro string + + // Now, if non-empty, matches based on the current date in UTC. + // e.g. ">=2021-10-07". + Now string + + Then string // "stop", "update", "update/security", "update: note" + ThenRules []*Rule + ElseRules []*Rule +} diff --git a/version/updates/updates_test.go b/version/updates/updates_test.go new file mode 100644 index 000000000..491a3eae1 --- /dev/null +++ b/version/updates/updates_test.go @@ -0,0 +1,28 @@ +// Copyright (c) 2021 Tailscale Inc & AUTHORS All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package updates + +import ( + "bytes" + "os" + "testing" + + "github.com/tailscale/hujson" +) + +func TestParse(t *testing.T) { + rulesJSON, err := os.ReadFile("rules.json") + if err != nil { + t.Fatal(err) + } + + d := hujson.NewDecoder(bytes.NewReader(rulesJSON)) + d.DisallowUnknownFields() + + var p Policy + if err := d.Decode(&p); err != nil { + t.Fatal(err) + } +}