func (c *Conf) loadNotification(s *parse.SectionNode) { name := s.Name.Text if _, ok := c.Notifications[name]; ok { c.errorf("duplicate notification name: %s", name) } n := conf.Notification{ Vars: make(map[string]string), ContentType: "application/x-www-form-urlencoded", Name: name, RunOnActions: true, } n.Text = s.RawText n.Locator = newSectionLocator(s) funcs := ttemplate.FuncMap{ "V": func(v string) string { return c.Expand(v, n.Vars, false) }, "json": func(v interface{}) string { b, err := json.Marshal(v) if err != nil { slog.Errorln(err) } return string(b) }, } c.Notifications[name] = &n pairs := c.getPairs(s, n.Vars, sNormal) for _, p := range pairs { c.at(p.node) v := p.val switch k := p.key; k { case "email": n.RawEmail = v email, err := mail.ParseAddressList(n.RawEmail) if err != nil { c.error(err) } n.Email = email case "post": n.RawPost = v post, err := url.Parse(n.RawPost) if err != nil { c.error(err) } n.Post = post case "get": n.RawGet = v get, err := url.Parse(n.RawGet) if err != nil { c.error(err) } n.Get = get case "print": n.Print = true case "contentType": n.ContentType = v case "next": n.NextName = v next, ok := c.Notifications[n.NextName] if !ok { c.errorf("unknown notification %s", n.NextName) } n.Next = next case "timeout": d, err := opentsdb.ParseDuration(v) if err != nil { c.error(err) } n.Timeout = time.Duration(d) case "body": n.RawBody = v tmpl := ttemplate.New(name).Funcs(funcs) _, err := tmpl.Parse(n.RawBody) if err != nil { c.error(err) } n.Body = tmpl case "runOnActions": n.RunOnActions = v == "true" case "useBody": n.UseBody = v == "true" default: c.errorf("unknown key %s", k) } } c.at(s) if n.Timeout > 0 && n.Next == nil { c.errorf("timeout specified without next") } }