summaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2024-08-22 10:31:43 +0300
committerPaul Buetow <paul@buetow.org>2024-08-22 10:31:43 +0300
commitf2b9094e301ac764930feaca93f1f0705f3e1a04 (patch)
tree62dedc06f8a90c1c4f9906269e8e44698f530257 /internal
parentb9aac1245c586ed3a78713e7b47f1e00c71a9aa2 (diff)
initial scheduler
Diffstat (limited to 'internal')
-rw-r--r--internal/config/server/server.go22
-rw-r--r--internal/server/cron/cron.go41
-rw-r--r--internal/server/health/health.go7
-rw-r--r--internal/server/scheduler/scheduler.go7
-rw-r--r--internal/server/server.go8
5 files changed, 50 insertions, 35 deletions
diff --git a/internal/config/server/server.go b/internal/config/server/server.go
index b43166c..88211a4 100644
--- a/internal/config/server/server.go
+++ b/internal/config/server/server.go
@@ -10,14 +10,15 @@ import (
)
type ServerConfig struct {
- ListenAddr string `json:"ListenAddr,omitempty"`
- Partner string `json:"Partner,omitempty"`
- APIKey string `json:"APIKey,omitempty"`
- DataDir string `json:"StateDir,omitempty"`
- EmailTo string `json:"EmailTo,omitempty"`
- EmailFrom string `json:"EmailFrom,omitempty"`
- SMTPServer string `json:"SMTPServer,omitempty"`
- CRONMergeIntervalS int `json:"CRONMergeInterval,omitempty"`
+ ListenAddr string `json:"ListenAddr,omitempty"`
+ Partner string `json:"Partner,omitempty"`
+ APIKey string `json:"APIKey,omitempty"`
+ DataDir string `json:"StateDir,omitempty"`
+ EmailTo string `json:"EmailTo,omitempty"`
+ EmailFrom string `json:"EmailFrom,omitempty"`
+ SMTPServer string `json:"SMTPServer,omitempty"`
+ MergeIntervalS int `json:"MergeInterval,omitempty"`
+ ScheduleIntervalS int `json:"ScheduleInterval,omitempty"`
}
func New(configFile string) (ServerConfig, error) {
@@ -38,7 +39,10 @@ func New(configFile string) (ServerConfig, error) {
return fmt.Sprintf("%s:25", hostname)
})
- conf.CRONMergeIntervalS = config.EnvToInt("GOS_CRON_MERGE_INTERVAL", 3600)
+ const oneHour = 3600
+ conf.MergeIntervalS = config.EnvToInt("GOS_MERGE_INTERVAL", oneHour)
+ conf.ScheduleIntervalS = config.EnvToInt("GOS_SCHEDULER_INTERVAL", oneHour*6)
+
return conf, nil
}
diff --git a/internal/server/cron/cron.go b/internal/server/cron/cron.go
index 4ec3107..b31b48f 100644
--- a/internal/server/cron/cron.go
+++ b/internal/server/cron/cron.go
@@ -2,32 +2,37 @@ package cron
import (
"context"
+ "fmt"
"log"
"time"
config "codeberg.org/snonux/gos/internal/config/server"
+ "codeberg.org/snonux/gos/internal/server/health"
"codeberg.org/snonux/gos/internal/server/repository"
+ "codeberg.org/snonux/gos/internal/server/scheduler"
)
-func Start(ctx context.Context, conf config.ServerConfig) error {
- go func() {
- helloTicker := time.NewTicker(time.Hour)
- mergeTicker := time.NewTicker(time.Second * time.Duration(conf.CRONMergeIntervalS))
+func Run(ctx context.Context, conf config.ServerConfig, status health.Status) {
+ helloTicker := time.NewTicker(time.Hour)
+ mergeTicker := time.NewTicker(time.Second * time.Duration(conf.MergeIntervalS))
+ scheduleTicker := time.NewTicker(time.Second * time.Duration(conf.ScheduleIntervalS))
- for {
- select {
- case <-ctx.Done():
- return
- case <-helloTicker.C:
- log.Println("CRON hello ticker ticked")
- case <-mergeTicker.C:
- log.Println("CRON ticker initiating remote merge operation")
- if err := repository.Instance(conf).MergeRemotely(ctx); err != nil {
- log.Println(err)
- }
+ for {
+ select {
+ case <-ctx.Done():
+ return
+ case <-helloTicker.C:
+ log.Println("CRON hello ticker ticked")
+ case <-mergeTicker.C:
+ log.Println("CRON ticker initiating remote merge operation")
+ if err := repository.Instance(conf).MergeRemotely(ctx); err != nil {
+ status.Set(health.Critical, "cron", fmt.Errorf("unable to merge remote repository: %w", err))
+ }
+ case <-scheduleTicker.C:
+ log.Println("CRON ticker initiating schedule operation")
+ if err := scheduler.Run(ctx); err != nil {
+ status.Set(health.Critical, "cron", fmt.Errorf("unable to schedule post(s): %w", err))
}
}
- }()
-
- return nil
+ }
}
diff --git a/internal/server/health/health.go b/internal/server/health/health.go
index 5f57cba..a75c475 100644
--- a/internal/server/health/health.go
+++ b/internal/server/health/health.go
@@ -52,12 +52,13 @@ func NewStatus() Status {
}
}
-func (hs Status) Set(s Severity, what, text string) {
- log.Println("alerting", what, "to", text, "with severity", s)
-
+func (hs Status) Set(s Severity, what string, info any) {
hs.mu.Lock()
defer hs.mu.Unlock()
+ text := fmt.Sprintf("%v", info)
+ log.Println("alerting", what, "to", text, "with severity", s)
+
hs.alerts[what] = alert{
text: text,
severity: s,
diff --git a/internal/server/scheduler/scheduler.go b/internal/server/scheduler/scheduler.go
new file mode 100644
index 0000000..8aae0ed
--- /dev/null
+++ b/internal/server/scheduler/scheduler.go
@@ -0,0 +1,7 @@
+package scheduler
+
+import "context"
+
+func Run(ctx context.Context) error {
+ return nil
+}
diff --git a/internal/server/server.go b/internal/server/server.go
index 7ab4df0..0c77d4f 100644
--- a/internal/server/server.go
+++ b/internal/server/server.go
@@ -18,13 +18,11 @@ type Server struct {
type HandlerFuncWithError func(http.ResponseWriter, *http.Request) error
-func New(conf config.ServerConfig) Server {
- serv := Server{
+func New(conf config.ServerConfig, status health.Status) Server {
+ return Server{
Conf: conf,
- Status: health.NewStatus(),
+ Status: status,
}
-
- return serv
}
func (serv Server) Handle(name string, handler HandlerFuncWithError) {