#!/bin/bash
IFS="
"

#Ausgangs-Video-Dir, im allgemeinen /video0 
VDIR="/video0"
#VDIR="/video0_neu"

#Verlinkte Video-Dirs, meist /video1 /video2 ...
#VDIR123="/video1 /video2"
VDIR123="/video1"

# index.vdr, ... auf Video[0-9] sichern
# Die Funktion ist nützlich, wenn die Video-Platten neu zusammengestellt werden sollen.
# Achtung, der VDR kann die Verzeichnisse dann nicht mehr loeschen!
# Für ein "normales" Backup ist es besser Video0 woanders hin zu kopieren.
Backup_Infos="no"

# index.vdr, ... von Video[0-9] loeschen
# Achtung! Beim Wiederherstellen einer Video-Platten-Installation die Funkton beim ersten
# Lauf !!! nicht !!! aktivieren, sonst sind die Dateien weg!!
Clean_Infos="no"

# [0-9][0-9][0-9].vdr Links auf VDIR123 löschen?
Warn_Links_on_VDIR123="yes"

# Aenderungen machen?
Modify="yes"

# Keine Rueckfragen
# automatic="yes"


# VDIR123
typeset -i Checked_Files=0
typeset -i Not_linked=0
typeset -i Not_linked_fixed=0
typeset -i Link_is_not_a_Link=0
typeset -i Link_is_not_a_Link_fixed=0
typeset -i Link_on_VDIR123=0
typeset -i Link_on_VDIR123_fixed=0
typeset -i Link_broken=0
typeset -i Link_broken_fixed=0
typeset -i Wrong_Linktarget=0
typeset -i Wrong_Linkname=0
typeset -i Wrong_Linkname_fixed=0

# VDIR
typeset -i Links=0
typeset -i Broken_Links=0
typeset -i Broken_Links_fixed=0
typeset -i Wrong_Linktargetname=0
typeset -i No_Index=0


VDIR=`echo "${VDIR}" | sed -e 's/\/$//' `

# Das muss noch verbessert werden, wenn das Skript die Video-Dirs selbst findet!

for i in $VDIR123 ; do
# sind die Aufnahmen auch wirklich aufnahmen und keine Links?
	i=`echo "${i}" | sed -e 's/\/$//' `
	echo "Pruefe $i"
	echo " "
        

# test ob die *.vdr korrekt verlinkt sind:
        #for j in `find "${i}/" -type f -name "*.vdr"` ; do
	for h in `find "${i}/" -name "*.rec" -type d 2> /dev/null ` ; do
		MOVED_DIR="?"
#		echo "Pruefe $h"
#		echo " "
# Schritt 1: Videodateien ueberpruefen
		for j in ` find "${h}/" -name "[0-9][0-9][0-9].vdr" 2> /dev/null `; do
			Checked_Files=$Checked_Files+1
			if [ -L $j ] ; then
			#$j ist ein Link, das sollte nicht so sein!
				Link_on_VDIR123=$Link_on_VDIR123+1
				if [ "$Warn_Links_on_VDIR123" = "yes" ] ; then 
					echo "${j} ist ein Link, das sollte auf ${i} nicht so sein!"
					if [ "$Modify" = "yes" ] ; then 
						echo "Link loeschen?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							rm ${j}
							if [ $? -eq 0 ]; then
								echo "... und weg!"
								Link_on_VDIR123_fixed=$Link_on_VDIR123_fixed+1
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "
				fi
				continue
			fi
	
			ONAME=`echo "$j" | sed -e "s/${i//\//\\\/}/${VDIR//\//\\\/}/"`
			PUFFER=`find "$VDIR/" -name "*.vdr" -type l -printf "%h/%f\t%l\n" 2> /dev/null | grep "	${j//\//\\\/}\$" `
			LNAME=`echo "$PUFFER" | cut -f 2 `
			REAL_ONAME=`echo "$PUFFER" | cut -f 1 `
			# ...und pruefen ob eine passende (Link?-)Datei existiert...
			if [ -e $ONAME ] ; then
				if [ ! "$j" = "$LNAME" ] ; then
					echo "$j:" 
					echo "Mehr als ein passender Link auf $VDIR gefunden evtl. Manueller Eingriff noetig!"
					echo " "
				fi
				# ...und pruefen, ob das ein Link ist
				if [ -L $ONAME ] ; then
					#$ONAME ist ein Link
					# Link Ziel feststellen
					DNAME=`ls -l $ONAME | grep ">" | cut -d ">" -f 2| cut -d " " -f 2`
					if [ "$DNAME" != "$j" ] ; then
						# nicht gleich, link zeigt vmtl. falsch
						file $ONAME | grep -q broken
						# wenn nicht, Massnahmen ergreifen
						if [ $? -eq 0 ] ; then
							Link_broken=$Link_broken+1
							echo "Link existiert, ist aber broken! Bei: $j"
							if [ "$Modify" = "yes" ] ; then 
								echo "Link ersaetzen?"
								eingabe="y"
								if [ ! "$automatic" = "yes" ] ; then
									read eingabe
								fi
								if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
