summaryrefslogtreecommitdiff
path: root/contrib/exchange-bmc-os-info.init.redhat
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/exchange-bmc-os-info.init.redhat')
-rw-r--r--contrib/exchange-bmc-os-info.init.redhat326
1 files changed, 326 insertions, 0 deletions
diff --git a/contrib/exchange-bmc-os-info.init.redhat b/contrib/exchange-bmc-os-info.init.redhat
new file mode 100644
index 0000000..b7ec43f
--- /dev/null
+++ b/contrib/exchange-bmc-os-info.init.redhat
@@ -0,0 +1,326 @@
+#!/bin/sh
+#############################################################################
+#
+# exchange-bmc-os-info: Set OS and BMC (Baseboard Management Controller)
+# parameters during system startup.
+#
+# version: 0.72
+#
+# Authors: Charles Rose <charles_rose@dell.com>
+# Jordan Hargrave <jordan_hargrave@dell.com>
+#
+# Description: Script to set OS information in the BMC; fetch BMC IP/URL
+# and set in the OS for use by other scripts/user.
+#
+# BMC IP and URL are made available in /var/run/bmc-info
+#
+# Example to launch BMC web-interface:
+# # . /var/run/bmc-info
+# # xdg-open $BMC_URL
+#
+# See here for details:
+# https://fedoraproject.org/wiki/Features/AgentFreeManagement
+#
+# OEM Specific: OEM specific ipmi commands go in:
+# 'oem_set_os_version' and 'oem_get_bmc_url'
+#############################################################################
+#
+# chkconfig: 345 99 00
+# description: Set OS name, hostname in BMC; make BMC IP/URL available in OS
+# processname: exchange-bmc-os-info
+# config: /etc/sysconfig/exchange-bmc-os-info
+#
+### BEGIN INIT INFO
+# Provides: exchange-bmc-os-info
+# Required-Start: ipmi
+# Default-Start: 3 4 5
+# Default-Stop: 0 1 2 6
+
+
+#############################################################################
+# GLOBALS
+#############################################################################
+CONFIGFILE=/etc/sysconfig/exchange-bmc-os-info
+IPMI_TOOL=/usr/bin/ipmitool
+BMC_INFO=/var/run/bmc-info
+
+# BMC Manufacturer ID used in 'oem_set_os_version' and 'oem_get_bmc_url'
+DELL="674"
+#OTHER_OEM="123"
+
+# Defaults for ${CONFIGFILE}
+SET_OS_INFO="yes"
+RESET_OS_INFO="no"
+SET_BMC_INFO="yes"
+
+# getsysinfo and setsysinfo commands
+IPMI_SET_SYSINFO="${IPMI_TOOL} mc setsysinfo"
+IPMI_GET_SYSINFO="${IPMI_TOOL} mc getsysinfo"
+#############################################################################
+SCRIPT_NAME=$(basename $0)
+
+# source config
+[ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
+
+RETVAL=0
+
+if [ -f /bin/gettext.sh ]; then
+ GETTEXT=1
+ . /bin/gettext.sh
+ OUTPUT="eval_gettext"
+else
+ GETTEXT=0
+ OUTPUT="echo"
+fi
+
+#############################################################################
+# Get Vendor ID of BMC for use in 'oem_set_os_version' and 'oem_get_bmc_url'
+#
+get_bmc_vendor_id()
+{
+ BMC_VENDOR=$(${IPMI_TOOL} mc info 2>/dev/null | \
+ sed -n "s#^Manufacturer ID.*: ##p")
+ [ -z "${BMC_VENDOR}" ] && RETVAL=4
+}
+
+check_ipmitool()
+{
+ if [ -x ${IPMI_TOOL} ]; then
+ # v1.8.12 plus patches are required for set/getsysinfo support
+ # http://sourceforge.net/mailarchive/message.php?msg_id=29647222
+ [ ! ${IPMI_GET_SYSINFO} >/dev/null 2>&1 ] && \
+ RETVAL=3
+ else
+ RETVAL=2
+ fi
+}
+
+bmc_exists()
+{
+ check_ipmitool
+ [ $RETVAL -eq 0 ] && get_bmc_vendor_id
+ return $RETVAL
+}
+#############################################################################
+
+get_os_info()
+{
+ OS_HOSTNAME=$(hostname)
+ KERNEL_VERSION=$(uname -r -m)
+
+ if [ -e /etc/lsb-release ] ; then
+ . /etc/lsb-release
+ NAME=${DISTRIB_ID}
+ VERSION="${DISTRIB_RELEASE} ${DISTRIB_CODENAME}"
+ fi
+
+ # we prefer systemd's /etc/os-release over other sources
+ [ -e /etc/os-release ] && . /etc/os-release
+
+ OS_NAME=${NAME}
+ OS_VERSION="${VERSION} kernel ${KERNEL_VERSION}"
+}
+
+oem_set_os_version()
+{
+ # OS Version setting is not standard yet
+ # we need per vendor oem commands
+ case "${BMC_VENDOR}" in
+ $DELL) ${IPMI_SET_SYSINFO} delloem_os_version \
+ "${OS_VERSION}" > /dev/null 2>&1
+ return $?
+ ;;
+# Add OEM specific commands.
+# Example:
+# $OTHER_OEM) ${IPMI_SET_SYSINFO} otheroem_os_version \
+# "${OS_VERSION}" > /dev/null 2>&1
+# return $?
+# ;;
+ *) return 0
+ ;;
+ esac
+}
+
+set_os_info()
+{
+ # Set and reset OS info in the BMC
+ if [ "$1" = "reset" ]; then
+ OS_NAME=""
+ OS_HOSTNAME=""
+ OS_VERSION=""
+ fi
+
+ ${IPMI_SET_SYSINFO} os_name "${OS_NAME}" >/dev/null 2>&1 \
+ || RETVAL=6
+ ${IPMI_SET_SYSINFO} primary_os_name "${OS_NAME}" >/dev/null 2>&1 \
+ || RETVAL=6
+ ${IPMI_SET_SYSINFO} system_name "${OS_HOSTNAME}" >/dev/null 2>&1 \
+ || RETVAL=6
+ oem_set_os_version || RETVAL=6
+}
+
+#############################################################################
+valid_url()
+{
+ url="(https?|http)://[a-z0-9-]+(\.[a-z0-9-]+)+([/?].*)?"
+ printf -- "%s" "${TMP_URL}"| grep -Eq "^${url}"
+ return $?
+}
+
+oem_get_bmc_url()
+{
+ # BMC URL is not standard yet
+ # we need per vendor oem commands
+ case "$BMC_VENDOR" in
+ $DELL) TMP_URL=$(${IPMI_GET_SYSINFO} delloem_url 2> /dev/null)
+ ;;
+# Add OEM specific commands
+# Example:
+# $OTHER_OEM)
+# TMP_URL=$(${IPMI_GET_SYSINFO} otheroem_url 2> /dev/null)
+# ;;
+ *) TMP_URL="" ;;
+ esac
+
+ valid_url && BMC_URL=${TMP_URL} || BMC_URL=""
+}
+
+valid_ip()
+{
+ #Thanks to mkyong.com
+ octet="([01]?[[:digit:]][[:digit:]]?|2[0-4][[:digit:]]|25[0-5])"
+
+ printf -- "%s" "${TMP_IPv4}"| grep -Eq "^${octet}\\.${octet}\\.${octet}\\.${octet}$"
+ return $?
+}
+
+get_bmc_ip()
+{
+ #Thanks to http://ingvar.blog.redpill-linpro.com
+ for CHANNEL in `seq 1 14`
+ do
+ [ $(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
+ | grep -q "^Set") ] || break
+ done
+
+ # Get BMC_IPv4 and BMC_URL from BMC
+ TMP_IPv4=$(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
+ | sed -n "s#^IP Address .*: ##p")
+
+ valid_ip && BMC_IPv4=${TMP_IPv4} || BMC_IPv4=""
+}
+
+get_bmc_info()
+{
+ get_bmc_ip
+ if [ -z "${BMC_IPv4}" ] || [ "${BMC_IPv4}" = "0.0.0.0" ]; then
+ BMC_IPv4=""
+ RETVAL=5
+ else
+ # URL makes sense only if there is an IP
+ oem_get_bmc_url
+ fi
+}
+
+set_bmc_info()
+{
+ if [ ! $(touch "${BMC_INFO}" && chmod 600 "${BMC_INFO}") ]; then
+ printf "BMC_IPv4=%s\n" "${BMC_IPv4}" > "${BMC_INFO}"
+ [ -n "${BMC_URL}" ] && \
+ printf "BMC_URL=%s\n" "${BMC_URL}" >> "${BMC_INFO}"
+ else
+ RETVAL=5
+ fi
+}
+
+unset_bmc_info()
+{
+ [ -f ${BMC_INFO} ] && rm -f ${BMC_INFO} > /dev/null 2>&1
+}
+
+#############################################################################
+start()
+{
+ if bmc_exists; then
+ [ "${SET_OS_INFO}" = "yes" ] && \
+ get_os_info && set_os_info
+
+ if [ "${SET_BMC_INFO}" = "yes" ]; then
+ get_bmc_info
+ if [ ${RETVAL} -eq 0 ]; then
+ set_bmc_info
+ fi
+ fi
+ fi
+}
+
+#############################################################################
+stop()
+{
+ if bmc_exists; then
+ # reset OS info while system reboots
+ # aids with debugging OS boot-up issues
+ if [ "${RESET_OS_INFO}" = "yes" ]; then
+ set_os_info reset
+ fi
+ unset_bmc_info
+ fi
+}
+
+#############################################################################
+restart()
+{
+ stop
+ [ $RETVAL -eq 0 ] && start
+}
+
+#############################################################################
+status()
+{
+ [ -r ${BMC_INFO} ] && \
+ grep -q "BMC_IPv4" "${BMC_INFO}" >/dev/null 1>&2 && \
+ BMC_STATUS="ok" || BMC_STATUS="inactive"
+ ${OUTPUT} "${SCRIPT_NAME}: ${BMC_STATUS}" 1>&2
+ [ ${GETTEXT} -eq 1 ] && echo
+}
+
+#############################################################################
+usage()
+{
+ ${OUTPUT} "Usage: ${SCRIPT_NAME} {start|stop|restart|status}" 1>&2
+ [ ${GETTEXT} -eq 1 ] && echo
+ RETVAL=1
+}
+
+#############################################################################
+# MAIN
+#############################################################################
+case "$1" in
+ start) start ;;
+ stop) stop ;;
+ restart) restart ;;
+ status) status ;;
+ *) usage ;;
+esac
+
+case "$RETVAL" in
+ 0|1) ;;
+ 2) ${OUTPUT} "${SCRIPT_NAME}: ipmitool(1) not found." 1>&2 ;;
+ 3) ${OUTPUT} "${SCRIPT_NAME}: this version of ipmitool does not support getsysinfo." 1>&2 ;;
+ 4) ${OUTPUT} "${SCRIPT_NAME}: failed to communicate with BMC." 1>&2 ;;
+ 5) ${OUTPUT} "${SCRIPT_NAME}: failed to set OS information in BMC." 1>&2 ;;
+ 6) ${OUTPUT} "${SCRIPT_NAME}: failed to get BMC information." 1>&2 ;;
+ *) ${OUTPUT} "${SCRIPT_NAME}: unexpected error." 1>&2 ;;
+esac
+
+if [ ${RETVAL} -gt 1 ]; then
+ ${OUTPUT} " Return code: ${RETVAL}" 1>&2
+ [ ${GETTEXT} -eq 1 ] && echo
+fi
+
+
+exit ${RETVAL}
+
+#############################################################################
+# end of file
+#############################################################################