Blame SOURCES/0011-ipmitool-1.8.13-bmc-snmp.patch.patch

4e2c59
From 24522dfdfc97df38da50765c1131df80194b2050 Mon Sep 17 00:00:00 2001
4e2c59
From: Boris Ranto <branto@redhat.com>
4e2c59
Date: Fri, 11 Dec 2015 16:27:31 +0100
4e2c59
Subject: [PATCH 11/11] ipmitool-1.8.13-bmc-snmp.patch
00a85e
4e2c59
Incorporate upstream comments to #289, add whitespace, other
4e2c59
cleanup.
4e2c59
4e2c59
Backported by: aledvink
00a85e
---
00a85e
 contrib/bmc-snmp-proxy | 130 +++++++++++++++++++++++++++++--------------------
00a85e
 1 file changed, 76 insertions(+), 54 deletions(-)
00a85e
00a85e
diff --git a/contrib/bmc-snmp-proxy b/contrib/bmc-snmp-proxy
00a85e
index 1704ef3..98479b9 100644
00a85e
--- a/contrib/bmc-snmp-proxy
00a85e
+++ b/contrib/bmc-snmp-proxy
00a85e
@@ -3,7 +3,7 @@
00a85e
 #
00a85e
 # bmc-snmp-proxy:	Set SNMP proxy to BMC (Baseboard Management Controller)
00a85e
 #
00a85e
-# version:	0.6
00a85e
+# version:	0.62
00a85e
 #
00a85e
 # Authors:	Charles Rose <charles_rose@dell.com>
00a85e
 #		Jordan Hargrave <jordan_hargrave@dell.com>
00a85e
@@ -20,9 +20,9 @@
00a85e
 SYSCONF_DIR="/etc/sysconfig"
00a85e
 CONFIG="${SYSCONF_DIR}/bmc-snmp-proxy"
00a85e
 
00a85e
-SNMPD_LOCAL_CONF_DIR="/etc/snmp/bmc"
00a85e
-SNMPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmpd.local.conf"
00a85e
-TRAPD_LOCAL_CONF="${SNMPD_LOCAL_CONF_DIR}/snmptrapd.local.conf"
00a85e
+SNMPD_BMC_CONF_DIR="/etc/snmp/bmc"
00a85e
+SNMPD_BMC_CONF="${SNMPD_BMC_CONF_DIR}/snmpd.local.conf"
00a85e
+TRAPD_BMC_CONF="${SNMPD_BMC_CONF_DIR}/snmptrapd.local.conf"
00a85e
 
00a85e
 TRAPD_CONF="/etc/snmp/snmptrapd.conf"
00a85e
 
00a85e
@@ -57,14 +57,16 @@ bmc_info_exists()
00a85e
 	else
00a85e
 		RETVAL=2
00a85e
 	fi
00a85e
+
00a85e
 	return $RETVAL
00a85e
 }
00a85e
 
00a85e
 check_snmp()
00a85e
 {
00a85e
-	if [ ! -d /etc/snmp ] && [ ! -x /usr/sbin/snmpd ]; then
00a85e
+	if [ ! -d /etc/snmp ] || [ ! -x /usr/sbin/snmpd ]; then
00a85e
 		RETVAL=12
00a85e
 	fi
00a85e
+
00a85e
 	return $RETVAL
00a85e
 }
00a85e
 
00a85e
@@ -77,11 +79,12 @@ write_snmp_conf()
00a85e
 	printf "###############################################\n"
00a85e
 	printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
00a85e
 	printf "###############################################\n"
00a85e
-	printf "view bmcview included %s 80\n" "${BMC_OID}"
00a85e
-	printf "com2sec -Cn bmc_ctx bmc_sec default bmc_cmty\n"
00a85e
-	printf "group bmc_grp v1 bmc_sec\n"
00a85e
-	printf "access bmc_grp bmc_ctx any noauth exact bmcview none none\n"
00a85e
-	printf "proxy -Cn bmc_ctx -v 1 %s\n" "${PROXY_TOKEN}"
00a85e
+	printf "#view bmcview included %s 80\n" "${BMC_OID}"
00a85e
+	printf "#com2sec -Cn bmc_ctx bmc_sec default bmc_cmty\n"
00a85e
+	printf "#group bmc_grp v1 bmc_sec\n"
00a85e
+	printf "#access bmc_grp bmc_ctx any noauth exact bmcview none none\n"
00a85e
+	printf "#proxy -Cn bmc_ctx -v 1 %s\n" "${PROXY_TOKEN}"
00a85e
+	printf "proxy -v 1 %s\n" "${PROXY_TOKEN}"
00a85e
 	printf "###############################################\n"
