make pkg/parsers support darwin and solaris
Signed-off-by: allencloud <allen.sun@daocloud.io>
This commit is contained in:
parent
83be58f17e
commit
dadbfbe65a
5 changed files with 103 additions and 30 deletions
|
@ -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
parsers/kernel/kernel_darwin.go
Normal file
56
parsers/kernel/kernel_darwin.go
Normal 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
|
||||||
|
}
|
34
parsers/kernel/kernel_unix.go
Normal file
34
parsers/kernel/kernel_unix.go
Normal 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))
|
||||||
|
}
|
|
@ -1,3 +1,5 @@
|
||||||
|
// +build windows
|
||||||
|
|
||||||
package kernel
|
package kernel
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|
|
@ -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")
|
||||||
}
|
}
|
Loading…
Reference in a new issue