make pkg/parsers support darwin and solaris

Signed-off-by: allencloud <allen.sun@daocloud.io>
This commit is contained in:
allencloud 2016-05-06 18:03:01 +08:00
parent 83be58f17e
commit dadbfbe65a
5 changed files with 103 additions and 30 deletions

View file

@ -5,7 +5,6 @@
package kernel package kernel
import ( import (
"bytes"
"errors" "errors"
"fmt" "fmt"
) )
@ -46,31 +45,6 @@ func CompareKernelVersion(a, b VersionInfo) int {
return 0 return 0
} }
// GetKernelVersion gets the current kernel version.
func GetKernelVersion() (*VersionInfo, error) {
var (
err error
)
uts, err := uname()
if err != nil {
return nil, err
}
release := make([]byte, len(uts.Release))
i := 0
for _, c := range uts.Release {
release[i] = byte(c)
i++
}
// Remove the \x00 from the release for Atoi to parse correctly
release = release[:bytes.IndexByte(release, 0)]
return ParseRelease(string(release))
}
// ParseRelease parses a string and creates a VersionInfo based on it. // ParseRelease parses a string and creates a VersionInfo based on it.
func ParseRelease(release string) (*VersionInfo, error) { func ParseRelease(release string) (*VersionInfo, error) {
var ( var (

View file

@ -0,0 +1,56 @@
// +build darwin
// Package kernel provides helper function to get, parse and compare kernel
// versions for different platforms.
package kernel
import (
"fmt"
"os/exec"
"strings"
"github.com/mattn/go-shellwords"
)
// GetKernelVersion gets the current kernel version.
func GetKernelVersion() (*VersionInfo, error) {
release, err := getRelease()
if err != nil {
return nil, err
}
return ParseRelease(release)
}
// getRelease uses `system_profiler SPSoftwareDataType` to get OSX kernel version
func getRelease() (string, error) {
cmd := exec.Command("system_profiler", "SPSoftwareDataType")
osName, err := cmd.Output()
if err != nil {
return "", err
}
var release string
data := strings.Split(string(osName), "\n")
for _, line := range data {
if strings.Contains(line, "Kernel Version") {
// It has the format like ' Kernel Version: Darwin 14.5.0'
content := strings.SplitN(line, ":", 2)
if len(content) != 2 {
return "", fmt.Errorf("Kernel Version is invalid")
}
prettyNames, err := shellwords.Parse(content[1])
if err != nil {
return "", fmt.Errorf("Kernel Version is invalid: %s", err.Error())
}
if len(prettyNames) != 2 {
return "", fmt.Errorf("Kernel Version needs to be 'Darwin x.x.x' ")
}
release = prettyNames[1]
}
}
return release, nil
}

View file

@ -0,0 +1,34 @@
// +build linux freebsd solaris
// Package kernel provides helper function to get, parse and compare kernel
// versions for different platforms.
package kernel
import (
"bytes"
)
// GetKernelVersion gets the current kernel version.
func GetKernelVersion() (*VersionInfo, error) {
var (
err error
)
uts, err := uname()
if err != nil {
return nil, err
}
release := make([]byte, len(uts.Release))
i := 0
for _, c := range uts.Release {
release[i] = byte(c)
i++
}
// Remove the \x00 from the release for Atoi to parse correctly
release = release[:bytes.IndexByte(release, 0)]
return ParseRelease(string(release))
}

View file

@ -1,3 +1,5 @@
// +build windows
package kernel package kernel
import ( import (

View file

@ -1,18 +1,25 @@
// +build freebsd darwin
package operatingsystem package operatingsystem
import ( import (
"errors" "errors"
"os/exec"
) )
// GetOperatingSystem gets the name of the current operating system. // GetOperatingSystem gets the name of the current operating system.
func GetOperatingSystem() (string, error) { func GetOperatingSystem() (string, error) {
// TODO: Implement OS detection cmd := exec.Command("uname", "-s")
return "", errors.New("Cannot detect OS version") osName, err := cmd.Output()
if err != nil {
return "", err
}
return string(osName), nil
} }
// IsContainerized returns true if we are running inside a container. // IsContainerized returns true if we are running inside a container.
// No-op on FreeBSD, always returns false. // No-op on FreeBSD and Darwin, always returns false.
func IsContainerized() (bool, error) { func IsContainerized() (bool, error) {
// TODO: Implement jail detection // TODO: Implement jail detection for freeBSD
return false, errors.New("Cannot detect if we are in container") return false, errors.New("Cannot detect if we are in container")
} }