diff --git a/pkg/system/os.go b/pkg/system/os.go new file mode 100644 index 0000000..a87aed5 --- /dev/null +++ b/pkg/system/os.go @@ -0,0 +1,69 @@ +// Package system 包含一些关于操作系统、运行时间、shell命令的功能 +package system + +import ( + "bytes" + "os" + "os/exec" + "runtime" +) + +// IsWindows 检查当前操作系统是否为Windows +func IsWindows() bool { + return runtime.GOOS == "windows" +} + +// IsLinux 检查当前操作系统是否为Linux +func IsLinux() bool { + return runtime.GOOS == "linux" +} + +// IsMac 检查当前操作系统是否为Macos +func IsMac() bool { + return runtime.GOOS == "darwin" +} + +// GetOsEnv 获取由键命名的环境变量的值 +func GetOsEnv(key string) string { + return os.Getenv(key) +} + +// SetOsEnv 设置由键命名的环境变量的值 +func SetOsEnv(key, value string) error { + return os.Setenv(key, value) +} + +// RemoveOsEnv 删除一个环境变量 +func RemoveOsEnv(key string) error { + return os.Unsetenv(key) +} + +// CompareOsEnv 获取由键值命名的环境,并将其与compareEnv进行比较 +func CompareOsEnv(key, comparedEnv string) bool { + env := GetOsEnv(key) + if env == "" { + return false + } + return env == comparedEnv +} + +// ExecCommand 使用shell /bin/bash -c来执行命令 +func ExecCommand(command string) (stdout, stderr string, err error) { + var out bytes.Buffer + var errout bytes.Buffer + + cmd := exec.Command("/bin/bash", "-c", command) + if IsWindows() { + cmd = exec.Command("cmd") + } + cmd.Stdout = &out + cmd.Stderr = &errout + err = cmd.Run() + + if err != nil { + stderr = string(errout.Bytes()) + } + stdout = string(out.Bytes()) + + return +} diff --git a/pkg/system/os_test.go b/pkg/system/os_test.go new file mode 100644 index 0000000..986a8b6 --- /dev/null +++ b/pkg/system/os_test.go @@ -0,0 +1,56 @@ +package system + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestOsDetection(t *testing.T) { + osType, _, _ := ExecCommand("echo $OSTYPE") + if strings.Index(osType, "linux") != -1 { + require.Equal(t, true, IsLinux()) + } + if strings.Index(osType, "darwin") != -1 { + require.Equal(t, true, IsMac()) + } +} + +func TestOsEnvOperation(t *testing.T) { + envNotExist := GetOsEnv("foo") + require.Equal(t, "", envNotExist) + + SetOsEnv("foo", "foo_value") + envExist := GetOsEnv("foo") + require.Equal(t, "foo_value", envExist) + + require.Equal(t, true, CompareOsEnv("foo", "foo_value")) + require.Equal(t, false, CompareOsEnv("foo", "abc")) + require.Equal(t, false, CompareOsEnv("abc", "abc")) + require.Equal(t, false, CompareOsEnv("abc", "abc")) + + err := RemoveOsEnv("foo") + if err != nil { + t.Fail() + } + require.Equal(t, false, CompareOsEnv("foo", "foo_value")) +} + +func TestExecCommand(t *testing.T) { + out, errout, err := ExecCommand("ls") + t.Log("std out: ", out) + t.Log("std err: ", errout) + require.Nil(t, err) + + out, errout, err = ExecCommand("abc") + t.Log("std out: ", out) + t.Log("std err: ", errout) + if err != nil { + t.Logf("error: %v\n", err) + } + + if !IsWindows() { + require.NotNil(t, err) + } +}