diff options
| author | Cynthia Revström <me@cynthia.re> | 2020-04-23 12:31:58 +0200 |
|---|---|---|
| committer | Cynthia Revström <me@cynthia.re> | 2020-04-23 12:31:58 +0200 |
| commit | bc0505fea55be609db88708fdc2d59ab43498cf9 (patch) | |
| tree | c04b0e0c22cbe16a5e4ac3dbe51d88af1120ce53 | |
initial commit
| -rw-r--r-- | .gitignore | 2 | ||||
| -rw-r--r-- | go.mod | 3 | ||||
| -rw-r--r-- | main.go | 101 |
3 files changed, 106 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c3d997d --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/cynci +/data/
\ No newline at end of file @@ -0,0 +1,3 @@ +module src.cynthia.re/cynci + +go 1.13 @@ -0,0 +1,101 @@ +package main + +import ( + "encoding/json" + "errors" + "flag" + "fmt" + "io/ioutil" + "log" + "net/http" + "os" + "os/exec" + "path/filepath" + "time" +) + +type cynciWebhookPayload struct { + RepoName string `json:"repo"` +} + +type configJSON struct { + Handlers map[string]string `json:"handlers"` +} + +var config configJSON + +var listenAddr = flag.String("listen", ":8080", "the address for HTTP to listen on") +var dataPath = flag.String("data.dir", "./data", "the path to the data directory") + +func main() { + flag.Parse() + + loadConfig() + + http.HandleFunc("/webhook/src", handleWebhookSrc) + + http.ListenAndServe(*listenAddr, nil) +} + +func loadConfig() { + configPath := filepath.Join(*dataPath, "config.json") + configFile, err := ioutil.ReadFile(configPath) + if err != nil { + log.Fatalf("failed to read config file: %v", err) + } + + err = json.Unmarshal(configFile, &config) + if err != nil { + log.Fatalf("failed to parse config: %v", err) + } +} + +func executeHandler(repoName string) error { + handler, ok := config.Handlers[repoName] + if !ok { + return errors.New("no handler found") + } + + args := []string{handler} + + dt := time.Now().UTC().Format("2006-01-02_15-04-05.999") + logPath := filepath.Join(*dataPath, fmt.Sprintf("logs/%s_%s.log", repoName, dt)) + + logFile, err := os.OpenFile(logPath, os.O_CREATE|os.O_RDWR, 0666) + if err != nil { + return errors.New("failed to create log file") + } + defer logFile.Close() + + // Run the actual handler + cmd := exec.Command(handler, args...) + cmd.Stdout = logFile + cmd.Stderr = logFile + cmd.Dir = *dataPath + err = cmd.Run() + if err != nil { + return fmt.Errorf("failed to execute handler: %v", err) + } + + return nil +} + +func handleWebhookSrc(rw http.ResponseWriter, req *http.Request) { + var payload cynciWebhookPayload + err := json.NewDecoder(req.Body).Decode(&payload) + if err != nil { + log.Printf("failed to decode payload: %v", err) + http.Error(rw, "error", 500) + return + } + + // Execute the handler for this repo + err = executeHandler(payload.RepoName) + if err != nil { + log.Print(err) + http.Error(rw, "error", 500) + return + } + + log.Printf("%+v", payload) +} |