00a85e
 }
00a85e
 
00a85e
@@ -92,6 +95,7 @@ valid_ip()
00a85e
 
00a85e
         printf -- "%s" "${1}"| grep -Eq \
00a85e
 		"^${octet}\\.${octet}\\.${octet}\\.${octet}$"
00a85e
+
00a85e
         return $?
00a85e
 }
00a85e
 
00a85e
@@ -112,37 +116,38 @@ set_snmp_proxy()
00a85e
 	if check_vars; then
00a85e
 		PROXY_TOKEN="-c ${BMC_COMMUNITY} ${BMC_IPv4} ${BMC_OID}"
00a85e
 
00a85e
-		if [ ! -d ${SNMPD_LOCAL_CONF_DIR} ] && \
00a85e
-			 	mkdir ${SNMPD_LOCAL_CONF_DIR}; then
00a85e
-			write_snmp_conf > ${SNMPD_LOCAL_CONF}
00a85e
-			[ $? -ne 0 ] && RETVAL=4
00a85e
+		if [ -d ${SNMPD_BMC_CONF_DIR} ]; then
00a85e
+			write_snmp_conf > ${SNMPD_BMC_CONF} || RETVAL=4
00a85e
 		fi
00a85e
 	else
00a85e
 		RETVAL=3
00a85e
 	fi
00a85e
 }
00a85e
 
00a85e
-
00a85e
 set_snmpd_conf_path()
00a85e
 {
00a85e
-	for SYSCONF in ${SYSCONF_DIR}/snmp*d;
00a85e
+	if [ ! -d ${SNMPD_BMC_CONF_DIR} ]; then
00a85e
+		mkdir ${SNMPD_BMC_CONF_DIR} || RETVAL=7
00a85e
+	fi
00a85e
+
00a85e
+	# We need SNMPCONFPATH set for both snmpd and snmptrapd
00a85e
+	for sysconf in ${SYSCONF_DIR}/snmp*d;
00a85e
 	do
00a85e
-		if grep -q "${SNMPD_LOCAL_CONF_DIR}" "${SYSCONF}" > \
00a85e
-				 /dev/null 2>&1; then
00a85e
-			continue
00a85e
-		else
00a85e
-			printf "SNMPCONFPATH=%s\n" "${SNMPD_LOCAL_CONF_DIR}" \
00a85e
-				>> ${SYSCONF} || RETVAL=7
00a85e
+		if ! grep -q "^SNMPCONFPATH.*${SNMPD_BMC_CONF_DIR}" \
00a85e
+			"${sysconf}" > /dev/null 2>&1; then
00a85e
+			printf "SNMPCONFPATH=/etc/snmp:%s\n" \
00a85e
+				"${SNMPD_BMC_CONF_DIR}" >> ${sysconf} || \
00a85e
+				RETVAL=7
00a85e
 		fi
00a85e
 	done
00a85e
+
00a85e
 	return $RETVAL
00a85e
 }
00a85e
 
00a85e
 disable_snmp_proxy()
00a85e
 {
00a85e
-	if [ -f ${SNMPD_LOCAL_CONF} ]; then
00a85e
-		rm -f ${SNMPD_LOCAL_CONF}
00a85e
-		[ $? -ne 0 ] && RETVAL=5
00a85e
+	if [ -f ${SNMPD_BMC_CONF} ]; then
00a85e
+		rm -f ${SNMPD_BMC_CONF} || RETVAL=5
00a85e
 	fi
00a85e
 }
00a85e
 #############################################################################
