Last active
May 7, 2019 13:48
-
-
Save lichti/f04abfea888625bbeac42fae56c0f7ee to your computer and use it in GitHub Desktop.
Script to enable or disable newrelic alerts
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
#!/bin/bash | |
if [ ! -x /usr/bin/curl ]; then | |
echo "Please install curl" | |
exit 1 | |
fi | |
if [ ! -x /usr/bin/jq ]; then | |
echo "Please install jq" | |
exit 1 | |
fi | |
if [ ! -x /usr/bin/python ]; then | |
echo "Please install python" | |
exit 1 | |
fi | |
if [ ! -x /usr/bin/awk ]; then | |
echo "Please install awk" | |
exit 1 | |
fi | |
if [ $# -eq 0 ]; then | |
set -- '-h' "$@" | |
fi | |
while [[ $# -gt 0 ]] | |
do | |
key="$1" | |
case $key in | |
-k|--key) | |
API_KEY="$2" | |
shift | |
;; | |
-p|--policy) | |
POLICY_NAME="$2" | |
shift | |
;; | |
-a|--alert) | |
ALERT_NAME_IN="$2" | |
shift | |
;; | |
-e|--enable) | |
ENABLED='true' | |
;; | |
-d|--disable) | |
DISABLED='false' | |
;; | |
--add-host|--add-hosts) | |
ADD_HOST_IN="$2" | |
shift | |
;; | |
--rm-host|--rm-hosts) | |
RM_HOST_IN="$2" | |
shift | |
;; | |
--add-application|--add-applications) | |
ADD_APM_IN="$2" | |
shift | |
;; | |
--rm-application|--rm-applications) | |
RM_APM_IN="$2" | |
shift | |
;; | |
--add-channel|--add-channels) | |
ADD_CHANNEL_IN="$2" | |
shift | |
;; | |
--rm-channel|--rm-channels) | |
RM_CHANNEL_IN="$2" | |
shift | |
;; | |
--debug) | |
DEBUG=true | |
;; | |
-h|--help) | |
echo "$0" | |
echo " -k, --key <newrelic api key>" | |
echo " -p, --policy <policy name>" | |
echo " -a, --alert <alert name>" | |
echo " -e, --enable" | |
echo " -d, --disable" | |
echo " --add-host, --add-hosts <hostname>" | |
echo " --rm-host, --rm-hosts <hostname>" | |
echo " --add-application, --add-applications <apm name>" | |
echo " --rm-application, --rm-applications <apm name>" | |
echo " --add-channel, --add-channels <channel name>" | |
echo " --rm-channel, --rm-channels <channel name>" | |
echo " --debug" | |
echo " -h, --help" | |
exit 1 | |
;; | |
*) | |
echo "$key: unknown option" | |
echo "Use: $0 --help" | |
exit 1 | |
;; | |
esac | |
shift | |
done | |
if [ -n "$ENABLED" ] && [ -n "$DISABLED" ]; then | |
echo "Use -d or -e" | |
exit 1 | |
elif [ -n "$ENABLED" ]; then | |
ALERT_ENABLED=$ENABLED | |
elif [ -n "$DISABLED" ]; then | |
ALERT_ENABLED=$DISABLED | |
fi | |
if [ -z "$API_KEY" ]; then echo "key not defined"; exit 1; fi | |
if [ -z "$POLICY_NAME" ]; then echo "policy name not defined"; exit 1; fi | |
#if [ -z "$ALERT_NAME_IN" ]; then echo "alert name not defined"; exit 1; fi | |
#if [ -z "$ADD_HOST_IN" ]; then echo "alert name not defined"; exit 1; fi | |
#if [ -z "$ALERT_ENABLED" ]; then echo "you must specify enable or disable"; exit 1; fi | |
if [ -n "$DEBUG" ]; then | |
echo "API KEY: $API_KEY" | |
echo "POLICY NAME: $POLICY_NAME" | |
echo "ALERT NAME: $ALERT_NAME_IN" | |
echo "ALERT ENABLED: $ALERT_ENABLED" | |
echo "ADD HOST IN: $ADD_HOST_IN" | |
echo "RM HOST IN: $RM_HOST_IN" | |
echo "ADD APM IN: $ADD_APM_IN" | |
echo "RM APM IN: $RM_APM_IN" | |
echo "ADD CHANNEL IN: $ADD_CHANNEL_IN" | |
echo "RM CHANNEL IN: $RM_CHANNEL_IN" | |
fi | |
POLICY_ESCAPED=$(python -c "import urllib; print urllib.quote('''${POLICY_NAME}''')") | |
if [ -n "$DEBUG" ]; then echo "POLICY ESCAPED: $POLICY_ESCAPED"; fi | |
POLICY_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_policies.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${POLICY_ESCAPED}" | jq '.policies[0] .id') | |
if [ -n "$DEBUG" ]; then echo "POLICY ID: $POLICY_ID"; fi | |
if [ $POLICY_ID != 'null' ]; then | |
OIFS=$IFS | |
IFS=',' | |
if [ -n "$ALERT_NAME_IN" ]; then | |
for ALERT_NAME in $ALERT_NAME_IN | |
do | |
echo "$ALERT_NAME" | |
ALERT_JSON=$(curl -X GET 'https://api.newrelic.com/v2/alerts_conditions.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "policy_id=${POLICY_ID}" | jq --arg name "${ALERT_NAME}" '.conditions[] | select(.name | contains($name))') | |
if [ -n "$DEBUG" ]; then echo "ALERT_JSON: $ALERT_JSON"; fi | |
if [ -n "$ALERT_JSON" ]; then | |
ALERT_ID=$(echo "${ALERT_JSON}" | jq '.id') | |
if [ -n "$DEBUG" ]; then echo "ALERT ID: $ALERT_ID"; fi | |
if [ -n "$ALERT_ENABLED" ]; then | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg enabled ${ALERT_ENABLED} '.enabled = $enabled') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
fi | |
if [ -n "$ADD_HOST_IN" ]; then | |
for HOST in $ADD_HOST_IN | |
do | |
SERVER_ID=$(curl -X GET 'https://api.newrelic.com/v2/servers.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[host]=${HOST}" | jq '.servers[0] .id') | |
if [ -n "$DEBUG" ]; then echo "SERVER ID: $SERVER_ID"; fi | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg server_id ${SERVER_ID} '.entities += [$server_id]') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
done | |
fi | |
if [ -n "$RM_HOST_IN" ]; then | |
for HOST in $RM_HOST_IN | |
do | |
SERVER_ID=$(curl -X GET 'https://api.newrelic.com/v2/servers.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[host]=${HOST}" | jq '.servers[0] .id') | |
if [ -n "$DEBUG" ]; then echo "SERVER ID: $SERVER_ID"; fi | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg server_id ${SERVER_ID} '.entities -= [$server_id]') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
done | |
fi | |
if [ -n "$ADD_APM_IN" ]; then | |
for APM in $ADD_APM_IN | |
do | |
APM_ID=$(curl -X GET 'https://api.newrelic.com/v2/applications.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${APM}" | jq '.applications[0] .id') | |
if [ -n "$DEBUG" ]; then echo "APM ID: $APM_ID"; fi | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg apm_id ${APM_ID} '.entities += [$apm_id]') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
done | |
fi | |
if [ -n "$RM_APM_IN" ]; then | |
for APM in $RM_APM_IN | |
do | |
APM_ID=$(curl -X GET 'https://api.newrelic.com/v2/applications.json' -H "X-Api-Key: ${API_KEY}" -s -G -d "filter[name]=${APM}" | jq '.applications[0] .id') | |
if [ -n "$DEBUG" ]; then echo "APM ID: $APM_ID"; fi | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq --arg apm_id ${APM_ID} '.entities -= [$apm_id]') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
done | |
fi | |
ALERT_JSON=$(echo "${ALERT_JSON}" | jq 'del(.id) | { condition: . }') | |
if [ -n "$DEBUG" ]; then echo "ALERT NEW JSON: $ALERT_JSON"; fi | |
RESPONSE=$(curl -X PUT "https://api.newrelic.com/v2/alerts_conditions/${ALERT_ID}.json" -H "X-Api-Key: ${API_KEY}" -s -i -H 'Content-Type: application/json' -d "${ALERT_JSON}") | |
if [ -n "$DEBUG" ]; then echo "RESPONSE: $RESPONSE"; fi | |
CODE=$(echo "$RESPONSE" | grep 'HTTP' | awk '{print $2}') | |
if [ $CODE -ne 200 ]; then | |
exit 1 | |
fi | |
else | |
echo 'Invalid alert name' | |
exit 1 | |
fi | |
done | |
fi | |
if [ -n "$ADD_CHANNEL_IN" ]; then | |
for CHANNEL in $ADD_CHANNEL_IN | |
do | |
CHANNEL_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_channels.json' -H "X-Api-Key: ${API_KEY}" -s | jq --arg channel ${CHANNEL} '.channels[] | select(.name | contains($channel)) | .id') | |
if [ -n "$DEBUG" ]; then echo "CHANNEL ID: $CHANNEL_ID"; fi | |
if [ -n "$CHANNEL_ID" ]; then | |
OUTPUT=$(curl -X PUT 'https://api.newrelic.com/v2/alerts_policy_channels.json' -H "X-Api-Key: ${API_KEY}" -s -H 'Content-Type: application/json' -G -d "policy_id=${POLICY_ID}&channel_ids=${CHANNEL_ID}") | |
if [ -n "$DEBUG" ]; then echo "OUTPUT CHANNEL: $OUTPUT"; fi | |
else | |
echo "$CHANNEL not found" | |
fi | |
done | |
fi | |
if [ -n "$RM_CHANNEL_IN" ]; then | |
for CHANNEL in $RM_CHANNEL_IN | |
do | |
CHANNEL_ID=$(curl -X GET 'https://api.newrelic.com/v2/alerts_channels.json' -H "X-Api-Key: ${API_KEY}" -s | jq --arg channel ${CHANNEL} '.channels[] | select(.name | contains($channel)) | .id') | |
if [ -n "$DEBUG" ]; then echo "CHANNEL ID: $CHANNEL_ID"; fi | |
if [ -n "$CHANNEL_ID" ]; then | |
OUTPUT=$(curl -X DELETE 'https://api.newrelic.com/v2/alerts_policy_channels.json' -H "X-Api-Key: ${API_KEY}" -s -H 'Content-Type: application/json' -G -d "policy_id=${POLICY_ID}&channel_id=${CHANNEL_ID}") | |
if [ -n "$DEBUG" ]; then echo "OUTPUT CHANNEL: $OUTPUT"; fi | |
else | |
echo "$CHANNEL not found" | |
fi | |
done | |
fi | |
IFS=$OIFS | |
else | |
echo 'Invalid policy name' | |
exit 1 | |
fi |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Can you explain how to use the script?