2014-03-03 00:51:23 +05:30
|
|
|
package embd
|
2014-02-27 04:24:53 +05:30
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os/exec"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Host int
|
|
|
|
|
|
|
|
const (
|
2014-03-03 00:51:23 +05:30
|
|
|
HostNull Host = iota
|
|
|
|
HostRPi
|
|
|
|
HostBBB
|
|
|
|
HostCubieTruck
|
|
|
|
HostGalileo
|
2014-02-27 04:24:53 +05:30
|
|
|
)
|
|
|
|
|
|
|
|
func execOutput(name string, arg ...string) (output string, err error) {
|
|
|
|
var out []byte
|
|
|
|
if out, err = exec.Command(name, arg...).Output(); err != nil {
|
|
|
|
return
|
|
|
|
}
|
2014-03-02 19:39:04 +05:30
|
|
|
output = strings.TrimSpace(string(out))
|
2014-02-27 04:24:53 +05:30
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func nodeName() (string, error) {
|
|
|
|
return execOutput("uname", "-n")
|
|
|
|
}
|
|
|
|
|
2014-03-02 01:54:01 +05:30
|
|
|
func parseVersion(str string) (major, minor, patch int, err error) {
|
|
|
|
parts := strings.Split(str, ".")
|
|
|
|
len := len(parts)
|
2014-02-27 04:24:53 +05:30
|
|
|
|
|
|
|
if major, err = strconv.Atoi(parts[0]); err != nil {
|
2014-03-02 01:54:01 +05:30
|
|
|
return 0, 0, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
if minor, err = strconv.Atoi(parts[1]); err != nil {
|
2014-03-02 01:54:01 +05:30
|
|
|
return 0, 0, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
2014-03-02 01:54:01 +05:30
|
|
|
if len > 2 {
|
|
|
|
part := parts[2]
|
|
|
|
part = strings.TrimSuffix(part, "+")
|
|
|
|
if patch, err = strconv.Atoi(part); err != nil {
|
|
|
|
return 0, 0, 0, err
|
|
|
|
}
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
2014-03-02 01:54:01 +05:30
|
|
|
return major, minor, patch, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func kernelVersion() (major, minor, patch int, err error) {
|
|
|
|
output, err := execOutput("uname", "-r")
|
|
|
|
if err != nil {
|
|
|
|
return 0, 0, 0, err
|
|
|
|
}
|
|
|
|
|
|
|
|
return parseVersion(output)
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
2014-03-03 00:51:23 +05:30
|
|
|
func DetectHost() (Host, int, error) {
|
2014-02-27 04:24:53 +05:30
|
|
|
major, minor, patch, err := kernelVersion()
|
|
|
|
if err != nil {
|
2014-03-03 00:51:23 +05:30
|
|
|
return HostNull, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
if major < 3 || (major == 3 && minor < 8) {
|
|
|
|
err = fmt.Errorf("embd: linux kernel versions lower than 3.8 are not supported. you have %v.%v.%v", major, minor, patch)
|
2014-03-03 00:51:23 +05:30
|
|
|
return HostNull, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
|
|
|
node, err := nodeName()
|
|
|
|
if err != nil {
|
2014-03-03 00:51:23 +05:30
|
|
|
return HostNull, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
2014-03-02 01:21:52 +05:30
|
|
|
var host Host
|
|
|
|
var rev int
|
|
|
|
|
2014-02-27 04:24:53 +05:30
|
|
|
switch node {
|
|
|
|
case "raspberrypi":
|
2014-03-03 00:51:23 +05:30
|
|
|
host = HostRPi
|
2014-02-27 04:24:53 +05:30
|
|
|
case "beaglebone":
|
2014-03-03 00:51:23 +05:30
|
|
|
host = HostBBB
|
2014-02-27 04:24:53 +05:30
|
|
|
default:
|
|
|
|
err = fmt.Errorf("embd: your host %q is not supported at this moment. please request support at https://github.com/kidoman/embd/issues", node)
|
2014-03-03 00:51:23 +05:30
|
|
|
return HostNull, 0, err
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|
|
|
|
|
2014-03-02 01:21:52 +05:30
|
|
|
return host, rev, nil
|
2014-02-27 04:24:53 +05:30
|
|
|
}
|