| //go:build !windows | |
| // Package kernel provides helper function to get, parse and compare kernel | |
| // versions for different platforms. | |
| package kernel // import "github.com/docker/docker/pkg/parsers/kernel" | |
| import ( | |
| "errors" | |
| "fmt" | |
| ) | |
| // VersionInfo holds information about the kernel. | |
| type VersionInfo struct { | |
| Kernel int // Version of the kernel (e.g. 4.1.2-generic -> 4) | |
| Major int // Major part of the kernel version (e.g. 4.1.2-generic -> 1) | |
| Minor int // Minor part of the kernel version (e.g. 4.1.2-generic -> 2) | |
| Flavor string // Flavor of the kernel version (e.g. 4.1.2-generic -> generic) | |
| } | |
| func (k *VersionInfo) String() string { | |
| return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor) | |
| } | |
| // CompareKernelVersion compares two kernel.VersionInfo structs. | |
| // Returns -1 if a < b, 0 if a == b, 1 it a > b | |
| func CompareKernelVersion(a, b VersionInfo) int { | |
| if a.Kernel < b.Kernel { | |
| return -1 | |
| } else if a.Kernel > b.Kernel { | |
| return 1 | |
| } | |
| if a.Major < b.Major { | |
| return -1 | |
| } else if a.Major > b.Major { | |
| return 1 | |
| } | |
| if a.Minor < b.Minor { | |
| return -1 | |
| } else if a.Minor > b.Minor { | |
| return 1 | |
| } | |
| return 0 | |
| } | |
| // ParseRelease parses a string and creates a VersionInfo based on it. | |
| func ParseRelease(release string) (*VersionInfo, error) { | |
| var ( | |
| kernel, major, minor, parsed int | |
| flavor, partial string | |
| ) | |
| // Ignore error from Sscanf to allow an empty flavor. Instead, just | |
| // make sure we got all the version numbers. | |
| parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial) | |
| if parsed < 2 { | |
| return nil, errors.New("Can't parse kernel version " + release) | |
| } | |
| // sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64 | |
| parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor) | |
| if parsed < 1 { | |
| flavor = partial | |
| } | |
| return &VersionInfo{ | |
| Kernel: kernel, | |
| Major: major, | |
| Minor: minor, | |
| Flavor: flavor, | |
| }, nil | |
| } |