#									ln -s -f "$j" "$ONAME"
echo "Funktion noch auskommentiert und ungetestet!!!"
									if [ $? -eq 0 ]; then
									echo "... Link ersaetzt?"
										Link_broken_fixed=$Link_broken_fixed+1
									else
										echo "Fehler !!!"
									fi
								fi
							fi
						else
							Wrong_Linktarget=$Wrong_Linktarget+1
							echo "Link existiert, zeigt aber falsch bei: $j"
							echo "$ONAME -> $DNAME"
							echo "Fehler! Manueller Eingriff noetig!"
						fi
						echo " "
					fi # sonst ist alles ok
				else # kein Link, Datei existiert aber- was nun?
					Link_is_not_a_Link=$Link_is_not_a_Link+1
					echo "Link-Datei existiert, ist aber kein Link! bei: $j"
					if [ "$Modify" = "yes" ] ; then 
						eingabe="y"
						echo "Link-Datei loeschen und durch Link ersaetzen?"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
#							ln -s -f "$j" "$ONAME"
echo "Funktion noch auskommentiert und ungetestet!!!"
							if [ $? -eq 0 ]; then
								Link_is_not_a_Link_fixed=$Link_is_not_a_Link_fixed+1
								echo "... Link geaendert!"
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "	
				fi
			else # $ONAME existiert garnicht ...
				#LNAME=`find "$VDIR/" -name "*.vdr" -type l -printf "%l\n" 2> /dev/null | grep "^${j//\//\\\/}\$" `
				if [ "" = "$LNAME" ] ; then # ... auch kein anderer Link auf die Datei
					Not_linked=$Not_linked+1
					echo "Kein passender Link gefunden bei $j"
					if [ "$Modify" = "yes" ] ; then 
						echo "Link-Datei erstellen?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							ODIRNAME=`dirname "$ONAME"`
							if [ ! -d $ODIRNAME ] ; then
								if [ -e $ODIRNAME ] ; then
									echo "Fehler! $ODIRNAME existiert bereits, ist aber kein Verzeichnis!"
									break
								fi
								mkdir -p "$ODIRNAME"
							fi
							ln -s "$j" "$ONAME"
							if [ $? -eq 0 ]; then
								Not_linked_fixed=$Not_linked_fixed+1
								echo "... Link erstellt!"
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "

				else # Passender Link unter anderem Namen gefunden.
					Wrong_Linkname=$Wrong_Linkname+1
					echo "Linkname passt nicht zum Dateinamen $j"
					# lassen oder Video-Dateien verschieben
					if [ "$Modify" = "yes" ] ; then 
						LCOUNT=`echo "$LNAME"| grep -c "^${j//\//\\\/}\$" `
						if [ "$LCOUNT" = "1" ] ; then # EIN passender Link gefunden
							echo "Video-Dateien verschieben?"
							#DDIRNAME=`dirname "$LNAME"`
							REAL_DNAME=`echo "$REAL_ONAME" | sed -e "s/${VDIR//\//\\\/}/${i//\//\\\/}/"`
							REAL_DDIRNAME=`dirname "$REAL_DNAME"`
							if [  ! "$MOVED_DIR" = "$REAL_DDIRNAME"  -a  !  "$MOVED_DIR" = "?" ] ; then
								echo "Fehler! Verzeichnis $REAL_DDIRNAME inkonsistent!"
							fi
							MOVED_DIR="$REAL_DDIRNAME"
							eingabe="y"
							if [ ! "$automatic" = "yes" ] ; then
								read eingabe
							fi
							if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
								if [ ! -d $REAL_DDIRNAME ] ; then
									if [ -e $REAL_DDIRNAME ] ; then
										echo "Fehler! Datei oder Verzeichnis $DDIRNAME existiert bereits!"
										break
									fi
									mkdir -p "$REAL_DDIRNAME"
								fi
								mv "$j" "$REAL_DNAME"
								if [ $? -ne 0 ]; then
									echo "Fehler! beim verschieben $j -> $REAL_DNAME$DDIRNAME !"
									break
								fi
								ln -s -f "$REAL_DNAME" "$REAL_ONAME"
								if [ $? -eq 0 ]; then
									Wrong_Linkname_fixed=$Wrong_Linkname_fixed+1
									echo "... Datei verschoben!"
								else
									echo "Fehler !!!"
								fi
							fi
						else # mehrere passende Links gefunden!
							echo "Fehler! $LCOUNT moegliche Links gefunden manueller Eingriff noetig!"
						fi
					fi
					echo " "
				fi
			fi
		done

		for J in index marks info resume summary ; do
			j="${h}/${J}.vdr"
			Checked_Files=$Checked_Files+1
			if [ -L "${j}" ] ; then
				#$j ist ein Link, das sollte nicht so sein!
				Link_on_VDIR123=$Link_on_VDIR123+1
				if [ "$Warn_Links_on_VDIR123" = "yes" ] ; then 
					echo "${j} ist ein Link, das sollte auf ${i} nicht so sein!"
					if [ "$Modify" = "yes" ] ; then 
						echo "Link loeschen?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
