#!/bin/bash
#
# Prozedur um ein Filesystem im Script-Cluster zu starten oder zu beenden
#
# Aufruf:
# fsg_startstop [--force] [--clear] [--nfs] [--fsck] <gruppenname> {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
################################################################################
#
GPNAME=$1
#
FSTAB=/etc/fstab
FSLOCKDAT=fslockgp
#
MOUNT=/bin/mount
UMOUNT=/bin/umount
FSCK=/sbin/fsck
#
GPMOUNT_TEST=./gpmount_test
MOUNT_TEST=./mount_test
#
# Start oder Stop?
#
case "$2" in
  start)
################################################################################
#
# Ist Filesystem schon gemounted?
#
$GPMOUNT_TEST $GPNAME
RET=$?
if [[ $RET = 1 ]]
 then
  echo "Die Filesysteme der Gruppe $GPNAME sind gemounted."
  exit 1
elif [[ $RET = 2 ]]
 then
  echo "Einige Filesysteme der Gruppe $GPNAME sind gemounted."
  exit 2
fi
#
#
if [[ $NFSFLAG = 0 ]]
 then
  #
  # Mounten der Filesysteme erst mal ReadOnly
  #
  echo "Dateisysteme der Gruppe $GPNAME Read-Only mounten."
  sed 's/#.*SCCL.*GRP: *\([^ #]*\) *#/#SCCLGRP: \1 /' $FSTAB | awk ' $1 == "#SCCLGRP:" && $2 == "'$GPNAME'" { print $3, $4, $5, $6}' | while read dev mp fstype opts
   do
    echo Dateisystem $mp mounten
    $MOUNT -o ro $dev $mp
    #
    if [[ -f $mp/$FSLOCKDAT ]]
     then
      echo "Auf dem Filesystem $mp existieren noch ClusterLockDateien."
      echo "Das Filesystem ist moeglicherweise auf einem anderen Knoten gemountet."
      $UMOUNT $mp
      exit 3
    fi
    $UMOUNT $mp
  done
  if [[ $? != 0 ]]
   then
    if [[ "$CLEARFLAG" = "0" || "$FORCEFLAG" = "0" ]]
     then
      echo "--clear und --force ist nicht gesetzt -> Abbruch"
      exit 3
    fi
  fi
fi
if [[ i$FSCKFLAG = 1 ]]
 then
  #
  # ggf. FSCK aufrufen
  #
  echo "Dateisysteme der Gruppe $GPNAME pruefen"
  sed 's/#.*SCCL.*GRP: *\([^ #]*\) *#/#SCCLGRP: \1 /' $FSTAB | awk ' $1 == "#SCCLGRP:" && $2 == "'$GPNAME'" { print $3, $4, $5, $6}' | while read dev mp fstype opts
   do
    echo Dateisystem $mp pruefen
    $FSCK $dev
    if [[ $? != 0 ]]
     then
      echo "FSCK auf $dev ist fehlgeschlagen!"
      exit 4
    fi
  done
fi
#
# Mounten der Filesysteme ReadWrite
#
UMOUNTS=""
echo "Dateisysteme der Gruppe $GPNAME Read-Write mounten."
sed 's/#.*SCCL.*GRP: *\([^ #]*\) *#/#SCCLGRP: \1 /' $FSTAB | awk ' $1 == "#SCCLGRP:" && $2 == "'$GPNAME'" { print $3, $4, $5, $6}' | while read dev mp fstype opts
 do
  echo Dateisystem $mp mounten
  $MOUNT -t $fstype -o $opts $dev $mp
  if ! $MOUNT_TEST $mp
   then
    echo "Das Filesystem $mp konnte nicht gemounted werden."
    if [[ ! -z "$UMOUNTS" ]]
     then
      if [[ $NFSFLAG = 0 ]]
       then
        for i in $UMOUNTS
         do
          rm -f $i/$FSLOCKDAT
        done
      fi
      $UMOUNT $UMOUNTS
    fi
    exit 1
  fi
  if [[ $NFSFLAG = 0 ]]
   then
    date >$mp/$FSLOCKDAT
    echo $THISHOSTNAME >>$mp/$FSLOCKDAT
  fi
  UMOUNTS="$UMOUNTS $mp"
done
#
#
  ;;
# Ende Startscript
################################################################################
  stop)
################################################################################
# Anfang Stoppscript
#
#
# Filesysteme unmounten
#
sed 's/#.*SCCL.*GRP: *\([^ #]*\) *#/#SCCLGRP: \1 /' $FSTAB | awk ' $1 == "#SCCLGRP:" && $2 == "'$GPNAME'" { print $4}' | while read mp
 do
  if [[ -f $mp/$FSLOCKDAT || $FORCEFLAG = 1 || $NFSFLAG = 1 ]]
   then
    if [[ $NFSFLAG = 0 ]]
     then
      rm -f $mp/$FSLOCKDAT
    fi
    $UMOUNT $mp
    if $MOUNT_TEST $mp
     then
      echo "Das Filesystem $mp konnte nicht unmounted werden!"
      if [[ $CLEARFLAG = 0 ]]
       then
        date >$mp/$FSLOCKDAT
        echo $THISHOSTNAME >>$mp/$FSLOCKDAT
      else
        echo "******************************************************"
        echo "* Es muss dafuer gesorgt werden, dass das Filesystem *"
        echo "* von Hand unmounted wird.                           *"
        echo "******************************************************"
      fi
    fi
  else
    echo "Auf dem Filesystem gibt es keine Clusterlockdatei."
  fi
done

#
  ;;
# Ende Stoppscript
################################################################################
  *)
  echo "usage: $0 [--force] [--clear] [--nfs] [--fsck] <filesystem> {start|stop}"
  exit 1
esac
