2023-03-15 09:56:11 +00:00
|
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
2023-03-17 13:00:02 +00:00
|
|
|
"bytes"
|
2023-03-15 09:56:11 +00:00
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
2023-03-17 13:48:23 +00:00
|
|
|
"os/signal"
|
2023-03-17 13:00:02 +00:00
|
|
|
"strings"
|
2023-03-17 07:16:09 +00:00
|
|
|
|
|
|
|
"github.com/denisbrodbeck/machineid"
|
|
|
|
"github.com/joho/godotenv"
|
2023-03-15 09:56:11 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func SH(c string) (string, error) {
|
|
|
|
cmd := exec.Command("/bin/sh", "-c", c)
|
|
|
|
cmd.Env = os.Environ()
|
|
|
|
o, err := cmd.CombinedOutput()
|
|
|
|
return string(o), err
|
|
|
|
}
|
|
|
|
|
2023-03-17 07:16:09 +00:00
|
|
|
func SHInDir(c, dir string, envs ...string) (string, error) {
|
2023-03-15 09:56:11 +00:00
|
|
|
cmd := exec.Command("/bin/sh", "-c", c)
|
2023-03-17 07:16:09 +00:00
|
|
|
cmd.Env = append(os.Environ(), envs...)
|
2023-03-15 09:56:11 +00:00
|
|
|
cmd.Dir = dir
|
|
|
|
o, err := cmd.CombinedOutput()
|
|
|
|
return string(o), err
|
|
|
|
}
|
|
|
|
|
|
|
|
func Exists(path string) bool {
|
|
|
|
_, err := os.Stat(path)
|
|
|
|
|
|
|
|
return !os.IsNotExist(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UUID TODO: move this into a machine submodule
|
|
|
|
func UUID() string {
|
|
|
|
if os.Getenv("UUID") != "" {
|
|
|
|
return os.Getenv("UUID")
|
|
|
|
}
|
|
|
|
id, _ := machineid.ID()
|
|
|
|
hostname, _ := os.Hostname()
|
|
|
|
return fmt.Sprintf("%s-%s", id, hostname)
|
|
|
|
}
|
|
|
|
|
|
|
|
func OSRelease(key string) (string, error) {
|
|
|
|
release, err := godotenv.Read("/etc/os-release")
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
v, exists := release[key]
|
|
|
|
if !exists {
|
|
|
|
return "", fmt.Errorf("key not found")
|
|
|
|
}
|
|
|
|
return v, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func FindCommand(def string, options []string) string {
|
|
|
|
for _, p := range options {
|
|
|
|
path, err := exec.LookPath(p)
|
|
|
|
if err == nil {
|
|
|
|
return path
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Otherwise return default
|
|
|
|
return def
|
|
|
|
}
|
2023-03-17 13:00:02 +00:00
|
|
|
|
|
|
|
func K3sBin() string {
|
|
|
|
for _, p := range []string{"/usr/bin/k3s", "/usr/local/bin/k3s"} {
|
|
|
|
if _, err := os.Stat(p); err == nil {
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
func WriteEnv(envFile string, config map[string]string) error {
|
|
|
|
content, _ := os.ReadFile(envFile)
|
|
|
|
env, _ := godotenv.Unmarshal(string(content))
|
|
|
|
|
|
|
|
for key, val := range config {
|
|
|
|
env[key] = val
|
|
|
|
}
|
|
|
|
|
|
|
|
return godotenv.Write(env, envFile)
|
|
|
|
}
|
|
|
|
|
|
|
|
func Flavor() string {
|
|
|
|
release, _ := godotenv.Read("/etc/os-release")
|
|
|
|
v := release["NAME"]
|
|
|
|
return strings.ReplaceAll(v, "kairos-", "")
|
|
|
|
}
|
|
|
|
|
|
|
|
func IsOpenRCBased() bool {
|
|
|
|
f := Flavor()
|
|
|
|
return strings.Contains(f, "alpine")
|
|
|
|
}
|
|
|
|
|
|
|
|
func ShellSTDIN(s, c string) (string, error) {
|
|
|
|
cmd := exec.Command("/bin/sh", "-c", c)
|
|
|
|
cmd.Stdout = os.Stdout
|
|
|
|
cmd.Stderr = os.Stderr
|
|
|
|
cmd.Stdin = bytes.NewBuffer([]byte(s))
|
|
|
|
o, err := cmd.CombinedOutput()
|
|
|
|
return string(o), err
|
|
|
|
}
|
2023-03-17 13:45:04 +00:00
|
|
|
|
|
|
|
func SetEnv(env []string) {
|
|
|
|
for _, e := range env {
|
|
|
|
pair := strings.SplitN(e, "=", 2)
|
|
|
|
if len(pair) >= 2 {
|
|
|
|
os.Setenv(pair[0], pair[1])
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2023-03-17 13:48:23 +00:00
|
|
|
|
|
|
|
func OnSignal(fn func(), sig ...os.Signal) {
|
|
|
|
sigs := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(sigs, sig...)
|
|
|
|
go func() {
|
|
|
|
<-sigs
|
|
|
|
fn()
|
|
|
|
}()
|
|
|
|
}
|