diff --git a/systemd/checks.go b/systemd/checks.go index 7b092c7..94cd1a3 100644 --- a/systemd/checks.go +++ b/systemd/checks.go @@ -69,6 +69,16 @@ type ClamConfDetails struct { DailyCld time.Time } +func parseDate(src string) (time.Time, error) { + const layout = "Mon Jan 2 15:04:05 2006" + return time.Parse(layout, src) +} + +func parseDailyCvdLine(line string) []string { + re := regexp.MustCompile(`^daily.c[l|v]d: version (.*), sigs: (.*), built on (.*)`) + return re.FindStringSubmatch(line) +} + func GetClamConfDetails() (ClamConfDetails, error) { cmd := exec.Command("clamconf") var out bytes.Buffer @@ -78,17 +88,15 @@ func GetClamConfDetails() (ClamConfDetails, error) { return ClamConfDetails{}, errors.New(fmt.Sprintf("%v", err)) } - const layout = "Mon Jan 02 15:04:05 2006" lines := strings.Split(out.String(), "\n") - re := regexp.MustCompile(`^daily.c[l|v]d: version (.*), sigs: (.*), built on (.*)`) for i := range lines { line := lines[i] - finds := re.FindStringSubmatch(line) + finds := parseDailyCvdLine(line) if len(finds) > 0 { cd := ClamConfDetails{} - cd.DailyCld, _ = time.Parse(layout, finds[3]) + cd.DailyCld, _ = parseDate(finds[3]) cd.version = finds[1] cd.sigs = finds[2] return cd, nil diff --git a/systemd/checks_test.go b/systemd/checks_test.go index a272376..8fda74d 100644 --- a/systemd/checks_test.go +++ b/systemd/checks_test.go @@ -70,3 +70,58 @@ func fileErrorCheck(t *testing.T, when time.Time) error { return DbFileAgeCheck(clamavDbFile) } + +func TestDatesParsing(t *testing.T) { + // extra space before day + if _, err := parseDate("Mon Jul 1 10:40:06 2024"); err != nil { + t.Errorf("%v", err) + } + + // no extra space before day + if _, err := parseDate("Mon Jul 1 10:40:06 2024"); err != nil { + t.Errorf("%v", err) + } + + if _, err := parseDate("Mon Jul 11 10:40:06 2024"); err != nil { + t.Errorf("%v", err) + } + + if _, err := parseDate("invalid"); err == nil { + t.Errorf("should have been an invalid date%s", "invalid") + } +} + +func parseDailyLine(t *testing.T, line string) { + var results = parseDailyCvdLine(line) + if len(results) != 4 { + t.Errorf("should have 4 results: %v", results) + } + + cd := ClamConfDetails{} + cd.DailyCld, _ = parseDate(results[3]) + cd.version = results[1] + cd.sigs = results[2] + + if cd.version != "27323" { + t.Errorf("version should have been 27323: %v", cd.version) + } + + if cd.sigs != "2063707" { + t.Errorf("sigs should have been 2063707: %v", cd.sigs) + } + + date, _ := parseDate("Mon Jul 1 10:40:06 2024") + if cd.DailyCld != date { + t.Errorf("sigs should have been Mon Jul 1 10:40:06 2024: %v", cd.DailyCld) + } +} + +func TestParseDailyCldLine(t *testing.T) { + var line = "daily.cld: version 27323, sigs: 2063707, built on Mon Jul 1 10:40:06 2024" + parseDailyLine(t, line) +} + +func TestParseDailyCvdLine(t *testing.T) { + var line = "daily.cvd: version 27323, sigs: 2063707, built on Mon Jul 1 10:40:06 2024" + parseDailyLine(t, line) +}