From 6a0c8006d6bf53d7ed9d9940d1c51a4152852e25 Mon Sep 17 00:00:00 2001 From: shoopea Date: Sun, 28 Dec 2025 16:15:25 +0100 Subject: [PATCH] app activate/deactivate --- admin.go | 3 ++ api.go | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- config.go | 38 +++++++++++++------------ version.go | 8 +++--- 4 files changed, 107 insertions(+), 24 deletions(-) diff --git a/admin.go b/admin.go index 2e08e3f..e0182d9 100644 --- a/admin.go +++ b/admin.go @@ -65,6 +65,9 @@ func (a *AdminConfig) Run() { r.GET("/app/add/:app", ApiAppAdd) r.GET("/app/del/:app", ApiAppDel) + r.GET("/app/activate/:app", ApiAppActivate) + r.GET("/app/deactivate/:app", ApiAppDeactivate) + srv := &http.Server{ Addr: a.Addr, Handler: r, diff --git a/api.go b/api.go index 133f0e0..b41d8be 100644 --- a/api.go +++ b/api.go @@ -144,6 +144,10 @@ func ApiConfig(c *gin.Context) { func ApiConfigApp(c *gin.Context) { name := c.Param("app") found := false + + CfgLock() + defer CfgUnlock() + for _, app := range cfg.Apps { if app.Name == name { found = true @@ -167,8 +171,12 @@ func ApiConfigApp(c *gin.Context) { func ApiAppList(c *gin.Context) { list := make([]string, 0) - for _, app := range cfg.apps { - list = append(list, app.name) + + CfgLock() + defer CfgUnlock() + + for _, app := range cfg.Apps { + list = append(list, app.Name) } slices.Sort(list) @@ -187,11 +195,16 @@ func ApiAppList(c *gin.Context) { func ApiAppAdd(c *gin.Context) { name := c.Param("app") found := false + + CfgLock() + defer CfgUnlock() + for _, app := range cfg.Apps { if app.Name == name { found = true } } + if found { c.JSON(http.StatusInternalServerError, gin.H{ "message": "error", @@ -199,6 +212,7 @@ func ApiAppAdd(c *gin.Context) { }) return } + app := &AppConfig{ Name: name, Active: false, @@ -220,6 +234,10 @@ func ApiAppAdd(c *gin.Context) { func ApiAppDel(c *gin.Context) { name := c.Param("app") found := false + + CfgLock() + defer CfgUnlock() + for id, app := range cfg.Apps { if app.Name == name { if app.Active { @@ -245,3 +263,63 @@ func ApiAppDel(c *gin.Context) { "message": "done", }) } + +func ApiAppActivate(c *gin.Context) { + name := c.Param("app") + + CfgLock() + defer CfgUnlock() + + for _, app := range cfg.Apps { + if app.Name == name { + if app.Active { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": "error", + "error": "app already active", + }) + return + } + + a, err := cfg.NewApp(app.Name, app.Sources, app.Destinations, app.Schedule, app.Before, app.After) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": "error", + "error": err, + }) + return + } + + cfg.apps[app.Name] = a + } + } + c.JSON(http.StatusOK, gin.H{ + "message": "done", + }) +} + +func ApiAppDeactivate(c *gin.Context) { + name := c.Param("app") + + CfgLock() + defer CfgUnlock() + + if _, ok := cfg.apps[name]; ok { + delete(cfg.apps, name) + } else { + c.JSON(http.StatusInternalServerError, gin.H{ + "message": "error", + "error": "app is not active", + }) + return + } + + for _, app := range cfg.Apps { + if app.Name == name { + app.Active = false + } + } + + c.JSON(http.StatusOK, gin.H{ + "message": "done", + }) +} diff --git a/config.go b/config.go index c1d0c99..62bce0d 100644 --- a/config.go +++ b/config.go @@ -170,28 +170,30 @@ func LoadConfigByte(conf []byte) (*Config, error) { c.apps = make(map[string]*App) for _, v := range c.Apps { - if a, err := c.NewApp(v.Name, v.Sources, v.Destinations, v.Schedule, v.Before, v.After); err != nil { - log.WithFields(log.Fields{"call": "NewApp", "attr": v.Name, "error": err}).Errorf("") - return nil, err - } else { - if _, ok := c.apps[v.Name]; ok { - err := errors.New("app already exists") - log.WithFields(log.Fields{"app": v.Name, "error": err}).Errorf("") + if v.Active { + if a, err := c.NewApp(v.Name, v.Sources, v.Destinations, v.Schedule, v.Before, v.After); err != nil { + log.WithFields(log.Fields{"call": "NewApp", "attr": v.Name, "error": err}).Errorf("") return nil, err - } - c.apps[v.Name] = a - for k := range a.schedule { - if dur, ok := c.ScheduleDuration[k]; ok { - re := regexp.MustCompile(`^forever|([0-9]+(h|d|m|y))+$`) - if !re.MatchString(dur) { - err := errors.New("incorrect schedule duration") + } else { + if _, ok := c.apps[v.Name]; ok { + err := errors.New("app already exists") + log.WithFields(log.Fields{"app": v.Name, "error": err}).Errorf("") + return nil, err + } + c.apps[v.Name] = a + for k := range a.schedule { + if dur, ok := c.ScheduleDuration[k]; ok { + re := regexp.MustCompile(`^forever|([0-9]+(h|d|m|y))+$`) + if !re.MatchString(dur) { + err := errors.New("incorrect schedule duration") + log.WithFields(log.Fields{"app": v.Name, "schedule": k, "error": err}).Errorf("") + return nil, err + } + } else { + err := errors.New("undefined schedule duration") log.WithFields(log.Fields{"app": v.Name, "schedule": k, "error": err}).Errorf("") return nil, err } - } else { - err := errors.New("undefined schedule duration") - log.WithFields(log.Fields{"app": v.Name, "schedule": k, "error": err}).Errorf("") - return nil, err } } } diff --git a/version.go b/version.go index 99ceeb4..84cf971 100644 --- a/version.go +++ b/version.go @@ -1,7 +1,7 @@ // Code generated by version.sh (@generated) DO NOT EDIT. package main -var githash = "3e867da" +var githash = "1890050" var branch = "master" -var buildstamp = "2025-12-27_20:59:37" -var commits = "118" -var version = "3e867da-b118 - 2025-12-27_20:59:37" +var buildstamp = "2025-12-28_15:14:58" +var commits = "119" +var version = "1890050-b119 - 2025-12-28_15:14:58"