github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/pkg/parsers/kernel/kernel_darwin.go (about) 1 //go:build darwin 2 // +build darwin 3 4 // Package kernel provides helper function to get, parse and compare kernel 5 // versions for different platforms. 6 package kernel // import "github.com/docker/docker/pkg/parsers/kernel" 7 8 import ( 9 "fmt" 10 "os/exec" 11 "strings" 12 ) 13 14 // GetKernelVersion gets the current kernel version. 15 func GetKernelVersion() (*VersionInfo, error) { 16 osName, err := getSPSoftwareDataType() 17 if err != nil { 18 return nil, err 19 } 20 release, err := getRelease(osName) 21 if err != nil { 22 return nil, err 23 } 24 return ParseRelease(release) 25 } 26 27 // getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version 28 func getRelease(osName string) (string, error) { 29 var release string 30 data := strings.Split(osName, "\n") 31 for _, line := range data { 32 if !strings.Contains(line, "Kernel Version") { 33 continue 34 } 35 // It has the format like ' Kernel Version: Darwin 14.5.0' 36 content := strings.SplitN(line, ":", 2) 37 if len(content) != 2 { 38 return "", fmt.Errorf("Kernel Version is invalid") 39 } 40 41 prettyNames := strings.SplitN(strings.TrimSpace(content[1]), " ", 2) 42 43 if len(prettyNames) != 2 { 44 return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ") 45 } 46 release = prettyNames[1] 47 } 48 49 return release, nil 50 } 51 52 func getSPSoftwareDataType() (string, error) { 53 cmd := exec.Command("system_profiler", "SPSoftwareDataType") 54 osName, err := cmd.Output() 55 if err != nil { 56 return "", err 57 } 58 return string(osName), nil 59 }