fix(host,linux): Check if path exists and is nonempty before reading host files

This commit is contained in:
shirou 2022-07-15 12:20:19 +00:00
parent 8c479f5153
commit 5610fbc5d5
3 changed files with 43 additions and 5 deletions

View File

@ -179,26 +179,26 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil
lsb = &lsbStruct{}
}
if common.PathExists(common.HostEtc("oracle-release")) {
if common.PathExistsWithContents(common.HostEtc("oracle-release")) {
platform = "oracle"
contents, err := common.ReadLines(common.HostEtc("oracle-release"))
if err == nil {
version = getRedhatishVersion(contents)
}
} else if common.PathExists(common.HostEtc("enterprise-release")) {
} else if common.PathExistsWithContents(common.HostEtc("enterprise-release")) {
platform = "oracle"
contents, err := common.ReadLines(common.HostEtc("enterprise-release"))
if err == nil {
version = getRedhatishVersion(contents)
}
} else if common.PathExists(common.HostEtc("slackware-version")) {
} else if common.PathExistsWithContents(common.HostEtc("slackware-version")) {
platform = "slackware"
contents, err := common.ReadLines(common.HostEtc("slackware-version"))
if err == nil {
version = getSlackwareVersion(contents)
}
} else if common.PathExists(common.HostEtc("debian_version")) {
} else if common.PathExistsWithContents(common.HostEtc("debian_version")) {
if lsb.ID == "Ubuntu" {
platform = "ubuntu"
version = lsb.Release
@ -206,7 +206,7 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil
platform = "linuxmint"
version = lsb.Release
} else {
if common.PathExists("/usr/bin/raspi-config") {
if common.PathExistsWithContents("/usr/bin/raspi-config") {
platform = "raspbian"
} else {
platform = "debian"
@ -279,6 +279,8 @@ func PlatformInformationWithContext(ctx context.Context) (platform string, famil
version = lsb.Release
}
platform = strings.Trim(platform, `"`)
switch platform {
case "debian", "ubuntu", "linuxmint", "raspbian":
family = "debian"

View File

@ -311,6 +311,23 @@ func PathExists(filename string) bool {
return false
}
// PathExistsWithContents returns the filename exists and it is not empty
func PathExistsWithContents(filename string) bool {
if _, err := os.Stat(filename); err != nil {
return false
}
f, err := os.Open(filename)
if err != nil {
return false
}
defer f.Close()
r := bufio.NewReader(f)
_, err = r.Peek(4) // check first 4 bytes
return err == nil
}
// GetEnv retrieves the environment variable key. If it does not exist it returns the default.
func GetEnv(key string, dfault string, combineWith ...string) string {
value := os.Getenv(key)

View File

@ -102,6 +102,25 @@ func TestPathExists(t *testing.T) {
}
}
func TestPathExistsWithContents(t *testing.T) {
if !PathExistsWithContents("common_test.go") {
t.Error("exists but return not exists")
}
if PathExistsWithContents("should_not_exists.go") {
t.Error("not exists but return exists")
}
f, err := os.CreateTemp("", "empty_test.txt")
if err != nil {
t.Errorf("CreateTemp failed, %s", err)
}
defer os.Remove(f.Name()) // clean up
if PathExistsWithContents(f.Name()) {
t.Error("exists but no content file return true")
}
}
func TestHostEtc(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("windows doesn't have etc")