00a85e
@@ -152,6 +157,7 @@ disable_snmp_proxy()
00a85e
 pick_alert_dest()
00a85e
 {
00a85e
 	test_ip="$1"
00a85e
+	# We have 4 IPv4 and 4 IPv6 alert dest. We will set IPv4 for now.
00a85e
 	for ALERT_DEST in `seq 1 4`
00a85e
 	do
00a85e
 		temp_ip=$(${IPMITOOL} lan alert print ${CHANNEL} ${ALERT_DEST}\
00a85e
@@ -165,12 +171,12 @@ pick_alert_dest()
00a85e
 set_alert_dest_ip()
00a85e
 {
00a85e
 	${IPMITOOL} lan alert set ${CHANNEL} ${ALERT_DEST} ipaddr ${1} \
00a85e
-		retry 4 type pet >/dev/null 2>&1
00a85e
-	[ $? -ne 0 ] && RETVAL=8
00a85e
+		retry 4 type pet >/dev/null 2>&1 || RETVAL=8
00a85e
 }
00a85e
 
00a85e
-bmc_alert_dest()
00a85e
+config_bmc_alert_dest()
00a85e
 {
00a85e
+	# call with enable|disable
00a85e
 	# Pick the first active LAN channel
00a85e
         for CHANNEL in `seq 1 14`
00a85e
         do
00a85e
@@ -180,12 +186,12 @@ bmc_alert_dest()
00a85e
 
00a85e
 	# If TRAPD_IP is already set as an alert dest,
00a85e
 	if pick_alert_dest "${TRAPD_IP}"; then
00a85e
-		# reset: reset it if we are called with reset
00a85e
-		[ "${1}" = "reset" ] && \
00a85e
+		# disable: reset it if we are called with disable
00a85e
+		[ "${1}" = "disable" ] && \
00a85e
 			set_alert_dest_ip "0.0.0.0"
00a85e
 	# else, find the next free alert dest,
00a85e
 	elif pick_alert_dest "0.0.0.0"; then
00a85e
-		[ "${1}" = "reset" ] && \
00a85e
+		[ "${1}" = "disable" ] && \
00a85e
 			return $RETVAL
00a85e
 		# set: the TRAPD_IP
00a85e
 		set_alert_dest_ip "${TRAPD_IP}"
00a85e
@@ -193,42 +199,54 @@ bmc_alert_dest()
00a85e
 		# No free alert destinations
00a85e
 		RETVAL=9
00a85e
 	fi
00a85e
+
00a85e
 	return $RETVAL
00a85e
 }
00a85e
 
00a85e
-set_ipmi_alert()
00a85e
+set_ipmi_pef()
00a85e
 {
00a85e
-	${IPMITOOL} lan set ${CHANNEL} alert "${1}" >/dev/null 2>&1
00a85e
-	[ $? -ne 0 ] && RETVAL=10
00a85e
+	# Needs ipmitool-1.8.13 + patches
00a85e
+	${IPMITOOL} pef setpolicy ${ALERT_DEST} "${1}" >/dev/null 2>&1 || \
00a85e
+		RETVAL=10
00a85e
 }
00a85e
 
00a85e
 get_host_ip()
00a85e
 {
00a85e
-	# Get host's IP that the BMC can reach.
00a85e
+	# Get host's IP that the BMC can reach. This is at best a hack.
00a85e
 	IFACE=$(/usr/sbin/ip -o -f inet address |awk '!/: lo/ {print $2}')
00a85e
+
00a85e
 	for dev in ${IFACE}
00a85e
 	do
00a85e
-		ping -c 1 -I ${dev} ${BMC_IPv4} > /dev/null 2>&1
00a85e
+		temp_ping=$(ping -c 1 -I ${dev} ${BMC_IPv4})
00a85e
+		[ $? -ne 0 ] && continue
00a85e
+
00a85e
+		printf -- "%s" "$temp_ping"| awk 'NR==1{print $5}' && break
00a85e
 	done
00a85e
 }
00a85e
 
00a85e
 config_bmc_alert()
00a85e
 {
00a85e
+	# Do two things
00a85e
+	# Set/Reset TRAP IP in BMC
00a85e
+	# Enable/Disable PEF alerting in BMC for TRAP
00a85e
+
00a85e
 	# Get Host's IP that the BMC can send traps to
00a85e
 	TRAPD_IP=$(get_host_ip)
00a85e
 
00a85e
 	# Set Host's IP as the alert destination in the BMC
00a85e
-	valid_ip ${TRAPD_IP} && bmc_alert_dest "${ACTION}"
00a85e
+	valid_ip ${TRAPD_IP} && config_bmc_alert_dest "${ACTION}"
00a85e
+
00a85e
+	# Enable/Disable alerting on the LAN channel
00a85e
+	[ $RETVAL -eq 0 ] && set_ipmi_pef "${ACTION}"
00a85e
 
00a85e
-	# Enable alerting on the LAN channel
00a85e
-	[ $RETVAL -eq 0 ] && set_ipmi_alert "${ACTION}"
00a85e
+	return $RETVAL
00a85e
 }
00a85e
 
00a85e
 write_trapd_conf()
00a85e
 {
00a85e
 	printf "###############################################\n"
00a85e
 	printf "# Automatically created by %s #\n" "${SCRIPT_NAME}"
00a85e
-	printf "forward %s %s\n" "${BMC_OID}*" "${FORWARD_HOST}"
00a85e
+	printf "forward default %s\n" "${FORWARD_HOST}"
00a85e
 	printf "###############################################\n"
00a85e
 }
00a85e
 
00a85e
@@ -236,10 +254,9 @@ config_trapd()
00a85e
 {
00a85e
 	# Proceed only if snmptrapd is available on the system
00a85e
 	if [ -f ${TRAPD_CONF} ]; then
00a85e
-		write_trapd_conf > ${TRAPD_LOCAL_CONF}
00a85e
-		[ $? -ne 0 ] && RETVAL=11
00a85e
+		write_trapd_conf > ${TRAPD_BMC_CONF} || RETVAL=11
00a85e
 	else
00a85e
-		return 1
00a85e
+		RETVAL=11
00a85e
 	fi
00a85e
 }
00a85e
 
00a85e
@@ -249,6 +266,7 @@ trap_sink_exists()
00a85e
 	# multiple
00a85e
 	FORWARD_HOST=$(awk '/^trap.*sink/{print $2}; /^informsink/{print $2}' \
00a85e
 			/etc/snmp/snmpd*conf | head -1)
00a85e
+
00a85e
 	if [ -z "${FORWARD_HOST}" ]; then
00a85e
 		# there is no trapsink setup.
00a85e
 		return 1
00a85e
@@ -261,19 +279,20 @@ trap_sink_exists()
00a85e
 trap_forward()
00a85e
 {
00a85e
 	NO_TRAP=0
00a85e
-	ACTION=${1} # set or reset
00a85e
+	ACTION=${1} # enable or disable
00a85e
 
00a85e
-	if [ "${ACTION}" = "set" ]; then
00a85e
+	if [ "${ACTION}" = "enable" ]; then
00a85e
 		# Get trapd config,
00a85e
 		if trap_sink_exists; then
00a85e
-			config_trapd && config_bmc_alert
00a85e
+			config_bmc_alert && config_trapd
00a85e
 		else
00a85e
 			# exit silently if there is no sink
00a85e
 			NO_TRAP=1
00a85e
 		fi
00a85e
 	else
00a85e
-		if [ -f ${TRAPD_LOCAL_CONF} ]; then
00a85e
-			rm -f ${TRAPD_LOCAL_CONF} >/dev/null 2>&1
00a85e
+		if [ -f ${TRAPD_BMC_CONF} ]; then
00a85e
+			rm -f ${TRAPD_BMC_CONF} >/dev/null 2>&1
00a85e
+			config_bmc_alert
00a85e
 		else
00a85e
 			NO_TRAP=1
00a85e
 		fi
00a85e
@@ -288,7 +307,6 @@ service_reload()
00a85e
 		service $1 reload
00a85e
 		[ $? -ne 0 ] && RETVAL=6
00a85e
 	fi
00a85e
-	return
00a85e
 }
00a85e
 
00a85e
 #############################################################################
00a85e
@@ -296,11 +314,12 @@ start()
00a85e
 {
00a85e
 	if bmc_info_exists && check_snmp; then
00a85e
 		touch ${LOCKFILE}
00a85e
+
00a85e
 		set_snmpd_conf_path && set_snmp_proxy
00a85e
 		[ $RETVAL -eq 0 ] && service_reload snmpd
00a85e
 
00a85e
 		if [ "${TRAP_FORWARD}" = "yes" ]; then
00a85e
-			trap_forward "set"
00a85e
+			trap_forward "enable"
00a85e
 			[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
00a85e
 				service_reload snmptrapd
00a85e
 		fi
00a85e
@@ -316,10 +335,11 @@ stop()
00a85e
 		[ $RETVAL -eq 0 ] && service_reload snmpd
00a85e
 
00a85e
 		if [ "${TRAP_FORWARD}" = "yes" ]; then
00a85e
-			trap_forward "reset"
00a85e
+			trap_forward "disable"
00a85e
 			[ $RETVAL -eq 0 ] && [ $NO_TRAP -eq 0 ] && \
00a85e
 				service_reload snmptrapd
00a85e
 		fi
00a85e
+
00a85e
 		rm -f ${LOCKFILE}
00a85e
 	fi
00a85e
 }
00a85e
@@ -329,12 +349,13 @@ status()
00a85e
 {
00a85e
 	eval_gettext "${SCRIPT_NAME}: snmp proxy to BMC is "
00a85e
 	# Checking for lockfile is better.
00a85e
-	#if grep -q "^proxy" "${SNMPD_LOCAL_CONF}" > /dev/null 2>&1 ; then
00a85e
+	#if grep -q "^proxy" "${SNMPD_BMC_CONF}" > /dev/null 2>&1 ; then
00a85e
 	if [ -f ${LOCKFILE} ]; then
00a85e
 		eval_gettext "set"
00a85e
 	else
00a85e
 		eval_gettext "not set"
00a85e
 	fi
00a85e
+
00a85e
 	echo
00a85e
 	RETVAL=0
00a85e
 }
00a85e
@@ -360,10 +381,10 @@ case "$RETVAL" in
00a85e
 	0|1) ;;
00a85e
 	2) eval_gettext "${SCRIPT_NAME}: failed to read ${BMC_INFO} " 1>&2 ;;
00a85e
 	3) eval_gettext "${SCRIPT_NAME}: failed to get proxy config." 1>&2 ;;
