Update
This commit is contained in:
1 parent
3530afb854
commit
6903fcff27
2146 files changed
+112256
-190703
No files matched your search
+12
-2
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build !ios
|
||||
@@ -13,6 +13,7 @@ import (
|
||||
"os"
|
||||
"path"
|
||||
"runtime"
|
||||
"runtime/debug"
|
||||
"strings"
|
||||
)
|
||||
|
||||
@@ -20,6 +21,15 @@ import (
|
||||
// using os.Executable. If os.Executable fails (it shouldn't), then
|
||||
// "cmd" is returned.
|
||||
func CmdName() string {
|
||||
// On non-Windows, the modinfo embedded in the running binary is
|
||||
// authoritative and avoids re-reading the executable from disk.
|
||||
// Windows needs the executable-name-based GUI override in cmdName,
|
||||
// so it still takes the slower path.
|
||||
if runtime.GOOS != "windows" {
|
||||
if info, ok := debug.ReadBuildInfo(); ok && info.Path != "" {
|
||||
return path.Base(info.Path)
|
||||
}
|
||||
}
|
||||
e, err := os.Executable()
|
||||
if err != nil {
|
||||
return "cmd"
|
||||
@@ -39,7 +49,7 @@ func cmdName(exe string) string {
|
||||
}
|
||||
// v is like:
|
||||
// "path\ttailscale.com/cmd/tailscale\nmod\ttailscale.com\t(devel)\t\ndep\tgithub.com/apenwarr/fixconsole\tv0.0.0-20191012055117-5a9f6489cc29\th1:muXWUcay7DDy1/hEQWrYlBy+g0EuwT70sBHg65SeUc4=\ndep\tgithub....
|
||||
for _, line := range strings.Split(info, "\n") {
|
||||
for line := range strings.SplitSeq(info, "\n") {
|
||||
if goPkg, ok := strings.CutPrefix(line, "path\t"); ok { // like "tailscale.com/cmd/tailscale"
|
||||
ret = path.Base(goPkg) // goPkg is always forward slashes; use path, not filepath
|
||||
break
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build ios
|
||||
|
||||
+6
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package version
|
||||
@@ -103,6 +103,11 @@ func parse(version string) (parsed, bool) {
|
||||
}
|
||||
}
|
||||
|
||||
// Ignore trailer like '_1 (Void Linux)'.
|
||||
if rest[0] == '_' && strings.HasSuffix(rest, " (Void Linux)") {
|
||||
return ret, true
|
||||
}
|
||||
|
||||
// Optional extraCommits, if the next bit can be completely
|
||||
// consumed as an integer.
|
||||
if rest[0] != '-' {
|
||||
|
||||
+7
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package distro reports which distro we're running on.
|
||||
@@ -19,6 +19,7 @@ type Distro string
|
||||
|
||||
const (
|
||||
Debian = Distro("debian")
|
||||
Crostini = Distro("crostini") // ChromeOS Crostini Linux container; Debian-based
|
||||
Arch = Distro("arch")
|
||||
Synology = Distro("synology")
|
||||
OpenWrt = Distro("openwrt")
|
||||
@@ -84,6 +85,11 @@ func linuxDistro() Distro {
|
||||
// Currently supported product families:
|
||||
// - UDM (UniFi Dream Machine, UDM-Pro)
|
||||
return UBNT
|
||||
case have("/opt/google/cros-containers/bin/garcon"):
|
||||
// ChromeOS Crostini ships /opt/google/cros-containers/bin/garcon
|
||||
// in every penguin container. MUST be checked before Debian since
|
||||
// Crostini is Debian-based.
|
||||
return Crostini
|
||||
case have("/etc/debian_version"):
|
||||
return Debian
|
||||
case have("/etc/arch-release"):
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package version
|
||||
|
||||
+9
-2
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package version
|
||||
@@ -24,7 +24,14 @@ var stringLazy = sync.OnceValue(func() string {
|
||||
if extraGitCommitStamp != "" {
|
||||
fmt.Fprintf(&ret, " other commit: %s\n", extraGitCommitStamp)
|
||||
}
|
||||
fmt.Fprintf(&ret, " go version: %s\n", runtime.Version())
|
||||
if tsGoRev := tailscaleToolchainRev(); tsGoRev != "" {
|
||||
if len(tsGoRev) > 10 {
|
||||
tsGoRev = tsGoRev[:10]
|
||||
}
|
||||
fmt.Fprintf(&ret, " go version: %s (tailscale/go %s)\n", runtime.Version(), tsGoRev)
|
||||
} else {
|
||||
fmt.Fprintf(&ret, " go version: %s\n", runtime.Version())
|
||||
}
|
||||
return strings.TrimSpace(ret.String())
|
||||
})
|
||||
|
||||
|
||||
+91
-18
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
package version
|
||||
@@ -15,6 +15,22 @@ import (
|
||||
"tailscale.com/types/lazy"
|
||||
)
|
||||
|
||||
// AppIdentifierFn, if non-nil, is a callback function that returns the
|
||||
// application identifier of the running process or an empty string if unknown.
|
||||
//
|
||||
// tailscale(d) implementations can set an explicit callback to return an identifier
|
||||
// for the running process if such a concept exists. The Apple bundle identifier, for example.
|
||||
var AppIdentifierFn func() string // or nil
|
||||
|
||||
const (
|
||||
macsysBundleID = "io.tailscale.ipn.macsys" // The macsys gui app and CLI
|
||||
appStoreBundleID = "io.tailscale.ipn.macos" // The App Store gui app and CLI
|
||||
macsysExtBundleId = "io.tailscale.ipn.macsys.network-extension" // The macsys system extension
|
||||
appStoreExtBundleId = "io.tailscale.ipn.macos.network-extension" // The App Store network extension
|
||||
tvOSExtBundleId = "io.tailscale.ipn.ios.network-extension-tvos" // The tvOS network extension
|
||||
iOSExtBundleId = "io.tailscale.ipn.ios.network-extension" // The iOS network extension
|
||||
)
|
||||
|
||||
// IsMobile reports whether this is a mobile client build.
|
||||
func IsMobile() bool {
|
||||
return runtime.GOOS == "android" || runtime.GOOS == "ios"
|
||||
@@ -52,8 +68,8 @@ func IsMacGUIVariant() bool {
|
||||
|
||||
// IsSandboxedMacOS reports whether this process is a sandboxed macOS
|
||||
// process (either the app or the extension). It is true for the Mac App Store
|
||||
// and macsys (System Extension) version on macOS, and false for
|
||||
// tailscaled-on-macOS.
|
||||
// and macsys (only its System Extension) variants on macOS, and false for
|
||||
// tailscaled and the macsys GUI process on macOS.
|
||||
func IsSandboxedMacOS() bool {
|
||||
return IsMacAppStore() || IsMacSysExt()
|
||||
}
|
||||
@@ -73,10 +89,15 @@ func IsMacSysGUI() bool {
|
||||
if runtime.GOOS != "darwin" {
|
||||
return false
|
||||
}
|
||||
|
||||
return isMacSysApp.Get(func() bool {
|
||||
if AppIdentifierFn != nil {
|
||||
return AppIdentifierFn() == macsysBundleID
|
||||
}
|
||||
|
||||
// TODO (barnstar): This check should be redundant once all relevant callers
|
||||
// use AppIdentifierFn.
|
||||
return strings.Contains(os.Getenv("HOME"), "/Containers/io.tailscale.ipn.macsys/") ||
|
||||
strings.Contains(os.Getenv("XPC_SERVICE_NAME"), "io.tailscale.ipn.macsys")
|
||||
strings.Contains(os.Getenv("XPC_SERVICE_NAME"), macsysBundleID)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -90,11 +111,17 @@ func IsMacSysExt() bool {
|
||||
return false
|
||||
}
|
||||
return isMacSysExt.Get(func() bool {
|
||||
if AppIdentifierFn != nil {
|
||||
return AppIdentifierFn() == macsysExtBundleId
|
||||
}
|
||||
|
||||
// TODO (barnstar): This check should be redundant once all relevant callers
|
||||
// use AppIdentifierFn.
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
return filepath.Base(exe) == "io.tailscale.ipn.macsys.network-extension"
|
||||
return filepath.Base(exe) == macsysExtBundleId
|
||||
})
|
||||
}
|
||||
|
||||
@@ -107,11 +134,17 @@ func IsMacAppStore() bool {
|
||||
return false
|
||||
}
|
||||
return isMacAppStore.Get(func() bool {
|
||||
if AppIdentifierFn != nil {
|
||||
id := AppIdentifierFn()
|
||||
return id == appStoreBundleID || id == appStoreExtBundleId
|
||||
}
|
||||
// TODO (barnstar): This check should be redundant once all relevant callers
|
||||
// use AppIdentifierFn.
|
||||
// Both macsys and app store versions can run CLI executable with
|
||||
// suffix /Contents/MacOS/Tailscale. Check $HOME to filter out running
|
||||
// as macsys.
|
||||
return strings.Contains(os.Getenv("HOME"), "/Containers/io.tailscale.ipn.macos/") ||
|
||||
strings.Contains(os.Getenv("XPC_SERVICE_NAME"), "io.tailscale.ipn.macos")
|
||||
strings.Contains(os.Getenv("XPC_SERVICE_NAME"), appStoreBundleID)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -124,6 +157,11 @@ func IsMacAppStoreGUI() bool {
|
||||
return false
|
||||
}
|
||||
return isMacAppStoreGUI.Get(func() bool {
|
||||
if AppIdentifierFn != nil {
|
||||
return AppIdentifierFn() == appStoreBundleID
|
||||
}
|
||||
// TODO (barnstar): This check should be redundant once all relevant callers
|
||||
// use AppIdentifierFn.
|
||||
exe, err := os.Executable()
|
||||
if err != nil {
|
||||
return false
|
||||
@@ -143,7 +181,13 @@ func IsAppleTV() bool {
|
||||
return false
|
||||
}
|
||||
return isAppleTV.Get(func() bool {
|
||||
return strings.EqualFold(os.Getenv("XPC_SERVICE_NAME"), "io.tailscale.ipn.ios.network-extension-tvos")
|
||||
if AppIdentifierFn != nil {
|
||||
return AppIdentifierFn() == tvOSExtBundleId
|
||||
}
|
||||
|
||||
// TODO (barnstar): This check should be redundant once all relevant callers
|
||||
// use AppIdentifierFn.
|
||||
return strings.EqualFold(os.Getenv("XPC_SERVICE_NAME"), tvOSExtBundleId)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -187,6 +231,23 @@ func IsUnstableBuild() bool {
|
||||
})
|
||||
}
|
||||
|
||||
// osVariant returns the OS variant string for systems where we support
|
||||
// multiple ways of running tailscale(d), if any.
|
||||
//
|
||||
// For example: "appstore", "macsys", "darwin".
|
||||
func osVariant() string {
|
||||
if IsMacAppStore() {
|
||||
return "appstore"
|
||||
}
|
||||
if IsMacSys() {
|
||||
return "macsys"
|
||||
}
|
||||
if runtime.GOOS == "darwin" {
|
||||
return "darwin"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var isDev = sync.OnceValue(func() bool {
|
||||
return strings.Contains(Short(), "-dev")
|
||||
})
|
||||
@@ -227,6 +288,11 @@ type Meta struct {
|
||||
// setting "vcs.modified" was true).
|
||||
GitDirty bool `json:"gitDirty,omitempty"`
|
||||
|
||||
// OSVariant is specific variant of the binary, if applicable. For example,
|
||||
// macsys/appstore/darwin for macOS builds. Nil/empty where not supported
|
||||
// or on oses without variants.
|
||||
OSVariant string `json:"osVariant,omitempty"`
|
||||
|
||||
// ExtraGitCommit, if non-empty, is the git commit of a "supplemental"
|
||||
// repository at which Tailscale was built. Its format is the same as
|
||||
// gitCommit.
|
||||
@@ -246,6 +312,11 @@ type Meta struct {
|
||||
// GitCommitTime is the commit time of the git commit in GitCommit.
|
||||
GitCommitTime string `json:"gitCommitTime,omitempty"`
|
||||
|
||||
// TailscaleGoGitHash is the git commit hash from
|
||||
// https://github.com/tailscale/go used to build this binary, if built
|
||||
// with the Tailscale Go toolchain. Otherwise it is empty.
|
||||
TailscaleGoGitHash string `json:"tailscaleGoGitHash,omitempty"`
|
||||
|
||||
// Cap is the current Tailscale capability version. It's a monotonically
|
||||
// incrementing integer that's incremented whenever a new capability is
|
||||
// added.
|
||||
@@ -258,16 +329,18 @@ var getMeta lazy.SyncValue[Meta]
|
||||
func GetMeta() Meta {
|
||||
return getMeta.Get(func() Meta {
|
||||
return Meta{
|
||||
MajorMinorPatch: majorMinorPatch(),
|
||||
Short: Short(),
|
||||
Long: Long(),
|
||||
GitCommitTime: getEmbeddedInfo().commitTime,
|
||||
GitCommit: gitCommit(),
|
||||
GitDirty: gitDirty(),
|
||||
ExtraGitCommit: extraGitCommitStamp,
|
||||
IsDev: isDev(),
|
||||
UnstableBranch: IsUnstableBuild(),
|
||||
Cap: int(tailcfg.CurrentCapabilityVersion),
|
||||
MajorMinorPatch: majorMinorPatch(),
|
||||
Short: Short(),
|
||||
Long: Long(),
|
||||
GitCommitTime: getEmbeddedInfo().commitTime,
|
||||
GitCommit: gitCommit(),
|
||||
GitDirty: gitDirty(),
|
||||
OSVariant: osVariant(),
|
||||
ExtraGitCommit: extraGitCommitStamp,
|
||||
IsDev: isDev(),
|
||||
UnstableBranch: IsUnstableBuild(),
|
||||
TailscaleGoGitHash: tailscaleToolchainRev(),
|
||||
Cap: int(tailcfg.CurrentCapabilityVersion),
|
||||
}
|
||||
})
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build race
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build !race
|
||||
|
||||
+38
-5
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
// Package version provides the version that the binary was built at.
|
||||
@@ -67,8 +67,10 @@ var long lazy.SyncValue[string]
|
||||
// builds by Tailscale (these are not distributed).
|
||||
// - "x.y.z-changecount-commithash" for untagged release branch builds
|
||||
// built with build_dist.sh
|
||||
// - "x.y.z-devYYYYMMDD-commithash{,-dirty}" for builds made with plain "go
|
||||
// build" or "go install"
|
||||
// - "x.y.z-devYYYYMMDD-tcommithash{,-dirty}" for builds of tailscale.com
|
||||
// made with plain "go build" or "go install", or
|
||||
// "x.y.z-devYYYYMMDD-gcommithash{,-dirty}" for such builds of a repo
|
||||
// that imports tailscale.com
|
||||
// - "x.y.z-ERR-BuildInfo" for builds made by plain "go run"
|
||||
func Long() string {
|
||||
return long.Get(func() string {
|
||||
@@ -79,7 +81,16 @@ func Long() string {
|
||||
if !bi.valid {
|
||||
return strings.TrimSpace(tailscaleroot.VersionDotTxt) + "-ERR-BuildInfo"
|
||||
}
|
||||
return fmt.Sprintf("%s-dev%s-t%s%s", strings.TrimSpace(tailscaleroot.VersionDotTxt), bi.commitDate, bi.commitAbbrev(), dirtyString())
|
||||
// The Go tool's embedded VCS info describes the main module's
|
||||
// repo. By convention (matching mkversion's stamped versions),
|
||||
// "t" always prefixes a tailscale.com commit and "g" a commit of
|
||||
// some other repo that imports tailscale.com, such as Tailscale's
|
||||
// proprietary repo.
|
||||
hashPrefix := "t"
|
||||
if bi.mainModule != "tailscale.com" {
|
||||
hashPrefix = "g"
|
||||
}
|
||||
return fmt.Sprintf("%s-dev%s-%s%s%s", strings.TrimSpace(tailscaleroot.VersionDotTxt), bi.commitDate, hashPrefix, bi.commitAbbrev(), dirtyString())
|
||||
})
|
||||
}
|
||||
|
||||
@@ -105,6 +116,7 @@ func Short() string {
|
||||
|
||||
type embeddedInfo struct {
|
||||
valid bool
|
||||
mainModule string // module path of the main module, e.g. "tailscale.com"
|
||||
commit string
|
||||
commitDate string
|
||||
commitTime string
|
||||
@@ -123,7 +135,7 @@ var getEmbeddedInfo = sync.OnceValue(func() embeddedInfo {
|
||||
if !ok {
|
||||
return embeddedInfo{}
|
||||
}
|
||||
ret := embeddedInfo{valid: true}
|
||||
ret := embeddedInfo{valid: true, mainModule: bi.Main.Path}
|
||||
for _, s := range bi.Settings {
|
||||
switch s.Key {
|
||||
case "vcs.revision":
|
||||
@@ -146,6 +158,23 @@ var getEmbeddedInfo = sync.OnceValue(func() embeddedInfo {
|
||||
return ret
|
||||
})
|
||||
|
||||
// tailscaleToolchainRev returns the git hash of the Tailscale Go toolchain
|
||||
// used to build this binary, if any. It is read separately from getEmbeddedInfo
|
||||
// because that function discards build info when VCS fields are missing (e.g.
|
||||
// in test binaries), but the toolchain rev is still present.
|
||||
var tailscaleToolchainRev = sync.OnceValue(func() string {
|
||||
bi, ok := debug.ReadBuildInfo()
|
||||
if !ok {
|
||||
return ""
|
||||
}
|
||||
for _, s := range bi.Settings {
|
||||
if s.Key == "tailscale.toolchain.rev" {
|
||||
return s.Value
|
||||
}
|
||||
}
|
||||
return ""
|
||||
})
|
||||
|
||||
func gitCommit() string {
|
||||
if gitCommitStamp != "" {
|
||||
return gitCommitStamp
|
||||
@@ -172,6 +201,10 @@ func majorMinorPatch() string {
|
||||
return ret
|
||||
}
|
||||
|
||||
// IsTailscaleGo reports whether the current binary was built with
|
||||
// Tailscale's custom Go toolchain.
|
||||
func IsTailscaleGo() bool { return isTailscaleGo }
|
||||
|
||||
func isValidLongWithTwoRepos(v string) bool {
|
||||
s := strings.Split(v, "-")
|
||||
if len(s) != 3 {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
// Copyright (c) Tailscale Inc & AUTHORS
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build tailscale_go && android
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build !tailscale_go
|
||||
|
||||
package version
|
||||
|
||||
const isTailscaleGo = false
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
// Copyright (c) Tailscale Inc & contributors
|
||||
// SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
//go:build tailscale_go
|
||||
|
||||
package version
|
||||
|
||||
const isTailscaleGo = true
|
||||
Reference in new issue
Block a user