Skip to content
Snippets Groups Projects
Commit 344d4002 authored by Jan Philipp Timme's avatar Jan Philipp Timme
Browse files

Upgrade plugin smart

parent d9d4d947
No related branches found
No related tags found
No related merge requests found
#!/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.
# Copyright (C) 2019 tribe29 GmbH - License: GNU General Public License v2
# This file is part of Checkmk (https://checkmk.com). It is subject to the terms and
# conditions defined in the file COPYING, which is part of this source code package.
# Reason for this no-op: shellcheck disable=... before the first command disables the error for the
# entire script.
:
# Disable unused variable error (needed to keep track of version)
# shellcheck disable=SC2034
CMK_VERSION="2.0.0p12"
# Function to replace "if type [somecmd]" idiom
# 'command -v' tends to be more robust vs 'which' and 'type' based tests
inpath() {
command -v "${1:?No command to test}" >/dev/null 2>&1
}
# This will be called on LSI based raidcontrollers and accesses
# the SMART data of SATA disks attached to a SAS Raid HBA via
......@@ -39,7 +30,7 @@ megaraid_info()
fi
echo "$PDINFO" | \
while read line ; do
while read -r line ; do
case "$line" in
# FIRST LINE
"Enclosure Device ID"*) #Enclosure Device ID: 252
......@@ -63,8 +54,8 @@ megaraid_info()
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(.*)' | \
smartctl -d megaraid,"${LOG_DEV_ID}" -v 9,raw48 -A /dev/sg0 | \
grep Always | grep -E -v '^190(.*)Temperature(.*)' | \
sed "s|^|Enc${ENC}/Slot${SLOT} $VEND $MODEL |"
;;
esac
......@@ -86,37 +77,47 @@ if which smartctl > /dev/null 2>&1 ; then
# 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
eval "$(tw_cli /"$TWAC" show drivestatus | grep -E '^p[0-9]' | awk '{print $1 " " $7 "0"}' | while read -r twaminor serial ; do
twaminor=${twaminor#p}
serial=${serial:(-9)}
serial=AMCC_${serial}00000000000
echo "$serial=$twaminor"
done`
else:
done)"
else
echo "tw_cli not found" >&2
fi
INPATH_UDEVADM=$(inpath udevadm && echo "udevadm_present")
echo '<<<smart>>>'
SEEN=
for D in /dev/disk/by-id/{scsi,ata}-*; do
for D in /dev/disk/by-id/{scsi,ata,nvme}-*; do
[ "$D" != "${D%scsi-\*}" ] && continue
[ "$D" != "${D%ata-\*}" ] && continue
[ "$D" != "${D%nvme-\*}" ] && continue
[ "$D" != "${D%-part*}" ] && continue
N=$(readlink $D)
N=$(readlink "$D")
N=${N##*/}
if [ -r /sys/block/$N/device/vendor ]; then
VEND=$(tr -d ' ' < /sys/block/$N/device/vendor)
if [ -r /sys/block/"$N"/device/vendor ]; then
VEND=$(tr -d ' ' < /sys/block/"$N"/device/vendor)
elif [ -r /sys/block/"$N"/device/device/vendor ]; then
VEND=NVME
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)
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")
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
if [ "$MODEL" = "iSCSI_Disk" ] || [ "$MODEL" = "LOGICAL_VOLUME" ]; then
continue
fi
# Exclude everything which can read a CD
if [ "$INPATH_UDEVADM" == "udevadm_present" ] && (udevadm info /dev/"$N" | grep -Fxq 'E: ID_CDROM_CD=1'); then
continue
fi
......@@ -131,31 +132,41 @@ if which smartctl > /dev/null 2>&1 ; then
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
if [ "$VEND" == "AMCC" ] && [ -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=$(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
if [ "$VEND" == "NVME" ] ; then
DNAME="/dev/$N"
CMD="smartctl -d nvme -A $DNAME"
else
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`
eval "$(smartctl -d scsi -i -A "$D" | while read -r a b c d _ ; do
[ "$a" == Serial ] && echo SN="$c"
[ "$a" == Current ] && [ "$b" == Drive ] && [ "$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}"
fi
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 |"
if [ $VEND == "NVME" ]; then
echo "$DNAME $VEND $MODEL"
[ -n "$CMD" ] && $CMD | sed -e '1,5d; /^$/d'
else
[ -n "$CMD" ] && $CMD | grep Always | grep -E -v '^190(.*)Temperature(.*)' | sed "s|^|$DNAME $VEND $MODEL |"
fi
done 2>/dev/null
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment