From cef456b96264399de2309fdb43792a590f4f76e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=95=D0=B2=D0=B3=D0=B5=D0=BD=D0=B8=D0=B9=20=28=D0=A5?= =?UTF-8?q?=D1=80=D0=B0=D0=BC=D1=8B=D1=87=D0=AA=29=20=D0=A5=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BE=D0=B2?= Date: Fri, 15 Aug 2025 22:29:03 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=84=D0=BB=D0=B0=D0=B3=20--now?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/builtins/register.go | 1 + internal/builtins/run_every.go | 21 +++++++++++++++++++ main.go | 37 ++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) diff --git a/internal/builtins/register.go b/internal/builtins/register.go index 4af4e4b..8fa3143 100644 --- a/internal/builtins/register.go +++ b/internal/builtins/register.go @@ -32,6 +32,7 @@ type Options struct { DB *bbolt.DB Config *config.Config Mux *http.ServeMux + RunNow bool } func Register(sd starlark.StringDict, opts *Options) { diff --git a/internal/builtins/run_every.go b/internal/builtins/run_every.go index 848f6c8..7fc237a 100644 --- a/internal/builtins/run_every.go +++ b/internal/builtins/run_every.go @@ -31,6 +31,9 @@ var ( tickerMtx = &sync.Mutex{} tickerCount = 0 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) { @@ -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) { + // Сохраняем функцию для возможности немедленного запуска + registeredFnMtx.Lock() + functionKey := thread.Name + ":" + fn.Name() + registeredFunctions[functionKey] = fn + registeredFnMtx.Unlock() + d, err := time.ParseDuration(duration) if err != nil { return nil, err @@ -173,3 +182,15 @@ func runScheduled(thread *starlark.Thread, fn *starlark.Function, duration strin 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 +} diff --git a/main.go b/main.go index 9cb943b..72151b1 100644 --- a/main.go +++ b/main.go @@ -24,6 +24,7 @@ import ( "os" "path/filepath" "strings" + "time" "github.com/caarlos0/env/v8" "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") useEnv := pflag.BoolP("use-env", "E", false, "Use environment variables for configuration") debug := pflag.BoolP("debug", "D", false, "Enable debug logging") + runNow := pflag.BoolP("now", "n", false, "Run all plugin checks immediately on startup") pflag.Parse() if *debug { @@ -135,6 +137,7 @@ func main() { Config: cfg, DB: db, Mux: mux, + RunNow: *runNow, }) _, err = starlark.ExecFile(thread, starFile, nil, predeclared) @@ -145,6 +148,40 @@ func main() { 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() http.ListenAndServe(*serverAddr, mux) }