From 895d5fea41177e444c18f4fdc820fffa5f67d5bf Mon Sep 17 00:00:00 2001 From: Rasmus Dahlberg Date: Sat, 9 Dec 2023 17:08:45 +0100 Subject: Add drafty skeleton --- main.go | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 103 insertions(+), 2 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 4ffa7f3..b602222 100644 --- a/main.go +++ b/main.go @@ -1,7 +1,108 @@ package main -import "fmt" +import ( + "context" + "errors" + "flag" + "fmt" + "os" + "os/signal" + "sync" + "syscall" + + "rgdd.se/silent-ct/internal/manager" + "rgdd.se/silent-ct/internal/options" + "rgdd.se/silent-ct/pkg/monitor" + "rgdd.se/silent-ct/pkg/server" +) func main() { - fmt.Println("TODO: silent-ct") + opts, err := options.New(os.Args[0], os.Args[1:]) + if err != nil { + if errors.Is(err, flag.ErrHelp) { + os.Exit(0) + } + die("options: %v", err) + } + var c options.Config + if err := c.FromFile(opts.ConfigFile); err != nil { + die("configuration: %v", err) + } + + srv, err := server.New(server.Config{Address: opts.ListenAddr, Nodes: c.Nodes}) + if err != nil { + die("create new server: %v", err) + } + mon, err := monitor.New(monitor.Config{Callback: &c.Monitor}) + if err != nil { + die("create new monitor: %v", err) + } + mgr, err := manager.New(manager.Config{Nodes: c.Nodes}) + if err != nil { + die("create new manager: %v", err) + } + + configCh := make(chan []monitor.MessageLogConfig) + defer close(configCh) + + progressCh := make(chan monitor.MessageLogProgress) + defer close(progressCh) + + submitCh := make(chan server.MessageNodeSubmission) + defer close(submitCh) + + errorCh := make(chan error) + defer close(errorCh) + + ctx, cancel := context.WithCancel(context.Background()) + var wg sync.WaitGroup + defer wg.Wait() + + wg.Add(1) + go func() { + defer wg.Done() + defer cancel() + await(ctx) + }() + + wg.Add(1) + go func() { + defer wg.Done() + defer cancel() + if err := srv.Run(ctx, submitCh, errorCh); err != nil { + die("server: %v\n", err) + } + }() + + wg.Add(1) + go func() { + defer wg.Done() + defer cancel() + mon.Run(ctx, configCh, progressCh, errorCh) + }() + + wg.Add(1) + go func() { + defer wg.Done() + defer cancel() + if err := mgr.Run(ctx, submitCh, progressCh, configCh, errorCh); err != nil { + die("manager: %v\n", err) + } + }() +} + +func await(ctx context.Context) { + sigs := make(chan os.Signal, 1) + defer close(sigs) + + signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM) + select { + case <-sigs: + case <-ctx.Done(): + } +} + +func die(format string, args ...interface{}) { + fmt.Printf("fatal: "+format, args) + os.Exit(1) } -- cgit v1.2.3