Last active
September 8, 2022 07:53
-
-
Save jworl/fd11b2b941627a12b6f6c1e1ad8715dc to your computer and use it in GitHub Desktop.
Issue reset, power off, or power on for SuperMicro BMC via web interface
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
#!/usr/bin/env bash | |
# written by: Joshua Worley | |
# received great help from DavidWittman here: | |
# https://gist.github.com/DavidWittman/98281cdf1d32ac795b74 | |
# This version's improvements: | |
# - allows reset, power on, or power off | |
# - sanity check conditionals | |
# - sends pushover alert for notification | |
# | |
# usage: ./ipmi_power.sh [ipmi-address] [off|on|reset] | |
# example: ./ipmi_power.sh 192.168.1.100 reset | |
_COOKIE(){ | |
curl -d "name=$2&pwd=$3" "https://$1/cgi/login.cgi" \ | |
--silent --insecure -i | awk '/Set-Cookie/ && NR != 2 { print $2 }' | |
} | |
_EVENT(){ | |
curl -s --form-string "token=put your application token here" \ | |
--form-string "user=put your user or group token here" \ | |
--form-string "message=$1" \ | |
https://api.pushover.net/1/messages.json &> /dev/null | |
} | |
_POWER(){ | |
curl "https://$1/cgi/ipmi.cgi" \ | |
-XPOST \ | |
-H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' \ | |
-H "Referer: http://$1/cgi/url_redirect.cgi?url_name=sys_info" \ | |
-H 'Accept: text/javascript, text/html, application/xml, text/xml, */*' \ | |
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/603.2.5 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.5' \ | |
-H "Cookie: $2" \ | |
-H "Origin: https://$1" \ | |
-H 'X-Prototype-Version: 1.5.0' \ | |
-H 'X-Requested-With: XMLHttpRequest' \ | |
--data "POWER_INFO.XML=($3)&time_stamp=Tue%20Jun%2027%202017%2010%3A30%3A57%20GMT-0400%20(EDT)&_=" \ | |
--insecure \ | |
--silent &> /dev/null | |
echo $? | |
} | |
# set -x | |
IPMI_HOST="$1" | |
IPMI_ACTION="$2" | |
IPMI_USER=${IPMI_USER:-ADMIN} | |
IPMI_PASS=${IPMI_PASS:-ADMIN} | |
if [[ $# -ne 2 ]]; then | |
echo "usage: $0 [ipmi-address] [cycle|off|on|reset|shutdown]" | |
exit 1 | |
fi | |
if [[ ${IPMI_ACTION} =~ ^shutdown$ ]]; then | |
POWER_INFO="1%2C5" | |
elif [[ ${IPMI_ACTION} =~ ^off$ ]]; then | |
POWER_INFO="1%2C0" | |
elif [[ ${IPMI_ACTION} =~ ^on$ ]]; then | |
POWER_INFO="1%2C1" | |
elif [[ ${IPMI_ACTION} =~ ^reset$ ]]; then | |
POWER_INFO="1%2C3" | |
elif [[ ${IPMI_ACTION} =~ ^cycle$ ]]; then | |
POWER_INFO="1%2C2" | |
else | |
echo "invalid selection: $2; please choose [cycle|off|on|reset|shutdown]" | |
exit 1 | |
fi | |
SESSION_ID=$(_COOKIE "${IPMI_HOST}" "${IPMI_USER}" "${IPMI_PASS}") | |
if ! [[ ${SESSION_ID} =~ ^SID=[a-z]{16}\;$ ]]; then | |
MESSAGE="Unexpected SESSION_ID from ${IPMI_HOST} - ${SESSION_ID}" | |
_EVENT "${MESSAGE}" | |
exit 2 | |
fi | |
EXIT_CODE=$(_POWER "${IPMI_HOST}" "${SESSION_ID}" "${POWER_INFO}") | |
if [[ ${EXIT_CODE} -eq 0 ]]; then | |
STATUS="successful" | |
else | |
STATUS="failed" | |
fi | |
MESSAGE="${IPMI_HOST} ${STATUS} ${IPMI_ACTION}" | |
_EVENT "${MESSAGE}" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment