mirror of
https://github.com/tailscale/tailscale.git
synced 2025-08-11 21:27:31 +00:00
wgengine/router: refactor udm-pro into broader ubnt support
Fixes #14453 Signed-off-by: Jason Barnett <J@sonBarnett.com>
This commit is contained in:

committed by
Adrian Dewhurst

parent
e3bcb2ec83
commit
17b881538a
@@ -9,7 +9,6 @@ import (
|
||||
"os"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"tailscale.com/types/lazy"
|
||||
"tailscale.com/util/lineiter"
|
||||
@@ -31,7 +30,7 @@ const (
|
||||
WDMyCloud = Distro("wdmycloud")
|
||||
Unraid = Distro("unraid")
|
||||
Alpine = Distro("alpine")
|
||||
UDMPro = Distro("udmpro")
|
||||
UBNT = Distro("ubnt") // Ubiquiti Networks
|
||||
)
|
||||
|
||||
var distro lazy.SyncValue[Distro]
|
||||
@@ -77,9 +76,12 @@ func linuxDistro() Distro {
|
||||
case have("/usr/local/bin/freenas-debug"):
|
||||
// TrueNAS Scale runs on debian
|
||||
return TrueNAS
|
||||
case isUDMPro():
|
||||
// UDM-Pro runs on debian
|
||||
return UDMPro
|
||||
case have("/usr/bin/ubnt-device-info"):
|
||||
// UBNT runs on Debian-based systems. This MUST be checked before Debian.
|
||||
//
|
||||
// Currently supported product families:
|
||||
// - UDM (UniFi Dream Machine, UDM-Pro)
|
||||
return UBNT
|
||||
case have("/etc/debian_version"):
|
||||
return Debian
|
||||
case have("/etc/arch-release"):
|
||||
@@ -152,44 +154,3 @@ func DSMVersion() int {
|
||||
return 0
|
||||
})
|
||||
}
|
||||
|
||||
// isUDMPro checks a couple of files known to exist on a UDM-Pro and returns
|
||||
// true if the expected content exists in the files.
|
||||
func isUDMPro() bool {
|
||||
// This is a performance guardrail against trying to load both
|
||||
// /etc/board.info and /sys/firmware/devicetree/base/soc/board-cfg/id when
|
||||
// not running on Debian so we don't make unnecessary calls in situations
|
||||
// where we definitely are NOT on a UDM Pro. In other words, the have() call
|
||||
// is much cheaper than the two os.ReadFile() in fileContainsAnyString().
|
||||
// That said, on Debian systems we will still be making the two
|
||||
// os.ReadFile() in fileContainsAnyString().
|
||||
if !have("/etc/debian_version") {
|
||||
return false
|
||||
}
|
||||
if exists, err := fileContainsAnyString("/etc/board.info", "UDMPRO", "Dream Machine PRO"); err == nil && exists {
|
||||
return true
|
||||
}
|
||||
if exists, err := fileContainsAnyString("/sys/firmware/devicetree/base/soc/board-cfg/id", "udm pro"); err == nil && exists {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// fileContainsAnyString is used to determine if one or more of the provided
|
||||
// strings exists in a file. This is not efficient for larger files. If you want
|
||||
// to use this function to parse large files, please refactor to use
|
||||
// `io.LimitedReader`.
|
||||
func fileContainsAnyString(filePath string, searchStrings ...string) (bool, error) {
|
||||
data, err := os.ReadFile(filePath)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
|
||||
content := string(data)
|
||||
for _, searchString := range searchStrings {
|
||||
if strings.Contains(content, searchString) {
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
return false, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user