#!/bin/sh
# APC control tool by robbat2
# Remember to copy powernet368.mib to /usr/share/snmp/mibs/ !
RW_COMMUNITY="RW-PASSWORD"
PARAMS="-c ${RW_COMMUNITY} -m ALL -v 1"
DOMAIN=""
HOSTS="power0.rack0.$DOMAIN power1.rack0.$DOMAIN"
BASEMIB="enterprises.apc.products.hardware.rPDU"
GET="snmpget ${PARAMS}"
SET="snmpset ${PARAMS}"
WALK="snmpwalk ${PARAMS}"

doHelp() {
	echo "Syntax:"
	echo "$0 list"
	echo "$0 status BOX"
	echo "$0 on BOX"
	echo "$0 off BOX"
	echo "$0 reboot BOX"
	echo "$0 rename PDU OUTLET NAME"
	exit 1
}

getOutlets() {
	BOX="$@"
	for h in $HOSTS ; do
		$WALK $h PowerNet-MIB::rPDUOutletStatusOutletName -Oqs |awk  "/\<${BOX}\>/{print \$1}" | sed "s,rPDUOutletStatusOutletName\.,$h~,g" | xargs
	done
}
getStatus() {
	OUTLET="${1/*~/}"
	HOST="${1/~*/}"
	$WALK $HOST PowerNet-MIB::rPDUOutletStatus |egrep "\.$OUTLET = "
}
setState() {
	OUTLET="${1/*~/}"
	HOST="${1/~*/}"
	STATE="$2"
	$SET $HOST "PowerNet-MIB::rPDUOutletControlOutletCommand.$OUTLET" = "$STATE"
}
setName() {
	HOST="$1"
	OUTLET="$2"
	NAME="$3"
	echo $SET $HOST "PowerNet-MIB::rPDUOutletConfigOutletName.$OUTLET" = "$NAME"
	$SET $HOST "PowerNet-MIB::rPDUOutletConfigOutletName.$OUTLET" = "$NAME"
}

listOutlets() {
	for h in $HOSTS ; do
		echo "$h:"
		$WALK $h PowerNet-MIB::rPDUOutletStatusOutletName -Oqs | sed -r -e 's,rPDUOutletStatusOutletName\.([[:digit:]]+) ,\1 = ,g'
	done
}

CMD="$1"
BOX="$2"
case $CMD in
	list)
		listOutlets
	;;
	status)
		[ -n "$BOX" ] || doHelp
		OUTLETS="$(getOutlets $BOX)"
		for o in $OUTLETS; do
			getStatus $o
		done
	;;
	on)
		[ -n "$BOX" ] || doHelp
		OUTLETS="$(getOutlets $BOX)"
		for o in $OUTLETS; do
			setState $o immediateOn
		done
	;;
	off)
		[ -n "$BOX" ] || doHelp
		OUTLETS="$(getOutlets $BOX)"
		for o in $OUTLETS; do
			setState $o immediateOff
		done
	;;
	reboot)
		[ -n "$BOX" ] || doHelp
		# Do all off, then all on
		# for machines that have multiple PSUs
		OUTLETS="$(getOutlets $BOX)"
		for o in $OUTLETS; do
			setState $o immediateOff
		done
		sleep 5
		for o in $OUTLETS; do
			setState $o immediateOn
		done
	;;
	rename)
		HOST="$2"
		OUTLET="$3"
		NAME="$4"
		[ -n "${HOST}" ] || doHelp
		[ -n "${OUTLET}" ] || doHelp
		[ "${OUTLET//[0-9]}" == "" ] || doHelp
		[ -n "${NAME}" ] || doHelp
		[ "${HOST//.}" == "${HOST}" ] && HOST="${HOST}.${DOMAIN}"
		setName "${HOST}" "${OUTLET}" "${NAME}"
	;;
	get)
		[ -n "$BOX" ] || doHelp
		OUTLETS="$(getOutlets $BOX)"
		echo $OUTLETS
	;;
	*) doHelp ;;
esac
