Blame contrib/exchange-bmc-os-info.init.redhat

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