package main import ( "context" "fmt" "git.ohea.xyz/cursorius/runner/config" "git.ohea.xyz/cursorius/runner/runner" "github.com/op/go-logging" "nhooyr.io/websocket" "nhooyr.io/websocket/wsjson" "os" "time" ) var log = logging.MustGetLogger("cursorius-server") type Register struct { Secret string Id string Tags []string } func main() { var format = logging.MustStringFormatter( `%{color}%{time:15:04:05.000} %{level:.4s}:%{color:reset} %{message}`, ) backend := logging.NewLogBackend(os.Stderr, "", 0) backendFormatter := logging.NewBackendFormatter(backend, format) backendLeveled := logging.AddModuleLevel(backendFormatter) backendLeveled.SetLevel(logging.DEBUG, "") logging.SetBackend(backendLeveled) log.Info("Starting cursorius-runner") configData, isNew, err := config.GetConfig() if err != nil { log.Fatalf("Could not get configuration: %v", err) os.Exit(1) } if isNew { log.Infof("New config file created at %s, please update and relaunch", *configData.ConfigFile) os.Exit(0) } registrationData := Register{ Secret: configData.Config.Secret, Id: configData.Config.Id, Tags: configData.Config.Tags, } connectString := fmt.Sprintf("ws://%v/runner", configData.Config.ServerUrl) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() conn, _, err := websocket.Dial(ctx, connectString, nil) if err != nil { log.Fatalf("Could not connect to server at \"%v\", %v", connectString, err) os.Exit(1) } defer conn.Close(websocket.StatusInternalError, "the sky is falling") err = wsjson.Write(ctx, conn, registrationData) if err != nil { log.Fatalf("Could not send registration information to server: %v", err) os.Exit(1) } for { var job runner.Job err = wsjson.Read(ctx, conn, &job) if err != nil { log.Fatalf("Could not receive from connection: %v", err) continue } log.Infof("Received job from server: id: %v, URL: %v", job.Id, job.URL) err = runner.RunJob(job, configData.Config.WorkingDir) if err != nil { log.Errorf("Could not run job: %v", err) } } }