diff --git a/internal/validator/validator.go b/internal/validator/validator.go new file mode 100644 index 0000000000..e12fbd584b --- /dev/null +++ b/internal/validator/validator.go @@ -0,0 +1,64 @@ +package validator + +import ( + "fmt" + "sniffer/internal/config" + "syscall" + + logger "github.com/kubescape/go-logger" + "github.com/kubescape/go-logger/helpers" +) + +const ( + FALCO_EBPF_ENGINE_MIN_KERNEL_VERSION_SUPPORT = "4.14" + KUBESCAPE_EBPF_ENGINE_MIN_KERNEL_VERSION_SUPPORT = "5.1" +) + +var minKernelVersion string + +func int8ToStr(arr []int8) string { + b := make([]byte, 0, len(arr)) + for _, v := range arr { + if v == 0x00 { + break + } + b = append(b, byte(v)) + } + return string(b) +} + +func checkKernelVersion() error { + var uname syscall.Utsname + if err := syscall.Uname(&uname); err != nil { + return fmt.Errorf("checkKernelVersion: fail to detect the kernel version") + } + kernelVersion := int8ToStr(uname.Sysname[:]) + "," + int8ToStr(uname.Release[:]) + "," + int8ToStr(uname.Version[:]) + logger.L().Debug("", helpers.String("kernelVersion: %s", kernelVersion)) + + if int8ToStr(uname.Release[:]) < minKernelVersion { + return fmt.Errorf("checkKernelVersion: the current kernel version %s is less than the min kernel version support %s", int8ToStr(uname.Release[:]), minKernelVersion) + } + + return nil +} + +func checkNodePrerequisites() error { + if config.IsFalcoEbpfEngine() { + minKernelVersion = FALCO_EBPF_ENGINE_MIN_KERNEL_VERSION_SUPPORT + } else { + minKernelVersion = KUBESCAPE_EBPF_ENGINE_MIN_KERNEL_VERSION_SUPPORT + } + err := checkKernelVersion() + if err != nil { + return err + } + return nil +} + +func CheckPrerequisites() error { + err := checkNodePrerequisites() + if err != nil { + return err + } + return nil +} diff --git a/internal/validator/validator_test.go b/internal/validator/validator_test.go new file mode 100644 index 0000000000..2384875bc5 --- /dev/null +++ b/internal/validator/validator_test.go @@ -0,0 +1,13 @@ +package validator + +import ( + "testing" +) + +func TestValidator(t *testing.T) { + minKernelVersion = "0.1" + err := checkKernelVersion() + if err != nil { + t.Fatalf("checkKernelVersion failed withh error %v", err) + } +} diff --git a/main.go b/main.go index 6f6e5b75f4..f121ae9480 100644 --- a/main.go +++ b/main.go @@ -3,6 +3,7 @@ package main import ( "fmt" "sniffer/internal/config" + "sniffer/internal/validator" "github.com/kubescape/go-logger" "github.com/kubescape/go-logger/helpers" @@ -18,5 +19,9 @@ func main() { if err != nil { logger.L().Fatal("", helpers.String("error during parsing configuration: ", fmt.Sprintf("%v", err))) } + err = validator.CheckPrerequisites() + if err != nil { + logger.L().Fatal("", helpers.String("error during validation: ", fmt.Sprintf("%v", err))) + } }