exchange-bmc-os-info.init.redhat 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #!/bin/sh
  2. #############################################################################
  3. #
  4. # exchange-bmc-os-info: Set OS and BMC (Baseboard Management Controller)
  5. # parameters during system startup.
  6. #
  7. # version: 0.72
  8. #
  9. # Authors: Charles Rose <charles_rose@dell.com>
  10. # Jordan Hargrave <jordan_hargrave@dell.com>
  11. #
  12. # Description: Script to set OS information in the BMC; fetch BMC IP/URL
  13. # and set in the OS for use by other scripts/user.
  14. #
  15. # BMC IP and URL are made available in /var/run/bmc-info
  16. #
  17. # Example to launch BMC web-interface:
  18. # # . /var/run/bmc-info
  19. # # xdg-open $BMC_URL
  20. #
  21. # See here for details:
  22. # https://fedoraproject.org/wiki/Features/AgentFreeManagement
  23. #
  24. # OEM Specific: OEM specific ipmi commands go in:
  25. # 'oem_set_os_version' and 'oem_get_bmc_url'
  26. #############################################################################
  27. #
  28. # chkconfig: 345 99 00
  29. # description: Set OS name, hostname in BMC; make BMC IP/URL available in OS
  30. # processname: exchange-bmc-os-info
  31. # config: /etc/sysconfig/exchange-bmc-os-info
  32. #
  33. ### BEGIN INIT INFO
  34. # Provides: exchange-bmc-os-info
  35. # Required-Start: ipmi
  36. # Default-Start: 3 4 5
  37. # Default-Stop: 0 1 2 6
  38. #############################################################################
  39. # GLOBALS
  40. #############################################################################
  41. CONFIGFILE=/etc/sysconfig/exchange-bmc-os-info
  42. IPMI_TOOL=/usr/bin/ipmitool
  43. BMC_INFO=/var/run/bmc-info
  44. # BMC Manufacturer ID used in 'oem_set_os_version' and 'oem_get_bmc_url'
  45. DELL="674"
  46. #OTHER_OEM="123"
  47. # Defaults for ${CONFIGFILE}
  48. SET_OS_INFO="yes"
  49. RESET_OS_INFO="no"
  50. SET_BMC_INFO="yes"
  51. # getsysinfo and setsysinfo commands
  52. IPMI_SET_SYSINFO="${IPMI_TOOL} mc setsysinfo"
  53. IPMI_GET_SYSINFO="${IPMI_TOOL} mc getsysinfo"
  54. #############################################################################
  55. SCRIPT_NAME=$(basename $0)
  56. # source config
  57. [ -r ${CONFIGFILE} ] && . ${CONFIGFILE}
  58. RETVAL=0
  59. if [ -f /bin/gettext.sh ]; then
  60. GETTEXT=1
  61. . /bin/gettext.sh
  62. OUTPUT="eval_gettext"
  63. else
  64. GETTEXT=0
  65. OUTPUT="echo"
  66. fi
  67. #############################################################################
  68. # Get Vendor ID of BMC for use in 'oem_set_os_version' and 'oem_get_bmc_url'
  69. #
  70. get_bmc_vendor_id()
  71. {
  72. BMC_VENDOR=$(${IPMI_TOOL} mc info 2>/dev/null | \
  73. sed -n "s#^Manufacturer ID.*: ##p")
  74. [ -z "${BMC_VENDOR}" ] && RETVAL=4
  75. }
  76. check_ipmitool()
  77. {
  78. if [ -x ${IPMI_TOOL} ]; then
  79. # v1.8.12 plus patches are required for set/getsysinfo support
  80. # http://sourceforge.net/mailarchive/message.php?msg_id=29647222
  81. [ ! ${IPMI_GET_SYSINFO} >/dev/null 2>&1 ] && \
  82. RETVAL=3
  83. else
  84. RETVAL=2
  85. fi
  86. }
  87. bmc_exists()
  88. {
  89. check_ipmitool
  90. [ $RETVAL -eq 0 ] && get_bmc_vendor_id
  91. return $RETVAL
  92. }
  93. #############################################################################
  94. get_os_info()
  95. {
  96. OS_HOSTNAME=$(hostname)
  97. KERNEL_VERSION=$(uname -r -m)
  98. if [ -e /etc/lsb-release ] ; then
  99. . /etc/lsb-release
  100. NAME=${DISTRIB_ID}
  101. VERSION="${DISTRIB_RELEASE} ${DISTRIB_CODENAME}"
  102. fi
  103. # we prefer systemd's /etc/os-release over other sources
  104. [ -e /etc/os-release ] && . /etc/os-release
  105. OS_NAME=${NAME}
  106. OS_VERSION="${VERSION} kernel ${KERNEL_VERSION}"
  107. }
  108. oem_set_os_version()
  109. {
  110. # OS Version setting is not standard yet
  111. # we need per vendor oem commands
  112. case "${BMC_VENDOR}" in
  113. $DELL) ${IPMI_SET_SYSINFO} delloem_os_version \
  114. "${OS_VERSION}" > /dev/null 2>&1
  115. return $?
  116. ;;
  117. # Add OEM specific commands.
  118. # Example:
  119. # $OTHER_OEM) ${IPMI_SET_SYSINFO} otheroem_os_version \
  120. # "${OS_VERSION}" > /dev/null 2>&1
  121. # return $?
  122. # ;;
  123. *) return 0
  124. ;;
  125. esac
  126. }
  127. set_os_info()
  128. {
  129. # Set and reset OS info in the BMC
  130. if [ "$1" = "reset" ]; then
  131. OS_NAME=""
  132. OS_HOSTNAME=""
  133. OS_VERSION=""
  134. fi
  135. ${IPMI_SET_SYSINFO} os_name "${OS_NAME}" >/dev/null 2>&1 \
  136. || RETVAL=6
  137. ${IPMI_SET_SYSINFO} primary_os_name "${OS_NAME}" >/dev/null 2>&1 \
  138. || RETVAL=6
  139. ${IPMI_SET_SYSINFO} system_name "${OS_HOSTNAME}" >/dev/null 2>&1 \
  140. || RETVAL=6
  141. oem_set_os_version || RETVAL=6
  142. }
  143. #############################################################################
  144. valid_url()
  145. {
  146. url="(https?|http)://[a-z0-9-]+(\.[a-z0-9-]+)+([/?].*)?"
  147. printf -- "%s" "${TMP_URL}"| grep -Eq "^${url}"
  148. return $?
  149. }
  150. oem_get_bmc_url()
  151. {
  152. # BMC URL is not standard yet
  153. # we need per vendor oem commands
  154. case "$BMC_VENDOR" in
  155. $DELL) TMP_URL=$(${IPMI_GET_SYSINFO} delloem_url 2> /dev/null)
  156. ;;
  157. # Add OEM specific commands
  158. # Example:
  159. # $OTHER_OEM)
  160. # TMP_URL=$(${IPMI_GET_SYSINFO} otheroem_url 2> /dev/null)
  161. # ;;
  162. *) TMP_URL="" ;;
  163. esac
  164. valid_url && BMC_URL=${TMP_URL} || BMC_URL=""
  165. }
  166. valid_ip()
  167. {
  168. #Thanks to mkyong.com
  169. octet="([01]?[[:digit:]][[:digit:]]?|2[0-4][[:digit:]]|25[0-5])"
  170. printf -- "%s" "${TMP_IPv4}"| grep -Eq "^${octet}\\.${octet}\\.${octet}\\.${octet}$"
  171. return $?
  172. }
  173. get_bmc_ip()
  174. {
  175. #Thanks to http://ingvar.blog.redpill-linpro.com
  176. for CHANNEL in `seq 1 14`
  177. do
  178. [ $(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
  179. | grep -q "^Set") ] || break
  180. done
  181. # Get BMC_IPv4 and BMC_URL from BMC
  182. TMP_IPv4=$(${IPMI_TOOL} lan print ${CHANNEL} 2>/dev/null \
  183. | sed -n "s#^IP Address .*: ##p")
  184. valid_ip && BMC_IPv4=${TMP_IPv4} || BMC_IPv4=""
  185. }
  186. get_bmc_info()
  187. {
  188. get_bmc_ip
  189. if [ -z "${BMC_IPv4}" ] || [ "${BMC_IPv4}" = "0.0.0.0" ]; then
  190. BMC_IPv4=""
  191. RETVAL=5
  192. else
  193. # URL makes sense only if there is an IP
  194. oem_get_bmc_url
  195. fi
  196. }
  197. set_bmc_info()
  198. {
  199. if [ ! $(touch "${BMC_INFO}" && chmod 600 "${BMC_INFO}") ]; then
  200. printf "BMC_IPv4=%s\n" "${BMC_IPv4}" > "${BMC_INFO}"
  201. [ -n "${BMC_URL}" ] && \
  202. printf "BMC_URL=%s\n" "${BMC_URL}" >> "${BMC_INFO}"
  203. else
  204. RETVAL=5
  205. fi
  206. }
  207. unset_bmc_info()
  208. {
  209. [ -f ${BMC_INFO} ] && rm -f ${BMC_INFO} > /dev/null 2>&1
  210. }
  211. #############################################################################
  212. start()
  213. {
  214. if bmc_exists; then
  215. [ "${SET_OS_INFO}" = "yes" ] && \
  216. get_os_info && set_os_info
  217. if [ "${SET_BMC_INFO}" = "yes" ]; then
  218. get_bmc_info
  219. if [ ${RETVAL} -eq 0 ]; then
  220. set_bmc_info
  221. fi
  222. fi
  223. fi
  224. }
  225. #############################################################################
  226. stop()
  227. {
  228. if bmc_exists; then
  229. # reset OS info while system reboots
  230. # aids with debugging OS boot-up issues
  231. if [ "${RESET_OS_INFO}" = "yes" ]; then
  232. set_os_info reset
  233. fi
  234. unset_bmc_info
  235. fi
  236. }
  237. #############################################################################
  238. restart()
  239. {
  240. stop
  241. [ $RETVAL -eq 0 ] && start
  242. }
  243. #############################################################################
  244. status()
  245. {
  246. [ -r ${BMC_INFO} ] && \
  247. grep -q "BMC_IPv4" "${BMC_INFO}" >/dev/null 1>&2 && \
  248. BMC_STATUS="ok" || BMC_STATUS="inactive"
  249. ${OUTPUT} "${SCRIPT_NAME}: ${BMC_STATUS}" 1>&2
  250. [ ${GETTEXT} -eq 1 ] && echo
  251. }
  252. #############################################################################
  253. usage()
  254. {
  255. ${OUTPUT} "Usage: ${SCRIPT_NAME} {start|stop|restart|status}" 1>&2
  256. [ ${GETTEXT} -eq 1 ] && echo
  257. RETVAL=1
  258. }
  259. #############################################################################
  260. # MAIN
  261. #############################################################################
  262. case "$1" in
  263. start) start ;;
  264. stop) stop ;;
  265. restart) restart ;;
  266. status) status ;;
  267. *) usage ;;
  268. esac
  269. case "$RETVAL" in
  270. 0|1) ;;
  271. 2) ${OUTPUT} "${SCRIPT_NAME}: ipmitool(1) not found." 1>&2 ;;
  272. 3) ${OUTPUT} "${SCRIPT_NAME}: this version of ipmitool does not support getsysinfo." 1>&2 ;;
  273. 4) ${OUTPUT} "${SCRIPT_NAME}: failed to communicate with BMC." 1>&2 ;;
  274. 5) ${OUTPUT} "${SCRIPT_NAME}: failed to set OS information in BMC." 1>&2 ;;
  275. 6) ${OUTPUT} "${SCRIPT_NAME}: failed to get BMC information." 1>&2 ;;
  276. *) ${OUTPUT} "${SCRIPT_NAME}: unexpected error." 1>&2 ;;
  277. esac
  278. if [ ${RETVAL} -gt 1 ]; then
  279. ${OUTPUT} " Return code: ${RETVAL}" 1>&2
  280. [ ${GETTEXT} -eq 1 ] && echo
  281. fi
  282. exit ${RETVAL}
  283. #############################################################################
  284. # end of file
  285. #############################################################################