mirror of
https://github.com/taigrr/godns
synced 2025-01-18 04:03:25 -08:00
Merge pull request #73 from kenthua/add-slack
add slack support for notification
This commit is contained in:
commit
2021a2404c
18
README.md
18
README.md
@ -405,6 +405,24 @@ Update config file and provide your Telegram options, a notification message wil
|
|||||||
```
|
```
|
||||||
Markdown is supported in message template, and use `%0A` for newline.
|
Markdown is supported in message template, and use `%0A` for newline.
|
||||||
|
|
||||||
|
### Slack notification support
|
||||||
|
|
||||||
|
Update config file and provide your Slack options, a notification message will be sent to your slack channel once the IP is changed and updated.
|
||||||
|
|
||||||
|
```json
|
||||||
|
"notify": {
|
||||||
|
"slack": {
|
||||||
|
"enabled": true,
|
||||||
|
"bot_api_token": "xoxb-xxx",
|
||||||
|
"channel": "your_channel",
|
||||||
|
"message_template": "Domain *{{ .Domain }}* is updated to \n{{ .CurrentIP }}",
|
||||||
|
"use_proxy": false
|
||||||
|
},
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Markdown is supported in message template, and use `\n` for newline.
|
||||||
|
|
||||||
|
|
||||||
### SOCKS5 proxy support
|
### SOCKS5 proxy support
|
||||||
|
|
||||||
You can also use SOCKS5 proxy, just fill SOCKS5 address to the ```socks5_proxy``` item:
|
You can also use SOCKS5 proxy, just fill SOCKS5 address to the ```socks5_proxy``` item:
|
||||||
|
10
settings.go
10
settings.go
@ -12,6 +12,15 @@ type Domain struct {
|
|||||||
SubDomains []string `json:"sub_domains"`
|
SubDomains []string `json:"sub_domains"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notify struct for slack notification
|
||||||
|
type SlackNotify struct {
|
||||||
|
Enabled bool `json:"enabled"`
|
||||||
|
BotApiToken string `json:"bot_api_token"`
|
||||||
|
Channel string `json:"channel"`
|
||||||
|
MsgTemplate string `json:"message_template"`
|
||||||
|
UseProxy bool `json:"use_proxy"`
|
||||||
|
}
|
||||||
|
|
||||||
// Notify struct for telegram notification
|
// Notify struct for telegram notification
|
||||||
type TelegramNotify struct {
|
type TelegramNotify struct {
|
||||||
Enabled bool `json:"enabled"`
|
Enabled bool `json:"enabled"`
|
||||||
@ -35,6 +44,7 @@ type MailNotify struct {
|
|||||||
type Notify struct {
|
type Notify struct {
|
||||||
Telegram TelegramNotify `json:"telegram"`
|
Telegram TelegramNotify `json:"telegram"`
|
||||||
Mail MailNotify `json:"mail"`
|
Mail MailNotify `json:"mail"`
|
||||||
|
Slack SlackNotify `json:"slack"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Settings struct
|
// Settings struct
|
||||||
|
68
utils.go
68
utils.go
@ -10,6 +10,7 @@ import (
|
|||||||
"log"
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
dnsResolver "github.com/TimothyYe/godns/resolver"
|
dnsResolver "github.com/TimothyYe/godns/resolver"
|
||||||
@ -321,6 +322,69 @@ func SendMailNotify(configuration *Settings, domain, currentIP string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SendSlack sends slack if IP is changed
|
||||||
|
func SendSlackNotify(configuration *Settings, domain, currentIP string) error {
|
||||||
|
if !configuration.Notify.Slack.Enabled {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if configuration.Notify.Slack.BotApiToken == "" {
|
||||||
|
return errors.New("bot api token cannot be empty")
|
||||||
|
}
|
||||||
|
|
||||||
|
if configuration.Notify.Slack.Channel == "" {
|
||||||
|
return errors.New("channel cannot be empty")
|
||||||
|
}
|
||||||
|
client := GetHttpClient(configuration, configuration.Notify.Slack.UseProxy)
|
||||||
|
tpl := configuration.Notify.Slack.MsgTemplate
|
||||||
|
if tpl == "" {
|
||||||
|
tpl = "_Your IP address is changed to_\n\n*{{ .CurrentIP }}*\n\nDomain *{{ .Domain }}* is updated"
|
||||||
|
}
|
||||||
|
|
||||||
|
msg := buildTemplate(currentIP, domain, tpl)
|
||||||
|
|
||||||
|
var response *http.Response
|
||||||
|
var err error
|
||||||
|
|
||||||
|
formData := url.Values{
|
||||||
|
"token": {configuration.Notify.Slack.BotApiToken},
|
||||||
|
"channel": {configuration.Notify.Slack.Channel},
|
||||||
|
"text": {msg},
|
||||||
|
}
|
||||||
|
|
||||||
|
response, err = client.PostForm("https://slack.com/api/chat.postMessage", formData)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
defer response.Body.Close()
|
||||||
|
|
||||||
|
body, _ := ioutil.ReadAll(response.Body)
|
||||||
|
type ResponseParameters struct {
|
||||||
|
MigrateToChatID int64 `json:"migrate_to_chat_id"` // optional
|
||||||
|
RetryAfter int `json:"retry_after"` // optional
|
||||||
|
}
|
||||||
|
type APIResponse struct {
|
||||||
|
Ok bool `json:"ok"`
|
||||||
|
Result json.RawMessage `json:"result"`
|
||||||
|
ErrorCode int `json:"error_code"`
|
||||||
|
Description string `json:"description"`
|
||||||
|
Parameters *ResponseParameters `json:"parameters"`
|
||||||
|
}
|
||||||
|
var resp APIResponse
|
||||||
|
err = json.Unmarshal([]byte(body), &resp)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("error:", err)
|
||||||
|
return errors.New("Failed to parse response")
|
||||||
|
}
|
||||||
|
if !resp.Ok {
|
||||||
|
return errors.New(resp.Description)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// SendNotify sends notify if IP is changed
|
// SendNotify sends notify if IP is changed
|
||||||
func SendNotify(configuration *Settings, domain, currentIP string) error {
|
func SendNotify(configuration *Settings, domain, currentIP string) error {
|
||||||
err := SendTelegramNotify(configuration, domain, currentIP)
|
err := SendTelegramNotify(configuration, domain, currentIP)
|
||||||
@ -331,6 +395,10 @@ func SendNotify(configuration *Settings, domain, currentIP string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("Send email notification with error:", err.Error())
|
log.Println("Send email notification with error:", err.Error())
|
||||||
}
|
}
|
||||||
|
err = SendSlackNotify(configuration, domain, currentIP)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("Send slack notification with error:", err.Error())
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user