Add test function to determine if Gordon is running inside a container
- commit
- c94ff7b4a46b66e3a490745775264c6760d16620
- author
- bnema · · 2023-11-03 08:39 UTC
- parent
- 1b3e6c2
- signature
- unsigned
4 files · +80 -5
M cmd/cli/main.go +9 -0
| @@ -8,6 +8,7 @@ import ( | |||
| 8 | 8 | "github.com/bnema/gordon/internal/cli/cmd" | |
| 9 | 9 | "github.com/bnema/gordon/internal/common" | |
| 10 | 10 | "github.com/bnema/gordon/internal/server" | |
| 11 | + | "github.com/bnema/gordon/pkg/docker" | |
| 11 | 12 | "github.com/spf13/cobra" | |
| 12 | 13 | ) | |
| 13 | 14 | ||
| @@ -44,5 +45,13 @@ func main() { | |||
| 44 | 45 | // Set the BuildVersion | |
| 45 | 46 | s.Config.Build.BuildVersion = build | |
| 46 | 47 | ||
| 48 | + | inContainer, err := docker.IsRunningInContainer() | |
| 49 | + | if err != nil { | |
| 50 | + | fmt.Printf("Error checking if running in a container: %s\n", err) | |
| 51 | + | } else if inContainer { | |
| 52 | + | fmt.Println("Running inside a container.") | |
| 53 | + | } else { | |
| 54 | + | fmt.Println("Not running inside a container.") | |
| 55 | + | } | |
| 47 | 56 | Execute(a, s) | |
| 48 | 57 | } | |
| @@ -8,6 +8,7 @@ import ( | |||||
| 8 | "github.com/bnema/gordon/internal/cli/cmd" | 8 | "github.com/bnema/gordon/internal/cli/cmd" | ||
| 9 | "github.com/bnema/gordon/internal/common" | 9 | "github.com/bnema/gordon/internal/common" | ||
| 10 | "github.com/bnema/gordon/internal/server" | 10 | "github.com/bnema/gordon/internal/server" | ||
| 11 | + | "github.com/bnema/gordon/pkg/docker" | |||
| 11 | "github.com/spf13/cobra" | 12 | "github.com/spf13/cobra" | ||
| 12 | ) | 13 | ) | ||
| 13 | 14 | ||||
| @@ -44,5 +45,13 @@ func main() { | |||||
| 44 | // Set the BuildVersion | 45 | // Set the BuildVersion | ||
| 45 | s.Config.Build.BuildVersion = build | 46 | s.Config.Build.BuildVersion = build | ||
| 46 | 47 | ||||
| 48 | + | inContainer, err := docker.IsRunningInContainer() | |||
| 49 | + | if err != nil { | |||
| 50 | + | fmt.Printf("Error checking if running in a container: %s\n", err) | |||
| 51 | + | } else if inContainer { | |||
| 52 | + | fmt.Println("Running inside a container.") | |||
| 53 | + | } else { | |||
| 54 | + | fmt.Println("Not running inside a container.") | |||
| 55 | + | } | |||
| 47 | Execute(a, s) | 56 | Execute(a, s) | ||
| 48 | } | 57 | } | ||
M internal/common/initconfig.go +5 -5
| @@ -165,12 +165,12 @@ func (config *Config) GetToken() (string, error) { | |||
| 165 | 165 | ||
| 166 | 166 | } | |
| 167 | 167 | ||
| 168 | - | // GetBuildVersion returns the build version | |
| 169 | - | func (config *BuildConfig) GetBuildVersion() string { | |
| 170 | - | return config.BuildVersion | |
| 171 | - | } | |
| 172 | - | ||
| 173 | 168 | // GetRunEnv returns the run environment | |
| 174 | 169 | func (config *BuildConfig) GetRunEnv() string { | |
| 175 | 170 | return config.RunEnv | |
| 176 | 171 | } | |
| 172 | + | ||
| 173 | + | // GetVersion returns the version | |
| 174 | + | func (config *Config) GetVersion() string { | |
| 175 | + | return config.Build.BuildVersion | |
| 176 | + | } | |
| @@ -165,12 +165,12 @@ func (config *Config) GetToken() (string, error) { | |||||
| 165 | 165 | ||||
| 166 | } | 166 | } | ||
| 167 | 167 | ||||
| 168 | - | // GetBuildVersion returns the build version | |||
| 169 | - | func (config *BuildConfig) GetBuildVersion() string { | |||
| 170 | - | return config.BuildVersion | |||
| 171 | - | } | |||
| 172 | - | ||||
| 173 | // GetRunEnv returns the run environment | 168 | // GetRunEnv returns the run environment | ||
| 174 | func (config *BuildConfig) GetRunEnv() string { | 169 | func (config *BuildConfig) GetRunEnv() string { | ||
| 175 | return config.RunEnv | 170 | return config.RunEnv | ||
| 176 | } | 171 | } | ||
| 172 | + | ||||
| 173 | + | // GetVersion returns the version | |||
| 174 | + | func (config *Config) GetVersion() string { | |||
| 175 | + | return config.Build.BuildVersion | |||
| 176 | + | } | |||
A internal/common/version.go +16 -0
| @@ -0,0 +1,16 @@ | |||
| 1 | + | package common | |
| 2 | + | ||
| 3 | + | import "time" | |
| 4 | + | ||
| 5 | + | const checkVersionURL = "https://gordon.bnema.dev/version" | |
| 6 | + | ||
| 7 | + | var timer = time.NewTicker(1 * time.Minute) | |
| 8 | + | ||
| 9 | + | type CurrentVersion struct { | |
| 10 | + | isDocker bool | |
| 11 | + | Version string `json:"version"` | |
| 12 | + | Commit string `json:"commit"` | |
| 13 | + | Sha256ID string `json:"sha256id"` | |
| 14 | + | } | |
| 15 | + | ||
| 16 | + | type Response interface{} | |
| @@ -0,0 +1,16 @@ | |||||
| 1 | + | package common | |||
| 2 | + | ||||
| 3 | + | import "time" | |||
| 4 | + | ||||
| 5 | + | const checkVersionURL = "https://gordon.bnema.dev/version" | |||
| 6 | + | ||||
| 7 | + | var timer = time.NewTicker(1 * time.Minute) | |||
| 8 | + | ||||
| 9 | + | type CurrentVersion struct { | |||
| 10 | + | isDocker bool | |||
| 11 | + | Version string `json:"version"` | |||
| 12 | + | Commit string `json:"commit"` | |||
| 13 | + | Sha256ID string `json:"sha256id"` | |||
| 14 | + | } | |||
| 15 | + | ||||
| 16 | + | type Response interface{} | |||
A pkg/docker/detect.go +50 -0
| @@ -0,0 +1,50 @@ | |||
| 1 | + | package docker | |
| 2 | + | ||
| 3 | + | import ( | |
| 4 | + | "bufio" | |
| 5 | + | "os" | |
| 6 | + | "strings" | |
| 7 | + | ) | |
| 8 | + | ||
| 9 | + | func fileExists(filepath string) bool { | |
| 10 | + | _, err := os.Stat(filepath) | |
| 11 | + | return !os.IsNotExist(err) | |
| 12 | + | } | |
| 13 | + | ||
| 14 | + | func checkCgroup() (bool, error) { | |
| 15 | + | // Open the cgroup file for the init process | |
| 16 | + | file, err := os.Open("/proc/1/cgroup") | |
| 17 | + | if err != nil { | |
| 18 | + | return false, err | |
| 19 | + | } | |
| 20 | + | defer file.Close() | |
| 21 | + | ||
| 22 | + | // Scan through the cgroup file looking for docker or kube pod paths | |
| 23 | + | scanner := bufio.NewScanner(file) | |
| 24 | + | for scanner.Scan() { | |
| 25 | + | line := scanner.Text() | |
| 26 | + | if strings.Contains(line, "docker") || strings.Contains(line, "kubepods") { | |
| 27 | + | return true, nil | |
| 28 | + | } | |
| 29 | + | } | |
| 30 | + | if err := scanner.Err(); err != nil { | |
| 31 | + | return false, err | |
| 32 | + | } | |
| 33 | + | ||
| 34 | + | return false, nil | |
| 35 | + | } | |
| 36 | + | ||
| 37 | + | func IsRunningInContainer() (bool, error) { | |
| 38 | + | // Check for .dockerenv file | |
| 39 | + | if fileExists("/.dockerenv") { | |
| 40 | + | return true, nil | |
| 41 | + | } | |
| 42 | + | ||
| 43 | + | // Check cgroup for docker or kube pod paths | |
| 44 | + | inContainer, err := checkCgroup() | |
| 45 | + | if err != nil { | |
| 46 | + | return false, err | |
| 47 | + | } | |
| 48 | + | ||
| 49 | + | return inContainer, nil | |
| 50 | + | } | |
| @@ -0,0 +1,50 @@ | |||||
| 1 | + | package docker | |||
| 2 | + | ||||
| 3 | + | import ( | |||
| 4 | + | "bufio" | |||
| 5 | + | "os" | |||
| 6 | + | "strings" | |||
| 7 | + | ) | |||
| 8 | + | ||||
| 9 | + | func fileExists(filepath string) bool { | |||
| 10 | + | _, err := os.Stat(filepath) | |||
| 11 | + | return !os.IsNotExist(err) | |||
| 12 | + | } | |||
| 13 | + | ||||
| 14 | + | func checkCgroup() (bool, error) { | |||
| 15 | + | // Open the cgroup file for the init process | |||
| 16 | + | file, err := os.Open("/proc/1/cgroup") | |||
| 17 | + | if err != nil { | |||
| 18 | + | return false, err | |||
| 19 | + | } | |||
| 20 | + | defer file.Close() | |||
| 21 | + | ||||
| 22 | + | // Scan through the cgroup file looking for docker or kube pod paths | |||
| 23 | + | scanner := bufio.NewScanner(file) | |||
| 24 | + | for scanner.Scan() { | |||
| 25 | + | line := scanner.Text() | |||
| 26 | + | if strings.Contains(line, "docker") || strings.Contains(line, "kubepods") { | |||
| 27 | + | return true, nil | |||
| 28 | + | } | |||
| 29 | + | } | |||
| 30 | + | if err := scanner.Err(); err != nil { | |||
| 31 | + | return false, err | |||
| 32 | + | } | |||
| 33 | + | ||||
| 34 | + | return false, nil | |||
| 35 | + | } | |||
| 36 | + | ||||
| 37 | + | func IsRunningInContainer() (bool, error) { | |||
| 38 | + | // Check for .dockerenv file | |||
| 39 | + | if fileExists("/.dockerenv") { | |||
| 40 | + | return true, nil | |||
| 41 | + | } | |||
| 42 | + | ||||
| 43 | + | // Check cgroup for docker or kube pod paths | |||
| 44 | + | inContainer, err := checkCgroup() | |||
| 45 | + | if err != nil { | |||
| 46 | + | return false, err | |||
| 47 | + | } | |||
| 48 | + | ||||
| 49 | + | return inContainer, nil | |||
| 50 | + | } | |||