// +build darwin // Package kernel provides helper function to get, parse and compare kernel // versions for different platforms. package kernel import ( "fmt" "os/exec" "strings" "github.com/mattn/go-shellwords" ) // GetKernelVersion gets the current kernel version. func GetKernelVersion() (*VersionInfo, error) { release, err := getRelease() if err != nil { return nil, err } return ParseRelease(release) } // getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version func getRelease() (string, error) { cmd := exec.Command("system_profiler", "SPSoftwareDataType") osName, err := cmd.Output() if err != nil { return "", err } var release string data := strings.Split(string(osName), "\n") for _, line := range data { if strings.Contains(line, "Kernel Version") { // It has the format like ' Kernel Version: Darwin 14.5.0' content := strings.SplitN(line, ":", 2) if len(content) != 2 { return "", fmt.Errorf("Kernel Version is invalid") } prettyNames, err := shellwords.Parse(content[1]) if err != nil { return "", fmt.Errorf("Kernel Version is invalid: %s", err.Error()) } if len(prettyNames) != 2 { return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ") } release = prettyNames[1] } } return release, nil }