Refactor bee CLI and LiveCD integration
This commit is contained in:
77
audit/internal/runtimeenv/runtimeenv.go
Normal file
77
audit/internal/runtimeenv/runtimeenv.go
Normal file
@@ -0,0 +1,77 @@
|
||||
package runtimeenv
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Mode string
|
||||
|
||||
const (
|
||||
ModeAuto Mode = "auto"
|
||||
ModeLocal Mode = "local"
|
||||
ModeLiveCD Mode = "livecd"
|
||||
)
|
||||
|
||||
type Info struct {
|
||||
Mode Mode
|
||||
Detected bool
|
||||
Reason string
|
||||
}
|
||||
|
||||
func ParseMode(raw string) (Mode, error) {
|
||||
mode := Mode(strings.TrimSpace(strings.ToLower(raw)))
|
||||
switch mode {
|
||||
case "", ModeAuto:
|
||||
return ModeAuto, nil
|
||||
case ModeLocal, ModeLiveCD:
|
||||
return mode, nil
|
||||
default:
|
||||
return "", fmt.Errorf("invalid runtime %q — use auto, local, or livecd", raw)
|
||||
}
|
||||
}
|
||||
|
||||
func Detect(flagValue string) (Info, error) {
|
||||
flagMode, err := ParseMode(flagValue)
|
||||
if err != nil {
|
||||
return Info{}, err
|
||||
}
|
||||
if flagMode != ModeAuto {
|
||||
return Info{Mode: flagMode, Reason: "flag"}, nil
|
||||
}
|
||||
|
||||
if envMode, ok := getenvMode("BEE_RUNTIME"); ok {
|
||||
return Info{Mode: envMode, Reason: "env:BEE_RUNTIME"}, nil
|
||||
}
|
||||
|
||||
if fileExists("/etc/bee-release") {
|
||||
return Info{Mode: ModeLiveCD, Detected: true, Reason: "marker:/etc/bee-release"}, nil
|
||||
}
|
||||
|
||||
if data, err := os.ReadFile("/proc/cmdline"); err == nil {
|
||||
cmdline := string(data)
|
||||
if strings.Contains(cmdline, " boot=live") || strings.HasPrefix(cmdline, "boot=live ") || strings.Contains(cmdline, "live-media") {
|
||||
return Info{Mode: ModeLiveCD, Detected: true, Reason: "kernel:boot=live"}, nil
|
||||
}
|
||||
}
|
||||
|
||||
return Info{Mode: ModeLocal, Detected: true, Reason: "default:local"}, nil
|
||||
}
|
||||
|
||||
func getenvMode(name string) (Mode, bool) {
|
||||
value := strings.TrimSpace(os.Getenv(name))
|
||||
if value == "" {
|
||||
return "", false
|
||||
}
|
||||
mode, err := ParseMode(value)
|
||||
if err != nil || mode == ModeAuto {
|
||||
return "", false
|
||||
}
|
||||
return mode, true
|
||||
}
|
||||
|
||||
func fileExists(path string) bool {
|
||||
info, err := os.Stat(path)
|
||||
return err == nil && !info.IsDir()
|
||||
}
|
||||
67
audit/internal/runtimeenv/runtimeenv_test.go
Normal file
67
audit/internal/runtimeenv/runtimeenv_test.go
Normal file
@@ -0,0 +1,67 @@
|
||||
package runtimeenv
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestParseMode(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
tests := []struct {
|
||||
in string
|
||||
want Mode
|
||||
ok bool
|
||||
}{
|
||||
{in: "", want: ModeAuto, ok: true},
|
||||
{in: "auto", want: ModeAuto, ok: true},
|
||||
{in: "local", want: ModeLocal, ok: true},
|
||||
{in: "livecd", want: ModeLiveCD, ok: true},
|
||||
{in: "bad", ok: false},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
got, err := ParseMode(test.in)
|
||||
if test.ok && err != nil {
|
||||
t.Fatalf("ParseMode(%q): %v", test.in, err)
|
||||
}
|
||||
if !test.ok && err == nil {
|
||||
t.Fatalf("ParseMode(%q): expected error", test.in)
|
||||
}
|
||||
if test.ok && got != test.want {
|
||||
t.Fatalf("ParseMode(%q): got %q want %q", test.in, got, test.want)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestDetectHonorsFlag(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
info, err := Detect("livecd")
|
||||
if err != nil {
|
||||
t.Fatalf("Detect(flag): %v", err)
|
||||
}
|
||||
if info.Mode != ModeLiveCD || info.Reason != "flag" {
|
||||
t.Fatalf("unexpected info: %+v", info)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDetectHonorsEnv(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
old := os.Getenv("BEE_RUNTIME")
|
||||
t.Cleanup(func() {
|
||||
_ = os.Setenv("BEE_RUNTIME", old)
|
||||
})
|
||||
if err := os.Setenv("BEE_RUNTIME", "local"); err != nil {
|
||||
t.Fatalf("Setenv: %v", err)
|
||||
}
|
||||
|
||||
info, err := Detect("auto")
|
||||
if err != nil {
|
||||
t.Fatalf("Detect(env): %v", err)
|
||||
}
|
||||
if info.Mode != ModeLocal || info.Reason != "env:BEE_RUNTIME" {
|
||||
t.Fatalf("unexpected info: %+v", info)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user