diff --git a/cmd/pke/app/util/linux/autodetect.go b/cmd/pke/app/util/linux/autodetect.go index 1cc15277..dc281a0f 100644 --- a/cmd/pke/app/util/linux/autodetect.go +++ b/cmd/pke/app/util/linux/autodetect.go @@ -17,15 +17,21 @@ package linux import ( "io" + "github.com/Masterminds/semver" "github.com/banzaicloud/pke/cmd/pke/app/constants" ) func KubernetesPackagesImpl(out io.Writer) (KubernetesPackages, error) { - if ver, err := CentOSVersion(out); err == nil { - if ver == "7" { + ver, err := CentOSVersion(out) + if err != nil { + ver, err = RedHatVersion(out) + } + if err == nil { + v, _ := semver.NewVersion(ver) + c, _ := semver.NewConstraint("7.x-0 || 8.x-0") + if c.Check(v) { return NewYumInstaller(), nil } - return nil, constants.ErrUnsupportedOS } if distro, err := LSBReleaseDistributorID(out); err == nil { @@ -48,8 +54,12 @@ func ContainerdPackagesImpl(out io.Writer) (ContainerdPackages, error) { if err != nil { ver, err = RedHatVersion(out) } - if err == nil && (ver == "7" || ver == "8.0") { - return NewYumInstaller(), nil + if err == nil { + v, _ := semver.NewVersion(ver) + c, _ := semver.NewConstraint("7.x-0 || 8.x-0") + if c.Check(v) { + return NewYumInstaller(), nil + } } if distro, err := LSBReleaseDistributorID(out); err == nil { diff --git a/cmd/pke/app/util/linux/kernel.go b/cmd/pke/app/util/linux/kernel.go index 56ecf3aa..39805da5 100644 --- a/cmd/pke/app/util/linux/kernel.go +++ b/cmd/pke/app/util/linux/kernel.go @@ -33,6 +33,8 @@ func KernelVersionConstraint(out io.Writer, constraint string) error { if err != nil { return err } + // Red Hat Linux uses underscore: 3.10.0-327.el7.x86_64 + version = bytes.ReplaceAll(version, []byte("_"), []byte("")) v := string(bytes.TrimSpace(version)) ver, err := semver.NewVersion(v) if err != nil { diff --git a/cmd/pke/app/util/linux/os_version_linux.go b/cmd/pke/app/util/linux/os_version_linux.go index 9f3a9177..b96c74e1 100644 --- a/cmd/pke/app/util/linux/os_version_linux.go +++ b/cmd/pke/app/util/linux/os_version_linux.go @@ -16,7 +16,10 @@ package linux import ( "bytes" + "fmt" "io" + "io/ioutil" + "regexp" "strings" "emperror.dev/errors" @@ -51,7 +54,18 @@ func CentOSVersion(w io.Writer) (string, error) { func RedHatVersion(w io.Writer) (string, error) { o, err := runner.Cmd(w, "rpm", "--query", "redhat-release").Output() if err != nil { - return "", err + // /etc/redhat-release + b, err := ioutil.ReadFile("/etc/redhat-release") + _, _ = fmt.Fprintf(w, "/etc/redhat-release: %q, err: %v\n", b, err) + if err != nil { + return "", err + } + re := regexp.MustCompile(`\d+(\.\d+)?`) + ver := re.Find(b) + if len(ver) == 0 { + return "", errors.New("failed to parse version") + } + return string(ver), nil } s := bytes.SplitN(o, dash, 4)