diff --git a/internal/osutil/osutil.go b/internal/osutil/osutil.go new file mode 100644 index 0000000..279bd00 --- /dev/null +++ b/internal/osutil/osutil.go @@ -0,0 +1,74 @@ +package osutil + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "golang.org/x/sys/unix" +) + +// Converts a relative symlink target path (e.g. ../../lib/foo.so), that is +// absolute path +func RelativeSymlinkTargetToDir(symPath string, dir string) (string, error) { + var path string + + oldWd, err := os.Getwd() + if err != nil { + log.Print("Unable to get current working dir") + return path, err + } + + if err := os.Chdir(dir); err != nil { + log.Print("Unable to change to working dir: ", dir) + return path, err + } + + path, err = filepath.Abs(symPath) + if err != nil { + log.Print("Unable to resolve abs path to: ", symPath) + return path, err + } + + if err := os.Chdir(oldWd); err != nil { + log.Print("Unable to change to old working dir") + return path, err + } + + return path, nil +} + +func FreeSpace(path string) (uint64, error) { + var stat unix.Statfs_t + unix.Statfs(path, &stat) + size := stat.Bavail * uint64(stat.Bsize) + return size, nil +} + +func getKernelReleaseFile() (string, error) { + files, _ := filepath.Glob("/usr/share/kernel/*/kernel.release") + // only one kernel flavor supported + if len(files) != 1 { + return "", fmt.Errorf("only one kernel release/flavor is supported, found: %q", files) + } + + return files[0], nil +} + +func GetKernelVersion() (string, error) { + var version string + + releaseFile, err := getKernelReleaseFile() + if err != nil { + return version, err + } + + contents, err := os.ReadFile(releaseFile) + if err != nil { + return version, err + } + + return strings.TrimSpace(string(contents)), nil +}