1#!/bin/bash
2
3# Sample script for the exec plugin (collectd-exec(5))
4#
5# This script uses smartctl(8) to read HDD temperatures. The drives are
6# attached to a 3ware RAID controller which hddtempd can't handle.
7# Unfortunately the smartmontools don't have a library so we can't write a
8# C-plugin, at least not easily.
9# Please note that only root can read the SMART attributes from harddrives,
10# because special ``capabilities'' are necessary. However, the exec plugin will
11# refuse to run scripts as root, which is why `sudo' is used here for
12# fine-grained root privileges for the user `smart'. This isn't as straigt
13# forward as one might hope, but we think that the gained security is worth it.
14
15# The sudo configuration looks something like this:
16# -- 8< --
17# Cmnd_Alias      SMARTCTL = /usr/sbin/smartctl -d 3ware\,0 -A /dev/twe0, /usr/sbin/smartctl -d 3ware\,1 -A /dev/twe0, /usr/sbin/smartctl -d ata -A /dev/sda
18# smart   ALL = (root) NOPASSWD: SMARTCTL
19# -- >8 --
20
21HOSTNAME="${COLLECTD_HOSTNAME:-`hostname -f`}"
22INTERVAL="${COLLECTD_INTERVAL:-60}"
23
24while sleep "$INTERVAL"
25do
26	TEMP=$((sudo smartctl -d 3ware,0 -A /dev/twe0 | grep Temperature_Celsius | awk '{ print $10; }') 2>/dev/null);
27	if [ $? -ne 0 ]
28	then
29		TEMP="U"
30	fi
31	echo "PUTVAL $HOSTNAME/exec-smart/temperature-3ware_0 interval=$INTERVAL N:$TEMP"
32
33	TEMP=$((sudo smartctl -d 3ware,1 -A /dev/twe0 | grep Temperature_Celsius | awk '{ print $10; }') 2>/dev/null);
34	if [ $? -ne 0 ]
35	then
36		TEMP="U"
37	fi
38	echo "PUTVAL $HOSTNAME/exec-smart/temperature-3ware_1 interval=$INTERVAL N:$TEMP"
39
40	TEMP=$((sudo smartctl -d ata -A /dev/sda | grep Temperature_Celsius | awk '{ print $10; }') 2>/dev/null);
41	if [ $? -ne 0 ]
42	then
43		TEMP="U"
44	fi
45	echo "PUTVAL $HOSTNAME/exec-smart/temperature-sata_0 interval=$INTERVAL N:$TEMP"
46done
47