Index: go/src/infra/crimson/server/crimsondb/crimsondb.go |
diff --git a/go/src/infra/crimson/server/crimsondb/crimsondb.go b/go/src/infra/crimson/server/crimsondb/crimsondb.go |
index 250d165db739fbd12be27cb4c40a0cbf4d75c0c3..752e6bcfa22c4c7aae9f398ae6224769702b6239 100644 |
--- a/go/src/infra/crimson/server/crimsondb/crimsondb.go |
+++ b/go/src/infra/crimson/server/crimsondb/crimsondb.go |
@@ -45,10 +45,44 @@ func IPStringToHexString(ip string) (string, error) { |
return "0x" + hex.EncodeToString(ipb), nil |
} |
+// MacAddrStringToHexString turns a mac address into a hex string. |
+func MacAddrStringToHexString(macAddr string) (string, error) { |
+ mac, err := net.ParseMAC(macAddr) |
+ if err != nil { |
+ return "", err |
+ } |
+ return "0x" + hex.EncodeToString(mac), nil |
+} |
+ |
+// HexStringToHardwareAddr turns an hex string into a hardware address. |
+func HexStringToHardwareAddr(hexMac string) (net.HardwareAddr, error) { |
+ // 6 bytes in hex + leading '0x' |
+ if len(hexMac) < 14 { |
+ err := fmt.Errorf("parsing of hex string failed (too short: %d characters)", |
+ len(hexMac)) |
+ return net.HardwareAddr{}, err |
+ } |
+ if hexMac[:2] != "0x" { |
+ return net.HardwareAddr{}, fmt.Errorf("parsing of hex string failed: %s", hexMac) |
+ } |
+ hwAddrRaw, err := hex.DecodeString(hexMac[2:]) |
+ if err != nil { |
+ return net.HardwareAddr{}, err |
+ } |
+ hwAddr := make(net.HardwareAddr, len(hwAddrRaw)) |
+ for n := 0; n < len(hwAddrRaw); n++ { |
+ hwAddr[n] = hwAddrRaw[n] |
+ } |
+ return hwAddr, nil |
+} |
+ |
// HexStringToIP converts an hex string returned by MySQL into a net.IP structure. |
-func HexStringToIP(hexIP string) net.IP { |
+func HexStringToIP(hexIP string) (net.IP, error) { |
// TODO(pgervais): Add decent error checking. Ex: check hexIP starts with '0x'. |
- ip, _ := hex.DecodeString(hexIP[2:]) |
+ ip, err := hex.DecodeString(hexIP[2:]) |
+ if err != nil { |
+ return net.IP{}, err |
+ } |
length := 4 |
if len(ip) > 4 { |
length = 16 |
@@ -57,7 +91,7 @@ func HexStringToIP(hexIP string) net.IP { |
for n := 1; n <= len(ip); n++ { |
netIP[length-n] = ip[len(ip)-n] |
} |
- return netIP |
+ return netIP, nil |
} |
// scanIPRanges is a low-level function to scan sql results. |
@@ -67,14 +101,24 @@ func scanIPRanges(ctx context.Context, rows *sql.Rows) ([]IPRange, error) { |
for rows.Next() { |
var startIP, endIP string |
+ var ip net.IP |
ipRange := IPRange{} |
err := rows.Scan(&ipRange.Site, &ipRange.Vlan, &startIP, &endIP) |
if err != nil { // Users can't trigger that. |
logging.Errorf(ctx, "%s", err) |
return nil, err |
} |
- ipRange.StartIP = HexStringToIP(startIP).String() |
- ipRange.EndIP = HexStringToIP(endIP).String() |
+ ip, err = HexStringToIP(startIP) |
+ if err != nil { |
+ return nil, err |
+ } |
+ ipRange.StartIP = ip.String() |
+ |
+ ip, err = HexStringToIP(endIP) |
+ if err != nil { |
+ return nil, err |
+ } |
+ ipRange.EndIP = ip.String() |
ipRanges = append(ipRanges, ipRange) |
} |
err := rows.Err() |