00a85e
-	4) eval_gettext "${SCRIPT_NAME}: failed to set ${SNMPD_LOCAL_CONF}." 1>&2 ;;
00a85e
+	4) eval_gettext "${SCRIPT_NAME}: failed to set ${SNMPD_BMC_CONF}." 1>&2 ;;
00a85e
 	5) eval_gettext "${SCRIPT_NAME}: failed to disable snmp proxy." 1>&2 ;;
00a85e
 	6) eval_gettext "${SCRIPT_NAME}: failed to reload snmpd." 1>&2 ;;
00a85e
-	7) eval_gettext "${SCRIPT_NAME}: failed to update ${SYSCONF}." 1>&2 ;;
00a85e
+	7) eval_gettext "${SCRIPT_NAME}: failed to set snmpd config." 1>&2 ;;
00a85e
 	8) eval_gettext "${SCRIPT_NAME}: failed to set IPMI alert dest." 1>&2 ;;
00a85e
 	9) eval_gettext "${SCRIPT_NAME}: no free IPMI alert dest." 1>&2 ;;
00a85e
 	10) eval_gettext "${SCRIPT_NAME}: failed to set IPMI PEF." 1>&2 ;;
00a85e
@@ -375,6 +396,7 @@ esac
00a85e
 if [ ${RETVAL} -gt 1 ]; then
00a85e
         eval_gettext " Return code: ${RETVAL}"; echo
00a85e
 fi
00a85e
+
00a85e
 exit ${RETVAL}
00a85e
 #############################################################################
00a85e
 # end of file
00a85e
-- 
4e2c59
2.1.0
00a85e