diff --git a/collector/collector.go b/collector/collector.go index 397dca0..c8f96a7 100644 --- a/collector/collector.go +++ b/collector/collector.go @@ -17,6 +17,7 @@ package collector import ( "bufio" + "errors" "fmt" "log" "os" @@ -256,6 +257,13 @@ func question(name string) dns.Question { } func parseLease(line string) (*lease, error) { + if strings.TrimSpace(line) == "" { + return nil, errSkipLease + } + if strings.HasPrefix(line, "duid ") || strings.HasPrefix(line, "vendorclass ") { + return nil, errSkipLease + } + arr := strings.Fields(line) if got, want := len(arr), 5; got != want { return nil, fmt.Errorf("illegal lease: expected %d fields, got %d", want, got) @@ -275,6 +283,8 @@ func parseLease(line string) (*lease, error) { }, nil } +var errSkipLease = errors.New("skip lease line") + // Read the DHCP lease file with the given path and return a list of leases. // // The format of the DHCP lease file written by dnsmasq is not formally @@ -303,7 +313,11 @@ func readLeaseFile(path string) ([]lease, error) { activeLeases := []lease{} for i := 1; scanner.Scan(); i++ { leaseLine := scanner.Text() - if activeLease, err := parseLease(leaseLine); err == nil { + activeLease, err := parseLease(leaseLine) + if errors.Is(err, errSkipLease) { + continue + } + if err == nil { activeLeases = append(activeLeases, *activeLease) } else { log.Printf("Error parsing lease (%d, %q): %s", i, leaseLine, err) diff --git a/collector/collector_test.go b/collector/collector_test.go index ce96e02..8aaad85 100644 --- a/collector/collector_test.go +++ b/collector/collector_test.go @@ -15,6 +15,7 @@ package collector import ( + "errors" "fmt" "io" "net" @@ -222,3 +223,17 @@ func fetchMetrics(t *testing.T, c *Collector) map[string]string { } return metrics } + +func TestParseLeaseSkipsMetadataLines(t *testing.T) { + t.Parallel() + + for _, line := range []string{ + "duid 00:01:00:01:ff:6f:ff:6e:aa:cf:ff:af:4a:8b", + "vendorclass something", + " ", + } { + if lease, err := parseLease(line); !errors.Is(err, errSkipLease) || lease != nil { + t.Fatalf("parseLease(%q) = (%v, %v), want skip error", line, lease, err) + } + } +} diff --git a/collector/testdata/dnsmasq.leases b/collector/testdata/dnsmasq.leases index e448cc1..bab9ee2 100644 --- a/collector/testdata/dnsmasq.leases +++ b/collector/testdata/dnsmasq.leases @@ -1,2 +1,5 @@ +duid 00:01:00:01:ff:6f:ff:6e:aa:cf:ff:af:4a:8b +vendorclass some-vendor-info 1625595932 00:00:00:00:00:00 10.10.10.10 host-1 00:00:00:00:00:00 -0 00:00:00:00:00:01 10.10.10.11 host-2 00:00:00:00:00:01 \ No newline at end of file +0 00:00:00:00:00:01 10.10.10.11 host-2 00:00:00:00:00:01 +