#!/bin/bash
#
# sccl_join_cluster
#
# einem SCCL-Cluster beitreten
# auf dem Master SCCL-Knoten muss sccl_add_node ausgefuehrt werden
##################################################################
#
if [[ -d /var/lock/subsys ]]
 then
  lockfile=/var/lock/subsys/sccl_cluster
else
  lockfile=''
fi
#
if [[ $0 = */* ]]; then
  cd ${0%/*}
fi
if [[ $PWD != */bin ]]; then
  cd bin
fi
#
PORT=3579
#
NEWVERS='2'
#
MYPRG="sccl ${0##*/sccl_}"
#
unset FORCE MASTERIP MERGE
while getopts m:p:-: op; do
  case "$op" in
   m) MASTERIP="-or $OPTARG";;
   p) PORT="$OPTARG";;
   -) case "$OPTARG" in
       force) FORCE=1;;
       merge) MERGE=1;;
       oldversion) unset NEWVERS;;
        *) echo "usage: $MYPRG [--oldversion] [--force|--merge] [-m <masterip>] [-p <port>]"
           exit 1;;
      esac;;
   *) echo "usage: $MYPRG [--oldversion] [--force|--merge] [-m <masterip>] [-p <port>]"
      exit 1;;
  esac
done
#
shift $(( $OPTIND - 1))
#
export BASEDIR=/etc/sccl
SCCLBASEDIR=/usr/share/sccl
#
if [[ -f $BASEDIR/sccl.conf ]]; then
  . $BASEDIR/sccl.conf
  OLDLOCKDIR="$LOCKDIR"
  if [[ -f /etc/HOSTNAME ]]; then
    THISHOSTNAME="`cut -f 1 -d . /etc/HOSTNAME | tr '[:upper:]' '[:lower:]'`"
  elif [[ -f /etc/sccl/HOSTNAME.conf ]]; then
    THISHOSTNAME=`cut -f 1 -d . /etc/sccl/HOSTNAME.conf | tr '[:upper:]' '[:lower:]'`
  fi
  if [[ -z "$THISHOSTNAME" ]]; then
    THISHOSTNAME="`hostname | cut -f 1 -d . | tr '[:upper:]' '[:lower:]'`"
  fi
  if [[ -n "$FORCE" ]]; then
    ./sccl_stop_node --enable-traps
    /etc/init.d/unix2web stop /etc/unix2web/sccl.conf.service
    sleep 1
  elif [[ -n "$MERGE" ]]; then
    if  ! grep -q "^NODES=\"$THISHOSTNAME\"" $BASEDIR/sccl.conf; then
      echo "Nur ein Knoten eines Single-Node-Clusters kann einem anderen Cluster beitreten."
      exit 1
    fi
    /etc/init.d/unix2web stop /etc/unix2web/sccl.conf.service
    sleep 1
  else
    echo "Das Cluster ist schon konfiguriert."
    echo "Merge Cluster:"
    echo "$MYPRG --merge $*"
    echo "Alte Konfiguration löschen:"
    echo "$MYPRG --force $*"
    exit 1
  fi
  mkdir -p $BASEDIR/old
  rm -r $BASEDIR/old/* 2>/dev/null
  mv $BASEDIR/sccl.conf $BASEDIR/certs $BASEDIR/userpwd.dat $BASEDIR/old
  [[ -f $BASEDIR/capwd.dat ]] && mv $BASEDIR/capwd.dat $BASEDIR/old
  [[ -f $BASEDIR/adminpwd.dat ]] && mv $BASEDIR/adminpwd.dat $BASEDIR/old
  [[ -f $BASEDIR/localadminpwd.dat ]] && mv $BASEDIR/localadminpwd.dat $BASEDIR/old
  [[ -f $BASEDIR/packages.conf ]] && mv $BASEDIR/packages.conf $BASEDIR/old
  [[ -f $BASEDIR/resources.conf ]] && mv $BASEDIR/resources.conf $BASEDIR/old
else
  rm -f $BASEDIR/*pwd.dat
fi
#
PIDFILE=/tmp/u2w.$$.pid
#
restartu2w ()
{ echo "Join abgebrochen."
  if [[ -n "$MERGE" && -f $BASEDIR/old/sccl.conf ]]; then
    mv $BASEDIR/old/* $BASEDIR/
    /etc/init.d/unix2web start /etc/unix2web/sccl.conf.service
  else
    echo "Gesicherte Dateien sind im Ordner $BASEDIR/old."
  fi
  exit 0
}
#
trap restartu2w 2
#
unix2webd -Xd "merge=$MERGE" -sU join -sP tocluster $MASTERIP -Dp $PIDFILE -Sf -Sa $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-ca.pem -Sk $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-server-key.pem -Sc $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-server-cert.pem -fp /tmp -h $SCCLBASEDIR/html -p $PORT -b $SCCLBASEDIR/bin
#
sleep 1
#
if [[ ! -f $PIDFILE ]]; then
  unix2webd -Xd "merge=$MERGE" -sU join -sP tocluster $MASTERIP -Dp $PIDFILE -Sf -Sa $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-ca.pem -Sk $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-server-key.pem -Sc $SCCLBASEDIR/data/JOINCLUSTER${NEWVERS}-server-cert.pem -fp /tmp -h $SCCLBASEDIR/html -p $PORT -b $SCCLBASEDIR/bin -L 0.0.0.0
  sleep 1
fi
#
if [[ -f $PIDFILE ]]; then
  echo "U2W-Server gestartet."
  echo "To join to an pre 2.9 cluster: $0 --oldversion $*"
  echo "Zum Beenden: CTRL-C"
  #
  while true; do
    if [[ -f $BASEDIR/sccl.conf ]]; then
      sleep 2
      break
    fi
    sleep 3
  done
  #
  if [[ -f $BASEDIR/sccl.conf ]]; then
    trap 2
    echo "Clusterconfig bekommen."
    echo "U2W-Server stoppen"
    kill $(<$PIDFILE)
    echo "Cluster starten"
    /etc/init.d/unix2web start /etc/unix2web/sccl.conf.service
    [[ -n "$lockfile" ]] && touch "$lockfile"
    [[ -f "$OLDLOCKDIR/node.STOPPED" ]] && rm "$OLDLOCKDIR/node.STOPPED"
    . $BASEDIR/sccl.conf
    mkdir -m 755 -p "$LOCKDIR"
  fi
else
  echo "Der U2W-Server konnte nicht gestartet werden."
  echo "Ggf. laeuft noch ein Server auf dem Port $PORT."
  echo "Gesicherte Dateien sind im Ordner $BASEDIR/old."
  exit 1
fi