#							rm ${j}
echo "Funktion noch auskommentiert und ungetestet!!!"
							if [ $? -eq 0 ]; then
								Link_on_VDIR123_fixed=$Link_on_VDIR123_fixed+1
								echo "... und weg!"
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "
				fi
				continue
			fi

			if [ -f "${j}" ] ; then
				if [ ! -e "${h}/001.vdr" -a ! -L "${h}/001.vdr" ]  ; then # Backups in Verzeichnissen ohne 001.vdr ignorieren.
					if [ "$Backup_Infos" = "yes" ]  ; then
						echo "${j} ist in einem Verzeichnis ohne 001.vdr!"
						if [ "$Modify" = "yes" ] ; then 
							echo "Datei loeschen?"
							eingabe="y"
							if [ ! "$automatic" = "yes" ] ; then
								read eingabe
							fi
							if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
								rm ${j}
								if [ $? -eq 0 ]; then
									#_fixed=$_fixed+1
									echo "... und weg!"
								else
									echo "Fehler !!!"
								fi
							fi
						fi
						echo " "
						continue
					fi
				fi
				ONAME=`echo "$j" | sed -e "s/${i//\//\\\/}/${VDIR//\//\\\/}/"`
				if [ ! -e "${ONAME}" ] ; then
					ODIRNAME=`dirname "$ONAME"`
					if [ ! "$MOVED_DIR" = "?" -a -d "$MOVED_DIR" ] ; then
						$ONAME="${MOVED_DIR}/${J}.vdr"
					elif [ ! -d "$ODIRNAME" ] ; then
						echo "Fehler: ${j} keine entsprechendes Verzeichnis auf ${VDIR} gefunden."
						echo " "
						break
					fi
					echo "Original zur Sicherung ${j} fehlt."
					if [ "$Modify" = "yes" ] ; then 
						echo "Sicherung zurueckkopieren?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							cp -pu ${j} ${ONAME}
							if [ $? -eq 0 ]; then
								#_fixed=$_fixed+1
								echo "... Datei kopiert!"
							else
								echo "Fehler !!!"
							fi
						fi
					echo " "
					fi
				elif [ "${j}" -nt "${ONAME}" ] ; then
					echo "Info: Sicherung ${j} neuer als Original."
					if [ "$Modify" = "yes" ] ; then 
						echo "Sicherung zurueckkopieren?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							cp -pu ${j} ${ONAME}
							if [ $? -eq 0 ]; then
								#_fixed=$_fixed+1
								echo "... Datei kopiert!"
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "
				fi
				if [ $Clean_Infos = "yes" ] ; then
					echo "${j} sollte nicht auf ${i} sein!"
					if [ "$Modify" = "yes" ] ; then 
						echo "Datei loeschen?"
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							rm ${j}
							if [ $? -eq 0 ]; then
								#_fixed=$_fixed+1
								echo "... und weg!"
							else
								echo "Fehler !!!"
							fi
						fi
					fi
					echo " "
					continue
				fi
			fi
		done


			found=`find "${h}/" -type d -maxdepth 0 ! -empty 2> /dev/null`
			if [ "$found" = "" ] ; then
				echo "Info: Verzeichnis ${h} leer."
				if [ "$Modify" = "yes" ] ; then
					echo "Verzeichnis loeschen?"
					eingabe="y"
					if [ ! "$automatic" = "yes" ] ; then
						read eingabe
					fi
					if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
						rmdir -p "${h}"
						echo "... und weg!"
					fi
				fi
				echo " "
			fi


