feat: improve cron syntax validation and force 6 digits with seconds

This commit is contained in:
Maxi Quoß
2025-02-07 14:04:44 +01:00
parent bba23e1f7a
commit cee1669a0e
25 changed files with 2063 additions and 821 deletions

View File

@@ -11,8 +11,8 @@ import (
var (
PingRunning = false
WakeShutdownRunning = false
CronPing = cron.New()
CronWakeShutdown = cron.New()
CronPing = cron.New(cron.WithSeconds())
CronWakeShutdown = cron.New(cron.WithSeconds())
)
func SetPingJobs(app *pocketbase.PocketBase) {
@@ -113,15 +113,18 @@ func SetWakeShutdownJobs(app *pocketbase.PocketBase) {
if wake_cron_enabled && wake_cron != "" {
_, err := CronWakeShutdown.AddFunc(wake_cron, func() {
isOnline := networking.PingDevice(dev)
if isOnline {
return
}
d, err := app.FindRecordById("devices", dev.Id)
if err != nil {
logger.Error.Println(err)
return
}
if d.GetString("status") == "pending" {
return
}
isOnline := networking.PingDevice(dev)
if isOnline {
return
}
d.Set("status", "pending")
if err := app.Save(d); err != nil {
logger.Error.Println("Failed to save record:", err)
@@ -144,15 +147,18 @@ func SetWakeShutdownJobs(app *pocketbase.PocketBase) {
if shutdown_cron_enabled && shutdown_cron != "" {
_, err := CronWakeShutdown.AddFunc(shutdown_cron, func() {
isOnline := networking.PingDevice(dev)
if !isOnline {
return
}
d, err := app.FindRecordById("devices", dev.Id)
if err != nil {
logger.Error.Println(err)
return
}
if d.GetString("status") == "pending" {
return
}
isOnline := networking.PingDevice(dev)
if !isOnline {
return
}
status := d.GetString("status")
if status != "online" {
return
@@ -187,8 +193,7 @@ func StartWakeShutdown() {
func StopWakeShutdown() {
if WakeShutdownRunning {
logger.Info.Println("Stopping wake/shutdown cronjob")
ctx := CronWakeShutdown.Stop()
<-ctx.Done()
CronWakeShutdown.Stop()
}
WakeShutdownRunning = false
}
@@ -201,8 +206,7 @@ func StartPing() {
func StopPing() {
if PingRunning {
logger.Info.Println("Stopping wake/shutdown cronjob")
ctx := CronPing.Stop()
<-ctx.Done()
CronPing.Stop()
}
PingRunning = false
}

View File

@@ -11,6 +11,7 @@ import (
"github.com/pocketbase/pocketbase/apis"
"github.com/pocketbase/pocketbase/core"
"github.com/pocketbase/pocketbase/plugins/migratecmd"
"github.com/robfig/cron/v3"
"github.com/seriousm4x/upsnap/cronjobs"
"github.com/seriousm4x/upsnap/logger"
_ "github.com/seriousm4x/upsnap/migrations"
@@ -212,7 +213,8 @@ func importSettings(app *pocketbase.PocketBase) error {
// 1st: env var
// 2nd: database entry
// 3rd: default values
interval := "@every 3s"
defaultInterval := "*/3 * * * * *"
interval := defaultInterval
if settingsPrivate.GetString("interval") != "" {
interval = settingsPrivate.GetString("interval")
}
@@ -220,6 +222,13 @@ func importSettings(app *pocketbase.PocketBase) error {
interval = os.Getenv("UPSNAP_INTERVAL")
}
// validate interval before saving
p := cron.NewParser(cron.Second | cron.Minute | cron.Hour | cron.Dom | cron.Month | cron.Dow)
if _, err := p.Parse(interval); err != nil {
interval = defaultInterval
logger.Warning.Println(errors.New("Ping interval is not valid."))
}
settingsPrivate.Set("interval", interval)
if scanRange := os.Getenv("UPSNAP_SCAN_RANGE"); scanRange != "" {
settingsPrivate.Set("scan_range", scanRange)