#!/bin/bash
### BEGIN INIT INFO
# Provides:          myfscheck.sh
# Required-Start:
# Required-Stop:     umountfs
# X-Stop-After:      sendsigs
# Default-Start:
# Default-Stop:      0
# Short-Description:
# Description:
### END INIT INFO
#
#Beschreibung: fsck beim Shutdown (aktuelle Version 0.8)
#
#benötigt: /sbin/tune2fs /sbin/fsck /sbin/logsave /usr/bin/mail
#
#Aufruf: myfscheck.sh [start|restart|reload|force-reload|stop]
#
#Hinweise und Fehler an tuxator@tuxator.de
#
#Status: ok
###################################################################
#Version 0.8:
#Verarbeitung von UUID integriert
#Version 0.7:
#grep-Fehler bei Root-FS beseitigt, INIT INFO-Block eingefügt
#Version 0.6:
#Prüfung auf Voraussetzungen optimiert
#Auslesen der fstab überarbeitet
#Version 0.5:
#Fehler in Z 122 beseitigt
#Version 0.4:
#Schachtelungstiefe verbessert
#for-Schleife optimiert
#Ausgaben auf Deutsch umgestellt
#Version 0.3:
#Code nochmals optimiert
#alles in eine Hauptfunktion integriert
#Prüfung auf Label <none> eingefügt
#Version 0.2:
#Code der Hauptfunktion optimiert
#Funktion read_fstab überarbeitet
###################################################################
#Variablen
declare fsarray
###################################################################
do_stop()
{
dev=""
lbl=""
logfile=/var/log/fsck/checkmyfs
retval=0
#Prüfung auf Voraussetzungen
for cmd in /sbin/tune2fs /sbin/fsck /sbin/logsave /usr/bin/mail
do
	if [[ ! -e ${cmd} ]]; then
		echo "Überprüfung nicht möglich. ${cmd} nicht gefunden"
		retval=1
	fi
done
# wenn on_ac_power installiert, prüfe ob System auf Akku läuft
if [[ -e /usr/bin/on_ac_power ]] && [[ ${retval} == 0 ]]; then
	/usr/bin/on_ac_power 2>&1 /dev/null
	ret_on_ac_power=${?}
fi
# wenn ret_on_ac_power == 1 dann Akkubetrieb
if [[ ${ret_on_ac_power} == 1 ]]; then
	echo "Akkubetrieb! Überspringe Überprüfung der Dateisysteme."
	retval=2
fi
if [[ ${retval} == 0 ]]; then
	typeset -i difbmi
	typeset -i maxm
	typeset -i istm
	currentifs=${IFS}
	IFS=$'\n'
	#Durchsuche die fstab nach
	#^[^#] Zeilen die am Anfang keine Raute enthalten gefolgt von
	#.* beliebigen Zeichen gefolgt von
	#ext gefolgt von
	#.* beliebigen Zeichen gefolgt von
	#([[:space:]]+0) einem Block aus Whitespace und 0 der
	#{1,2} mindestens 1, höchstens 2 Mal auftritt und
	#$ bis zum Zeilenende geht
	#schließe / und /usr (oder was auch immer für Mountpunkte) aus
	fsarray=($(grep -E "^[^#].*ext.*([[:space:]]+0){1,2}$" /etc/fstab | grep -v -E "(/[[:space:]]|/usr|/mnt/netdisk)"))
	#für alle gefundenen Filesysteme
	for fs in ${fsarray[*]}
	do
		dev=$(echo ${fs} | awk '{ print $1 }')
		#Ermittle Max.Mounts und Ist.Mounts
		maxm=$(tune2fs -l ${dev} | grep "Maximum mount count" | awk '{ print $4 }')
		istm=$(tune2fs -l ${dev} | grep "Mount count" | awk '{print $3}')
		lbl=$(tune2fs -l ${dev} | grep "Filesystem volume name" | awk '{ print $4 }')
		#wenn kein Label, nimm Devicenamen zum anzeigen
		if [[ "${lbl}" == "" || "${lbl}" == "<none>" ]]; then
			lbl=${dev}
		fi
		#Differenz zwischen MaxMounts und IstMounts
		difbmi=${maxm}-${istm}
		#wenn weniger als 6 Mountvorgänge bis zum nächsten Check
		if (( ${difbmi} < 6 && ${difbmi} > 0 )) ; then
			#gib Meldung aus, wann der nächste Check läuft
			echo ${lbl} "wird nach" ${difbmi} "Mountvorgängen überprüft."
		#wenn MaxMounts erreicht
		elif (( ${difbmi} <= 0 )); then
			#stelle sicher, daß FS nicht doch gemountet
			#Device oder UUID?
			if [[ ${dev::5} == "UUID=" ]]; then
				#wandel UUID in Device um
				dev=$(blkid -U ${dev:5})
			fi
			if [[ $(grep ${dev} /etc/mtab) ]]; then
				#hänge FS aus
				umount ${dev}
				ret_umount=${?}
				if (( "${ret_umount}" != 0 )); then
					echo "Aushängen von ${dev} fehlgeschlagen"
					retval=3
				fi
			fi
			if [[ ${retval} == 0 ]]; then
				echo ${lbl} "wird jetzt überprüft."
				#FS überprüfen
				logsave -s -a ${logfile} fsck -V -C -a ${dev}
				#Error abfangen
				if (( "${?}" > 1 )); then
					echo "Die automatische Überprüfung von ${lbl} ist fehlgeschlagen.
Eine manuelle Überprüfung nach dem Restart des Systems wird empfohlen." | tee -a $(pwd)/err.log
					mail -s ${0} root@localhost < $(pwd)/err.log
					rm -f $(pwd)/err.log
					retval=4
				else
					echo "Überprüfung abgeschlossen.
Ein Bericht wurde in die Datei ${logfile} geschrieben."
				fi
			fi
		fi
	done
	IFS=${currentifs}
fi
return ${retval}
}
###################################################################
###################################################################
case "${1}" in
  start)
	# No-op
	echo "starte srcipt" > /var/log/tets.log
	;;
  restart|reload|force-reload)
	echo "Fehler: Argument '$1' wird nicht unterstützt." >&2
	RetVal=1
	;;
  stop|"")
	do_stop
	RetVal=${?}
	;;
  *)
	echo "Benutze: myfscheck.sh [start|stop]" >&2
	RetVal=1
	;;
esac
exit ${RetVal}
####################################################################
