mirror of
https://github.com/luckfox-eng29/kvm.git
synced 2026-01-20 02:04:15 +01:00
feat: improve custom jiggler settings and add timezone support (#742)
* feat: add timezone support to jiggler and fix custom settings persistence - Add timezone field to JigglerConfig with comprehensive IANA timezone list - Fix custom settings not loading current values - Remove business hours preset, add as examples in custom settings - Improve error handling for invalid cron expressions * fix: format jiggler.go with gofmt * fix: add embedded timezone data and validation - Import time/tzdata to embed timezone database in binary - Add timezone validation in runJigglerCronTab() to gracefully fallback to UTC - Add timezone to debug logging in rpcSetJigglerConfig - Fixes 'unknown time zone' errors when system lacks timezone data * refactor: add timezone field comments from jiggler options * chore: move tzdata to backend * refactor: fix JigglerSetting linting - Adjusted useEffect dependency to include send function for better data fetching - Modified layout classes for improved responsiveness and consistency - Cleaned up code formatting for better readability --------- Co-authored-by: Siyuan Miao <i@xswan.net>
This commit is contained in:
22
jiggler.go
22
jiggler.go
@@ -4,14 +4,17 @@ import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"time"
|
||||
_ "time/tzdata"
|
||||
|
||||
"github.com/go-co-op/gocron/v2"
|
||||
"github.com/jetkvm/kvm/internal/tzdata"
|
||||
)
|
||||
|
||||
type JigglerConfig struct {
|
||||
InactivityLimitSeconds int `json:"inactivity_limit_seconds"`
|
||||
JitterPercentage int `json:"jitter_percentage"`
|
||||
ScheduleCronTab string `json:"schedule_cron_tab"`
|
||||
Timezone string `json:"timezone,omitempty"`
|
||||
}
|
||||
|
||||
var jigglerEnabled = false
|
||||
@@ -21,16 +24,21 @@ var scheduler gocron.Scheduler = nil
|
||||
func rpcSetJigglerState(enabled bool) {
|
||||
jigglerEnabled = enabled
|
||||
}
|
||||
|
||||
func rpcGetJigglerState() bool {
|
||||
return jigglerEnabled
|
||||
}
|
||||
|
||||
func rpcGetTimezones() []string {
|
||||
return tzdata.TimeZones
|
||||
}
|
||||
|
||||
func rpcGetJigglerConfig() (JigglerConfig, error) {
|
||||
return *config.JigglerConfig, nil
|
||||
}
|
||||
|
||||
func rpcSetJigglerConfig(jigglerConfig JigglerConfig) error {
|
||||
logger.Info().Msgf("jigglerConfig: %v, %v, %v", jigglerConfig.InactivityLimitSeconds, jigglerConfig.JitterPercentage, jigglerConfig.ScheduleCronTab)
|
||||
logger.Info().Msgf("jigglerConfig: %v, %v, %v, %v", jigglerConfig.InactivityLimitSeconds, jigglerConfig.JitterPercentage, jigglerConfig.ScheduleCronTab, jigglerConfig.Timezone)
|
||||
config.JigglerConfig = &jigglerConfig
|
||||
err := removeExistingCrobJobs(scheduler)
|
||||
if err != nil {
|
||||
@@ -68,6 +76,18 @@ func initJiggler() {
|
||||
|
||||
func runJigglerCronTab() error {
|
||||
cronTab := config.JigglerConfig.ScheduleCronTab
|
||||
|
||||
// Apply timezone if specified and valid
|
||||
if config.JigglerConfig.Timezone != "" && config.JigglerConfig.Timezone != "UTC" {
|
||||
// Validate timezone before applying
|
||||
if _, err := time.LoadLocation(config.JigglerConfig.Timezone); err != nil {
|
||||
logger.Warn().Msgf("Invalid timezone '%s', falling back to UTC: %v", config.JigglerConfig.Timezone, err)
|
||||
// Don't add TZ prefix, let it run in UTC
|
||||
} else {
|
||||
cronTab = fmt.Sprintf("TZ=%s %s", config.JigglerConfig.Timezone, cronTab)
|
||||
}
|
||||
}
|
||||
|
||||
s, err := gocron.NewScheduler()
|
||||
if err != nil {
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user