summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCynthia Revström <me@cynthia.re>2020-04-23 12:31:58 +0200
committerCynthia Revström <me@cynthia.re>2020-04-23 12:31:58 +0200
commitbc0505fea55be609db88708fdc2d59ab43498cf9 (patch)
treec04b0e0c22cbe16a5e4ac3dbe51d88af1120ce53
initial commit
-rw-r--r--.gitignore2
-rw-r--r--go.mod3
-rw-r--r--main.go101
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
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..de9a8b4
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,3 @@
+module src.cynthia.re/cynci
+
+go 1.13
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..8e84218
--- /dev/null
+++ b/main.go
@@ -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)
+}