aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMitch Riedstra <mitch@riedstra.us>2019-09-21 20:06:05 -0400
committerMitch Riedstra <mitch@riedstra.us>2019-09-21 20:06:05 -0400
commit719ce085779c2ed4b577400d17d0890447e1eec8 (patch)
tree5043a01764dfc56f64a3a44876dd1d6585c3fb09
downloadhook-719ce085779c2ed4b577400d17d0890447e1eec8.tar.gz
hook-719ce085779c2ed4b577400d17d0890447e1eec8.tar.xz
Initial--messy commit. It works but needs some refinement
-rw-r--r--example.yml7
-rw-r--r--main.go136
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}}```'
+
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..da9a3c3
--- /dev/null
+++ b/main.go
@@ -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)
+
+}