X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=plugins.d%2Falarm-notify.sh;h=a41c55bc70c520896bb0e9e0c059da51d1f3c6df;hb=0b006a56cf575d7fdb05fb2614db8411a1542ca7;hp=b836eaedecc76d85aec7995cb2aa8f71951267fc;hpb=cb17dd530ef596f4e14b55d81b05a5348599d650;p=netdata.git diff --git a/plugins.d/alarm-notify.sh b/plugins.d/alarm-notify.sh index b836eaed..a41c55bc 100755 --- a/plugins.d/alarm-notify.sh +++ b/plugins.d/alarm-notify.sh @@ -5,7 +5,7 @@ # (C) 2016 Costa Tsaousis # GPL v3+ # -# Script the send alarm notifications for netdata +# Script to send alarm notifications for netdata # # Features: # - multiple notification methods @@ -16,18 +16,61 @@ # Supported notification methods: # - emails # - pushover.net notifications +# - pushbullet.com push notifications # - slack.com notifications # - telegram.org notifications # -me="${0}" +export PATH="${PATH}:/sbin:/usr/sbin:/usr/local/sbin" +export LC_ALL=C + +# ----------------------------------------------------------------------------- + +PROGRAM_NAME="$(basename "${0}")" + +logdate() { + date "+%Y-%m-%d %H:%M:%S" +} + +log() { + local status="${1}" + shift + + echo >&2 "$(logdate): ${PROGRAM_NAME}: ${status}: ${*}" + +} + +warning() { + log WARNING "${@}" +} + +error() { + log ERROR "${@}" +} + +info() { + log INFO "${@}" +} + +fatal() { + log FATAL "${@}" + exit 1 +} + +debug=0 +debug() { + [ $debug -eq 1 ] && log DEBUG "${@}" +} + +# ----------------------------------------------------------------------------- # check for BASH v4+ (required for associative arrays) [ $(( ${BASH_VERSINFO[0]} )) -lt 4 ] && \ - echo >&2 "${me}: BASH version 4 or later is required (this is ${BASH_VERSION})." && \ - exit 1 + fatal "BASH version 4 or later is required (this is ${BASH_VERSION})." +# ----------------------------------------------------------------------------- # defaults to allow running this script by hand + NETDATA_CONFIG_DIR="${NETDATA_CONFIG_DIR-/etc/netdata}" NETDATA_CACHE_DIR="${NETDATA_CACHE_DIR-/var/cache/netdata}" [ -z "${NETDATA_REGISTRY_URL}" ] && NETDATA_REGISTRY_URL="https://registry.my-netdata.io" @@ -62,14 +105,14 @@ info="${18}" # a short description of the alarm # don't do anything if this is not WARNING, CRITICAL or CLEAR if [ "${status}" != "WARNING" -a "${status}" != "CRITICAL" -a "${status}" != "CLEAR" ] then - echo >&2 "${me}: not sending notification for ${status} on '${chart}.${name}'" + info "not sending notification for ${status} on '${chart}.${name}'" exit 1 fi # don't do anything if this is CLEAR, but it was not WARNING or CRITICAL if [ "${old_status}" != "WARNING" -a "${old_status}" != "CRITICAL" -a "${status}" = "CLEAR" ] then - echo >&2 "${me}: not sending notification for ${status} on '${chart}.${name}' (last status was ${old_status})" + info "not sending notification for ${status} on '${chart}.${name}' (last status was ${old_status})" exit 1 fi @@ -105,6 +148,7 @@ DEFAULT_RECIPIENT_PUSHOVER= declare -A role_recipients_pushover=() # pushbullet configs +PUSHBULLET_ACCESS_TOKEN= DEFAULT_RECIPIENT_PUSHBULLET= declare -A role_recipients_pushbullet=() @@ -197,7 +241,7 @@ do [ "${r}" != "disabled" ] && filter_recipient_by_criticality pushover "${r}" && arr_pushover[${r/|*/}]="1" done - # pushover + # pushbullet a="${role_recipients_pushbullet[${x}]}" [ -z "${a}" ] && a="${DEFAULT_RECIPIENT_PUSHBULLET}" for r in ${a//,/ } @@ -284,8 +328,7 @@ fi # check that we have at least a method enabled if [ "${SEND_EMAIL}" != "YES" -a "${SEND_PUSHOVER}" != "YES" -a "${SEND_TELEGRAM}" != "YES" -a "${SEND_SLACK}" != "YES" -a "${SEND_PUSHBULLET}" != "YES" ] then - echo >&2 "All notification methods are disabled. Not sending a notification." - exit 1 + fatal "All notification methods are disabled. Not sending a notification." fi # ----------------------------------------------------------------------------- @@ -394,10 +437,10 @@ send_email() { if [ $ret -eq 0 ] then - echo >&2 "${me}: Sent email notification for: ${host} ${chart}.${name} is ${status} to '${to_email}'" + info "sent email notification for: ${host} ${chart}.${name} is ${status} to '${to_email}'" return 0 else - echo >&2 "${me}: Failed to send email notification for: ${host} ${chart}.${name} is ${status} to '${to_email}' with error code ${ret}." + error "failed to send email notification for: ${host} ${chart}.${name} is ${status} to '${to_email}' with error code ${ret}." return 1 fi fi @@ -439,10 +482,10 @@ send_pushover() { if [ "${httpcode}" == "200" ] then - echo >&2 "${me}: Sent pushover notification for: ${host} ${chart}.${name} is ${status} to '${user}'" + info "sent pushover notification for: ${host} ${chart}.${name} is ${status} to '${user}'" sent=$((sent + 1)) else - echo >&2 "${me}: Failed to send pushover notification for: ${host} ${chart}.${name} is ${status} to '${user}' with HTTP error code ${httpcode}." + error "failed to send pushover notification for: ${host} ${chart}.${name} is ${status} to '${user}' with HTTP error code ${httpcode}." fi done @@ -456,20 +499,23 @@ send_pushover() { # pushbullet sender send_pushbullet() { - local userapikeys="${1}" message="${2}" title="${3}" httpcode sent=0 user priority - - if [ "${SEND_PUSHBULLET}" = "YES" -a ! -z "${userapikeys}" -a ! -z "${message}" -a ! -z "${title}" ] + local userapikey="${1}" recipients="${2}" message="${3}" title="${4}" httpcode sent=0 user + if [ "${SEND_PUSHBULLET}" = "YES" -a ! -z "${userapikey}" -a ! -z "${recipients}" -a ! -z "${message}" -a ! -z "${title}" ] then - #https://docs.pushbullet.com/#create-push priority=-2 - for user in ${userapikeys} + #https://docs.pushbullet.com/#create-push + for user in ${recipients} do httpcode=$(${curl} --write-out %{http_code} --silent --output /dev/null \ - -u ""$user"": \ - -d type="note" \ - --data-urlencode body="${message}" \ - --data-urlencode title="${title}" \ - "https://api.pushbullet.com/v2/pushes" - ) + --header 'Access-Token: '$userapikey'' \ + --header 'Content-Type: application/json' \ + --data-binary @<(cat <&2 "${me}: Sent pushbullet notification for: ${host} ${chart}.${name} is ${status} to '${user}'" @@ -485,8 +531,6 @@ send_pushbullet() { return 1 } - - # ----------------------------------------------------------------------------- # telegram sender @@ -508,13 +552,13 @@ send_telegram() { if [ "${httpcode}" == "200" ] then - echo >&2 "${me}: Sent telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}'" + info "sent telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}'" sent=$((sent + 1)) elif [ "${httpcode}" == "401" ] then - echo >&2 "${me}: Failed to send telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}': Wrong bot token." + error "failed to send telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}': Wrong bot token." else - echo >&2 "${me}: Failed to send telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}' with HTTP error code ${httpcode}." + error "failed to send telegram notification for: ${host} ${chart}.${name} is ${status} to '${chatid}' with HTTP error code ${httpcode}." fi done @@ -576,10 +620,10 @@ EOF httpcode=$(${curl} --write-out %{http_code} --silent --output /dev/null -X POST --data-urlencode "payload=${payload}" "${webhook}") if [ "${httpcode}" == "200" ] then - echo >&2 "${me}: Sent slack notification for: ${host} ${chart}.${name} is ${status} to '${channel}'" + info "sent slack notification for: ${host} ${chart}.${name} is ${status} to '${channel}'" sent=$((sent + 1)) else - echo >&2 "${me}: Failed to send slack notification for: ${host} ${chart}.${name} is ${status} to '${channel}', with HTTP error code ${httpcode}." + error "failed to send slack notification for: ${host} ${chart}.${name} is ${status} to '${channel}', with HTTP error code ${httpcode}." fi done @@ -706,15 +750,14 @@ SENT_PUSHOVER=$? # ----------------------------------------------------------------------------- # send the pushbullet notification -pushbullet_message=" -${alarm} -Severity: ${severity} -Chart: ${chart} -Family: ${family} -To view NetData: ${goto_url} +pushbullet_message="${alarm} \n +Severity: ${severity} \n +Chart: ${chart} \n +Family: ${family} \n +To View Netdata go to: ${goto_url} \n The source of this alarm is line ${src}" pushbullet_title="${status} at ${host} ${status_message} - ${name//_/ } - ${chart}}" -send_pushbullet "${DEFAULT_RECIPIENT_PUSHBULLET}" "$pushbullet_message" "$pushbullet_title" +send_pushbullet "${PUSHBULLET_ACCESS_TOKEN}" "${to_pushbullet}" "$pushbullet_message" "$pushbullet_title" SENT_PUSHBULLET=$? @@ -722,15 +765,11 @@ SENT_PUSHBULLET=$? # send the telegram.org message # https://core.telegram.org/bots/api#formatting-options -telegram_message="${severity}" -[ "${status_message}" != "recovered" ] && telegram_message="${telegram_message}, ${status_message}" -telegram_message="${telegram_message} -${chart} (${family}) +send_telegram "${TELEGRAM_BOT_TOKEN}" "${to_telegram}" "${host} ${status_message} - ${name//_/ } +${chart} (${family}) ${alarm} ${info}" -send_telegram "${TELEGRAM_BOT_TOKEN}" "${to_telegram}" "${telegram_message}" - SENT_TELEGRAM=$? # ----------------------------------------------------------------------------- @@ -832,7 +871,7 @@ SENT_EMAIL=$? # let netdata know # we did send something -[ ${SENT_EMAIL} -eq 0 -o ${SENT_PUSHOVER} -eq 0 -o ${SENT_TELEGRAM} -eq 0 -o ${SENT_SLACK} -eq 0 ] && exit 0 +[ ${SENT_EMAIL} -eq 0 -o ${SENT_PUSHOVER} -eq 0 -o ${SENT_TELEGRAM} -eq 0 -o ${SENT_SLACK} -eq 0 -o ${SENT_PUSHBULLET} -eq 0 ] && exit 0 # we did not send anything exit 1