Browse Source

make pkg/parsers support darwin and solaris

Signed-off-by: allencloud <allen.sun@daocloud.io>
allencloud 9 years ago
parent
commit
a7f551359a

+ 0 - 26
pkg/parsers/kernel/kernel.go

@@ -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 (

+ 56 - 0
pkg/parsers/kernel/kernel_darwin.go

@@ -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
+}

+ 34 - 0
pkg/parsers/kernel/kernel_unix.go

@@ -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))
+}

+ 2 - 0
pkg/parsers/kernel/kernel_windows.go

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

+ 11 - 4
pkg/parsers/operatingsystem/operatingsystem_freebsd.go → pkg/parsers/operatingsystem/operatingsystem_unix.go

@@ -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
-	return "", errors.New("Cannot detect OS version")
+	cmd := exec.Command("uname", "-s")
+	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")
 }
 }