//go:build darwin // +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 }