blob: afab88e54715f54c0d7be12c0286c64f784d08a8 [file] [log] [blame]
package main
import (
"context"
"regexp"
"strings"
"go.skia.org/infra/go/executil"
"go.skia.org/infra/go/skerr"
)
type arpNameGetter struct{}
func newArpNameGetter() arpNameGetter {
return arpNameGetter{}
}
// Example line with named groups annotated:
// skia-rpi-072 ether b8:27:eb:bc:62:2f C eno1
// <hostname > <mac_address >
var arpLineMatcher = regexp.MustCompile(`^(?P<hostname>\S+)\s+ether\s+(?P<mac_address>\S+)\s+`)
// GetDeviceNamesAddresses implements the nameAddressGetter interface.
func (a arpNameGetter) GetDeviceNamesAddresses(ctx context.Context) ([]poeDevice, error) {
cmd := executil.CommandContext(ctx, "arp")
out, err := cmd.CombinedOutput()
if err != nil {
return nil, skerr.Wrap(err)
}
var devices []poeDevice
lines := strings.Split(string(out), "\n")
for _, line := range lines {
if matches := arpLineMatcher.FindStringSubmatch(line); matches != nil {
devices = append(devices, poeDevice{
Hostname: matches[1],
MACAddress: strings.ToUpper(matches[2]),
})
}
}
return devices, nil
}
var _ nameAddressGetter = arpNameGetter{}