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  }