#!/bin/sh #------------------------------------------------------------------------------ # /usr/sbin/tw_status - status for LSI/3ware Escalade IDE RAID Adapters # # Copyright (c) 2003-2007 Maximilian Pasternak # Copyright (c) 2008-2018 The Eisfair Team, team(at)eisfair(dot)org # # Creation: 2003-07-19 max # Last Update: $Id$ # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. #------------------------------------------------------------------------------ # command line parameters quietflag='' if [ "$1" = "-quiet" ] then quietflag='quiet' shift fi #exec 2>/tmp/tw_status-trace-$$.log #set -x if [ "${TWADMIN_DO_DEBUG}" = "yes" ] then set -x fi # read configuration if [ -f /etc/config.d/twadmin ] then . /etc/config.d/twadmin else echo "configuration file '/etc/config.d/twadmin' not found!" exit 1 fi # path to logfiles TW_TEMPFILE="/tmp/twadmin-$$" TW_LOGFILE='/var/log/log.twadmin' TW_ALARMLOG='/var/log/log.twadmin.alarms' TW_ERRORFILE=/var/run/twadmin-error # path to the cli TW_CLI=/usr/sbin/tw_cli # generate timestamp TW_TIMESTAMP=`/bin/date +%Y%m%d%k%M%S` ### error-flag TW_ERRORFLAG='OK' # check cli version TW_CLI_TYPE='OLD' if /var/install/config.d/twadmin.sh 'is_tw_cli_type_new' then TW_CLI_TYPE='NEW' fi # check alarm support TW_ALARMS_SUPPORT='FALSE' if /var/install/config.d/twadmin.sh 'is_tw_cli_alarm_support' then TW_ALARMS_SUPPORT='TRUE' fi [ ! -f $TW_ALARMLOG ] && touch $TW_ALARMLOG # delete tempfile and save timestamp rm -f $TW_TEMPFILE /bin/date +%d.%m.%Y-%k:%M:%S >> $TW_TEMPFILE echo >> $TW_TEMPFILE # iterate all LSI/3ware controllers TW_CONTROLLERS="`/var/install/config.d/twadmin.sh 'get_tw_controllers'`" for TW_C in $TW_CONTROLLERS do # controller parameters if [ "$TW_CLI_TYPE" = "NEW" ] then { echo "Controller: c${TW_C}" echo "--------------" $TW_CLI info c${TW_C} driver | head -1 $TW_CLI info c${TW_C} model | head -1 $TW_CLI info c${TW_C} firmware | head -1 $TW_CLI info c${TW_C} bios | head -1 $TW_CLI info c${TW_C} monitor | head -1 $TW_CLI info c${TW_C} serial | head -1 $TW_CLI info c${TW_C} pcb | head -1 $TW_CLI info c${TW_C} pchip | head -1 $TW_CLI info c${TW_C} achip | head -1 echo } >> $TW_TEMPFILE fi $TW_CLI info c${TW_C} >> $TW_TEMPFILE if [ "$TW_ALARMS_SUPPORT" = "TRUE" ] then TW_ALARM_SET='' $TW_CLI alarms > /dev/null 2> /dev/null if [ $? -eq 0 ] then # command supported $TW_CLI alarms | grep -q "^c${TW_C} " | grep -qE "DEBUG|ERROR|UNKNOWN|WARNING" if [ $? -eq 0 ] then # alarms exist TW_ALARM_SET='TRUE' TW_STATUS_TXT="`$TW_CLI alarms | grep "^c${TW_C} "`" else # no alarms found TW_ALARM_SET='FALSE' TW_STATUS_TXT="No alarms for controller c${TW_C} found." fi else # command not supported TW_ALARMS_SUPPORT='FALSE' fi if [ "$TW_ALARM_SET" = "TRUE" ] then TW_ERRORFLAG='ERROR' { /bin/date +%d.%m.%Y-%k:%M:%S echo echo 'Ctl Date Severity AEN Message' echo '------------------------------------------------------------------------------' echo echo "$TW_STATUS_TXT" echo echo } > $TW_ALARMLOG if [ "$TWADMIN_SYSLOGD" = "yes" -a "$quietflag" = "quiet" ] then /usr/bin/logger -t "3ware" -p "local0.info" "alarm for controller ${TW_C}: look at $TW_ALARMLOG for details" fi fi echo "$TW_STATUS_TXT" >> $TW_TEMPFILE fi echo >> $TW_TEMPFILE # iterate all units TW_UNITS="`/var/install/config.d/twadmin.sh 'get_tw_units' "${TW_C}"`" for TW_U in $TW_UNITS do TW_STATUS_TXT=`$TW_CLI info c${TW_C} u${TW_U} status | sed 's/(.*)//'` if ! echo "$TW_STATUS_TXT" | grep -qE "^OK|= OK$" then TW_ERRORFLAG='ERROR' fi $TW_CLI info c${TW_C} u${TW_U} >> $TW_TEMPFILE echo >> $TW_TEMPFILE if [ "$TWADMIN_SYSLOGD" = "yes" -a "$quietflag" = "quiet" ] then /usr/bin/logger -t "3ware" -p "local0.info" "status (controller ${TW_C}; unit ${TW_U}): $TW_STATUS_TXT" fi done # iterate all ports/drives TW_PORTS="`/var/install/config.d/twadmin.sh 'get_tw_ports' "${TW_C}" 'with-status'`" # read list of active ports from configuration file TW_ACTIVE_PORTS="`/var/install/config.d/twadmin.sh 'get_config_ports' "${TW_C}"`" for TW_PORT in ${TW_PORTS} do # extract port number (-f1) TW_P=`echo "${TW_PORT}" | sed 's/[.,].*$//'` if [ "${TW_CLI_TYPE}" = "NEW" ] then # new syntax - create status output message (-f2) TW_STATUS_TXT="/c${TW_C}/p${TW_P} Status = `echo "${TW_PORT}" | sed 's/^.*[.,]//'`" else # old syntax - get port status TW_STATUS_TXT=`${TW_CLI} info c${TW_C} p${TW_P} status | sed 's/(.*)//'` fi if echo "${TW_ACTIVE_PORTS}" | grep -q " ${TW_P} " then # active port found if ! echo "${TW_STATUS_TXT}" | grep -qE "^OK|= OK$" then TW_ERRORFLAG='ERROR' fi if ! echo "${TW_STATUS_TXT}" | grep -q "NOT-PRESENT" then # execute only if port/drive exists ${TW_CLI} info c${TW_C} p${TW_P} >> ${TW_TEMPFILE} ${TW_CLI} info c${TW_C} p${TW_P} smart >> ${TW_TEMPFILE} 2>> ${TW_TEMPFILE} fi else # port check deactivated TW_STATUS_TXT="/c${TW_C}/p${TW_P} Port check deactivated" fi if [ "${TWADMIN_SYSLOGD}" = "yes" -a "${quietflag}" = "quiet" ] then /usr/bin/logger -t "3ware" -p "local0.info" "status (controller ${TW_C}; port ${TW_P}): ${TW_STATUS_TXT}" fi done done # output if [ "${TW_ERRORFLAG}" != "OK" -o -f ${TW_ERRORFILE} -o "${quietflag}" != "quiet" ] then echo echo "LSI/3ware Escalade IDE RAID Controller" if [ "${TW_ERRORFLAG}" != "OK" ] then # create error marker to send at least one final ok report after an error had appeared touch ${TW_ERRORFILE} echo echo "--- ERROR REPORT ---" else # delete error marker after status has been recovered to (normal) ok mode rm -f ${TW_ERRORFILE} fi echo cat ${TW_TEMPFILE} fi if [ "$quietflag" = "quiet" -a "${TWADMIN_LOG}" = "yes" ] then { cat $TW_TEMPFILE echo "------------------------------------------------------" echo } >> $TW_LOGFILE fi rm -f $TW_TEMPFILE set +x