-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #157 from sdslabs/added_more_notification_channels
- Loading branch information
Showing
10 changed files
with
253 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -28,3 +28,8 @@ ssh_key = "/home/vsts/.beast/secret.key" | |
url = "[email protected]:sdslabs/nonexistent.git" | ||
name = "nonexistent" | ||
branch = "nonexistent" | ||
|
||
[[webhooks]] | ||
url = "" | ||
service_name= "discord" | ||
active=true |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
package notify | ||
|
||
import ( | ||
"bytes" | ||
"encoding/json" | ||
"fmt" | ||
"net/http" | ||
"time" | ||
) | ||
|
||
type DiscordNotificationProvider struct { | ||
Request | ||
} | ||
|
||
func (d *DiscordNotificationProvider) SendNotification(nType NotificationType, msg string) error { | ||
if d.Request.WebHookURL == "" { | ||
return fmt.Errorf("Need a WebHookURL to send notification.") | ||
} | ||
|
||
d.Request.FillReqParams() | ||
|
||
nAttachment := Attachment{ | ||
AuthorName: "Beast Notifier", | ||
AuthorLink: "https://backdoor.sdslabs.co", | ||
Footer: "Beast Discord API", | ||
FooterIcon: "https://discordapp.com/assets/e05ead6e6ebc08df9291738d0aa6986d.png", | ||
Timestamp: time.Now().Unix(), | ||
Text: msg, | ||
} | ||
|
||
switch nType { | ||
case Success: | ||
nAttachment.Color = SuccessColor | ||
nAttachment.Title = "Beast Deployment Success" | ||
break | ||
case Error: | ||
nAttachment.Color = ErrorColor | ||
nAttachment.Title = "Beast Deployment Error" | ||
break | ||
} | ||
|
||
d.Request.PostPayload.Attachments = []Attachment{nAttachment} | ||
|
||
if d.Request.PostPayload.Channel == "" || d.Request.PostPayload.Username == "" { | ||
return fmt.Errorf("Username and Channel required to send the notification.") | ||
} | ||
|
||
payload, err := json.Marshal(d.PostPayload) | ||
if err != nil { | ||
return fmt.Errorf("Error while converting payload to JSON : %s", err) | ||
} | ||
|
||
payloadReader := bytes.NewReader(payload) | ||
req, err := http.NewRequest("POST", d.Request.WebHookURL, payloadReader) | ||
if err != nil { | ||
return fmt.Errorf("Error while connecting to webhook url host : %s", err) | ||
} | ||
|
||
req.Header.Set("Content-Type", "application/json") | ||
client := http.Client{} | ||
_, err = client.Do(req) | ||
|
||
if err != nil { | ||
return fmt.Errorf("Error while posting payload for notification : %s", err) | ||
} | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,116 @@ | ||
package notify | ||
|
||
import ( | ||
"fmt" | ||
"net/url" | ||
|
||
"github.com/sdslabs/beastv4/core/config" | ||
log "github.com/sirupsen/logrus" | ||
) | ||
|
||
type Attachment struct { | ||
Fallback string `json:"fallback,omitempty"` | ||
Color NotificationColor `json:"color,omitempty"` | ||
PreText string `json:"pretext,omitempty"` | ||
AuthorName string `json:"author_name,omitempty"` | ||
AuthorLink string `json:"author_link,omitempty"` | ||
AuthorIcon string `json:"author_icon,omitempty"` | ||
Title string `json:"title,omitempty"` | ||
TitleLink string `json:"title_link,omitempty"` | ||
Text string `json:"text,omitempty"` | ||
ImageUrl string `json:"image_url,omitempty"` | ||
Footer string `json:"footer,omitempty"` | ||
FooterIcon string `json:"footer_icon,omitempty"` | ||
Timestamp int64 `json:"ts,omitempty"` | ||
MarkdownIn []string `json:"mrkdwn_in,omitempty"` | ||
CallbackID string `json:"callback_id,omitempty"` | ||
ThumbnailUrl string `json:"thumb_url,omitempty"` | ||
} | ||
|
||
type PostPayload struct { | ||
Parse string `json:"parse,omitempty"` | ||
Username string `json:"username,omitempty"` | ||
IconUrl string `json:"icon_url,omitempty"` | ||
IconEmoji string `json:"icon_emoji,omitempty"` | ||
Channel string `json:"channel,omitempty"` | ||
Text string `json:"text,omitempty"` | ||
Attachments []Attachment `json:"attachments,omitempty"` | ||
Markdown bool `json:"mrkdwn,omitempty"` | ||
} | ||
|
||
type Notifier interface { | ||
SendNotification(nType NotificationType, msg string) error | ||
} | ||
|
||
type Request struct { | ||
WebHookURL string | ||
PostPayload | ||
} | ||
|
||
type ProviderTypeEnum int | ||
|
||
const ( | ||
DiscordProvider ProviderTypeEnum = 1 + iota | ||
SlackProvider | ||
) | ||
|
||
//In the Discord notification provider it was using the same payload which was used for slack. | ||
//By writing "/slack" in the discord WebHookURL, it execute Slack-Compatible Webhook | ||
func NewNotifier(URL string, ProviderType ProviderTypeEnum) Notifier { | ||
url, err := url.ParseRequestURI(URL) | ||
if url == nil || err != nil { | ||
log.Error("Invalid notification webhook URL") | ||
return nil | ||
} | ||
switch ProviderType { | ||
case SlackProvider: | ||
return &SlackNotificationProvider{ | ||
Request{ | ||
WebHookURL: url.String(), | ||
}, | ||
} | ||
case DiscordProvider: | ||
return &DiscordNotificationProvider{ | ||
Request{ | ||
WebHookURL: url.String() + "/slack", | ||
}, | ||
} | ||
} | ||
return nil | ||
} | ||
|
||
func (req *Request) FillReqParams() error { | ||
req.PostPayload = PostPayload{ | ||
Username: USERNAME, | ||
IconUrl: ICON_URL, | ||
Channel: CHANNEL_NAME, | ||
} | ||
return nil | ||
} | ||
|
||
func SendNotification(nType NotificationType, message string) error { | ||
for _, webhook := range config.Cfg.NotificationWebhooks { | ||
if webhook.ServiceName != "" || webhook.Active == true { | ||
var Provider ProviderTypeEnum | ||
if webhook.ServiceName == "slack" { | ||
Provider = SlackProvider | ||
} | ||
if webhook.ServiceName == "discord" { | ||
Provider = DiscordProvider | ||
} | ||
Notifier := NewNotifier(webhook.URL, Provider) | ||
|
||
err := Notifier.SendNotification(nType, message) | ||
if err != nil { | ||
log.Errorf("Error while sending notification to %s : %s", webhook.ServiceName, err) | ||
fmt.Errorf("NOTIFICATION_SEND_ERROR: %s", err) | ||
} | ||
|
||
log.Infof("Notfication sent to %s.", webhook.ServiceName) | ||
} else { | ||
log.Warnf("No %s webhook url provided in beast config, cannot send notification.", webhook.ServiceName) | ||
fmt.Errorf("No webhook URL in beast config.") | ||
} | ||
} | ||
return nil | ||
} |
Oops, something went wrong.