1
0
Fork 0
mirror of https://github.com/gocsaf/csaf.git synced 2025-12-22 11:55:40 +01:00

support publishers in aggregator

This commit is contained in:
Sascha L. Teichmann 2022-08-16 11:55:56 +02:00
parent 8e0812c82f
commit b608746fac
2 changed files with 47 additions and 14 deletions

View file

@ -31,6 +31,7 @@ const (
defaultFolder = "/var/www" defaultFolder = "/var/www"
defaultWeb = "/var/www/html" defaultWeb = "/var/www/html"
defaultDomain = "https://example.com" defaultDomain = "https://example.com"
defaultUpdateInterval = "on best effort"
) )
type provider struct { type provider struct {
@ -44,6 +45,9 @@ type provider struct {
// ServiceDocument incidates if we should create a service.json document. // ServiceDocument incidates if we should create a service.json document.
ServiceDocument *bool `toml:"create_service_document"` ServiceDocument *bool `toml:"create_service_document"`
AggregatoryCategory *csaf.AggregatorCategory `toml:"category"` AggregatoryCategory *csaf.AggregatorCategory `toml:"category"`
// UpdateInterval is as the mandatory `update_interval` if this is a publisher.
UpdateInterval *string `toml:"update_interval"`
} }
type config struct { type config struct {
@ -81,6 +85,10 @@ type config struct {
// ServiceDocument incidates if we should create a service.json document. // ServiceDocument incidates if we should create a service.json document.
ServiceDocument bool `toml:"create_service_document"` ServiceDocument bool `toml:"create_service_document"`
// UpdateInterval is used for publishers a the mandatory field
// 'update_interval'.
UpdateInterval *string
keyMu sync.Mutex keyMu sync.Mutex
key *crypto.Key key *crypto.Key
keyErr error keyErr error
@ -96,6 +104,17 @@ func (c *config) tooOldForInterims() func(time.Time) bool {
return func(t time.Time) bool { return t.Before(from) } return func(t time.Time) bool { return t.Before(from) }
} }
// updateInterval returns the update interval of a publisher.
func (p *provider) updateInterval(c *config) string {
if p.UpdateInterval != nil {
return *p.UpdateInterval
}
if c.UpdateInterval != nil {
return *c.UpdateInterval
}
return defaultUpdateInterval
}
// serviceDocument tells if we should generate a service document for a // serviceDocument tells if we should generate a service document for a
// given provider. // given provider.
func (p *provider) serviceDocument(c *config) bool { func (p *provider) serviceDocument(c *config) bool {

View file

@ -14,6 +14,7 @@ import (
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"sync" "sync"
"time" "time"
@ -128,8 +129,8 @@ func (p *processor) full() error {
wg.Wait() wg.Wait()
// Assemble aggregator data structure. // Assemble aggregator data structure.
var providers []*csaf.AggregatorCSAFProvider
csafProviders := make([]*csaf.AggregatorCSAFProvider, 0, len(jobs)) var publishers []*csaf.AggregatorCSAFPublisher
for i := range jobs { for i := range jobs {
j := &jobs[i] j := &jobs[i]
@ -142,10 +143,22 @@ func (p *processor) full() error {
"error: '%s' does not produce any result.\n", j.provider.Name) "error: '%s' does not produce any result.\n", j.provider.Name)
continue continue
} }
csafProviders = append(csafProviders, j.aggregatorProvider)
// "https://" signals a publisher.
if strings.HasPrefix(j.provider.Domain, "https://") {
var pub csaf.AggregatorCSAFPublisher
pub.FromProvider(j.aggregatorProvider)
pub.UpdateInterval = j.provider.updateInterval(p.cfg)
publishers = append(publishers, &pub)
} else {
providers = append(providers, j.aggregatorProvider)
}
} }
if len(csafProviders) == 0 { if len(providers)+len(publishers) == 0 {
return errors.New("all jobs failed, stopping") return errors.New("all jobs failed, stopping")
} }
@ -159,7 +172,8 @@ func (p *processor) full() error {
Aggregator: &p.cfg.Aggregator, Aggregator: &p.cfg.Aggregator,
Version: &version, Version: &version,
CanonicalURL: &canonicalURL, CanonicalURL: &canonicalURL,
CSAFProviders: csafProviders, CSAFProviders: providers,
CSAFPublishers: publishers,
LastUpdated: &lastUpdated, LastUpdated: &lastUpdated,
} }