dotcloud/docker

View on GitHub
pkg/parsers/kernel/kernel_darwin.go

Summary

Maintainability
A
0 mins
Test Coverage
//go: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
}