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  }