func extractComponent(component string, re *regexp.Regexp) (string, bool) { // TODO: make sure there's no extra text before the match of the regexp if re.MatchString(component) { value := strings.TrimSpace(re.ReplaceAllLiteralString(component, "")) return value, true } else { return "", false } }
// outBytes takes the proc.net.dev string, and the interface name, and returns the bytes field func outBytes(procNetDev, iface string, multipleSpaceRegex *regexp.Regexp) (int64, error) { if procNetDev == "" { return 0, fmt.Errorf("procNetDev empty") } if iface == "" { return 0, fmt.Errorf("iface empty") } ifacePos := strings.Index(procNetDev, iface) if ifacePos == -1 { return 0, fmt.Errorf("interface '%s' not found in proc.net.dev '%s'", iface, procNetDev) } procNetDevIfaceBytes := procNetDev[ifacePos+len(iface)+1:] procNetDevIfaceBytes = strings.TrimLeft(procNetDevIfaceBytes, " ") procNetDevIfaceBytes = multipleSpaceRegex.ReplaceAllLiteralString(procNetDevIfaceBytes, " ") procNetDevIfaceBytesArr := strings.Split(procNetDevIfaceBytes, " ") // this could be made faster with a custom function (DFA?) that splits and ignores duplicate spaces at the same time if len(procNetDevIfaceBytesArr) < 10 { return 0, fmt.Errorf("proc.net.dev iface '%v' unknown format '%s'", iface, procNetDev) } procNetDevIfaceBytes = procNetDevIfaceBytesArr[8] return strconv.ParseInt(procNetDevIfaceBytes, 10, 64) }