From ef15096a7dc01bd43ee2a646b25b212c50be7f8a Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Mon, 21 Dec 2020 20:57:35 -0800 Subject: [PATCH] control/controlclient, version/distro: detect NixOS explicitly The fallthrough happened to work in controlclient already due to the /etc/os-release PRETTY_NAME default, but make it explicit so it doesn't look like an accident. Also add it to version/distro, even though nothing needs it yet. --- control/controlclient/hostinfo_linux.go | 2 +- control/controlclient/netmap_test.go | 13 +++++++++++++ version/distro/distro.go | 25 ++++++++++++++++++------- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/control/controlclient/hostinfo_linux.go b/control/controlclient/hostinfo_linux.go index 8074f6cd1..0fd125a87 100644 --- a/control/controlclient/hostinfo_linux.go +++ b/control/controlclient/hostinfo_linux.go @@ -73,7 +73,7 @@ func osVersionLinux() string { return fmt.Sprintf("%s%s", bytes.TrimSpace(cr), attr) } fallthrough - case "fedora", "rhel", "alpine": + case "fedora", "rhel", "alpine", "nixos": // Their PRETTY_NAME is fine as-is for all versions I tested. fallthrough default: diff --git a/control/controlclient/netmap_test.go b/control/controlclient/netmap_test.go index 909a787f1..c9a422cec 100644 --- a/control/controlclient/netmap_test.go +++ b/control/controlclient/netmap_test.go @@ -6,6 +6,7 @@ package controlclient import ( "encoding/hex" + "encoding/json" "testing" "github.com/tailscale/wireguard-go/wgcfg" @@ -282,3 +283,15 @@ func TestConciseDiffFrom(t *testing.T) { }) } } + +func TestNewHostinfo(t *testing.T) { + hi := NewHostinfo() + if hi == nil { + t.Fatal("no Hostinfo") + } + j, err := json.MarshalIndent(hi, " ", "") + if err != nil { + t.Fatal(err) + } + t.Logf("Got: %s", j) +} diff --git a/version/distro/distro.go b/version/distro/distro.go index cc39d7a7a..6023a2453 100644 --- a/version/distro/distro.go +++ b/version/distro/distro.go @@ -17,6 +17,7 @@ const ( Arch = Distro("arch") Synology = Distro("synology") OpenWrt = Distro("openwrt") + NixOS = Distro("nixos") ) // Get returns the current distro, or the empty string if unknown. @@ -27,18 +28,28 @@ func Get() Distro { return "" } +func have(file string) bool { + _, err := os.Stat(file) + return err == nil +} + +func haveDir(file string) bool { + fi, err := os.Stat(file) + return err == nil && fi.IsDir() +} + func linuxDistro() Distro { - if fi, err := os.Stat("/usr/syno"); err == nil && fi.IsDir() { + switch { + case haveDir("usr/syno"): return Synology - } - if _, err := os.Stat("/etc/debian_version"); err == nil { + case have("/etc/debian_version"): return Debian - } - if _, err := os.Stat("/etc/arch-release"); err == nil { + case have("/etc/arch-release"): return Arch - } - if _, err := os.Stat("/etc/openwrt_version"); err == nil { + case have("/etc/openwrt_version"): return OpenWrt + case have("/run/current-system/sw/bin/nixos-version"): + return NixOS } return "" }