#! /bin/sh

# smartmontools init file for smartd
# Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
# $Id: smartd.initd.in 3360 2011-06-06 19:25:36Z chrfranke $

# For RedHat and cousins:
# chkconfig: - 60 60
# description: Self Monitoring and Reporting Technology (SMART) Daemon
# processname: smartd 

# For SuSE and cousins
### BEGIN INIT INFO
# Provides:                   smartd
# Required-Start:             $syslog $remote_fs
# Should-Start:               sendmail
# Required-Stop:              $syslog $remote_fs
# Should-Stop:                sendmail
# Default-Start:              2 3 4 5
# Default-Stop:               0 1 6
# Short-Description:          Monitors disk and tape health via S.M.A.R.T.
# Description:                Start S.M.A.R.T. disk and tape monitor.
### END INIT INFO

# 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, or (at your option) any later
# version. 
# You should have received a copy of the GNU General Public License (for
# example COPYING); if not, write to the Free Software Foundation, Inc., 675
# Mass Ave, Cambridge, MA 02139, USA.
# This code was originally developed as a Senior Thesis by Michael Cornwell
# at the Concurrent Systems Laboratory (now part of the Storage Systems
# Research Center), Jack Baskin School of Engineering, University of
# California, Santa Cruz. http://ssrc.soe.ucsc.edu/.

# Uncomment the line below to pass options to smartd on startup. 
# Note that distribution specific configuration files like
# /etc/{default,sysconfig}/smartmontools might override these
#smartd_opts="--interval=1800"

SMARTD_BIN=/usr/sbin/smartd
SMARTDPID=/var/run/smartd.pid
[ -x $SMARTD_BIN ] || exit 0
RET=0

# source configuration file
[ -r /etc/default/rcS ] && . /etc/default/rcS
[ -r /etc/default/smartmontools ] && . /etc/default/smartmontools

smartd_opts="--pidfile $SMARTDPID $smartd_opts"

case "$1" in
	start)
		if [ "$start_smartd" != "yes" ]; then
			[ "$VERBOSE" != "no" ] && echo "Not starting S.M.A.R.T. daemon smartd, disabled via /etc/default/smartmontools"
			exit 0
		fi
		echo -n "Starting S.M.A.R.T. daemon: smartd"
		if start-stop-daemon --start --quiet --pidfile $SMARTDPID \
			--exec $SMARTD_BIN -- $smartd_opts; then
			echo "."
		else
			echo " (failed)"
			RET=1
		fi
		;;
	stop)
		echo -n "Stopping S.M.A.R.T. daemon: smartd"
		start-stop-daemon --stop --quiet --oknodo --pidfile $SMARTDPID
		echo "."
		;;
	restart)
		$0 stop
		$0 start
		;;
	force-reload)
		$0 reload || $0 restart
		;;
	reload)
		echo -n "Reload S.M.A.R.T. daemon: smartd"
		if start-stop-daemon --stop --quiet --signal 1 \
			--pidfile $SMARTDPID; then
			echo "."
		else
			echo " (failed)"
			RET=1
		fi
		;;
	report)
		echo -n "Checking SMART devices now"
		if start-stop-daemon --stop --quiet --signal 10 \
			--pidfile $SMARTDPID; then
			echo "."
		else
			echo " (failed)"
			RET=1
		fi
		;;
	status)
		if pidof $SMARTD_BIN >/dev/null; then
			echo "$SMARTD_BIN is running."
		else
			echo "$SMARTD_BIN is not running."
			RET=1
		fi
		;;
	*)
		echo "Usage: $0 {start|stop|restart|force-reload|reload|report|status}"
		exit 1
esac
exit $RET