# v nur zum testen! v
# if [ $Checked_Files -ge 14 ] ; then
# break
# fi
# ^ nur zum testen! ^
	
	done
	echo "Pruefung von $i abgeschlossen"
	echo " "

done


#Part 2: Welches Video-Dir?
# derzeit als Konstante gesetzt, spaeter evtl. selbst finden

echo "Pruefe Video_rootdir $VDIR"
echo " "

for h in `find "${VDIR}/" -name "*.rec" -type d 2> /dev/null ` ; do
#	echo "h:>$h<"
#	echo " "
	#DIR_LINKED="?"
	#Finde alle *vdr, die ein Symlink sind
	for i in ` find "${h}/" -name "*.vdr" -type l 2> /dev/null `; do
		Links=$Links+1
		# feststellen, ob der link noch gueltig ist oder nicht
		file $i | grep -q broken
		# wenn nicht, Massnahmen ergreifen
		if [ $? -eq 0 ] ; then
			Broken_Links=$Broken_Link+1
			echo "Broken link bei $i"
			if [ "$Modify" = "yes" ] ; then 
				echo "Link loeschen?"
				eingabe="y"
				if [ ! "$automatic" = "yes" ] ; then
					read eingabe
				fi
				if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
					rm ${i}
					if [ $? -eq 0 ]; then
						Broken_Links_fixed=$Broken_Links_fixed+1
						echo "... und weg!"
					else
						echo "Fehler !!!"
					fi
				fi
			fi
			echo " "
			# Next release: suche entsprechende Verzeichnisse
			# in den anderen Video-Dirs und korrigiere ggf. den Link
		else
			DNAME=`ls -l $i | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 `
			#INAME2=`echo "$i" | sed -e "s/${VDIR//\//\\\/}//"`
			INAME=${i//${VDIR}/}
			echo "$DNAME" | grep -q "${INAME}\$"
			if [ $? -ne 0 ]; then
				Wrong_Linktargetname=$Wrong_Linktargetname+1
				echo "Info: Linkname passt nicht zum Dateinamen (das sollte eigentlich schon beseitigt sein):"
				echo "$i -> $DNAME"
				echo " "
			fi
		fi
	done


	# Findet, wenn Aufnahmen nicht fortlaufend.
	# Ob am Ende Teile fehlen kann z.Zt. noch nicht festgestellt werden!
	typeset -i ki=0
	typeset -i kii=0
	typeset -i kiii=0
	for i in `ls -1 ${h}/[0-9][0-9][0-9].vdr 2> /dev/null `; do
		#echo "i:>$i<"
		ki=$ki+1
		if [ $ki -gt 9 ] ; then
			if [ $kii -gt 9 ] ; then
				kiii=$kiii+1
				kii=0
			fi
			kii=$kii+1
			ki=0
		fi
		if [ ! "${h}/$kiii$kii$ki.vdr" = "$i" ] ; then 
			echo "Fehler: Aufnahmen nicht fortlaufend in $h!"
			echo " "
			continue 2
		fi

	done

	for J in index marks info resume summary ; do
		j="${h}/${J}.vdr"
		if [ -L "${j}" ] ; then
			LTARGET=""
			#$j ist ein Link, das sollte nicht so sein!
			echo "${j} ist ein Link, das sollte nicht so sein!"
			if [ "$Modify" = "yes" ] ; then 
				LTARGET=`ls -l $j | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 `
				echo "Link loeschen und Datei kopieren?"
				if [ ! -f "${LTARGET}" ] ; then
					echo "${LTARGET} ist keine Datei!"
					continue
				fi
				eingabe="y"
				if [ ! "$automatic" = "yes" ] ; then
					read eingabe
				fi
				if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
#					cp -pu ${LTARGET} ${j}
echo "Funktion noch auskommentiert und ungetestet!!!"
					if [ $? -eq 0 ]; then
						#_fixed=$_fixed+1
						echo "... Datei kopiert!"
					else
						echo "Fehler !!!"
					fi
				fi
			fi
			echo " "
			continue
		fi
		if [ -f "${j}" ] ; then
			if [ "${J}" = "summary" ] ; then
				echo "Info: ${h}: Alte Aufnahme, summary.vdr gefunden!"
			fi
			if [ "$Backup_Infos" = "yes" -a -L "${h}/001.vdr" ] ; then 
				LTARGET=`ls -l "${h}/001.vdr" | grep ">" | cut -d ">" -f 2| cut -d " " -f 2 `
				LTARGET=`dirname "${LTARGET}"`
				LTARGET="${LTARGET}/${J}.vdr"
				if [ ! -e "${LTARGET}" -o "${j}" -nt "${LTARGET}" ] ; then
					if [ ! -e "${LTARGET}" ] ; then
						echo "es gibt bislang noch kein Backup von ${j} Backup erstellen?"
					else
						echo "${j} neuer als ${LTARGET} als Backup kopieren?"
					fi
					#echo "${j} als Backup nach ${LTARGET} kopieren?"
					if [ "$Modify" = "yes" ] ; then
						eingabe="y"
						if [ ! "$automatic" = "yes" ] ; then
							read eingabe
						fi
						if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
							cp -pu ${j} ${LTARGET}
							if [ $? -eq 0 ]; then
								#_fixed=$_fixed+1
								echo "... Datei kopiert!"
							else
							echo "Fehler !!!"
							fi
						fi
					fi
					echo " "
				elif [ ! -f "${LTARGET}" ] ; then
					echo "Fehler: bearbeite ${j}: ${LTARGET} ist keine Datei!"
				elif [ "${j}" -ot "${LTARGET}" ] ; then
					echo "Info: ${j} aelter als ${LTARGET}, das sollte eigehtlich nicht passieren."
				fi
			fi
		elif [ "${J}" = "index" ] ; then
			No_Index=$No_Index+1
			echo "Fehler: kein index.vdr in ${h}!"
			echo "genindex starten?"
				if [ "$Modify" = "yes" ] ; then
					eingabe="y"
					if [ ! "$automatic" = "yes" ] ; then
						read eingabe
					fi
					if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
						(
							cd ${h}
							genindex
						)
					fi
				fi
			echo " "
		#elif [ "${J}" = "marks" -o "${J}" = "info" ] ; then # zu viele resume.vdr fehlen, ausserdem muss die nicht vorhanden sein.
		#	echo "Info: kein ${J}.vdr in ${h}."
		#	echo " "
		fi
	done

	found=`find "${h}/" -type d -maxdepth 0 -empty 2> /dev/null`
	if [ ! "$found" = "" ] ; then
		echo "Info: Verzeichnis ${h} leer."
		if [ "$Modify" = "yes" ] ; then
			echo "Verzeichnis loeschen?"
			eingabe="y"
			if [ ! "$automatic" = "yes" ] ; then
				read eingabe
			fi
			if [ "$eingabe" = "y" -o "$eingabe" = "Y" -o "$eingabe" = "yes"  ] ; then
				rmdir -p "${h}"
				echo "... und weg!"
			fi
		fi
		echo " "
		continue
	fi	

	if [ ! -f "${h}/001.vdr" ] ; then
		echo "Fehler: kein 001.vdr in ${h}!"
		continue
	fi

	if [ ! -s "${h}/001.vdr" ] ; then
		echo "Fehler: 001.vdr in ${h} hat Groesse 0!"
		continue
	fi
done

echo "Pruefung von Video_rootdir $VDIR abgeschlossen"
echo " "



echo " "
echo "Statistik:"
echo "Durchsuchte Links auf $VDIR: $Links, davon broken: $Broken_Links, davon geloescht: $Broken_Links_fixed"
echo "Bei $Wrong_Linktargetname Links passt der Name nicht zur Zieldatei."
echo "$No_Index Index-Dateien fehlen"
echo " "
echo "Durchsuchte Dateien: $Checked_Files (auf ${VDIR123})"
echo "$Link_on_VDIR123 Videodateien sind Links ($Link_on_VDIR123_fixed geloescht)"
echo "Bei $Wrong_Linktarget zeigt der Link auf eine andere Datei!"
echo "Bei $Link_broken ist der Link defekt ($Link_broken_fixed neu verlinkt)!"
echo "Bei $Link_is_not_a_Link ist der Link kein Link ($Link_is_not_a_Link_fixed Links ersaetzt)!"
echo "Bei $Not_linked existiert kein Link ($Not_linked_fixed neu verlinkt)!"
echo "Bei $Wrong_Linkname existiert kein Link mit passendem Namen, aber einer mit anderem Namen ($Wrong_Linkname_fixed verschoben)."

#find $VDIR -name "*.vdr" -type l -printf "%l\n"
