Skip to content

Instantly share code, notes, and snippets.

@lichti
Last active May 7, 2019 13:48
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save lichti/f04abfea888625bbeac42fae56c0f7ee to your computer and use it in GitHub Desktop.
Save lichti/f04abfea888625bbeac42fae56c0f7ee to your computer and use it in GitHub Desktop.
Script to enable or disable newrelic alerts
#!/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
@CesarNog
Copy link

CesarNog commented May 7, 2019

Can you explain how to use the script?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment