initial commit, based on sensu-email-handler
This commit is contained in:
commit
6490448439
11
CHANGELOG.md
Normal file
11
CHANGELOG.md
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# Changelog
|
||||||
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
|
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
and this project adheres to [Semantic
|
||||||
|
Versioning](http://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [0.0.1] - 2019-03-31
|
||||||
|
|
||||||
|
### Added
|
||||||
|
- Initial release, based on sensu-email-handler
|
233
Gopkg.lock
generated
Normal file
233
Gopkg.lock
generated
Normal file
@ -0,0 +1,233 @@
|
|||||||
|
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||||
|
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:660af934d331e79d29317ffd5c76fceedaa1249167b1ee461d284c58d53291c6"
|
||||||
|
name = "github.com/coreos/etcd"
|
||||||
|
packages = [
|
||||||
|
"auth/authpb",
|
||||||
|
"etcdserver/etcdserverpb",
|
||||||
|
"mvcc/mvccpb",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "27fc7e2296f506182f58ce846e48f36b34fe6842"
|
||||||
|
version = "v3.3.10"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55"
|
||||||
|
name = "github.com/dgrijalva/jwt-go"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e"
|
||||||
|
version = "v3.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:9d5bd7c02a73959247ccbf524180e363631ece23c58e12b21d697f4741c7926f"
|
||||||
|
name = "github.com/echlebek/timeproxy"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "d7c2918981322d4d437f7a52f3a15c7ec5a4f488"
|
||||||
|
version = "v1.0.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:bfc758d5a03d57d97226fac6934551c01bd76612adb119c177395b057a0a46db"
|
||||||
|
name = "github.com/gogo/protobuf"
|
||||||
|
packages = [
|
||||||
|
"gogoproto",
|
||||||
|
"proto",
|
||||||
|
"protoc-gen-gogo/descriptor",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "636bf0302bc95575d69441b25a2603156ffdddf1"
|
||||||
|
version = "v1.1.1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:4c0989ca0bcd10799064318923b9bc2db6b4d6338dd75f3f2d86c3511aaaf5cf"
|
||||||
|
name = "github.com/golang/protobuf"
|
||||||
|
packages = [
|
||||||
|
"proto",
|
||||||
|
"ptypes",
|
||||||
|
"ptypes/any",
|
||||||
|
"ptypes/duration",
|
||||||
|
"ptypes/timestamp",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "aa810b61a9c79d51363740d207bb46cf8e620ed5"
|
||||||
|
version = "v1.2.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be"
|
||||||
|
name = "github.com/inconshreveable/mousetrap"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75"
|
||||||
|
version = "v1.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:1ed5ad32e321bd35d51e30dbbccab9d226ac290347838d03362b427459036a91"
|
||||||
|
name = "github.com/json-iterator/go"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "f7279a603edee96fe7764d3de9c6ff8cf9970994"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:dbfe572cc258e5bcf54cb650a06d90edd0da04e42ca1ed909cc1d49f00011c63"
|
||||||
|
name = "github.com/robertkrimen/otto"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"ast",
|
||||||
|
"dbg",
|
||||||
|
"file",
|
||||||
|
"parser",
|
||||||
|
"registry",
|
||||||
|
"token",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "15f95af6e78dcd2030d8195a138bd88d4f403546"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:bffc9efe1d7783f54cb0003b57cb3c8fe49f56beb9859cf122be97504e854666"
|
||||||
|
name = "github.com/robfig/cron"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "2315d5715e36303a941d907f038da7f7c44c773b"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:b9cc662e15cbe325399cb8a8610962a4b8373512c2f3318d0b30e856ca081c64"
|
||||||
|
name = "github.com/sensu/sensu-go"
|
||||||
|
packages = [
|
||||||
|
"api/core/v2",
|
||||||
|
"js",
|
||||||
|
"types",
|
||||||
|
"util/strings",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "0150bbcb0a2b70f720fa20a9a47c7e91bacd72b1"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:645cabccbb4fa8aab25a956cbcbdf6a6845ca736b2c64e197ca7cbb9d210b939"
|
||||||
|
name = "github.com/spf13/cobra"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "ef82de70bb3f60c65fb8eebacbb2d122ef517385"
|
||||||
|
version = "v0.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2"
|
||||||
|
name = "github.com/spf13/pflag"
|
||||||
|
packages = ["."]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "298182f68c66c05229eb03ac171abe6e309ee79a"
|
||||||
|
version = "v1.0.3"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:6ca51c5d8a610b3da56856df7a8f8f3e075eba8d5f7a4acbadd79b2d2a368054"
|
||||||
|
name = "golang.org/x/net"
|
||||||
|
packages = [
|
||||||
|
"context",
|
||||||
|
"http/httpguts",
|
||||||
|
"http2",
|
||||||
|
"http2/hpack",
|
||||||
|
"idna",
|
||||||
|
"internal/timeseries",
|
||||||
|
"trace",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "adae6a3d119ae4890b46832a2e88a95adc62b8e7"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:a62e80faf19c93dcbd7954a26fdb51acbfcb4b7161966adf1de531e593c4834a"
|
||||||
|
name = "golang.org/x/sys"
|
||||||
|
packages = ["unix"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "93218def8b18e66adbdab3eca8ec334700329f1f"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18"
|
||||||
|
name = "golang.org/x/text"
|
||||||
|
packages = [
|
||||||
|
"collate",
|
||||||
|
"collate/build",
|
||||||
|
"internal/colltab",
|
||||||
|
"internal/gen",
|
||||||
|
"internal/tag",
|
||||||
|
"internal/triegen",
|
||||||
|
"internal/ucd",
|
||||||
|
"language",
|
||||||
|
"secure/bidirule",
|
||||||
|
"transform",
|
||||||
|
"unicode/bidi",
|
||||||
|
"unicode/cldr",
|
||||||
|
"unicode/norm",
|
||||||
|
"unicode/rangetable",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0"
|
||||||
|
version = "v0.3.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
branch = "master"
|
||||||
|
digest = "1:56b0bca90b7e5d1facf5fbdacba23e4e0ce069d25381b8e2f70ef1e7ebfb9c1a"
|
||||||
|
name = "google.golang.org/genproto"
|
||||||
|
packages = ["googleapis/rpc/status"]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "b5d43981345bdb2c233eb4bf3277847b48c6fdc6"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:c3ad9841823db6da420a5625b367913b4ff54bbe60e8e3c98bd20e243e62e2d2"
|
||||||
|
name = "google.golang.org/grpc"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"balancer",
|
||||||
|
"balancer/base",
|
||||||
|
"balancer/roundrobin",
|
||||||
|
"codes",
|
||||||
|
"connectivity",
|
||||||
|
"credentials",
|
||||||
|
"encoding",
|
||||||
|
"encoding/proto",
|
||||||
|
"grpclog",
|
||||||
|
"internal",
|
||||||
|
"internal/backoff",
|
||||||
|
"internal/channelz",
|
||||||
|
"internal/envconfig",
|
||||||
|
"internal/grpcrand",
|
||||||
|
"internal/transport",
|
||||||
|
"keepalive",
|
||||||
|
"metadata",
|
||||||
|
"naming",
|
||||||
|
"peer",
|
||||||
|
"resolver",
|
||||||
|
"resolver/dns",
|
||||||
|
"resolver/passthrough",
|
||||||
|
"stats",
|
||||||
|
"status",
|
||||||
|
"tap",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "2e463a05d100327ca47ac218281906921038fd95"
|
||||||
|
version = "v1.16.0"
|
||||||
|
|
||||||
|
[[projects]]
|
||||||
|
digest = "1:9935525a8c49b8434a0b0a54e1980e94a6fae73aaff45c5d33ba8dff69de123e"
|
||||||
|
name = "gopkg.in/sourcemap.v1"
|
||||||
|
packages = [
|
||||||
|
".",
|
||||||
|
"base64vlq",
|
||||||
|
]
|
||||||
|
pruneopts = "UT"
|
||||||
|
revision = "6e83acea0053641eff084973fee085f0c193c61a"
|
||||||
|
version = "v1.0.5"
|
||||||
|
|
||||||
|
[solve-meta]
|
||||||
|
analyzer-name = "dep"
|
||||||
|
analyzer-version = 1
|
||||||
|
input-imports = [
|
||||||
|
"github.com/sensu/sensu-go/types",
|
||||||
|
"github.com/spf13/cobra",
|
||||||
|
]
|
||||||
|
solver-name = "gps-cdcl"
|
||||||
|
solver-version = 1
|
38
Gopkg.toml
Normal file
38
Gopkg.toml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
# Gopkg.toml example
|
||||||
|
#
|
||||||
|
# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html
|
||||||
|
# for detailed Gopkg.toml documentation.
|
||||||
|
#
|
||||||
|
# required = ["github.com/user/thing/cmd/thing"]
|
||||||
|
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project"
|
||||||
|
# version = "1.0.0"
|
||||||
|
#
|
||||||
|
# [[constraint]]
|
||||||
|
# name = "github.com/user/project2"
|
||||||
|
# branch = "dev"
|
||||||
|
# source = "github.com/myfork/project2"
|
||||||
|
#
|
||||||
|
# [[override]]
|
||||||
|
# name = "github.com/x/y"
|
||||||
|
# version = "2.4.0"
|
||||||
|
#
|
||||||
|
# [prune]
|
||||||
|
# non-go = false
|
||||||
|
# go-tests = true
|
||||||
|
# unused-packages = true
|
||||||
|
|
||||||
|
|
||||||
|
[prune]
|
||||||
|
go-tests = true
|
||||||
|
unused-packages = true
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/spf13/cobra"
|
||||||
|
version = "0.0.3"
|
||||||
|
|
||||||
|
[[constraint]]
|
||||||
|
name = "github.com/sensu/sensu-go"
|
||||||
|
revision = "0150bbcb0a2b70f720fa20a9a47c7e91bacd72b1"
|
43
LICENSE
Normal file
43
LICENSE
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 PaulBSD
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2019 Sensu Inc.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
64
README.md
Normal file
64
README.md
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# Sensu Go Telegram Handler Plugin
|
||||||
|
|
||||||
|
The Sensu Go Telegram Handler is a [Sensu Event Handler][2] for sending
|
||||||
|
incident notification emails.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Download the latest version of the sensu-telegram-handler from [releases][1],
|
||||||
|
or create an executable script from this source.
|
||||||
|
|
||||||
|
From the local path of the sensu-telegram-handler repository:
|
||||||
|
|
||||||
|
```
|
||||||
|
go build -o /usr/local/bin/sensu-telegram-handler main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
|
||||||
|
Example Sensu Go definition:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"api_version": "core/v2",
|
||||||
|
"type": "Handler",
|
||||||
|
"metadata": {
|
||||||
|
"namespace": "default",
|
||||||
|
"name": "telegram"
|
||||||
|
},
|
||||||
|
"spec": {
|
||||||
|
"type": "pipe",
|
||||||
|
"command": "sensu-telegram-handler -t 123456789:dahxaemuGoM8ekeed1pideeCoh3ahm-abcd -c 9876543210",
|
||||||
|
"timeout": 10,
|
||||||
|
"filters": [
|
||||||
|
"is_incident",
|
||||||
|
"not_silenced"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage Examples
|
||||||
|
|
||||||
|
Help:
|
||||||
|
|
||||||
|
```
|
||||||
|
The Sensu Go Telegram handler for sending an email notification
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
sensu-telegram-handler [flags]
|
||||||
|
|
||||||
|
Flags:
|
||||||
|
-T, --bodyTemplateFile string A template file to use for the body
|
||||||
|
-c, --channel int The channel (default -1)
|
||||||
|
-h, --help help for sensu-telegram-handler
|
||||||
|
-H, --hookout Include output from check hook(s)
|
||||||
|
-t, --token string the telegram bot token
|
||||||
|
```
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
See https://github.com/sensu/sensu-go/blob/master/CONTRIBUTING.md
|
||||||
|
|
||||||
|
[1]: https://github.com/sensu/sensu-email-handler/releases (code base)
|
||||||
|
[2]: https://docs.sensu.io/sensu-go/5.0/reference/handlers/#how-do-sensu-handlers-work
|
121
event.json
Normal file
121
event.json
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
{
|
||||||
|
"entity": {
|
||||||
|
"entity_class": "agent",
|
||||||
|
"system": {
|
||||||
|
"hostname": "webserver01",
|
||||||
|
"os": "linux",
|
||||||
|
"platform": "centos",
|
||||||
|
"platform_family": "rhel",
|
||||||
|
"platform_version": "7.4.1708",
|
||||||
|
"network": {
|
||||||
|
"interfaces": [
|
||||||
|
{
|
||||||
|
"name": "lo",
|
||||||
|
"addresses": [
|
||||||
|
"127.0.0.1/8",
|
||||||
|
"::1/128"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "enp0s3",
|
||||||
|
"mac": "08:00:27:11:ad:d2",
|
||||||
|
"addresses": [
|
||||||
|
"10.0.2.15/24",
|
||||||
|
"fe80::26a5:54ec:cf0d:9704/64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "enp0s8",
|
||||||
|
"mac": "08:00:27:bc:be:60",
|
||||||
|
"addresses": [
|
||||||
|
"172.28.128.3/24",
|
||||||
|
"fe80::a00:27ff:febc:be60/64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"arch": "amd64"
|
||||||
|
},
|
||||||
|
"subscriptions": [
|
||||||
|
"testing",
|
||||||
|
"entity:webserver01"
|
||||||
|
],
|
||||||
|
"last_seen": 1542667635,
|
||||||
|
"deregister": false,
|
||||||
|
"deregistration": {},
|
||||||
|
"user": "agent",
|
||||||
|
"redact": [
|
||||||
|
"password",
|
||||||
|
"passwd",
|
||||||
|
"pass",
|
||||||
|
"api_key",
|
||||||
|
"api_token",
|
||||||
|
"access_key",
|
||||||
|
"secret_key",
|
||||||
|
"private_key",
|
||||||
|
"secret"
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"name": "webserver01",
|
||||||
|
"namespace": "default",
|
||||||
|
"labels": null,
|
||||||
|
"annotations": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"check": {
|
||||||
|
"check_hooks": null,
|
||||||
|
"duration": 1.903135228,
|
||||||
|
"executed": 1522100915,
|
||||||
|
"high_flap_threshold": 0,
|
||||||
|
"history": [
|
||||||
|
{
|
||||||
|
"executed": 1522100315
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"executed": 1522100915
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"command": "http_check.sh http://localhost:80",
|
||||||
|
"handlers": [
|
||||||
|
"slack"
|
||||||
|
],
|
||||||
|
"high_flap_threshold": 0,
|
||||||
|
"interval": 20,
|
||||||
|
"low_flap_threshold": 0,
|
||||||
|
"publish": true,
|
||||||
|
"runtime_assets": [],
|
||||||
|
"subscriptions": [
|
||||||
|
"testing"
|
||||||
|
],
|
||||||
|
"proxy_entity_name": "",
|
||||||
|
"check_hooks": null,
|
||||||
|
"stdin": false,
|
||||||
|
"ttl": 0,
|
||||||
|
"timeout": 0,
|
||||||
|
"duration": 0.010849143,
|
||||||
|
"executed": 1542667666,
|
||||||
|
"history": [
|
||||||
|
{
|
||||||
|
"status": 1,
|
||||||
|
"executed": 1542667666
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"issued": 1542667666,
|
||||||
|
"output": "example output",
|
||||||
|
"state": "failing",
|
||||||
|
"status": 1,
|
||||||
|
"total_state_change": 0,
|
||||||
|
"last_ok": 0,
|
||||||
|
"occurrences": 1,
|
||||||
|
"occurrences_watermark": 1,
|
||||||
|
"output_metric_format": "",
|
||||||
|
"output_metric_handlers": [],
|
||||||
|
"env_vars": null,
|
||||||
|
"metadata": {
|
||||||
|
"name": "check-nginx",
|
||||||
|
"namespace": "default",
|
||||||
|
"labels": null,
|
||||||
|
"annotations": null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
132
main.go
Normal file
132
main.go
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"text/template"
|
||||||
|
|
||||||
|
"github.com/sensu/sensu-go/types"
|
||||||
|
"github.com/spf13/cobra"
|
||||||
|
"github.com/go-telegram-bot-api/telegram-bot-api"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
token string
|
||||||
|
channel int64
|
||||||
|
subject string
|
||||||
|
hookout bool
|
||||||
|
bodyTemplateFile string
|
||||||
|
stdin *os.File
|
||||||
|
|
||||||
|
emailSubjectTemplate = "Sensu Alert - {{.Entity.Name}}/{{.Check.Name}}: {{.Check.State}}"
|
||||||
|
emailBodyTemplate = "{{.Check.Output}}"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
cmd := &cobra.Command{
|
||||||
|
Use: "sensu-telegram-handler",
|
||||||
|
Short: "The Sensu Go Telegram handler for sending an email notification",
|
||||||
|
RunE: run,
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.Flags().StringVarP(&token, "token", "t", "", "the telegram bot token")
|
||||||
|
cmd.Flags().Int64VarP(&channel, "channel", "c", -1, "The channel")
|
||||||
|
cmd.Flags().BoolVarP(&hookout, "hookout", "H", false, "Include output from check hook(s)")
|
||||||
|
cmd.Flags().StringVarP(&bodyTemplateFile, "bodyTemplateFile", "T", "", "A template file to use for the body")
|
||||||
|
|
||||||
|
cmd.Execute()
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(cmd *cobra.Command, args []string) error {
|
||||||
|
validationError := checkArgs()
|
||||||
|
if validationError != nil {
|
||||||
|
return validationError
|
||||||
|
}
|
||||||
|
|
||||||
|
if stdin == nil {
|
||||||
|
stdin = os.Stdin
|
||||||
|
}
|
||||||
|
|
||||||
|
eventJSON, err := ioutil.ReadAll(stdin)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to read stdin: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
event := &types.Event{}
|
||||||
|
err = json.Unmarshal(eventJSON, event)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to unmarshal stdin data: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = event.Validate(); err != nil {
|
||||||
|
return fmt.Errorf("failed to validate event: %s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !event.HasCheck() {
|
||||||
|
return fmt.Errorf("event does not contain check")
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMsg(event)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func checkArgs() error {
|
||||||
|
if hookout && len(bodyTemplateFile) > 0 {
|
||||||
|
return errors.New("--hookout (-H) and --bodyTemplateFile (-T) are mutually exclusive")
|
||||||
|
}
|
||||||
|
if hookout {
|
||||||
|
emailBodyTemplate = "{{.Check.Output}}\n{{range .Check.Hooks}}Hook Name: {{.Name}}\nHook Command: {{.Command}}\n\n{{.Output}}\n\n{{end}}"
|
||||||
|
} else if len(bodyTemplateFile) > 0 {
|
||||||
|
templateBytes, fileErr := ioutil.ReadFile(bodyTemplateFile)
|
||||||
|
if fileErr != nil {
|
||||||
|
return fmt.Errorf("failed to read specified template file %s", bodyTemplateFile)
|
||||||
|
}
|
||||||
|
emailBodyTemplate = string(templateBytes)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func sendMsg(event *types.Event) error {
|
||||||
|
var output string
|
||||||
|
|
||||||
|
bot, botErr := tgbotapi.NewBotAPI(token)
|
||||||
|
if botErr != nil {
|
||||||
|
return botErr
|
||||||
|
}
|
||||||
|
|
||||||
|
subject, subjectErr := resolveTemplate(emailSubjectTemplate, event)
|
||||||
|
if subjectErr != nil {
|
||||||
|
return subjectErr
|
||||||
|
}
|
||||||
|
|
||||||
|
body, bodyErr := resolveTemplate(emailBodyTemplate, event)
|
||||||
|
if bodyErr != nil {
|
||||||
|
return bodyErr
|
||||||
|
}
|
||||||
|
|
||||||
|
output = fmt.Sprintf("%s, %s",subject,body)
|
||||||
|
|
||||||
|
msg := tgbotapi.NewMessage(channel, output)
|
||||||
|
_, sendErr := bot.Send(msg)
|
||||||
|
|
||||||
|
return sendErr
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveTemplate(templateValue string, event *types.Event) (string, error) {
|
||||||
|
var resolved bytes.Buffer
|
||||||
|
tmpl, err := template.New("test").Parse(templateValue)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
err = tmpl.Execute(&resolved, *event)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolved.String(), nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user