From 5d8b88be8852fbdcdf90f96094549d78901ef4b1 Mon Sep 17 00:00:00 2001 From: Brad Fitzpatrick Date: Tue, 22 Sep 2020 10:28:40 -0700 Subject: [PATCH] control/controlclient, version/distro, wgengine: recognize OpenWrt And help out with missing packages. Thanks to @willangley for tips. Updates #724 --- control/controlclient/hostinfo_linux.go | 12 +++++++++--- version/distro/distro.go | 4 ++++ wgengine/userspace.go | 11 +++++++++++ 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/control/controlclient/hostinfo_linux.go b/control/controlclient/hostinfo_linux.go index 64ce3fa24..8074f6cd1 100644 --- a/control/controlclient/hostinfo_linux.go +++ b/control/controlclient/hostinfo_linux.go @@ -26,8 +26,11 @@ func init() { func osVersionLinux() string { dist := distro.Get() propFile := "/etc/os-release" - if dist == distro.Synology { + switch dist { + case distro.Synology: propFile = "/etc.defaults/VERSION" + case distro.OpenWrt: + propFile = "/etc/openwrt_release" } m := map[string]string{} @@ -36,7 +39,7 @@ func osVersionLinux() string { if eq == -1 { return nil } - k, v := string(line[:eq]), strings.Trim(string(line[eq+1:]), `"`) + k, v := string(line[:eq]), strings.Trim(string(line[eq+1:]), `"'`) m[k] = v return nil }) @@ -78,8 +81,11 @@ func osVersionLinux() string { return fmt.Sprintf("%s%s", v, attr) } } - if dist == distro.Synology { + switch dist { + case distro.Synology: return fmt.Sprintf("Synology %s%s", m["productversion"], attr) + case distro.OpenWrt: + return fmt.Sprintf("OpenWrt %s%s", m["DISTRIB_RELEASE"], attr) } return fmt.Sprintf("Other%s", attr) } diff --git a/version/distro/distro.go b/version/distro/distro.go index 814a234eb..cc39d7a7a 100644 --- a/version/distro/distro.go +++ b/version/distro/distro.go @@ -16,6 +16,7 @@ const ( Debian = Distro("debian") Arch = Distro("arch") Synology = Distro("synology") + OpenWrt = Distro("openwrt") ) // Get returns the current distro, or the empty string if unknown. @@ -36,5 +37,8 @@ func linuxDistro() Distro { if _, err := os.Stat("/etc/arch-release"); err == nil { return Arch } + if _, err := os.Stat("/etc/openwrt_version"); err == nil { + return OpenWrt + } return "" } diff --git a/wgengine/userspace.go b/wgengine/userspace.go index b645b5724..72cfe3044 100644 --- a/wgengine/userspace.go +++ b/wgengine/userspace.go @@ -1272,5 +1272,16 @@ func diagnoseLinuxTUNFailure(logf logger.Logf) { if !bytes.Contains(findOut, kernel) { logf("kernel/drivers/net/tun.ko found on disk, but not for current kernel; are you in middle of a system update and haven't rebooted? found: %s", findOut) } + case distro.OpenWrt: + out, err := exec.Command("opkg", "list-installed").CombinedOutput() + if err != nil { + logf("error querying OpenWrt installed packages: %s", out) + return + } + for _, pkg := range []string{"kmod-tun", "ca-bundle"} { + if !bytes.Contains(out, []byte(pkg+" - ")) { + logf("Missing required package %s; run: opkg install %s", pkg, pkg) + } + } } }