go-latestver/scheduler.go

90 lines
2.0 KiB
Go

package main
import (
"context"
"strings"
"time"
"github.com/Luzifer/go-latestver/internal/database"
"github.com/Luzifer/go-latestver/internal/fetcher"
"github.com/pkg/errors"
log "github.com/sirupsen/logrus"
)
var schedulerRunActive bool
func schedulerRun() {
if schedulerRunActive {
return
}
schedulerRunActive = true
defer func() { schedulerRunActive = false }()
for _, ce := range configFile.Catalog {
if err := checkForUpdates(&ce); err != nil {
log.WithField("entry", ce.Key()).WithError(err).Error("Unable to update entry")
}
}
}
func checkForUpdates(ce *database.CatalogEntry) error {
logger := log.WithField("entry", ce.Key())
cm, err := storage.Catalog.GetMeta(ce)
if err != nil {
return errors.Wrap(err, "getting catalog meta")
}
checkTime := time.Now()
if cm.LastChecked != nil {
checkTime = *cm.LastChecked
switch {
case ce.CheckInterval > 0:
checkTime = checkTime.Add(ce.CheckInterval)
case configFile.CheckInterval > 0:
checkTime = checkTime.Add(configFile.CheckInterval)
default:
checkTime = checkTime.Add(time.Hour)
}
}
if checkTime.After(time.Now()) {
// Not yet ready to check
return nil
}
logger.Debug("Checking for updates")
ver, vertime, err := fetcher.Get(ce.Fetcher).FetchVersion(context.Background(), &ce.FetcherConfig)
if err != nil {
return errors.Wrap(err, "fetching version")
}
ver = strings.TrimPrefix(ver, "v")
if cm.CurrentVersion != ver {
if err = storage.Logs.Add(&database.LogEntry{
CatalogName: ce.Name,
CatalogTag: ce.Tag,
Timestamp: vertime,
VersionTo: ver,
VersionFrom: cm.CurrentVersion,
}); err != nil {
return errors.Wrap(err, "adding log entry")
}
logger.WithFields(log.Fields{
"from": cm.CurrentVersion,
"to": ver,
}).Info("Entry had version update")
cm.VersionTime = func(v time.Time) *time.Time { return &v }(vertime)
}
cm.CurrentVersion = ver
cm.LastChecked = func(v time.Time) *time.Time { return &v }(time.Now())
return errors.Wrap(storage.Catalog.PutMeta(cm), "updating meta entry")
}