Skip to content

Commit

Permalink
Merge pull request #633 from twpayne/allow-kernel-fail
Browse files Browse the repository at this point in the history
Make reading /proc/sys/kernel more tolerant of errors
  • Loading branch information
twpayne committed Mar 21, 2020
2 parents d289303 + 74297e8 commit d0ab459
Show file tree
Hide file tree
Showing 3 changed files with 73 additions and 38 deletions.
3 changes: 2 additions & 1 deletion cmd/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,9 +358,10 @@ func (c *Config) getDefaultData() (map[string]interface{}, error) {
kernelInfo, err := getKernelInfo(c.fs)
if err == nil && kernelInfo != nil {
data["kernel"] = kernelInfo
} else if err != nil && !os.IsNotExist(err) {
} else if err != nil {
return nil, err
}

return data, nil
}

Expand Down
47 changes: 24 additions & 23 deletions cmd/data_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package cmd

import (
"bufio"
"bytes"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strconv"
Expand All @@ -15,35 +15,36 @@ import (
)

func getKernelInfo(fs vfs.FS) (map[string]string, error) {
const procKernel = "/proc/sys/kernel"
files := []string{"version", "ostype", "osrelease"}
const procSysKernel = "/proc/sys/kernel"

stat, err := fs.Stat(procKernel)
if err != nil {
return nil, err
}
if !stat.IsDir() {
return nil, fmt.Errorf("expected %q to be a directory", procKernel)
info, err := fs.Stat(procSysKernel)
switch {
case os.IsNotExist(err):
return nil, nil
case os.IsPermission(err):
return nil, nil
case !info.Mode().IsDir():
return nil, nil
}

res := map[string]string{}
for _, file := range files {
p := filepath.Join(procKernel, file)
f, err := fs.Open(p)
if os.IsNotExist(err) {
kernelInfo := make(map[string]string)
for _, filename := range []string{
"osrelease",
"ostype",
"version",
} {
data, err := fs.ReadFile(filepath.Join(procSysKernel, filename))
switch {
case os.IsNotExist(err):
continue
} else if err != nil {
return nil, err
}
defer f.Close()
data, err := ioutil.ReadAll(f)
if err != nil {
case os.IsPermission(err):
continue
case err != nil:
return nil, err
}
res[file] = strings.TrimSpace(string(data))
kernelInfo[filename] = string(bytes.TrimSpace(data))
}

return res, nil
return kernelInfo, nil
}

// getOSRelease returns the operating system identification data as defined by
Expand Down
61 changes: 47 additions & 14 deletions cmd/data_linux_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,21 +10,54 @@ import (
)

func TestGetKernelInfo(t *testing.T) {
root := map[string]interface{}{
"/proc/sys/kernel/version": "#1 SMP Fri Nov 1 14:28:19 UTC 2019",
"/proc/sys/kernel/ostype": "Linux",
"/proc/sys/kernel/osrelease": "4.19.81-microsoft-standard",
for _, tc := range []struct {
name string
root interface{}
expectedKernelInfo map[string]string
}{
{
name: "windows_services_for_linux",
root: map[string]interface{}{
"/proc/sys/kernel": map[string]interface{}{
"osrelease": "4.19.81-microsoft-standard\n",
"ostype": "Linux\n",
"version": "#1 SMP Debian 5.2.9-2 (2019-08-21)\n",
},
},
expectedKernelInfo: map[string]string{
"osrelease": "4.19.81-microsoft-standard",
"ostype": "Linux",
"version": "#1 SMP Debian 5.2.9-2 (2019-08-21)",
},
},
{
name: "debian_version_only",
root: map[string]interface{}{
"/proc/sys/kernel": map[string]interface{}{
"version": "#1 SMP Debian 5.2.9-2 (2019-08-21)\n",
},
},
expectedKernelInfo: map[string]string{
"version": "#1 SMP Debian 5.2.9-2 (2019-08-21)",
},
},
{
name: "proc_sys_kernel_missing",
root: map[string]interface{}{
"/proc/sys": &vfst.Dir{Perm: 0755},
},
expectedKernelInfo: nil,
},
} {
t.Run(tc.name, func(t *testing.T) {
fs, cleanup, err := vfst.NewTestFS(tc.root)
require.NoError(t, err)
defer cleanup()
kernelInfo, err := getKernelInfo(fs)
assert.NoError(t, err)
assert.Equal(t, tc.expectedKernelInfo, kernelInfo)
})
}
fs, cleanup, err := vfst.NewTestFS(root)
require.NoError(t, err)
defer cleanup()
info, err := getKernelInfo(fs)
assert.NoError(t, err)
assert.Equal(t, map[string]string{
"version": "#1 SMP Fri Nov 1 14:28:19 UTC 2019",
"ostype": "Linux",
"osrelease": "4.19.81-microsoft-standard",
}, info)
}

func TestGetOSRelease(t *testing.T) {
Expand Down

0 comments on commit d0ab459

Please sign in to comment.