diff --git a/hostinfo/hostinfo_linux.go b/hostinfo/hostinfo_linux.go index 5853d4fc5..c5983f3a1 100644 --- a/hostinfo/hostinfo_linux.go +++ b/hostinfo/hostinfo_linux.go @@ -48,7 +48,17 @@ func linuxDeviceModel() string { return "" } +func getQnapQtsVersion(versionInfo string) string { + for _, field := range strings.Fields(versionInfo) { + if suffix := strings.TrimPrefix(field, "QTSFW_"); suffix != field { + return "QTS " + suffix + } + } + return "" +} + func osVersionLinux() string { + // TODO(bradfitz,dgentry): cache this, or make caller(s) cache it. dist := distro.Get() propFile := "/etc/os-release" switch dist { @@ -59,6 +69,9 @@ func osVersionLinux() string { case distro.WDMyCloud: slurp, _ := ioutil.ReadFile("/etc/version") return fmt.Sprintf("%s", string(bytes.TrimSpace(slurp))) + case distro.QNAP: + slurp, _ := ioutil.ReadFile("/etc/version_info") + return getQnapQtsVersion(string(slurp)) } m := map[string]string{} diff --git a/hostinfo/hostinfo_linux_test.go b/hostinfo/hostinfo_linux_test.go new file mode 100644 index 000000000..4bb8a83d9 --- /dev/null +++ b/hostinfo/hostinfo_linux_test.go @@ -0,0 +1,38 @@ +// Copyright (c) 2022 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. + +//go:build linux && !android +// +build linux,!android + +package hostinfo + +import ( + "testing" +) + +func TestQnap(t *testing.T) { + version_info := `commit 2910d3a594b068024ed01a64a0fe4168cb001a12 +Date: 2022-05-30 16:08:45 +0800 +================================================ +* QTSFW_5.0.0 +remotes/origin/QTSFW_5.0.0` + + got := getQnapQtsVersion(version_info) + want := "QTS 5.0.0" + if got != want { + t.Errorf("got %q; want %q", got, want) + } + + got = getQnapQtsVersion("") + want = "" + if got != want { + t.Errorf("got %q; want %q", got, want) + } + + got = getQnapQtsVersion("just a bunch of junk") + want = "" + if got != want { + t.Errorf("got %q; want %q", got, want) + } +}