|
|
@ -431,13 +431,7 @@ func addMetadata(ctx context.Context, datastore database.Datastore, vulnerabilit
|
|
|
|
// GetLastUpdateTime retrieves the latest successful time of update and whether
|
|
|
|
// GetLastUpdateTime retrieves the latest successful time of update and whether
|
|
|
|
// or not it's the first update.
|
|
|
|
// or not it's the first update.
|
|
|
|
func GetLastUpdateTime(datastore database.Datastore) (time.Time, bool, error) {
|
|
|
|
func GetLastUpdateTime(datastore database.Datastore) (time.Time, bool, error) {
|
|
|
|
tx, err := datastore.Begin()
|
|
|
|
lastUpdateTSS, ok, err := database.FindKeyValueAndRollback(datastore, updaterLastFlagName)
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return time.Time{}, false, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer tx.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lastUpdateTSS, ok, err := tx.FindKeyValue(updaterLastFlagName)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return time.Time{}, false, err
|
|
|
|
return time.Time{}, false, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -449,7 +443,7 @@ func GetLastUpdateTime(datastore database.Datastore) (time.Time, bool, error) {
|
|
|
|
|
|
|
|
|
|
|
|
lastUpdateTS, err := strconv.ParseInt(lastUpdateTSS, 10, 64)
|
|
|
|
lastUpdateTS, err := strconv.ParseInt(lastUpdateTSS, 10, 64)
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return time.Time{}, false, err
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return time.Unix(lastUpdateTS, 0).UTC(), false, nil
|
|
|
|
return time.Unix(lastUpdateTS, 0).UTC(), false, nil
|
|
|
@ -539,40 +533,19 @@ func doVulnerabilitiesNamespacing(vulnerabilities []database.VulnerabilityWithAf
|
|
|
|
return response
|
|
|
|
return response
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// updateUpdaterFlags updates the flags specified by updaters, every transaction
|
|
|
|
|
|
|
|
// is independent of each other.
|
|
|
|
|
|
|
|
func updateUpdaterFlags(datastore database.Datastore, flags map[string]string) error {
|
|
|
|
func updateUpdaterFlags(datastore database.Datastore, flags map[string]string) error {
|
|
|
|
for key, value := range flags {
|
|
|
|
for key, value := range flags {
|
|
|
|
tx, err := datastore.Begin()
|
|
|
|
if err := database.UpdateKeyValueAndCommit(datastore, key, value); err != nil {
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer tx.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err = tx.UpdateKeyValue(key, value)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if err = tx.Commit(); err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// setLastUpdateTime records the last successful date time in database.
|
|
|
|
// setLastUpdateTime records the last successful date time in database.
|
|
|
|
func setLastUpdateTime(datastore database.Datastore) error {
|
|
|
|
func setLastUpdateTime(datastore database.Datastore) error {
|
|
|
|
tx, err := datastore.Begin()
|
|
|
|
return database.UpdateKeyValueAndCommit(datastore, updaterLastFlagName, strconv.FormatInt(time.Now().UTC().Unix(), 10))
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer tx.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
err = tx.UpdateKeyValue(updaterLastFlagName, strconv.FormatInt(time.Now().UTC().Unix(), 10))
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return tx.Commit()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// isVulnerabilityChange compares two vulnerabilities by their severity and
|
|
|
|
// isVulnerabilityChange compares two vulnerabilities by their severity and
|
|
|
@ -648,12 +621,6 @@ func createVulnerabilityNotifications(datastore database.Datastore, changes []vu
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
tx, err := datastore.Begin()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer tx.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
notifications := make([]database.VulnerabilityNotification, 0, len(changes))
|
|
|
|
notifications := make([]database.VulnerabilityNotification, 0, len(changes))
|
|
|
|
for _, change := range changes {
|
|
|
|
for _, change := range changes {
|
|
|
|
var oldVuln, newVuln *database.Vulnerability
|
|
|
|
var oldVuln, newVuln *database.Vulnerability
|
|
|
@ -675,11 +642,7 @@ func createVulnerabilityNotifications(datastore database.Datastore, changes []vu
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if err := tx.InsertVulnerabilityNotifications(notifications); err != nil {
|
|
|
|
return database.InsertVulnerabilityNotificationsAndCommit(datastore, notifications)
|
|
|
|
return err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return tx.Commit()
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// updateVulnerabilities upserts unique vulnerabilities into the database and
|
|
|
|
// updateVulnerabilities upserts unique vulnerabilities into the database and
|
|
|
@ -698,13 +661,7 @@ func updateVulnerabilities(ctx context.Context, datastore database.Datastore, vu
|
|
|
|
})
|
|
|
|
})
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
tx, err := datastore.Begin()
|
|
|
|
oldVulnNullable, err := database.FindVulnerabilitiesAndRollback(datastore, ids)
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
defer tx.Rollback()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
oldVulnNullable, err := tx.FindVulnerabilities(ids)
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return nil, err
|
|
|
|
return nil, err
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -748,21 +705,8 @@ func updateVulnerabilities(ctx context.Context, datastore database.Datastore, vu
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
log.WithField("count", len(toRemove)).Debug("marking vulnerabilities as outdated")
|
|
|
|
log.Debugf("there are %d vulnerability changes", len(changes))
|
|
|
|
if err := tx.DeleteVulnerabilities(toRemove); err != nil {
|
|
|
|
return changes, database.UpdateVulnerabilitiesAndCommit(datastore, toRemove, toAdd)
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
log.WithField("count", len(toAdd)).Debug("inserting new vulnerabilities")
|
|
|
|
|
|
|
|
if err := tx.InsertVulnerabilities(toAdd); err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if err := tx.Commit(); err != nil {
|
|
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return changes, nil
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func updaterEnabled(updaterName string) bool {
|
|
|
|
func updaterEnabled(updaterName string) bool {
|
|
|
|