kernel.go 1.8 KB

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