добавлен флаг --now
This commit is contained in:
@@ -32,6 +32,7 @@ type Options struct {
|
|||||||
DB *bbolt.DB
|
DB *bbolt.DB
|
||||||
Config *config.Config
|
Config *config.Config
|
||||||
Mux *http.ServeMux
|
Mux *http.ServeMux
|
||||||
|
RunNow bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func Register(sd starlark.StringDict, opts *Options) {
|
func Register(sd starlark.StringDict, opts *Options) {
|
||||||
|
@@ -31,6 +31,9 @@ var (
|
|||||||
tickerMtx = &sync.Mutex{}
|
tickerMtx = &sync.Mutex{}
|
||||||
tickerCount = 0
|
tickerCount = 0
|
||||||
tickers = map[int]*time.Ticker{}
|
tickers = map[int]*time.Ticker{}
|
||||||
|
// Для хранения зарегистрированных функций
|
||||||
|
registeredFunctions = map[string]*starlark.Function{}
|
||||||
|
registeredFnMtx = &sync.RWMutex{}
|
||||||
)
|
)
|
||||||
|
|
||||||
func runEvery(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
|
func runEvery(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tuple, kwargs []starlark.Tuple) (starlark.Value, error) {
|
||||||
@@ -148,6 +151,12 @@ func runEveryWeek(thread *starlark.Thread, b *starlark.Builtin, args starlark.Tu
|
|||||||
}
|
}
|
||||||
|
|
||||||
func runScheduled(thread *starlark.Thread, fn *starlark.Function, duration string) (starlark.Value, error) {
|
func runScheduled(thread *starlark.Thread, fn *starlark.Function, duration string) (starlark.Value, error) {
|
||||||
|
// Сохраняем функцию для возможности немедленного запуска
|
||||||
|
registeredFnMtx.Lock()
|
||||||
|
functionKey := thread.Name + ":" + fn.Name()
|
||||||
|
registeredFunctions[functionKey] = fn
|
||||||
|
registeredFnMtx.Unlock()
|
||||||
|
|
||||||
d, err := time.ParseDuration(duration)
|
d, err := time.ParseDuration(duration)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -173,3 +182,15 @@ func runScheduled(thread *starlark.Thread, fn *starlark.Function, duration strin
|
|||||||
|
|
||||||
return newTickerHandle(handle), nil
|
return newTickerHandle(handle), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetRegisteredFunctions возвращает все зарегистрированные функции
|
||||||
|
func GetRegisteredFunctions() map[string]*starlark.Function {
|
||||||
|
registeredFnMtx.RLock()
|
||||||
|
defer registeredFnMtx.RUnlock()
|
||||||
|
|
||||||
|
result := make(map[string]*starlark.Function)
|
||||||
|
for k, v := range registeredFunctions {
|
||||||
|
result[k] = v
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
37
main.go
37
main.go
@@ -24,6 +24,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/caarlos0/env/v8"
|
"github.com/caarlos0/env/v8"
|
||||||
"github.com/go-git/go-git/v5"
|
"github.com/go-git/go-git/v5"
|
||||||
@@ -51,6 +52,7 @@ func main() {
|
|||||||
genHash := pflag.BoolP("gen-hash", "g", false, "Generate a password hash for webhooks")
|
genHash := pflag.BoolP("gen-hash", "g", false, "Generate a password hash for webhooks")
|
||||||
useEnv := pflag.BoolP("use-env", "E", false, "Use environment variables for configuration")
|
useEnv := pflag.BoolP("use-env", "E", false, "Use environment variables for configuration")
|
||||||
debug := pflag.BoolP("debug", "D", false, "Enable debug logging")
|
debug := pflag.BoolP("debug", "D", false, "Enable debug logging")
|
||||||
|
runNow := pflag.BoolP("now", "n", false, "Run all plugin checks immediately on startup")
|
||||||
pflag.Parse()
|
pflag.Parse()
|
||||||
|
|
||||||
if *debug {
|
if *debug {
|
||||||
@@ -135,6 +137,7 @@ func main() {
|
|||||||
Config: cfg,
|
Config: cfg,
|
||||||
DB: db,
|
DB: db,
|
||||||
Mux: mux,
|
Mux: mux,
|
||||||
|
RunNow: *runNow,
|
||||||
})
|
})
|
||||||
|
|
||||||
_, err = starlark.ExecFile(thread, starFile, nil, predeclared)
|
_, err = starlark.ExecFile(thread, starFile, nil, predeclared)
|
||||||
@@ -145,6 +148,40 @@ func main() {
|
|||||||
log.Info("Initialized plugin").Str("name", pluginName).Send()
|
log.Info("Initialized plugin").Str("name", pluginName).Send()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Запускаем все зарегистрированные функции немедленно если установлен флаг --now
|
||||||
|
if *runNow {
|
||||||
|
// Получаем все функции, зарегистрированные через run_every
|
||||||
|
registeredFns := builtins.GetRegisteredFunctions()
|
||||||
|
|
||||||
|
if len(registeredFns) > 0 {
|
||||||
|
log.Info("Running all registered plugin checks immediately").Int("functions", len(registeredFns)).Send()
|
||||||
|
|
||||||
|
for key, fn := range registeredFns {
|
||||||
|
parts := strings.Split(key, ":")
|
||||||
|
pluginName := parts[0]
|
||||||
|
|
||||||
|
log.Info("Executing registered function").Str("plugin", pluginName).Str("function", fn.Name()).Send()
|
||||||
|
|
||||||
|
// Запускаем функцию в горутине для параллельного выполнения
|
||||||
|
go func(function *starlark.Function, plugin string) {
|
||||||
|
thread := &starlark.Thread{Name: plugin}
|
||||||
|
_, err := starlark.Call(thread, function, nil, nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Error("Error executing function").Str("plugin", plugin).Str("function", function.Name()).Err(err).Send()
|
||||||
|
} else {
|
||||||
|
log.Info("Function executed successfully").Str("plugin", plugin).Str("function", function.Name()).Send()
|
||||||
|
}
|
||||||
|
}(fn, pluginName)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Даём время на выполнение функций
|
||||||
|
log.Info("Waiting for immediate checks to complete...").Send()
|
||||||
|
time.Sleep(5 * time.Second)
|
||||||
|
} else {
|
||||||
|
log.Warn("No functions registered with run_every, nothing to run immediately").Send()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
log.Info("Starting HTTP server").Str("addr", *serverAddr).Send()
|
log.Info("Starting HTTP server").Str("addr", *serverAddr).Send()
|
||||||
http.ListenAndServe(*serverAddr, mux)
|
http.ListenAndServe(*serverAddr, mux)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user