diff --git a/cmd/main.go b/cmd/main.go index 9aeb10fa..bc6e954e 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -32,9 +32,14 @@ var ( ) func main() { + var err error runtime.GOMAXPROCS(runtime.NumCPU()) + meta.Version = version meta.UserAgent = fmt.Sprintf("%s/%s go/%s %s", meta.ID, meta.Version, runtime.Version()[2:], strings.Title(runtime.GOOS)) + if meta.Hostname, err = os.Hostname(); err != nil { + log.Fatal().Err(err).Msg("Cannot resolve hostname") + } // Parse command line _ = kong.Parse(&cli, @@ -52,7 +57,7 @@ func main() { // Load timezone location location, err := time.LoadLocation(cli.Timezone) if err != nil { - log.Panic().Err(err).Msgf("Cannot load timezone %s", cli.Timezone) + log.Fatal().Err(err).Msgf("Cannot load timezone %s", cli.Timezone) } // Init diff --git a/docs/notif/amqp.md b/docs/notif/amqp.md index c5f7da3f..25878fd0 100644 --- a/docs/notif/amqp.md +++ b/docs/notif/amqp.md @@ -43,6 +43,7 @@ The JSON response will look like this: ```json { "diun_version": "0.3.0", + "hostname": "myserver", "status": "new", "provider": "file", "image": "docker.io/crazymax/swarm-cronjob:0.2.1", diff --git a/docs/notif/webhook.md b/docs/notif/webhook.md index d7f4908a..3b30a3d0 100644 --- a/docs/notif/webhook.md +++ b/docs/notif/webhook.md @@ -34,6 +34,7 @@ The JSON response will look like this: ```json { "diun_version": "4.0.0", + "hostname": "myserver", "status": "new", "provider": "file", "image": "docker.io/crazymax/diun:latest", diff --git a/internal/model/meta.go b/internal/model/meta.go index c73f36ae..d9580f0a 100644 --- a/internal/model/meta.go +++ b/internal/model/meta.go @@ -10,4 +10,5 @@ type Meta struct { Author string Version string UserAgent string + Hostname string } diff --git a/internal/notif/amqp/client.go b/internal/notif/amqp/client.go index 6a58c906..fa47c43d 100644 --- a/internal/notif/amqp/client.go +++ b/internal/notif/amqp/client.go @@ -72,6 +72,7 @@ func (c *Client) Send(entry model.NotifEntry) error { body, err := json.Marshal(struct { Version string `json:"diun_version"` + Hostname string `json:"hostname"` Status string `json:"status"` Provider string `json:"provider"` Image string `json:"image"` @@ -82,6 +83,7 @@ func (c *Client) Send(entry model.NotifEntry) error { Platform string `json:"platform"` }{ Version: c.meta.Version, + Hostname: c.meta.Hostname, Status: string(entry.Status), Provider: entry.Provider, Image: entry.Image.String(), diff --git a/internal/notif/gotify/client.go b/internal/notif/gotify/client.go index 8d1b6dee..dc624779 100644 --- a/internal/notif/gotify/client.go +++ b/internal/notif/gotify/client.go @@ -47,14 +47,20 @@ func (c *Client) Send(entry model.NotifEntry) error { title = fmt.Sprintf("New image %s has been added", entry.Image.String()) } - tagTpl := "`{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}`" + tagTpl := "`{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}`" if len(entry.Image.HubLink) > 0 { - tagTpl = "[`{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}`]({{ .Image.HubLink }})" + tagTpl = "[`{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}`]({{ .Entry.Image.HubLink }})" } var msgBuf bytes.Buffer - msgTpl := template.Must(template.New("gotify").Parse(fmt.Sprintf("Docker tag %s which you subscribed to through {{ .Provider }} provider has been {{ if (eq .Status \"new\") }}newly added{{ else }}updated{{ end }}.", tagTpl))) - if err := msgTpl.Execute(&msgBuf, entry); err != nil { + msgTpl := template.Must(template.New("gotify").Parse(fmt.Sprintf("Docker tag %s which you subscribed to through {{ .Entry.Provider }} provider has been {{ if (eq .Entry.Status \"new\") }}newly added{{ else }}updated{{ end }} on {{ .Meta.Hostname }}.", tagTpl))) + if err := msgTpl.Execute(&msgBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } diff --git a/internal/notif/mail/client.go b/internal/notif/mail/client.go index 55ffe261..f0445b56 100644 --- a/internal/notif/mail/client.go +++ b/internal/notif/mail/client.go @@ -59,24 +59,30 @@ func (c *Client) Send(entry model.NotifEntry) error { subject = fmt.Sprintf("New image %s has been added", entry.Image.String()) } - tagTpl := "**{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}**" + tagTpl := "**{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}**" if len(entry.Image.HubLink) > 0 { - tagTpl = "[**{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}**]({{ .Image.HubLink }})" + tagTpl = "[**{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}**]({{ .Entry.Image.HubLink }})" } // Body var emailBuf bytes.Buffer emailTpl := template.Must(template.New("email").Parse(fmt.Sprintf(` -Docker tag %s which you subscribed to through **{{ .Provider }}** provider has been {{ if (eq .Status "new") }}newly added{{ else }}updated{{ end }}. +Docker tag %s which you subscribed to through **{{ .Entry.Provider }}** provider has been {{ if (eq .Entry.Status "new") }}newly added{{ else }}updated{{ end }} on **{{ .Meta.Hostname }}**. -This image has been {{ if (eq .Status "new") }}created{{ else }}updated{{ end }} at {{ .Manifest.Created.Format "Jan 02, 2006 15:04:05 UTC" }} -with digest {{ .Manifest.Digest }} for {{ .Manifest.Platform }} platform. +This image has been {{ if (eq .Entry.Status "new") }}created{{ else }}updated{{ end }} at {{ .Entry.Manifest.Created.Format "Jan 02, 2006 15:04:05 UTC" }} +with digest {{ .Entry.Manifest.Digest }} for {{ .Entry.Manifest.Platform }} platform. Need help, or have questions? Go to https://github.com/crazy-max/diun and leave an issue. `, tagTpl))) - if err := emailTpl.Execute(&emailBuf, entry); err != nil { + if err := emailTpl.Execute(&emailBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } email := hermes.Email{ diff --git a/internal/notif/rocketchat/client.go b/internal/notif/rocketchat/client.go index 457d50e0..e0306312 100644 --- a/internal/notif/rocketchat/client.go +++ b/internal/notif/rocketchat/client.go @@ -50,12 +50,23 @@ func (c *Client) Send(entry model.NotifEntry) error { } var textBuf bytes.Buffer - textTpl := template.Must(template.New("rocketchat").Parse(`Docker tag {{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }} which you subscribed to through {{ .Provider }} provider has been {{ if (eq .Status "new") }}newly added{{ else }}updated{{ end }}.`)) - if err := textTpl.Execute(&textBuf, entry); err != nil { + textTpl := template.Must(template.New("rocketchat").Parse(`Docker tag {{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }} which you subscribed to through {{ .Entry.Provider }} provider has been {{ if (eq .Entry.Status "new") }}newly added{{ else }}updated{{ end }}.`)) + if err := textTpl.Execute(&textBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } fields := []AttachmentField{ + { + Title: "Hostname", + Value: c.meta.Hostname, + Short: false, + }, { Title: "Provider", Value: entry.Provider, diff --git a/internal/notif/script/client.go b/internal/notif/script/client.go index a86f1241..3931dea6 100644 --- a/internal/notif/script/client.go +++ b/internal/notif/script/client.go @@ -53,6 +53,7 @@ func (c *Client) Send(entry model.NotifEntry) error { // Set env vars cmd.Env = append(os.Environ(), []string{ fmt.Sprintf("DIUN_VERSION=%s", c.meta.Version), + fmt.Sprintf("DIUN_HOSTNAME=%s", c.meta.Hostname), fmt.Sprintf("DIUN_ENTRY_STATUS=%s", string(entry.Status)), fmt.Sprintf("DIUN_ENTRY_PROVIDER=%s", entry.Provider), fmt.Sprintf("DIUN_ENTRY_IMAGE=%s", entry.Image.String()), diff --git a/internal/notif/slack/slack.go b/internal/notif/slack/slack.go index 93bc9e68..28f26ef3 100644 --- a/internal/notif/slack/slack.go +++ b/internal/notif/slack/slack.go @@ -38,8 +38,14 @@ func (c *Client) Name() string { // Send creates and sends a slack notification with an entry func (c *Client) Send(entry model.NotifEntry) error { var textBuf bytes.Buffer - textTpl := template.Must(template.New("text").Parse(" Docker tag `{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}` {{ if (eq .Status \"new\") }}newly added{{ else }}updated{{ end }}.")) - if err := textTpl.Execute(&textBuf, entry); err != nil { + textTpl := template.Must(template.New("text").Parse(" Docker tag `{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}` {{ if (eq .Entry.Status \"new\") }}newly added{{ else }}updated{{ end }}.")) + if err := textTpl.Execute(&textBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } @@ -49,6 +55,11 @@ func (c *Client) Send(entry model.NotifEntry) error { } fields := []slack.AttachmentField{ + { + Title: "Hostname", + Value: c.meta.Hostname, + Short: false, + }, { Title: "Provider", Value: entry.Provider, diff --git a/internal/notif/teams/client.go b/internal/notif/teams/client.go index efba45ab..4c8c7a71 100644 --- a/internal/notif/teams/client.go +++ b/internal/notif/teams/client.go @@ -53,14 +53,20 @@ func (c *Client) Send(entry model.NotifEntry) error { Timeout: time.Duration(10) * time.Second, } - tagTpl := "`{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}`" + tagTpl := "`{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}`" if len(entry.Image.HubLink) > 0 { - tagTpl = "[`{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}`]({{ .Image.HubLink }})" + tagTpl = "[`{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}`]({{ .Entry.Image.HubLink }})" } var textBuf bytes.Buffer - textTpl := template.Must(template.New("text").Parse(fmt.Sprintf("Docker tag %s {{ if (eq .Status \"new\") }}newly added{{ else }}updated{{ end }}.", tagTpl))) - if err := textTpl.Execute(&textBuf, entry); err != nil { + textTpl := template.Must(template.New("text").Parse(fmt.Sprintf("Docker tag %s {{ if (eq .Entry.Status \"new\") }}newly added{{ else }}updated{{ end }}.", tagTpl))) + if err := textTpl.Execute(&textBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } @@ -84,6 +90,8 @@ func (c *Client) Send(entry model.NotifEntry) error { ActivityTitle: textBuf.String(), ActivitySubtitle: "Provider: " + entry.Provider, Facts: []Fact{ + {"Hostname", c.meta.Hostname}, + {"Provider", entry.Provider}, {"Created", entry.Manifest.Created.Format("Jan 02, 2006 15:04:05 UTC")}, {"Digest", entry.Manifest.Digest.String()}, {"Platform", entry.Manifest.Platform}, diff --git a/internal/notif/telegram/telegram.go b/internal/notif/telegram/telegram.go index 7ed6adaf..6d5fc8ce 100644 --- a/internal/notif/telegram/telegram.go +++ b/internal/notif/telegram/telegram.go @@ -39,14 +39,20 @@ func (c *Client) Send(entry model.NotifEntry) error { return err } - tagTpl := "{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}" + tagTpl := "{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}" if len(entry.Image.HubLink) > 0 { - tagTpl = "[{{ .Image.Domain }}/{{ .Image.Path }}:{{ .Image.Tag }}]({{ .Image.HubLink }})" + tagTpl = "[{{ .Entry.Image.Domain }}/{{ .Entry.Image.Path }}:{{ .Entry.Image.Tag }}]({{ .Entry.Image.HubLink }})" } var msgBuf bytes.Buffer - msgTpl := template.Must(template.New("email").Parse(fmt.Sprintf("Docker tag %s which you subscribed to through {{ .Provider }} provider has been {{ if (eq .Status \"new\") }}newly added{{ else }}updated{{ end }}.", tagTpl))) - if err := msgTpl.Execute(&msgBuf, entry); err != nil { + msgTpl := template.Must(template.New("email").Parse(fmt.Sprintf("Docker tag %s which you subscribed to through {{ .Entry.Provider }} provider has been {{ if (eq .Entry.Status \"new\") }}newly added{{ else }}updated{{ end }} on {{ .Meta.Hostname }}.", tagTpl))) + if err := msgTpl.Execute(&msgBuf, struct { + Meta model.Meta + Entry model.NotifEntry + }{ + Meta: c.meta, + Entry: entry, + }); err != nil { return err } diff --git a/internal/notif/webhook/client.go b/internal/notif/webhook/client.go index fbd6588c..f8030ba3 100644 --- a/internal/notif/webhook/client.go +++ b/internal/notif/webhook/client.go @@ -41,6 +41,7 @@ func (c *Client) Send(entry model.NotifEntry) error { body, err := json.Marshal(struct { Version string `json:"diun_version"` + Hostname string `json:"hostname"` Status string `json:"status"` Provider string `json:"provider"` Image string `json:"image"` @@ -51,6 +52,7 @@ func (c *Client) Send(entry model.NotifEntry) error { Platform string `json:"platform"` }{ Version: c.meta.Version, + Hostname: c.meta.Hostname, Status: string(entry.Status), Provider: entry.Provider, Image: entry.Image.String(),