diff --git a/main.go b/main.go index 5ed93ba..da7176b 100644 --- a/main.go +++ b/main.go @@ -2,12 +2,14 @@ package main import ( "bytes" + "encoding/json" "flag" "html/template" "io/ioutil" "log" "net/http" "os" + "os/exec" "path" "strconv" "strings" @@ -18,6 +20,8 @@ import ( func main() { loadConfig() + _ = os.Setenv(`GIT_TERMINAL_PROMPT`, `0`) + if err := updateTemplate(); err != nil { log.Fatal(`Failed to load template. (` + err.Error() + `)`) } @@ -30,6 +34,7 @@ var config struct { Template string Pages string Static string + Webhook string } func loadConfig() { @@ -37,21 +42,49 @@ func loadConfig() { flag.StringVar(&config.Template, `template`, `template.html`, `The template used by mdsite`) flag.StringVar(&config.Pages, `pages`, `pages`, `The OS path used when searching a page`) flag.StringVar(&config.Static, `static`, `static`, `The OS path used for static resource`) + flag.StringVar(&config.Webhook, `webhook`, ``, `The secret for webhooks to update the content`) flag.Parse() } var t *template.Template func updateTemplate() error { - var err error - t, err = template.ParseFiles(config.Template) + tmpl, err := template.ParseFiles(config.Template) if err != nil { return err } + + t = tmpl return nil } func serveRequest(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost && config.Webhook != `` && r.URL.Path == `/hook` { + var input struct { + Secret string `json:"secret"` + } + err := json.NewDecoder(r.Body).Decode(&input) + _ = r.Body.Close() + if err != nil || input.Secret != config.Webhook { + w.WriteHeader(403) + return + } + + err = exec.Command(`git`, `fetch`).Run() + if err == nil { + err = exec.Command(`git`, `reset`, `--hard`, `origin/master`).Run() + } + if err == nil { + err = updateTemplate() + } + + if err != nil { + w.WriteHeader(500) + w.Write([]byte(`Update failed`)) + } + return + } + if strings.HasPrefix(r.URL.Path, `/static/`) { path := path.Join(config.Static, path.Clean(strings.TrimPrefix(r.URL.Path, `/static/`))) http.ServeFile(w, r, path)