diff options
| author | Mitch Riedstra <mitch@riedstra.us> | 2019-09-21 20:06:05 -0400 |
|---|---|---|
| committer | Mitch Riedstra <mitch@riedstra.us> | 2019-09-21 20:06:05 -0400 |
| commit | 719ce085779c2ed4b577400d17d0890447e1eec8 (patch) | |
| tree | 5043a01764dfc56f64a3a44876dd1d6585c3fb09 | |
| download | hook-719ce085779c2ed4b577400d17d0890447e1eec8.tar.gz hook-719ce085779c2ed4b577400d17d0890447e1eec8.tar.xz | |
Initial--messy commit. It works but needs some refinement
| -rw-r--r-- | example.yml | 7 | ||||
| -rw-r--r-- | main.go | 136 |
2 files changed, 143 insertions, 0 deletions
diff --git a/example.yml b/example.yml new file mode 100644 index 0000000..052a4d0 --- /dev/null +++ b/example.yml @@ -0,0 +1,7 @@ + +backups: + url: https://discordapp.com/api/webhooks/fill/me/in + schema: + username: 'backups@{{.Vars.Hostname}}' + content: '{{.Vars.Message}} ```{{.Stdin}}```' + @@ -0,0 +1,136 @@ +package main + +import ( + "bytes" + "encoding/json" + "fmt" + "gopkg.in/yaml.v2" + "io/ioutil" + "net/http" + "os" + "text/template" +) + +type Hook struct { + Url string + Schema map[string]string +} + +func (h *Hook) String() string { + return fmt.Sprintf("Hook: Url: %s Schema: %s", + h.Url, h.Schema) +} + +func readConf(fn string, cfg map[string]*Hook) error { + if fn == "" { + fn = os.Getenv("HOME") + "/.hook.yml" + } + content, err := ioutil.ReadFile(fn) + if err != nil { + return err + } + err = yaml.Unmarshal(content, cfg) + if err != nil { + return err + } + return nil +} + +func help() { + n := os.Args[0] + fmt.Fprintf(os.Stderr, `Usage: %s [-c cfg] -n name [-v varName varVal]... + +For example: + + echo "Contents!" | %s -c hook.yml -n discord -v hostname "$(hostname)" \ + -v message "Backup failure" + +See the full documentation on generating the required configuration file. +`, n, n) + os.Exit(1) +} + +func (h *Hook) ProcessSchema(data interface{}) error { + for k, v := range h.Schema { + buf := &bytes.Buffer{} + templ, err := template.New("schema").Parse(v) + if err != nil { + return err + } + err = templ.Execute(buf, data) + if err != nil { + return err + } + // Need to check that this gets modified properly + result, err := ioutil.ReadAll(buf) + if err != nil { + return err + } + h.Schema[k] = string(result) + } + return nil +} + +func main() { + cfgFN := "hook.yml" + hookName := "" + vars := map[string]string{} + + // A bit of an unusual loop to handle the unusual way that the + // arguments work + for i := 1; i < len(os.Args); i += 1 { + switch os.Args[i] { + case "-c", "-config", "--config": + i += 1 + cfgFN = os.Args[i] + case "-n", "-name", "--name": + i += 1 + hookName = os.Args[i] + case "-v", "-var", "--var": + vars[os.Args[i+1]] = os.Args[i+2] + i += 2 + default: + help() + } + + } + cfg := make(map[string]*Hook) + err := readConf(cfgFN, cfg) + + if hookName == "" { + help() + } else if _, ok := cfg[hookName]; !ok { + fmt.Fprintf(os.Stderr, "Hook name \"%s\" does not exist!\n", hookName) + help() + } + + // fmt.Println(hookName) + // fmt.Println(cfg) + // fmt.Println(err) + // fmt.Println(vars) + + hook := cfg[hookName] + // fmt.Println(hook) + + stdin, _ := ioutil.ReadAll(os.Stdin) + + err = hook.ProcessSchema(struct { + Vars map[string]string + Stdin string + }{ + Vars: vars, + Stdin: string(stdin), + }) + + fmt.Println(hook) + fmt.Println(err) + + body, err := json.Marshal(hook.Schema) + if err != nil { + fmt.Fprintln(os.Stderr, err) + } + buf := bytes.NewBuffer(body) + resp, err := http.Post(hook.Url, "Application/json", buf) + fmt.Println(resp) + +} |
