| // +build darwin |
| |
| // Package kernel provides helper function to get, parse and compare kernel |
| // versions for different platforms. |
| package kernel // import "github.com/docker/docker/pkg/parsers/kernel" |
| |
| import ( |
| "fmt" |
| "os/exec" |
| "strings" |
| ) |
| |
| // GetKernelVersion gets the current kernel version. |
| func GetKernelVersion() (*VersionInfo, error) { |
| osName, err := getSPSoftwareDataType() |
| if err != nil { |
| return nil, err |
| } |
| release, err := getRelease(osName) |
| if err != nil { |
| return nil, err |
| } |
| return ParseRelease(release) |
| } |
| |
| // getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version |
| func getRelease(osName string) (string, error) { |
| var release string |
| data := strings.Split(osName, "\n") |
| for _, line := range data { |
| if !strings.Contains(line, "Kernel Version") { |
| continue |
| } |
| // 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 := strings.SplitN(strings.TrimSpace(content[1]), " ", 2) |
| |
| if len(prettyNames) != 2 { |
| return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ") |
| } |
| release = prettyNames[1] |
| } |
| |
| return release, nil |
| } |
| |
| func getSPSoftwareDataType() (string, error) { |
| cmd := exec.Command("system_profiler", "SPSoftwareDataType") |
| osName, err := cmd.Output() |
| if err != nil { |
| return "", err |
| } |
| return string(osName), nil |
| } |