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