diff --git a/utils/utils.go b/utils/utils.go index 08a1994c1a..13c69c5ffc 100644 --- a/utils/utils.go +++ b/utils/utils.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/hex" "encoding/json" + "errors" "fmt" "index/suffixarray" "io" @@ -552,15 +553,10 @@ type KernelVersionInfo struct { Kernel int Major int Minor int - Flavor string } func (k *KernelVersionInfo) String() string { - flavor := "" - if len(k.Flavor) > 0 { - flavor = fmt.Sprintf("-%s", k.Flavor) - } - return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, flavor) + return fmt.Sprintf("%d.%d.%d", k.Kernel, k.Major, k.Minor) } // Compare two KernelVersionInfo struct. @@ -613,48 +609,28 @@ func GetKernelVersion() (*KernelVersionInfo, error) { func ParseRelease(release string) (*KernelVersionInfo, error) { var ( - flavor string - kernel, major, minor int - err error + parts [3]int + err error ) - tmp := strings.SplitN(release, "-", 2) - tmp2 := strings.Split(tmp[0], ".") + re := regexp.MustCompile(`^([0-9]+)\.([0-9]+)\.([0-9]+)`) + subs := re.FindStringSubmatch(release) - if len(tmp2) > 0 { - kernel, err = strconv.Atoi(tmp2[0]) + if len(subs) < 4 { + return nil, errors.New("Can't parse kernel version " + release) + } + + for i := 0; i < 3; i++ { + parts[i], err = strconv.Atoi(subs[i+1]) if err != nil { return nil, err } } - if len(tmp2) > 1 { - major, err = strconv.Atoi(tmp2[1]) - if err != nil { - return nil, err - } - } - - if len(tmp2) > 2 { - // Removes "+" because git kernels might set it - minorUnparsed := strings.Trim(tmp2[2], "+") - minor, err = strconv.Atoi(minorUnparsed) - if err != nil { - return nil, err - } - } - - if len(tmp) == 2 { - flavor = tmp[1] - } else { - flavor = "" - } - return &KernelVersionInfo{ - Kernel: kernel, - Major: major, - Minor: minor, - Flavor: flavor, + Kernel: parts[0], + Major: parts[1], + Minor: parts[2], }, nil } diff --git a/utils/utils_test.go b/utils/utils_test.go index e95e108225..8acc27e15a 100644 --- a/utils/utils_test.go +++ b/utils/utils_test.go @@ -237,16 +237,16 @@ func TestCompareKernelVersion(t *testing.T) { &KernelVersionInfo{Kernel: 2, Major: 6, Minor: 0}, 1) assertKernelVersion(t, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"}, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "16"}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) assertKernelVersion(t, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 5}, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 1) assertKernelVersion(t, - &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20, Flavor: "25"}, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"}, + &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, -1) } @@ -412,9 +412,9 @@ func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, resu func TestParseRelease(t *testing.T) { assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0) - assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0) - assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) + assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) + assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8}, 0) } func TestParsePortMapping(t *testing.T) {