#!/bin/bash # +------------------------------------------------------------------+ # | ____ _ _ __ __ _ __ | # | / ___| |__ ___ ___| | __ | \/ | |/ / | # | | | | '_ \ / _ \/ __| |/ / | |\/| | ' / | # | | |___| | | | __/ (__| < | | | | . \ | # | \____|_| |_|\___|\___|_|\_\___|_| |_|_|\_\ | # | | # | Copyright Mathias Kettner 2014 mk@mathias-kettner.de | # +------------------------------------------------------------------+ # # This file is part of Check_MK. # The official homepage is at http://mathias-kettner.de/check_mk. # # check_mk 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 in version 2. check_mk is distributed # in the hope that it will be useful, but WITHOUT ANY WARRANTY; with- # out even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. See the GNU General Public License for more de- # tails. You should have received a copy of the GNU General Public # License along with GNU Make; see the file COPYING. If not, write # to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, # Boston, MA 02110-1301 USA. # This will be called on LSI based raidcontrollers and accesses # the SMART data of SATA disks attached to a SAS Raid HBA via # SCSI protocol interface. megaraid_info() { #PDINFO=$(MegaCli -PDlist -a0) if [ -z "$1" ]; then PDINFO=$(megacli -PDlist -a0 -NoLog) else PDINFO=$($1 -PDlist -a0 -NoLog) fi echo "$PDINFO" | \ while read line ; do case "$line" in # FIRST LINE "Enclosure Device ID"*) #Enclosure Device ID: 252 ENC=$( echo "$line" | awk '{print $4}') unset SLOT LOG_DEV_ID VEND MODEL ;; "Slot Number"*) #Slot Number: 7 SLOT=$( echo "$line" | awk '{print $3}') ;; # Identify the logical device ID. smartctl needs it to access the disk. "Device Id"*) #Device Id: 19 LOG_DEV_ID=$( echo "$line" | awk '{print $3}') ;; "PD Type"*) #PD Type: SATA VEND=$( echo "$line" | awk '{print $3}') ;; # This is the last value, generate output here "Inquiry Data"*) #Inquiry Data: WD-WCC1T1035197WDC WD20EZRX-00DC0B0 80.00A80 # $4 seems to be better for some vendors... wont be possible to get this perfect. MODEL=$( echo "$line" | awk '{print $3}') # /dev/sdc ATA SAMSUNG_SSD_830 5 Reallocated_Sector_Ct 0x0033 100 100 010 Pre-fail Always - smartctl -d megaraid,${LOG_DEV_ID} -v 9,raw48 -A /dev/sg0 | \ grep Always | egrep -v '^190(.*)Temperature(.*)' | \ sed "s|^|Enc${ENC}/Slot${SLOT} $VEND $MODEL |" ;; esac done } # Only handle always updated values, add device path and vendor/model if which smartctl > /dev/null 2>&1 ; then # # if the 3ware-utility is found # get the serials for all disks on the controller # if which tw_cli > /dev/null 2>&1 ; then # support for only one controller at the moment TWAC=$(tw_cli show | awk 'NR < 4 { next } { print $1 }' | head -n 1) # - add a trailing zero to handle case of unused slot # trailing zeros are part of the device links in /dev/disk/by-id/... anyway # - only the last 9 chars seem to be relevant # (hopefully all this doesn't change with new kernels...) eval `tw_cli /$TWAC show drivestatus | grep -E '^p[0-9]' | awk '{print $1 " " $7 "0"}' | while read twaminor serial ; do twaminor=${twaminor#p} serial=${serial:(-9)} serial=AMCC_${serial}00000000000 echo "$serial=$twaminor" done` else: echo "tw_cli not found" >&2 fi echo '<<>>' SEEN= for D in /dev/disk/by-id/{scsi,ata}-*; do [ "$D" != "${D%scsi-\*}" ] && continue [ "$D" != "${D%ata-\*}" ] && continue [ "$D" != "${D%-part*}" ] && continue N=$(readlink $D) N=${N##*/} if [ -r /sys/block/$N/device/vendor ]; then VEND=$(tr -d ' ' < /sys/block/$N/device/vendor) else # 2012-01-25 Stefan Kaerst CDJ - in case $N does not exist VEND=ATA fi if [ -r /sys/block/$N/device/model ]; then MODEL=$(sed -e 's/ /_/g' -e 's/_*$//g' < /sys/block/$N/device/model) else MODEL=$(smartctl -a $D | grep -i "device model" | sed -e "s/.*:[ ]*//g" -e "s/\ /_/g") fi # Excluded disk models for SAN arrays or certain RAID luns that are also not usable.. if [ "$MODEL" = "iSCSI_Disk" -o "$MODEL" = "LOGICAL_VOLUME" ]; then continue fi # Avoid duplicate entries for same device if [ "${SEEN//.$N./}" != "$SEEN" ] ; then continue fi SEEN="$SEEN.$N." # strip device name for final output DNAME=${D#/dev/disk/by-id/scsi-} DNAME=${DNAME#/dev/disk/by-id/ata-} # 2012-01-25 Stefan Kaerst CDJ - special option in case vendor is AMCC CMD= if [ "$VEND" == "AMCC" -a -n "$TWAC" ]; then DNAME=${DNAME#1} [ -z "${!DNAME}" ] && continue CMD="smartctl -d 3ware,${!DNAME} -v 9,raw48 -A /dev/twa0" # create nice device name including model MODEL=$(tw_cli /$TWAC/p${!DNAME} show model | head -n 1 | awk -F= '{ print $2 }') MODEL=${MODEL## } MODEL=${MODEL// /-} DNAME=${DNAME#AMCC_} DNAME="AMCC_${MODEL}_${DNAME%000000000000}" elif [ "$VEND" != "ATA" ] ; then TEMP= # create temperature output as expected by checks/smart # this is a hack, TODO: change checks/smart to support SCSI-disks eval `smartctl -d scsi -i -A $D | while read a b c d e ; do [ "$a" == Serial ] && echo SN=$c [ "$a" == Current -a "$b" == Drive -a "$c" == Temperature: ] && echo TEMP=$d done` [ -n "$TEMP" ] && CMD="echo 194 Temperature_Celsius 0x0000 000 000 000 Old_age Always - $TEMP (0 0 0 0)" DNAME="${VEND}_${MODEL}_${SN}" else CMD="smartctl -d ata -v 9,raw48 -A $D" fi [ -n "$CMD" ] && $CMD | grep Always | egrep -v '^190(.*)Temperature(.*)' | sed "s|^|$DNAME $VEND $MODEL |" done 2>/dev/null # Call MegaRaid submodule if conditions are met if type MegaCli >/dev/null 2>&1; then MegaCli_bin="MegaCli" elif type MegaCli64 >/dev/null 2>&1; then MegaCli_bin="MegaCli64" elif type megacli >/dev/null 2>&1; then MegaCli_bin="megacli" else MegaCli_bin="unknown" fi if [ "$MegaCli_bin" != "unknown" ]; then megaraid_info "$MegaCli_bin" fi else echo "ERROR: smartctl not found" >&2 fi