From cc56c0a135072fd40b16166001716474581668ad Mon Sep 17 00:00:00 2001 From: Federico Di Pierro Date: Wed, 29 Nov 2023 10:45:46 +0100 Subject: [PATCH] chore(cmd/driver,pkg/driver,internal/config): avoid string concatenation for hostroot. Moreover, hostRoot will now default to `/`, and it will be stored as package local variable in driverdistro package, to forwarding it where needed. Signed-off-by: Federico Di Pierro --- cmd/driver/config/config.go | 15 +++++++----- cmd/driver/install/install.go | 4 +-- cmd/driver/printenv/printenv.go | 2 +- internal/config/config.go | 2 +- pkg/driver/distro/centos.go | 14 ++++++++--- pkg/driver/distro/centos_test.go | 21 ++++++++++------ pkg/driver/distro/cos.go | 3 +-- pkg/driver/distro/debian.go | 9 +++++-- pkg/driver/distro/debian_test.go | 21 ++++++++++------ pkg/driver/distro/distro.go | 39 +++++++++++++++++------------- pkg/driver/distro/distro_test.go | 6 ++--- pkg/driver/distro/flatcar.go | 1 - pkg/driver/distro/generic.go | 1 - pkg/driver/distro/minikube.go | 11 ++++++--- pkg/driver/distro/minikube_test.go | 21 ++++++++++------ pkg/driver/distro/rhel.go | 10 ++++++-- pkg/driver/distro/rhel_test.go | 21 ++++++++++------ 17 files changed, 125 insertions(+), 76 deletions(-) diff --git a/cmd/driver/config/config.go b/cmd/driver/config/config.go index 6f6f8599c..e0068dd68 100644 --- a/cmd/driver/config/config.go +++ b/cmd/driver/config/config.go @@ -125,6 +125,9 @@ func (o *driverConfigOptions) RunDriverConfig(ctx context.Context, cmd *cobra.Co }) } if f := cmd.Flags().Lookup("host-root"); f != nil && f.Changed { + if !filepath.IsAbs(o.HostRoot) { + return fmt.Errorf("host-root must be an absolute path: %s", o.HostRoot) + } driverCfg.HostRoot = o.HostRoot loggerArgs = append(loggerArgs, pterm.LoggerArgument{ Key: "driver host root", @@ -153,7 +156,7 @@ func (o *driverConfigOptions) RunDriverConfig(ctx context.Context, cmd *cobra.Co "kernel release", info.String(), "kernel version", info.KernelVersion)) - d, err := driverdistro.DiscoverDistro(info, driverCfg.HostRoot) + d, err := driverdistro.Discover(info, driverCfg.HostRoot) if err != nil { return err } @@ -170,7 +173,7 @@ func (o *driverConfigOptions) RunDriverConfig(ctx context.Context, cmd *cobra.Co o.Printer.Logger.Info("Running falcoctl driver config", loggerArgs) if o.Update { - err = o.commit(ctx, dType, driverCfg.HostRoot) + err = o.commit(ctx, dType) if err != nil { return err } @@ -189,8 +192,8 @@ func checkFalcoRunsWithDrivers(engineKind string) error { return nil } -func (o *driverConfigOptions) replaceDriverTypeInFalcoConfig(hostRoot string, driverType drivertype.DriverType) error { - falcoCfgFile := hostRoot + "/etc/falco/falco.yaml" +func (o *driverConfigOptions) replaceDriverTypeInFalcoConfig(driverType drivertype.DriverType) error { + falcoCfgFile := filepath.Clean(filepath.Join(string(os.PathSeparator), "etc", "falco", "falco.yaml")) type engineCfg struct { Kind string `yaml:"kind"` } @@ -275,10 +278,10 @@ func (o *driverConfigOptions) replaceDriverTypeInK8SConfigMap(ctx context.Contex // commit saves the updated driver type to Falco config, // either to the local falco.yaml or updating the deployment configmap. -func (o *driverConfigOptions) commit(ctx context.Context, driverType drivertype.DriverType, hostroot string) error { +func (o *driverConfigOptions) commit(ctx context.Context, driverType drivertype.DriverType) error { if o.Namespace != "" { // Ok we are on k8s return o.replaceDriverTypeInK8SConfigMap(ctx, driverType) } - return o.replaceDriverTypeInFalcoConfig(hostroot, driverType) + return o.replaceDriverTypeInFalcoConfig(driverType) } diff --git a/cmd/driver/install/install.go b/cmd/driver/install/install.go index 16f9ecdba..f1d69054f 100644 --- a/cmd/driver/install/install.go +++ b/cmd/driver/install/install.go @@ -159,7 +159,7 @@ func (o *driverInstallOptions) RunDriverInstall(ctx context.Context, driver *con return "", nil } - d, err := driverdistro.DiscoverDistro(kr, driver.HostRoot) + d, err := driverdistro.Discover(kr, driver.HostRoot) if err != nil { if errors.Is(err, driverdistro.ErrUnsupported) && o.Compile { o.Download = false @@ -190,7 +190,7 @@ func (o *driverInstallOptions) RunDriverInstall(ctx context.Context, driver *con } if o.Compile { - dest, err = driverdistro.Build(ctx, d, o.Printer, kr, driver.Name, driver.Type, driver.Version, driver.HostRoot) + dest, err = driverdistro.Build(ctx, d, o.Printer, kr, driver.Name, driver.Type, driver.Version) if err == nil { return dest, nil } diff --git a/cmd/driver/printenv/printenv.go b/cmd/driver/printenv/printenv.go index 50b1ec9c0..2bfef4897 100644 --- a/cmd/driver/printenv/printenv.go +++ b/cmd/driver/printenv/printenv.go @@ -65,7 +65,7 @@ func (o *driverPrintenvOptions) RunDriverPrintenv(_ context.Context) error { return err } - d, err := driverdistro.DiscoverDistro(kr, driver.HostRoot) + d, err := driverdistro.Discover(kr, driver.HostRoot) if err != nil { return err } diff --git a/internal/config/config.go b/internal/config/config.go index 5cb06208e..d74521f4b 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -208,7 +208,7 @@ func init() { Name: "falco", Repos: []string{"https://download.falco.org/driver"}, Version: "", - HostRoot: "", + HostRoot: string(os.PathSeparator), } } diff --git a/pkg/driver/distro/centos.go b/pkg/driver/distro/centos.go index 0cd5e3866..9ca9f7505 100644 --- a/pkg/driver/distro/centos.go +++ b/pkg/driver/distro/centos.go @@ -15,7 +15,11 @@ package driverdistro -import "github.com/falcosecurity/falcoctl/internal/utils" +import ( + "path/filepath" + + "github.com/falcosecurity/falcoctl/internal/utils" +) func init() { distros["centos"] = ¢os{generic: &generic{}} @@ -25,7 +29,11 @@ type centos struct { *generic } -func (c *centos) check(hostRoot string) bool { - exist, _ := utils.FileExists(hostRoot + "/etc/centos-release") +func (c *centos) check() bool { + exist, _ := utils.FileExists(c.releaseFile()) return exist } + +func (c *centos) releaseFile() string { + return filepath.Clean(filepath.Join(hostRoot, "etc", "centos-release")) +} diff --git a/pkg/driver/distro/centos_test.go b/pkg/driver/distro/centos_test.go index 9f60a3187..c4ef1c91e 100644 --- a/pkg/driver/distro/centos_test.go +++ b/pkg/driver/distro/centos_test.go @@ -30,6 +30,12 @@ func TestDistroCentosCheck(t *testing.T) { postFn func() retExpected bool } + + const ( + etcPath = "/etc/" + releaseFilePath = etcPath + "centos-release" + ) + testCases := []testCase{ { // No centos-release file @@ -44,14 +50,14 @@ func TestDistroCentosCheck(t *testing.T) { // centos-release file present under hostroot hostRoot: ".", preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll(hostRoot+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/centos-release") + _, err := os.Create(hostRoot + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/centos-release") + _ = os.RemoveAll(hostRoot + releaseFilePath) }, retExpected: true, }, @@ -59,24 +65,25 @@ func TestDistroCentosCheck(t *testing.T) { // centos-release file present but not under hostroot hostRoot: "/foo", preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll("."+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/centos-release") + _, err := os.Create("." + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/centos-release") + _ = os.RemoveAll("." + releaseFilePath) }, retExpected: false, }, } for _, tCase := range testCases { + hostRoot = tCase.hostRoot c := ¢os{generic: &generic{}} err := tCase.preFn() require.NoError(t, err) - assert.Equal(t, tCase.retExpected, c.check(tCase.hostRoot)) + assert.Equal(t, tCase.retExpected, c.check()) tCase.postFn() } } diff --git a/pkg/driver/distro/cos.go b/pkg/driver/distro/cos.go index dfe3c75cf..1e99de23b 100644 --- a/pkg/driver/distro/cos.go +++ b/pkg/driver/distro/cos.go @@ -58,7 +58,6 @@ func (c *cos) customizeBuild(ctx context.Context, printer *output.Printer, driverType drivertype.DriverType, kr kernelrelease.KernelRelease, - hostRoot string, ) (map[string]string, error) { switch driverType.String() { case drivertype.TypeBpf: @@ -70,7 +69,7 @@ func (c *cos) customizeBuild(ctx context.Context, printer.Logger.Info("COS detected, using COS kernel headers.", printer.Logger.Args("build ID", c.buildID)) bpfKernelSrcURL := fmt.Sprintf("https://storage.googleapis.com/cos-tools/%s/kernel-headers.tgz", c.buildID) kr.Extraversion = "+" - env, err := downloadKernelSrc(ctx, printer, &kr, bpfKernelSrcURL, hostRoot, 0) + env, err := downloadKernelSrc(ctx, printer, &kr, bpfKernelSrcURL, 0) if err != nil { return nil, err } diff --git a/pkg/driver/distro/debian.go b/pkg/driver/distro/debian.go index 4166bf86b..19ddafc1f 100644 --- a/pkg/driver/distro/debian.go +++ b/pkg/driver/distro/debian.go @@ -17,6 +17,7 @@ package driverdistro import ( "fmt" + "path/filepath" "regexp" "github.com/falcosecurity/driverkit/pkg/kernelrelease" @@ -36,11 +37,15 @@ type debian struct { var debianKernelReleaseRegex = regexp.MustCompile(`-?(rt-|cloud-|)(amd64|arm64)`) var debianKernelVersionRegex = regexp.MustCompile(`\d+\.\d+\.\d+-\d+`) -func (d *debian) check(hostRoot string) bool { - exist, _ := utils.FileExists(hostRoot + "/etc/debian_version") +func (d *debian) check() bool { + exist, _ := utils.FileExists(d.releaseFile()) return exist } +func (d *debian) releaseFile() string { + return filepath.Clean(filepath.Join(hostRoot, "etc", "debian_version")) +} + //nolint:gocritic // the method shall not be able to modify kr func (d *debian) FixupKernel(kr kernelrelease.KernelRelease) kernelrelease.KernelRelease { // Workaround: debian kernelreleases might not be actual kernel running; diff --git a/pkg/driver/distro/debian_test.go b/pkg/driver/distro/debian_test.go index 9fae29fe9..c589e2a06 100644 --- a/pkg/driver/distro/debian_test.go +++ b/pkg/driver/distro/debian_test.go @@ -25,6 +25,10 @@ import ( ) func TestDistroDebianCheck(t *testing.T) { + const ( + etcPath = "/etc/" + releaseFilePath = etcPath + "debian_version" + ) type testCase struct { hostRoot string preFn func() error @@ -43,16 +47,16 @@ func TestDistroDebianCheck(t *testing.T) { }, { // debian_version file present under hostroot - hostRoot: ".", + hostRoot: os.TempDir(), preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll(hostRoot+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/debian_version") + _, err := os.Create(hostRoot + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/debian_version") + _ = os.RemoveAll(hostRoot + releaseFilePath) }, retExpected: true, }, @@ -60,24 +64,25 @@ func TestDistroDebianCheck(t *testing.T) { // debian_version file present but not under hostroot hostRoot: "/foo", preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll("."+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/debian_version") + _, err := os.Create("." + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/debian_version") + _ = os.RemoveAll("." + releaseFilePath) }, retExpected: false, }, } for _, tCase := range testCases { + hostRoot = tCase.hostRoot deb := &debian{generic: &generic{}} err := tCase.preFn() require.NoError(t, err) - assert.Equal(t, tCase.retExpected, deb.check(tCase.hostRoot)) + assert.Equal(t, tCase.retExpected, deb.check()) tCase.postFn() } } diff --git a/pkg/driver/distro/distro.go b/pkg/driver/distro/distro.go index 7e47ee081..ec93359c5 100644 --- a/pkg/driver/distro/distro.go +++ b/pkg/driver/distro/distro.go @@ -43,10 +43,12 @@ const ( kernelSrcDownloadFolder = "kernel-sources" ) -var distros = map[string]Distro{} - -// ErrUnsupported is the error returned when the target distro is not supported. -var ErrUnsupported = errors.New("failed to determine distro") +var ( + distros = map[string]Distro{} + hostRoot = string(os.PathSeparator) + // ErrUnsupported is the error returned when the target distro is not supported. + ErrUnsupported = errors.New("failed to determine distro") +) // Distro is the common interface used by distro-specific implementations. // Most of the distro-specific only partially override the default `generic` implementation. @@ -54,21 +56,25 @@ type Distro interface { init(kr kernelrelease.KernelRelease, id string, cfg *ini.File) error // private FixupKernel(kr kernelrelease.KernelRelease) kernelrelease.KernelRelease // private customizeBuild(ctx context.Context, printer *output.Printer, driverType drivertype.DriverType, - kr kernelrelease.KernelRelease, hostRoot string) (map[string]string, error) + kr kernelrelease.KernelRelease) (map[string]string, error) PreferredDriver(kr kernelrelease.KernelRelease) drivertype.DriverType fmt.Stringer } type checker interface { - check(hostRoot string) bool // private + check() bool // private } -// DiscoverDistro tries to fetch the correct Distro by looking at /etc/os-release or +// Discover tries to fetch the correct Distro by looking at /etc/os-release or // by cycling on all supported distros and checking them one by one. // //nolint:gocritic // the method shall not be able to modify kr -func DiscoverDistro(kr kernelrelease.KernelRelease, hostRoot string) (Distro, error) { - distro, err := getOSReleaseDistro(&kr, hostRoot) +func Discover(kr kernelrelease.KernelRelease, hostroot string) (Distro, error) { + // Implicitly store hostroot to a package local variable + // to avoid passing it in other APIs + hostRoot = hostroot + + distro, err := getOSReleaseDistro(&kr) if err == nil { return distro, nil } @@ -76,7 +82,7 @@ func DiscoverDistro(kr kernelrelease.KernelRelease, hostRoot string) (Distro, er // Fallback to check any distro checker for id, d := range distros { dd, ok := d.(checker) - if ok && dd.check(hostRoot) { + if ok && dd.check() { err = d.init(kr, id, nil) return d, err } @@ -90,7 +96,7 @@ func DiscoverDistro(kr kernelrelease.KernelRelease, hostRoot string) (Distro, er return distro, ErrUnsupported } -func getOSReleaseDistro(kr *kernelrelease.KernelRelease, hostRoot string) (Distro, error) { +func getOSReleaseDistro(kr *kernelrelease.KernelRelease) (Distro, error) { cfg, err := ini.Load(hostRoot + "/etc/os-release") if err != nil { return nil, err @@ -104,7 +110,7 @@ func getOSReleaseDistro(kr *kernelrelease.KernelRelease, hostRoot string) (Distr // Overwrite the OS_ID if /etc/VERSION file is present. // Not sure if there is a better way to detect minikube. dd := distros["minikube"].(checker) - if dd.check(hostRoot) { + if dd.check() { id = "minikube" } @@ -155,9 +161,8 @@ func Build(ctx context.Context, driverName string, driverType drivertype.DriverType, driverVer string, - hostRoot string, ) (string, error) { - env, err := d.customizeBuild(ctx, printer, driverType, kr, hostRoot) + env, err := d.customizeBuild(ctx, printer, driverType, kr) if err != nil { return "", err } @@ -237,7 +242,7 @@ func customizeDownloadKernelSrcBuild(printer *output.Printer, kr *kernelrelease. return err } -func getKernelConfig(printer *output.Printer, kr *kernelrelease.KernelRelease, hostRoot string) (string, error) { +func getKernelConfig(printer *output.Printer, kr *kernelrelease.KernelRelease) (string, error) { bootConfig := fmt.Sprintf("/boot/config-%s", kr.String()) hrBootConfig := fmt.Sprintf("%s%s", hostRoot, bootConfig) ostreeConfig := fmt.Sprintf("/usr/lib/ostree-boot/config-%s", kr.String()) @@ -265,7 +270,7 @@ func getKernelConfig(printer *output.Printer, kr *kernelrelease.KernelRelease, h func downloadKernelSrc(ctx context.Context, printer *output.Printer, kr *kernelrelease.KernelRelease, - url, hostRoot string, + url string, stripComponents int, ) (map[string]string, error) { env := make(map[string]string) @@ -309,7 +314,7 @@ func downloadKernelSrc(ctx context.Context, return env, err } - kernelConfigPath, err := getKernelConfig(printer, kr, hostRoot) + kernelConfigPath, err := getKernelConfig(printer, kr) if err != nil { return nil, err } diff --git a/pkg/driver/distro/distro_test.go b/pkg/driver/distro/distro_test.go index 1132d1529..703bfe1aa 100644 --- a/pkg/driver/distro/distro_test.go +++ b/pkg/driver/distro/distro_test.go @@ -27,8 +27,8 @@ import ( ) func TestDiscoverDistro(t *testing.T) { - hostRoot := "." - etcDir := hostRoot + "/etc" + localHostRoot := os.TempDir() + etcDir := localHostRoot + "/etc" osReleaseFile := filepath.Join(etcDir, "os-release") type osID struct { @@ -203,7 +203,7 @@ func TestDiscoverDistro(t *testing.T) { err := tCase.preFn() require.NoError(t, err) kr := kernelrelease.FromString(tCase.krInput) - d, err := DiscoverDistro(kr, hostRoot) + d, err := Discover(kr, localHostRoot) if tCase.errExpected { assert.Error(t, err) } else { diff --git a/pkg/driver/distro/flatcar.go b/pkg/driver/distro/flatcar.go index c3aba182f..dc91d3b9b 100644 --- a/pkg/driver/distro/flatcar.go +++ b/pkg/driver/distro/flatcar.go @@ -84,7 +84,6 @@ func (f *flatcar) customizeBuild(ctx context.Context, printer *output.Printer, driverType drivertype.DriverType, _ kernelrelease.KernelRelease, - _ string, ) (map[string]string, error) { switch driverType.String() { case drivertype.TypeBpf, drivertype.TypeKmod: diff --git a/pkg/driver/distro/generic.go b/pkg/driver/distro/generic.go index 0264b7007..d6bbb0239 100644 --- a/pkg/driver/distro/generic.go +++ b/pkg/driver/distro/generic.go @@ -49,7 +49,6 @@ func (g *generic) customizeBuild(_ context.Context, _ *output.Printer, _ drivertype.DriverType, _ kernelrelease.KernelRelease, - _ string, ) (map[string]string, error) { return nil, nil } diff --git a/pkg/driver/distro/minikube.go b/pkg/driver/distro/minikube.go index 4d09fe50b..cbec5eaf3 100644 --- a/pkg/driver/distro/minikube.go +++ b/pkg/driver/distro/minikube.go @@ -42,8 +42,8 @@ var minikubeVersionRegex = regexp.MustCompile(`(\d+(\.\d+){2})`) // check() will also load minikube version, because minikube has a different // code path from other "checker" distros. -func (m *minikube) check(hostRoot string) bool { - file, err := os.Open(filepath.Clean(hostRoot + "/etc/VERSION")) +func (m *minikube) check() bool { + file, err := os.Open(m.releaseFile()) if err == nil { defer func() { _ = file.Close() @@ -66,6 +66,10 @@ func (m *minikube) check(hostRoot string) bool { return false } +func (m *minikube) releaseFile() string { + return filepath.Clean(filepath.Join(hostRoot, "etc", "VERSION")) +} + //nolint:gocritic // the method shall not be able to modify kr func (m *minikube) FixupKernel(kr kernelrelease.KernelRelease) kernelrelease.KernelRelease { kr.KernelVersion = fmt.Sprintf("1_%s", m.version) @@ -77,7 +81,6 @@ func (m *minikube) customizeBuild(ctx context.Context, printer *output.Printer, driverType drivertype.DriverType, kr kernelrelease.KernelRelease, - hostRoot string, ) (map[string]string, error) { switch driverType.String() { case drivertype.TypeBpf: @@ -94,7 +97,7 @@ func (m *minikube) customizeBuild(ctx context.Context, kernelVersionStr += fmt.Sprintf(".%d", kr.Patch) } bpfKernelSrcURL := fmt.Sprintf("http://mirrors.edge.kernel.org/pub/linux/kernel/v%d.x/linux-%s.tar.gz", kr.Major, kernelVersionStr) - env, err := downloadKernelSrc(ctx, printer, &kr, bpfKernelSrcURL, hostRoot, 1) + env, err := downloadKernelSrc(ctx, printer, &kr, bpfKernelSrcURL, 1) if err != nil { return nil, err } diff --git a/pkg/driver/distro/minikube_test.go b/pkg/driver/distro/minikube_test.go index 743468307..f5269099b 100644 --- a/pkg/driver/distro/minikube_test.go +++ b/pkg/driver/distro/minikube_test.go @@ -25,6 +25,10 @@ import ( ) func TestDistroMinikubeInitFixup(t *testing.T) { + const ( + etcPath = "/etc/" + releaseFilePath = etcPath + "VERSION" + ) type testCase struct { hostRoot string preFn func() error @@ -44,15 +48,15 @@ func TestDistroMinikubeInitFixup(t *testing.T) { }, { // VERSION file present under hostroot - hostRoot: ".", + hostRoot: os.TempDir(), preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll(hostRoot+etcPath, 0o755); err != nil { return err } - return os.WriteFile("./etc/VERSION", []byte("v1.26.0-1655407986-14197"), os.ModePerm) + return os.WriteFile(hostRoot+releaseFilePath, []byte("v1.26.0-1655407986-14197"), os.ModePerm) }, postFn: func() { - _ = os.RemoveAll("./etc/VERSION") + _ = os.RemoveAll(hostRoot + releaseFilePath) }, retExpected: true, kvExpected: "1_1.26.0", @@ -61,23 +65,24 @@ func TestDistroMinikubeInitFixup(t *testing.T) { // VERSION file present but not under hostroot hostRoot: "/foo", preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll("."+etcPath, 0o755); err != nil { return err } - return os.WriteFile("./etc/VERSION", []byte("v1.26.0-1655407986-14197"), os.ModePerm) + return os.WriteFile("."+releaseFilePath, []byte("v1.26.0-1655407986-14197"), os.ModePerm) }, postFn: func() { - _ = os.RemoveAll("./etc/VERSION") + _ = os.RemoveAll("." + releaseFilePath) }, retExpected: false, }, } for _, tCase := range testCases { + hostRoot = tCase.hostRoot mn := &minikube{generic: &generic{}} err := tCase.preFn() require.NoError(t, err) - assert.Equal(t, tCase.retExpected, mn.check(tCase.hostRoot)) + assert.Equal(t, tCase.retExpected, mn.check()) if tCase.retExpected { kr := kernelrelease.KernelRelease{} fixedKr := mn.FixupKernel(kr) diff --git a/pkg/driver/distro/rhel.go b/pkg/driver/distro/rhel.go index 2b5295dca..6a204261e 100644 --- a/pkg/driver/distro/rhel.go +++ b/pkg/driver/distro/rhel.go @@ -16,6 +16,8 @@ package driverdistro import ( + "path/filepath" + "github.com/falcosecurity/falcoctl/internal/utils" ) @@ -27,7 +29,11 @@ type rhel struct { *generic } -func (r *rhel) check(hostRoot string) bool { - exist, _ := utils.FileExists(hostRoot + "/etc/redhat-release") +func (r *rhel) check() bool { + exist, _ := utils.FileExists(r.releaseFile()) return exist } + +func (r *rhel) releaseFile() string { + return filepath.Clean(filepath.Join(hostRoot, "etc", "redhat-release")) +} diff --git a/pkg/driver/distro/rhel_test.go b/pkg/driver/distro/rhel_test.go index 315e0de4e..af79737e3 100644 --- a/pkg/driver/distro/rhel_test.go +++ b/pkg/driver/distro/rhel_test.go @@ -24,6 +24,10 @@ import ( ) func TestDistroRhelCheck(t *testing.T) { + const ( + etcPath = "/etc/" + releaseFilePath = etcPath + "redhat-release" + ) type testCase struct { hostRoot string preFn func() error @@ -42,16 +46,16 @@ func TestDistroRhelCheck(t *testing.T) { }, { // redhat-release file present under hostroot - hostRoot: ".", + hostRoot: os.TempDir(), preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll(hostRoot+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/redhat-release") + _, err := os.Create(hostRoot + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/redhat-release") + _ = os.RemoveAll(hostRoot + releaseFilePath) }, retExpected: true, }, @@ -59,24 +63,25 @@ func TestDistroRhelCheck(t *testing.T) { // redhat-release file present but not under hostroot hostRoot: "/foo", preFn: func() error { - if err := os.MkdirAll("./etc/", 0o755); err != nil { + if err := os.MkdirAll("."+etcPath, 0o755); err != nil { return err } - _, err := os.Create("./etc/redhat-release") + _, err := os.Create("." + releaseFilePath) return err }, postFn: func() { - _ = os.RemoveAll("./etc/redhat-release") + _ = os.RemoveAll("." + releaseFilePath) }, retExpected: false, }, } for _, tCase := range testCases { + hostRoot = tCase.hostRoot r := &rhel{generic: &generic{}} err := tCase.preFn() require.NoError(t, err) - assert.Equal(t, tCase.retExpected, r.check(tCase.hostRoot)) + assert.Equal(t, tCase.retExpected, r.check()) tCase.postFn() } }