package system import ( "bytes" "errors" "fmt" "hash/fnv" "net" "os/exec" "strings" ) // this package serves to add in wrappers for system commands to get hwinfo from the board // this package does not actually use the hwinfo command, but rather gathers hardware info from a variety of commands // command for model : // lshw -C system 2>/dev/null | head -n 1 // command for ip && mac address : // ifconfig eth0 | awk '/inet |ether / {print $2}' // can combine and dump into file using // lshw -C system 2>/dev/null | head -n 1 > hwinfo.txt && ifconfig eth0 | awk '/inet |ether / {print $2}' >> hwinfo.txt // *** will just replace info in file everytime func GetId(eth string) (int, error) { maccmd := fmt.Sprintf("ifconfig %v | awk '/ether / {print $2}'", eth) var stderr bytes.Buffer var out bytes.Buffer cmd := exec.Command("bash", "-c", maccmd) cmd.Stdout = &out cmd.Stderr = &stderr if err := cmd.Run(); err != nil { return 0, err } hash := fnv.New32a() hash.Write(out.Bytes()) id := hash.Sum32() return int(id), nil } func GetIp(eth string) (string, error) { ipcmd := fmt.Sprintf("ifconfig %v | awk '/inet / {print $2}'", eth) var stderr bytes.Buffer var out bytes.Buffer cmd := exec.Command("bash", "-c", ipcmd) cmd.Stdout = &out cmd.Stderr = &stderr if err := cmd.Run(); err != nil { return "", err } ip := strings.Trim(out.String(), " \n") return ip, nil } func GetPort() (int, error) { if addr, err := net.ResolveTCPAddr("tcp", ":0"); err != nil { return 0, err } else if lis, err := net.ListenTCP("tcp", addr); err != nil { return 0, err } else { defer lis.Close() return lis.Addr().(*net.TCPAddr).Port, nil } } func GetBus() (int, error) { bus := map[string]int{"raspberrypi": 1, "beaglebone": 2} devname := "lshw -C system 2>/dev/null | head -n 1" var stderr, out bytes.Buffer cmd := exec.Command("bash", "-c", devname) cmd.Stdout = &out cmd.Stderr = &stderr if err := cmd.Run(); err != nil { return 0, err } b := out.String() b = strings.Trim(b, " \n") if bs, ok := bus[b]; !ok { return 0, errors.New(fmt.Sprintf("No bus for dev %v", b)) } else { return bs, nil } } func GetModel() (string, error) { devname := "lshw -C system 2>/dev/null | head -n 1" var stderr, out bytes.Buffer cmd := exec.Command("bash", "-c", devname) cmd.Stdout = &out cmd.Stderr = &stderr if err := cmd.Run(); err != nil { return "", err } b := out.String() b = strings.Trim(b, " \n") return b, nil } func Get() error { // responsible for filling out struct //bus := map[string]int{"raspberrypi":1,"beaglebone":2} // eventually will replace this with a config file ipcmd := "ifconfig eth0 | awk '/inet / {print $2}'" maccmd := "ifconfig eth0 | awk '/ether / {print $2}'" devcmd := "lshw -C system 2>/dev/null | head -n 1" res := [3]bytes.Buffer{} var stderr bytes.Buffer cmds := []string{ipcmd, maccmd, devcmd} for i, c := range cmds { cmd := exec.Command("bash", "-c", c) cmd.Stdout = &res[i] cmd.Stderr = &stderr err := cmd.Run() if err != nil { return err } } // formatting ip := res[0].String() ip = strings.Trim(ip, " \n") hash := fnv.New32a() hash.Write(res[1].Bytes()) b := res[2].String() b = strings.Trim(b, " \n") return nil }