kernel_darwin.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. // +build darwin
  2. // Package kernel provides helper function to get, parse and compare kernel
  3. // versions for different platforms.
  4. package kernel
  5. import (
  6. "fmt"
  7. "os/exec"
  8. "strings"
  9. "github.com/mattn/go-shellwords"
  10. )
  11. // GetKernelVersion gets the current kernel version.
  12. func GetKernelVersion() (*VersionInfo, error) {
  13. release, err := getRelease()
  14. if err != nil {
  15. return nil, err
  16. }
  17. return ParseRelease(release)
  18. }
  19. // getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version
  20. func getRelease() (string, error) {
  21. cmd := exec.Command("system_profiler", "SPSoftwareDataType")
  22. osName, err := cmd.Output()
  23. if err != nil {
  24. return "", err
  25. }
  26. var release string
  27. data := strings.Split(string(osName), "\n")
  28. for _, line := range data {
  29. if strings.Contains(line, "Kernel Version") {
  30. // It has the format like ' Kernel Version: Darwin 14.5.0'
  31. content := strings.SplitN(line, ":", 2)
  32. if len(content) != 2 {
  33. return "", fmt.Errorf("Kernel Version is invalid")
  34. }
  35. prettyNames, err := shellwords.Parse(content[1])
  36. if err != nil {
  37. return "", fmt.Errorf("Kernel Version is invalid: %s", err.Error())
  38. }
  39. if len(prettyNames) != 2 {
  40. return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ")
  41. }
  42. release = prettyNames[1]
  43. }
  44. }
  45. return release, nil
  46. }