add system utils

This commit is contained in:
kenneth 2022-05-10 15:15:42 +08:00
parent 4e5d76af37
commit 68842a39b8
2 changed files with 125 additions and 0 deletions

69
pkg/system/os.go Normal file
View File

@ -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
}

56
pkg/system/os_test.go Normal file
View File

@ -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)
}
}