|
@@ -9,13 +9,11 @@ package controlclient
|
|
|
import (
|
|
import (
|
|
|
"bytes"
|
|
"bytes"
|
|
|
"fmt"
|
|
"fmt"
|
|
|
- "io"
|
|
|
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
|
- "os"
|
|
|
|
|
"strings"
|
|
"strings"
|
|
|
"syscall"
|
|
"syscall"
|
|
|
|
|
|
|
|
- "go4.org/mem"
|
|
|
|
|
|
|
+ "tailscale.com/hostinfo"
|
|
|
"tailscale.com/util/lineread"
|
|
"tailscale.com/util/lineread"
|
|
|
"tailscale.com/version/distro"
|
|
"tailscale.com/version/distro"
|
|
|
)
|
|
)
|
|
@@ -56,20 +54,11 @@ func osVersionLinux() string {
|
|
|
}
|
|
}
|
|
|
attrBuf.WriteByte(byte(b))
|
|
attrBuf.WriteByte(byte(b))
|
|
|
}
|
|
}
|
|
|
- if inContainer() {
|
|
|
|
|
|
|
+ if hostinfo.InContainer() {
|
|
|
attrBuf.WriteString("; container")
|
|
attrBuf.WriteString("; container")
|
|
|
}
|
|
}
|
|
|
- if inKnative() {
|
|
|
|
|
- attrBuf.WriteString("; env=kn")
|
|
|
|
|
- }
|
|
|
|
|
- if inAWSLambda() {
|
|
|
|
|
- attrBuf.WriteString("; env=lm")
|
|
|
|
|
- }
|
|
|
|
|
- if inHerokuDyno() {
|
|
|
|
|
- attrBuf.WriteString("; env=hr")
|
|
|
|
|
- }
|
|
|
|
|
- if inAzureAppService() {
|
|
|
|
|
- attrBuf.WriteString("; env=az")
|
|
|
|
|
|
|
+ if env := hostinfo.GetEnvType(); env != "" {
|
|
|
|
|
+ fmt.Fprintf(&attrBuf, "; env=%s", env)
|
|
|
}
|
|
}
|
|
|
attr := attrBuf.String()
|
|
attr := attrBuf.String()
|
|
|
|
|
|
|
@@ -102,58 +91,3 @@ func osVersionLinux() string {
|
|
|
}
|
|
}
|
|
|
return fmt.Sprintf("Other%s", attr)
|
|
return fmt.Sprintf("Other%s", attr)
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
-func inContainer() (ret bool) {
|
|
|
|
|
- lineread.File("/proc/1/cgroup", func(line []byte) error {
|
|
|
|
|
- if mem.Contains(mem.B(line), mem.S("/docker/")) ||
|
|
|
|
|
- mem.Contains(mem.B(line), mem.S("/lxc/")) {
|
|
|
|
|
- ret = true
|
|
|
|
|
- return io.EOF // arbitrary non-nil error to stop loop
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
- })
|
|
|
|
|
- lineread.File("/proc/mounts", func(line []byte) error {
|
|
|
|
|
- if mem.Contains(mem.B(line), mem.S("fuse.lxcfs")) {
|
|
|
|
|
- ret = true
|
|
|
|
|
- return io.EOF
|
|
|
|
|
- }
|
|
|
|
|
- return nil
|
|
|
|
|
- })
|
|
|
|
|
- return
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func inKnative() bool {
|
|
|
|
|
- // https://cloud.google.com/run/docs/reference/container-contract#env-vars
|
|
|
|
|
- if os.Getenv("K_REVISION") != "" && os.Getenv("K_CONFIGURATION") != "" &&
|
|
|
|
|
- os.Getenv("K_SERVICE") != "" && os.Getenv("PORT") != "" {
|
|
|
|
|
- return true
|
|
|
|
|
- }
|
|
|
|
|
- return false
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func inAWSLambda() bool {
|
|
|
|
|
- // https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html
|
|
|
|
|
- if os.Getenv("AWS_LAMBDA_FUNCTION_NAME") != "" &&
|
|
|
|
|
- os.Getenv("AWS_LAMBDA_FUNCTION_VERSION") != "" &&
|
|
|
|
|
- os.Getenv("AWS_LAMBDA_INITIALIZATION_TYPE") != "" &&
|
|
|
|
|
- os.Getenv("AWS_LAMBDA_RUNTIME_API") != "" {
|
|
|
|
|
- return true
|
|
|
|
|
- }
|
|
|
|
|
- return false
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func inHerokuDyno() bool {
|
|
|
|
|
- // https://devcenter.heroku.com/articles/dynos#local-environment-variables
|
|
|
|
|
- if os.Getenv("PORT") != "" && os.Getenv("DYNO") != "" {
|
|
|
|
|
- return true
|
|
|
|
|
- }
|
|
|
|
|
- return false
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-func inAzureAppService() bool {
|
|
|
|
|
- if os.Getenv("APPSVC_RUN_ZIP") != "" && os.Getenv("WEBSITE_STACK") != "" &&
|
|
|
|
|
- os.Getenv("WEBSITE_AUTH_AUTO_AAD") != "" {
|
|
|
|
|
- return true
|
|
|
|
|
- }
|
|
|
|
|
- return false
|
|
|
|
|
-}
|
|
|