Compare commits
23 Commits
Author | SHA1 | Date |
---|---|---|
Norwin | 8e1cf7ed38 | 5 years ago |
Norwin | 17c80cecab | 5 years ago |
Norwin | 83fb1e7d76 | 5 years ago |
Norwin | e3df49f8bf | 5 years ago |
Norwin | d4c499df38 | 5 years ago |
Norwin | e9ddf63dad | 5 years ago |
Norwin | 528c9122f2 | 5 years ago |
Norwin | b29081550b | 5 years ago |
Norwin | 2c2508c471 | 5 years ago |
Norwin | 5abdd0debb | 5 years ago |
Norwin | 3547d3e0c1 | 5 years ago |
Norwin | 43aeb83069 | 5 years ago |
Norwin | 331852b56c | 5 years ago |
Norwin | 287f26a37c | 5 years ago |
Norwin | 3a48d3ae5a | 5 years ago |
Norwin | a9659de229 | 5 years ago |
Norwin | fa871f6467 | 5 years ago |
Norwin | 97db2d0b9e | 6 years ago |
Norwin | 17c66b5100 | 6 years ago |
Norwin | d6738691b4 | 6 years ago |
Norwin | 794ea5369d | 6 years ago |
Norwin | 50f4184139 | 6 years ago |
Norwin | 35648ed30f | 6 years ago |
@ -1,26 +0,0 @@
|
|||||||
package cmd
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TODO: insert automatically via build step?
|
|
||||||
const (
|
|
||||||
VERSION = "1.0.7"
|
|
||||||
BUILDDATE = "2018-06-26T00:59:00+02"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
rootCmd.AddCommand(versionCmd)
|
|
||||||
}
|
|
||||||
|
|
||||||
var versionCmd = &cobra.Command{
|
|
||||||
Use: "version",
|
|
||||||
Short: "Get build and version information",
|
|
||||||
Long: "osem_notify version returns its build and version information",
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
fmt.Printf("%s %s", VERSION, BUILDDATE)
|
|
||||||
},
|
|
||||||
}
|
|
@ -0,0 +1,73 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/dghubble/sling"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
var slackClient = sling.New().Client(&http.Client{})
|
||||||
|
|
||||||
|
var notificationColors = map[string]string{
|
||||||
|
CheckOk: "#00ff00",
|
||||||
|
CheckErr: "#ff0000",
|
||||||
|
}
|
||||||
|
|
||||||
|
// slack Notifier has no configuration
|
||||||
|
type SlackNotifier struct {
|
||||||
|
webhook string
|
||||||
|
}
|
||||||
|
|
||||||
|
type SlackMessage struct {
|
||||||
|
Text string `json:"text"`
|
||||||
|
Username string `json:"username,omitempty`
|
||||||
|
Attachments []SlackAttachment `json:"attachments,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type SlackAttachment struct {
|
||||||
|
Text string `json:"text"`
|
||||||
|
Color string `json:"color,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n SlackNotifier) New(config TransportConfig) (AbstractNotifier, error) {
|
||||||
|
// validate transport configuration
|
||||||
|
// :TransportConfSourceHack
|
||||||
|
baseUrl := viper.GetString("slack.webhook")
|
||||||
|
if baseUrl == "" {
|
||||||
|
return nil, fmt.Errorf("Missing configuration key slack.webhook")
|
||||||
|
}
|
||||||
|
|
||||||
|
return SlackNotifier{
|
||||||
|
webhook: baseUrl,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n SlackNotifier) Submit(notification Notification) error {
|
||||||
|
message := &SlackMessage{
|
||||||
|
Username: "osem_notify box healthcheck",
|
||||||
|
Text: notification.Subject,
|
||||||
|
Attachments: []SlackAttachment{{notification.Body, notificationColors[notification.Status]}},
|
||||||
|
}
|
||||||
|
|
||||||
|
req, err := slackClient.Post(n.webhook).BodyJSON(message).Request()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
c := http.Client{}
|
||||||
|
res, err2 := c.Do(req)
|
||||||
|
if err2 != nil {
|
||||||
|
return err2
|
||||||
|
}
|
||||||
|
|
||||||
|
if res.StatusCode > 200 {
|
||||||
|
defer res.Body.Close()
|
||||||
|
body, _ := ioutil.ReadAll(res.Body)
|
||||||
|
return fmt.Errorf("slack webhook failed: %s", body)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -0,0 +1,102 @@
|
|||||||
|
package core
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
xmpp "github.com/mattn/go-xmpp"
|
||||||
|
"github.com/spf13/viper"
|
||||||
|
)
|
||||||
|
|
||||||
|
var xmppClient = &xmpp.Client{} // @Hacky
|
||||||
|
|
||||||
|
// box config required for the XmppNotifier (TransportConfig.Options)
|
||||||
|
type XmppNotifier struct {
|
||||||
|
Recipients []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n XmppNotifier) New(config TransportConfig) (AbstractNotifier, error) {
|
||||||
|
// validate transport configuration
|
||||||
|
// :TransportConfSourceHack
|
||||||
|
requiredConf := []string{"xmpp.user", "xmpp.pass", "xmpp.host", "xmpp.starttls"}
|
||||||
|
for _, key := range requiredConf {
|
||||||
|
if viper.GetString(key) == "" {
|
||||||
|
return nil, fmt.Errorf("Missing configuration key %s", key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// establish connection with server once, and share it accross instances
|
||||||
|
// @Hacky
|
||||||
|
if xmppClient.JID() == "" {
|
||||||
|
c, err := connectXmpp()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
xmppClient = c
|
||||||
|
}
|
||||||
|
|
||||||
|
// assign configuration to the notifier after ensuring the correct type.
|
||||||
|
// lesson of this project: golang requires us to fuck around with type
|
||||||
|
// assertions, instead of providing us with proper inheritance.
|
||||||
|
asserted, ok := config.Options.(XmppNotifier)
|
||||||
|
if !ok || asserted.Recipients == nil {
|
||||||
|
// config did not contain valid options.
|
||||||
|
// first try fallback: parse result of viper is a map[string]interface{},
|
||||||
|
// which requires a different assertion change
|
||||||
|
asserted2, ok := config.Options.(map[string]interface{})
|
||||||
|
if ok {
|
||||||
|
asserted3, ok := asserted2["recipients"].([]interface{})
|
||||||
|
if ok {
|
||||||
|
asserted = XmppNotifier{Recipients: []string{}}
|
||||||
|
for _, rec := range asserted3 {
|
||||||
|
asserted.Recipients = append(asserted.Recipients, rec.(string))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if asserted.Recipients == nil {
|
||||||
|
return nil, errors.New("Invalid XmppNotifier options")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return XmppNotifier{
|
||||||
|
Recipients: asserted.Recipients,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (n XmppNotifier) Submit(notification Notification) error {
|
||||||
|
if xmppClient.JID() == "" {
|
||||||
|
return fmt.Errorf("xmpp client not correctly initialized!")
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, recipient := range n.Recipients {
|
||||||
|
_, err := xmppClient.Send(xmpp.Chat{
|
||||||
|
Remote: recipient,
|
||||||
|
Subject: notification.Subject,
|
||||||
|
Text: fmt.Sprintf("%s\n\n%s", notification.Subject, notification.Body),
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func connectXmpp() (*xmpp.Client, error) {
|
||||||
|
// :TransportConfSourceHack
|
||||||
|
xmppOpts := xmpp.Options{
|
||||||
|
Host: viper.GetString("xmpp.host"),
|
||||||
|
User: viper.GetString("xmpp.user"),
|
||||||
|
Password: viper.GetString("xmpp.pass"),
|
||||||
|
Resource: "osem_notify",
|
||||||
|
}
|
||||||
|
|
||||||
|
if viper.GetBool("xmpp.starttls") {
|
||||||
|
xmppOpts.NoTLS = true
|
||||||
|
xmppOpts.StartTLS = true
|
||||||
|
}
|
||||||
|
|
||||||
|
return xmppOpts.NewClient()
|
||||||
|
}
|
@ -0,0 +1,6 @@
|
|||||||
|
theme: jekyll-theme-hacker
|
||||||
|
plugins:
|
||||||
|
- jekyll-redirect-from
|
||||||
|
whitelist:
|
||||||
|
- jekyll-redirect-from
|
||||||
|
|
@ -0,0 +1,4 @@
|
|||||||
|
---
|
||||||
|
redirect_to:
|
||||||
|
- "osem_notify"
|
||||||
|
---
|
@ -0,0 +1,42 @@
|
|||||||
|
## osem_notify check all
|
||||||
|
|
||||||
|
one-off check on all boxes registered on the opensensemap instance
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
one-off check on all boxes registered on the opensensemap instance
|
||||||
|
|
||||||
|
```
|
||||||
|
osem_notify check all [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
-a, --api string openSenseMap API to query against (default "https://api.opensensemap.org")
|
||||||
|
-c, --config string path to config file (default $HOME/.osem_notify.yml)
|
||||||
|
-d, --debug enable verbose logging
|
||||||
|
-l, --logformat string log format, can be plain or json (default "plain")
|
||||||
|
--no-cache send all notifications, ignoring results from previous runs. also don't update the cache.
|
||||||
|
-n, --notify string If set, will send out notifications for the specified type of check result,
|
||||||
|
otherwise results are printed to stdout only.
|
||||||
|
Allowed values are "all", "error", "ok".
|
||||||
|
You might want to run 'osem_notify debug notifications' first to verify everything works.
|
||||||
|
|
||||||
|
Notifications for failing checks are sent only once, and then cached until the issue got
|
||||||
|
resolved, unless --no-cache is set.
|
||||||
|
To clear the cache, run 'osem_notify debug cache --clear'.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
|
||||||
|
* [osem_notify check](osem_notify_check.md) - One-off check for events on boxes
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 10-Feb-2019
|
@ -0,0 +1,43 @@
|
|||||||
|
## osem_notify debug cache
|
||||||
|
|
||||||
|
Print or clear the notifications cache
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
osem_notify debug cache prints the contents of the notifications cache
|
||||||
|
|
||||||
|
```
|
||||||
|
osem_notify debug cache [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
--clear reset the notifications cache
|
||||||
|
-h, --help help for cache
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
-a, --api string openSenseMap API to query against (default "https://api.opensensemap.org")
|
||||||
|
-c, --config string path to config file (default $HOME/.osem_notify.yml)
|
||||||
|
-d, --debug enable verbose logging
|
||||||
|
-l, --logformat string log format, can be plain or json (default "plain")
|
||||||
|
--no-cache send all notifications, ignoring results from previous runs. also don't update the cache.
|
||||||
|
-n, --notify string If set, will send out notifications for the specified type of check result,
|
||||||
|
otherwise results are printed to stdout only.
|
||||||
|
Allowed values are "all", "error", "ok".
|
||||||
|
You might want to run 'osem_notify debug notifications' first to verify everything works.
|
||||||
|
|
||||||
|
Notifications for failing checks are sent only once, and then cached until the issue got
|
||||||
|
resolved, unless --no-cache is set.
|
||||||
|
To clear the cache, run 'osem_notify debug cache --clear'.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
|
||||||
|
* [osem_notify debug](osem_notify_debug.md) - Run some debugging checks on osem_notify itself
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 10-Feb-2019
|
@ -0,0 +1,43 @@
|
|||||||
|
## osem_notify watch all
|
||||||
|
|
||||||
|
watch all boxes registered on the map
|
||||||
|
|
||||||
|
### Synopsis
|
||||||
|
|
||||||
|
watch all boxes registered on the map
|
||||||
|
|
||||||
|
```
|
||||||
|
osem_notify watch all [flags]
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options
|
||||||
|
|
||||||
|
```
|
||||||
|
-h, --help help for all
|
||||||
|
```
|
||||||
|
|
||||||
|
### Options inherited from parent commands
|
||||||
|
|
||||||
|
```
|
||||||
|
-a, --api string openSenseMap API to query against (default "https://api.opensensemap.org")
|
||||||
|
-c, --config string path to config file (default $HOME/.osem_notify.yml)
|
||||||
|
-d, --debug enable verbose logging
|
||||||
|
-i, --interval int interval to run checks in minutes (default 30)
|
||||||
|
-l, --logformat string log format, can be plain or json (default "plain")
|
||||||
|
--no-cache send all notifications, ignoring results from previous runs. also don't update the cache.
|
||||||
|
-n, --notify string If set, will send out notifications for the specified type of check result,
|
||||||
|
otherwise results are printed to stdout only.
|
||||||
|
Allowed values are "all", "error", "ok".
|
||||||
|
You might want to run 'osem_notify debug notifications' first to verify everything works.
|
||||||
|
|
||||||
|
Notifications for failing checks are sent only once, and then cached until the issue got
|
||||||
|
resolved, unless --no-cache is set.
|
||||||
|
To clear the cache, run 'osem_notify debug cache --clear'.
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
### SEE ALSO
|
||||||
|
|
||||||
|
* [osem_notify watch](osem_notify_watch.md) - Watch boxes for events at an interval
|
||||||
|
|
||||||
|
###### Auto generated by spf13/cobra on 10-Feb-2019
|
Loading…
Reference in New Issue