diff options
Diffstat (limited to 'service_report.go')
| -rw-r--r-- | service_report.go | 44 |
1 files changed, 42 insertions, 2 deletions
diff --git a/service_report.go b/service_report.go index 291cd2b..7aee321 100644 --- a/service_report.go +++ b/service_report.go @@ -3,6 +3,14 @@ package lilin +import ( + "encoding/csv" + "fmt" + "log" + "os" + "path/filepath" +) + // historyKeepSize maximum report to keep in history. const historyKeepSize = 120 @@ -11,17 +19,44 @@ const historyMax = historyKeepSize * 2 // ServiceReport contains the scan report for single service. type ServiceReport struct { + logf *os.File + writer *csv.Writer + logPath string + Name string Last ScanReport History []ScanReport } -func NewServiceReport(name string) (svcReport *ServiceReport) { +func NewServiceReport(opts ServerOptions, name string) ( + svcReport *ServiceReport, err error, +) { + var logp = `NewServiceReport` + svcReport = &ServiceReport{ + logPath: filepath.Join(opts.logServiceDir, name+`.log`), Name: name, History: make([]ScanReport, 0, historyMax), } - return svcReport + + svcReport.logf, err = os.OpenFile(svcReport.logPath, + os.O_WRONLY|os.O_CREATE, 0600) + if err != nil { + return nil, fmt.Errorf(`%s: %w`, logp, err) + } + + svcReport.writer = csv.NewWriter(svcReport.logf) + + return svcReport, nil +} + +// Close release any resources opened by report. +func (svcReport *ServiceReport) Close() (err error) { + err = svcReport.logf.Close() + if err != nil { + return fmt.Errorf(`Close: %w`, err) + } + return nil } func (svcReport *ServiceReport) Store(scanReport ScanReport) { @@ -32,4 +67,9 @@ func (svcReport *ServiceReport) Store(scanReport ScanReport) { copy(svcReport.History, svcReport.History[start:]) svcReport.History = svcReport.History[:historyKeepSize-1] } + var record = scanReport.toCSV() + var err = svcReport.writer.Write(record) + if err != nil { + log.Printf(`Store: %s`, err) + } } |
