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