| // +build !windows |
| |
| // Package kernel provides helper function to get, parse and compare kernel |
| // versions for different platforms. |
| package 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 |
| } |