123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326 |
- #!/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
- #############################################################################
|