mirror of
https://github.com/gocsaf/csaf.git
synced 2025-12-22 11:55:40 +01:00
Add time range to checker report.
This commit is contained in:
parent
b6e5af9b49
commit
873eb4879b
5 changed files with 54 additions and 24 deletions
|
|
@ -13,7 +13,6 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v2/internal/filter"
|
"github.com/csaf-poc/csaf_distribution/v2/internal/filter"
|
||||||
"github.com/csaf-poc/csaf_distribution/v2/internal/models"
|
"github.com/csaf-poc/csaf_distribution/v2/internal/models"
|
||||||
|
|
@ -49,7 +48,7 @@ type config struct {
|
||||||
Config string `short:"c" long:"config" description:"Path to config TOML file" value-name:"TOML-FILE" toml:"-"`
|
Config string `short:"c" long:"config" description:"Path to config TOML file" value-name:"TOML-FILE" toml:"-"`
|
||||||
|
|
||||||
clientCerts []tls.Certificate
|
clientCerts []tls.Certificate
|
||||||
ageAccept func(time.Time) bool
|
ageAccept *models.TimeRange
|
||||||
ignorePattern filter.PatternMatcher
|
ignorePattern filter.PatternMatcher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -156,14 +155,6 @@ func (cfg *config) prepareCertificates() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// acceptYears returns a filter that accepts advisories from the last years.
|
|
||||||
func acceptYears(years uint) func(time.Time) bool {
|
|
||||||
good := time.Now().AddDate(-int(years), 0, 0)
|
|
||||||
return func(t time.Time) bool {
|
|
||||||
return !t.Before(good)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// prepareTimeRangeFilter sets up the filter in which time range
|
// prepareTimeRangeFilter sets up the filter in which time range
|
||||||
// advisory should be considered for checking.
|
// advisory should be considered for checking.
|
||||||
func (cfg *config) prepareTimeRangeFilter() error {
|
func (cfg *config) prepareTimeRangeFilter() error {
|
||||||
|
|
@ -172,10 +163,11 @@ func (cfg *config) prepareTimeRangeFilter() error {
|
||||||
return errors.New(`"timerange" and "years" are both configured: only one allowed`)
|
return errors.New(`"timerange" and "years" are both configured: only one allowed`)
|
||||||
|
|
||||||
case cfg.Years != nil:
|
case cfg.Years != nil:
|
||||||
cfg.ageAccept = acceptYears(*cfg.Years)
|
years := models.NYears(*cfg.Years)
|
||||||
|
cfg.ageAccept = &years
|
||||||
|
|
||||||
case cfg.Range != nil:
|
case cfg.Range != nil:
|
||||||
cfg.ageAccept = cfg.Range.Contains
|
cfg.ageAccept = cfg.Range
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -243,6 +243,7 @@ func (p *processor) run(domains []string) (*Report, error) {
|
||||||
report := Report{
|
report := Report{
|
||||||
Date: ReportTime{Time: time.Now().UTC()},
|
Date: ReportTime{Time: time.Now().UTC()},
|
||||||
Version: util.SemVersion,
|
Version: util.SemVersion,
|
||||||
|
TimeRange: p.cfg.ageAccept,
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, d := range domains {
|
for _, d := range domains {
|
||||||
|
|
@ -545,8 +546,8 @@ func (p *processor) rolieFeedEntries(feed string) ([]csaf.AdvisoryFile, error) {
|
||||||
rfeed.Entries(func(entry *csaf.Entry) {
|
rfeed.Entries(func(entry *csaf.Entry) {
|
||||||
|
|
||||||
// Filter if we have date checking.
|
// Filter if we have date checking.
|
||||||
if p.cfg.ageAccept != nil {
|
if accept := p.cfg.ageAccept; accept != nil {
|
||||||
if pub := time.Time(entry.Published); !pub.IsZero() && !p.cfg.ageAccept(pub) {
|
if pub := time.Time(entry.Published); !pub.IsZero() && !accept.Contains(pub) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -666,7 +667,7 @@ func (p *processor) integrity(
|
||||||
if m := yearFromURL.FindStringSubmatch(u); m != nil {
|
if m := yearFromURL.FindStringSubmatch(u); m != nil {
|
||||||
year, _ := strconv.Atoi(m[1])
|
year, _ := strconv.Atoi(m[1])
|
||||||
// Check if we are in checking time interval.
|
// Check if we are in checking time interval.
|
||||||
if p.cfg.ageAccept != nil && !p.cfg.ageAccept(
|
if accept := p.cfg.ageAccept; accept != nil && !accept.Contains(
|
||||||
time.Date(
|
time.Date(
|
||||||
year, 12, 31, // Assume last day of year.
|
year, 12, 31, // Assume last day of year.
|
||||||
23, 59, 59, 0, // 23:59:59
|
23, 59, 59, 0, // 23:59:59
|
||||||
|
|
@ -972,7 +973,7 @@ func (p *processor) checkChanges(base string, mask whereType) error {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
// Apply date range filtering.
|
// Apply date range filtering.
|
||||||
if p.cfg.ageAccept != nil && !p.cfg.ageAccept(t) {
|
if accept := p.cfg.ageAccept; accept != nil && !accept.Contains(t) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
path := r[pathColumn]
|
path := r[pathColumn]
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,7 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/csaf-poc/csaf_distribution/v2/csaf"
|
"github.com/csaf-poc/csaf_distribution/v2/csaf"
|
||||||
|
"github.com/csaf-poc/csaf_distribution/v2/internal/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MessageType is the kind of the message.
|
// MessageType is the kind of the message.
|
||||||
|
|
@ -63,6 +64,7 @@ type Report struct {
|
||||||
Domains []*Domain `json:"domains,omitempty"`
|
Domains []*Domain `json:"domains,omitempty"`
|
||||||
Version string `json:"version,omitempty"`
|
Version string `json:"version,omitempty"`
|
||||||
Date ReportTime `json:"date,omitempty"`
|
Date ReportTime `json:"date,omitempty"`
|
||||||
|
TimeRange *models.TimeRange `json:"timerange,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// MarshalText implements the encoding.TextMarshaller interface.
|
// MarshalText implements the encoding.TextMarshaller interface.
|
||||||
|
|
|
||||||
|
|
@ -62,8 +62,26 @@
|
||||||
{{ end }}
|
{{ end }}
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
Date of run: <time datetime="{{.Date.Format "2006-01-02T15:04:05Z"}}">{{ .Date.Local.Format "Monday, 02 Jan 2006 15:04:05 MST" }}</time>
|
<fieldset>
|
||||||
csaf_checker v<span class="version">{{ .Version }}</span>
|
<legend>Runtime</legend>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td><strong>Date of run:</strong></td>
|
||||||
|
<td><time datetime="{{ .Date.Format "2006-01-02T15:04:05Z"}}">{{ .Date.Local.Format "Monday, 02 Jan 2006 15:04:05 MST" }}</time></td>
|
||||||
|
</tr>
|
||||||
|
{{ if .TimeRange }}{{ with .TimeRange }}
|
||||||
|
<tr>
|
||||||
|
<td><strong>Time range:</strong></td>
|
||||||
|
<td><time datetime="{{ (index . 0).Format "2006-01-02T15:04:05Z"}}">{{ (index . 0).Local.Format "Monday, 02 Jan 2006 15:04:05 MST" }}</time> -
|
||||||
|
<time datetime="{{ (index . 1).Format "2006-01-02T15:04:05Z"}}">{{ (index . 1).Local.Format "Monday, 02 Jan 2006 15:04:05 MST" }}</time></td>
|
||||||
|
</tr>
|
||||||
|
{{ end }}{{ end }}
|
||||||
|
<tr>
|
||||||
|
<td><strong>Version:</strong></td>
|
||||||
|
<td>csaf_checker v<span class="version">{{ .Version }}</span></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</fieldset>
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -27,10 +28,17 @@ func NewTimeInterval(a, b time.Time) TimeRange {
|
||||||
return TimeRange{a, b}
|
return TimeRange{a, b}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NYears returns a time interval spanning the last years.
|
||||||
|
func NYears(years uint) TimeRange {
|
||||||
|
now := time.Now()
|
||||||
|
start := now.AddDate(-int(years), 0, 0)
|
||||||
|
return NewTimeInterval(start, now)
|
||||||
|
}
|
||||||
|
|
||||||
// guessDate tries to guess an RFC 3339 date time from a given string.
|
// guessDate tries to guess an RFC 3339 date time from a given string.
|
||||||
func guessDate(s string) (time.Time, bool) {
|
func guessDate(s string) (time.Time, bool) {
|
||||||
for _, layout := range []string{
|
for _, layout := range []string{
|
||||||
"2006-01-02T15:04:05Z07:00",
|
time.RFC3339,
|
||||||
"2006-01-02T15:04:05",
|
"2006-01-02T15:04:05",
|
||||||
"2006-01-02T15:04",
|
"2006-01-02T15:04",
|
||||||
"2006-01-02T15",
|
"2006-01-02T15",
|
||||||
|
|
@ -50,6 +58,15 @@ func (tr *TimeRange) UnmarshalText(text []byte) error {
|
||||||
return tr.UnmarshalFlag(string(text))
|
return tr.UnmarshalFlag(string(text))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MarshalJSON implements [encoding/json.Marshaler].
|
||||||
|
func (tr TimeRange) MarshalJSON() ([]byte, error) {
|
||||||
|
s := []string{
|
||||||
|
tr[0].Format(time.RFC3339),
|
||||||
|
tr[1].Format(time.RFC3339),
|
||||||
|
}
|
||||||
|
return json.Marshal(s)
|
||||||
|
}
|
||||||
|
|
||||||
// UnmarshalFlag implements [go-flags/Unmarshaler].
|
// UnmarshalFlag implements [go-flags/Unmarshaler].
|
||||||
func (tr *TimeRange) UnmarshalFlag(s string) error {
|
func (tr *TimeRange) UnmarshalFlag(s string) error {
|
||||||
s = strings.TrimSpace(s)
|
s = strings.TrimSpace(s)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue