version/updates: start of version updates policy package

Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
Brad Fitzpatrick 2021-09-29 12:19:16 -07:00
parent 0fa1da2d1b
commit d39e972e59
3 changed files with 116 additions and 0 deletions

View File

@ -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",
},
],
}

View File

@ -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
}

View File

@ -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)
}
}