#!/bin/bash
#
# Prozedur um ein Filesystem im Script-Cluster zu starten oder zu beenden
#
# Aufruf:
# fs_startstop [--force] [--clear] [--nfs] [--fsck] <mountpoint> {start|stop}
#
########################################################################################
#
#
. `dirname $0`/globals.functions
#
FORCEFLAG=0
CLEARFLAG=0
NFSFLAG=0
FSCKFLAG=0
#
while [[ "${1:0:2}" = "--" ]]
 do
  case "$1" in
    --force) FORCEFLAG=1
             shift;;
    --clear)
             CLEARFLAG=1
             shift;;
    --nfs)
             NFSFLAG=1
             shift;;
    --fsck)
             FSCKFLAG=1
             shift;;
  esac
done
################################################################################
#
MOUNTPOINT=$1
#
FSTAB=/etc/fstab
FSLOCKDAT=$MOUNTPOINT/fslock
#
MOUNT=/bin/mount
UMOUNT=/bin/umount
FSCK=/sbin/fsck
#
MOUNT_TEST=./mount_test
#
################################################################################
# trapcatch
umounttest()
{ if $MOUNT_TEST $MOUNTPOINT
   then
    echo "Das Filesystem konnte nicht unmounted werden!"
    if [[ $CLEARFLAG = 0 ]]
     then
      if [[ $NFSFLAG = 0 ]]
       then
        if [[ -n "$FSLOCKSAVE" ]]
         then
          echo "$FSLOCKSAVE" >$FSLOCKDAT
        else
          date >$FSLOCKDAT
          echo $THISHOSTNAME >>$FSLOCKDAT
        fi
      fi
      exit 1
    else
      echo "******************************************************"
      echo "* Es muss dafuer gesorgt werden, dass das Filesystem *"
      echo "* von Hand unmounted wird.                           *"
      echo "******************************************************"
      exit 0
    fi
  else
    echo "Das Filesystem $MOUNTPOINT wurde dismountet."
    exit 0
  fi
}

################################################################################
#
# Start oder Stop?
#
case "$2" in
  start)
################################################################################
#
# Ist Filesystem schon gemounted?
#
if $MOUNT_TEST $MOUNTPOINT
 then
  echo "Das Filesystem $MOUNTPOINT ist gemounted."
  exit 1
fi
#
#
if [[ $NFSFLAG = 0 ]]
 then
  #
  # Mounten des Filesystems erst mal ReadOnly
  #
  if [[ $FORCEFLAG = 0 ]]
   then
    echo Dateisystem $MOUNTPOINT RO mounten
    if $MOUNT -o ro $MOUNTPOINT
     then
      #
      if [[ -f $FSLOCKDAT ]]
       then
        MD=`head -1 $FSLOCKDAT`
        MH=`tail -1 $FSLOCKDAT`
        if [[ "$MH" != "`hostname`" ]]
         then
          echo "Auf dem Filesystem $MOUNTPOINT existieren noch ClusterLockDateien."
          echo "Das Filesystem ist moeglicherweise auf dem Knoten $MH gemountet."
          echo "Mountzeit: $MD"
          $UMOUNT $MOUNTPOINT
          exit 1
        fi
      fi
    else
      echo "Das Filesystem $MOUNTPOINT kann nicht gemounted werden."
      exit 2
    fi
    $UMOUNT $MOUNTPOINT
  fi
  #
  # ggf. FSCK aufrufen
  #
  if [[ $FSCKFLAG = 1 ]]
   then
    FSDEV=`awk '$2 == "'$MOUNTPOINT'"{print $1}' $FSTAB | head -1`
    if [[ -n "$FSDEV" ]]
     then
      $FSCK $FSDEV
      if [[ $? != 0 ]]
       then
        echo "FSCK ist fehlgeschlagen!"
        exit 1
      fi
    fi
  fi
  #
  # Mounten des Filesystems ReadWrite
  #
  echo Dateisystem $MOUNTPOINT Read-Write remounten
  $MOUNT $MOUNTPOINT
else
  echo Dateisystem $MOUNTPOINT mounten
  $MOUNT $MOUNTPOINT
fi
#
#
if ! $MOUNT_TEST $MOUNTPOINT
 then
  echo "Das Filesystem $MOUNTPOINT konnte nicht gemounted werden."
  exit 1
fi
#
if [[ $NFSFLAG = 0 ]]
 then
  date >$FSLOCKDAT
  echo $THISHOSTNAME >>$FSLOCKDAT
fi
#
#
  ;;
# Ende Startscript
################################################################################
  stop)
################################################################################
# Anfang Stoppscript
#
#
trap 'umounttest' 1 2 3 6 9 14 15
# Filesystem unmounten
#
unset FSLOCKSAVE
if [[ -f $FSLOCKDAT || $FORCEFLAG = 1 || $NFSFLAG = 1 ]]
 then
  if [[ $NFSFLAG = 0 ]]
   then
    FSLOCKSAVE="$(<$FSLOCKDAT)"
    rm -f $FSLOCKDAT
  fi
  echo Dateisystem $MOUNTPOINT unmounten
  if $MOUNT_TEST $MOUNTPOINT
   then
    Z=0
    while ! $UMOUNT $MOUNTPOINT
     do
      echo "Fehler beim unmount des $MOUNTPOINT"
      if [[ $Z -gt 10 ]]
       then
        echo "Der Umount wird abgebrochen"
        break
      fi
      Z=$(($Z + 1))
      echo "Umount wird in $Z Sekunden wiederholt."
      sleep $Z
    done
  else
    echo "Das Dateisystem $MOUNTPOINT ist nicht gemountet."
  fi

  umounttest

else
  echo "Auf dem Filesystem gibt es keine Clusterlockdatei."
  exit 1
fi
#
  ;;
# Ende Stoppscript
################################################################################
  *)
  echo "usage: $0 [--force] [--clear] [--nfs] [--fsck] <filesystem> {start|stop}"
  exit 1
esac
