github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/parsers/kernel/kernel.go (about) 1 //go:build !windows 2 // +build !windows 3 4 // Package kernel provides helper function to get, parse and compare kernel 5 // versions for different platforms. 6 package kernel // import "github.com/docker/docker/pkg/parsers/kernel" 7 8 import ( 9 "errors" 10 "fmt" 11 ) 12 13 // VersionInfo holds information about the kernel. 14 type VersionInfo struct { 15 Kernel int // Version of the kernel (e.g. 4.1.2-generic -> 4) 16 Major int // Major part of the kernel version (e.g. 4.1.2-generic -> 1) 17 Minor int // Minor part of the kernel version (e.g. 4.1.2-generic -> 2) 18 Flavor string // Flavor of the kernel version (e.g. 4.1.2-generic -> generic) 19 } 20 21 func (k *VersionInfo) String() string { 22 return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor) 23 } 24 25 // CompareKernelVersion compares two kernel.VersionInfo structs. 26 // Returns -1 if a < b, 0 if a == b, 1 it a > b 27 func CompareKernelVersion(a, b VersionInfo) int { 28 if a.Kernel < b.Kernel { 29 return -1 30 } else if a.Kernel > b.Kernel { 31 return 1 32 } 33 34 if a.Major < b.Major { 35 return -1 36 } else if a.Major > b.Major { 37 return 1 38 } 39 40 if a.Minor < b.Minor { 41 return -1 42 } else if a.Minor > b.Minor { 43 return 1 44 } 45 46 return 0 47 } 48 49 // ParseRelease parses a string and creates a VersionInfo based on it. 50 func ParseRelease(release string) (*VersionInfo, error) { 51 var ( 52 kernel, major, minor, parsed int 53 flavor, partial string 54 ) 55 56 // Ignore error from Sscanf to allow an empty flavor. Instead, just 57 // make sure we got all the version numbers. 58 parsed, _ = fmt.Sscanf(release, "%d.%d%s", &kernel, &major, &partial) 59 if parsed < 2 { 60 return nil, errors.New("Can't parse kernel version " + release) 61 } 62 63 // sometimes we have 3.12.25-gentoo, but sometimes we just have 3.12-1-amd64 64 parsed, _ = fmt.Sscanf(partial, ".%d%s", &minor, &flavor) 65 if parsed < 1 { 66 flavor = partial 67 } 68 69 return &VersionInfo{ 70 Kernel: kernel, 71 Major: major, 72 Minor: minor, 73 Flavor: flavor, 74 }, nil 75 }