| //go: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) { |
| for _, line := range strings.Split(osName, "\n") { |
| if !strings.Contains(line, "Kernel Version") { |
| continue |
| } |
| // It has the format like ' Kernel Version: Darwin 14.5.0' |
| _, ver, ok := strings.Cut(line, ":") |
| if !ok { |
| return "", fmt.Errorf("kernel Version is invalid") |
| } |
| |
| _, release, ok := strings.Cut(strings.TrimSpace(ver), " ") |
| if !ok { |
| return "", fmt.Errorf("kernel version needs to be 'Darwin x.x.x'") |
| } |
| return release, nil |
| } |
| |
| return "", nil |
| } |
| |
| func getSPSoftwareDataType() (string, error) { |
| cmd := exec.Command("system_profiler", "SPSoftwareDataType") |
| osName, err := cmd.Output() |
| if err != nil { |
| return "", err |
| } |
| return string(osName), nil |
| } |