#!/bin/bash
# setup for linuxmuster.net
#
# thomas@linuxmuster.net
# 07.04.2014
# GPL v3
#

# read dist.conf
. /usr/share/linuxmuster/config/dist.conf || exit 1

# source helperfunctions
. $HELPERFUNCTIONS || exit 1

# parsing parameters
opt=$1

usage() {
  echo
  echo "Usage: linuxmuster-setup <--prepare|--first|--modify>"
  echo
  echo "--prepare: Install setup dependencies only."
  echo
  echo "--first  : Call to do a fresh configuration. Use with caution."
  echo "           You will lose all your user data!"
  echo
  echo "--modify : Call to modify your server configuration"
  echo
  exit 1
}

[[ "$opt" = "--first" || "$opt" = "--prepare" || "$opt" = "--modify" ]] || usage

# warning
echo
echo "You have called $0 with parameter $opt."
[ "$opt" = "--first" ] && echo "Doing a fresh installation. You will lose all your user and workstation data!"
[ "$opt" = "--modify" ] && echo "Modified configuration files will be backed up to $BACKUPDIR!"
echo "The process will start in 5 seconds. Press CRTL-C to cancel."
n=0
while [ $n -lt 5 ]; do
  echo -n .
  sleep 1
  let n=n+1
done
echo
echo "Let's go! :-)"
echo

# logfile
logfile=$LOGDIR/setup.log
echo >> $logfile
chmod 600 $logfile
echo "####################################################" >> $logfile
echo "Setup session started at `date`" >> $logfile
date >> $logfile
echo "####################################################" >> $logfile

echo "Logging output to $logfile ..."
echo

# reconfiguring package to have all templates
dpkg-reconfigure linuxmuster-base | tee -a $logfile


# prepare setup, install necessary packages only
do_prepare(){
    # check tasks
    for i in common server; do
      if [ ! -s "/usr/share/linuxmuster/tasks/$i" ]; then
        echo "Error: Taskfile $i not found!" | tee -a $logfile
        return 1
      fi
    done

    # force apt to do ugly things during upgrade
    echo 'DPkg::Options {"--force-confold";"--force-confdef";"--force-bad-verify";"--force-overwrite";};' > /etc/apt/apt.conf.d/99upgrade
    echo 'apt-get::CmdLine::Ignore-Trust-Violations "true";' >> /etc/apt/apt.conf.d/99upgrade

    # tweaking buggy sophomorix, install postgresql & libdigest-sha-perl first
    apt-get update | tee -a $logfile
    for i in postgresql-9.1 libdigest-sha-perl; do
     DEBIAN_FRONTEND=noninteractive apt-get -y install $i | tee -a $logfile
    done
    [ -s /usr/lib/perl5/Digest/SHA.pm ] && ln -sf SHA.pm /usr/lib/perl5/Digest/SHA1.pm | tee -a $logfile

    # installing depending task
    for i in common server; do
      task=`cat /usr/share/linuxmuster/tasks/$i`
      DEBIAN_FRONTEND=noninteractive apt-get -y install $task | tee -a $logfile
    done

    # remove upgrade cheat
    rm -f /etc/apt/apt.conf.d/99upgrade
    rm -f /var/cache/apt/archives/Packages
}

# calling as base-config late command
case $opt in

  --prepare)

    do_prepare || exit 1
    exit 0

    ;;

  --first)

    # renew complete apt configuration
    echo "Resetting apt configuration." | tee -a $logfile
    cp -a $STATICTPLDIR/etc/apt/* /etc/apt | tee -a $logfile

    # correct vboxadd
    id vboxadd &> /dev/null && userdel vboxadd
    adduser --ingroup daemon --gecos "VirtualBox guest additions user" --system --home /var/run/vboxadd --shell /bin/false vboxadd
    mkdir -p /var/run/vboxadd
    chown vboxadd:daemon /var/run/vboxadd

    # add cyrus user
    id cyrus &> /dev/null || adduser --gecos "Cyrus Mailsystem User" --home /var/spool/cyrus -ingroup mail --system --shell /bin/sh cyrus | tee -a $logfile
    mkdir -p /var/spool/cyrus
    chown cyrus:mail /var/spool/cyrus

    # install packages
    do_prepare || exit 1

    ;;

  --modify)

    # check for installed flag
    if [ ! -e "$INSTALLED" ]; then
      echo "Linux-Musterloesung isn't installed yet!" | tee -a $logfile
      echo "You have to use the command linuxmuster-setup --first!" | tee -a $logfile
      exit 1
    fi

    # reading current debconf values
    echo "Reading current configuration values ..." | tee -a $logfile
    rm -f $OLDVALUES
    for i in country state location workgroup servername domainname \
             opsi schoolname smtprelay internsubrange fwconfig \
             serverexternname subnetting; do
     RET="$(echo get linuxmuster-base/$i | debconf-communicate | awk '{ print $2 }')"
     oldvalue="${i}_old"
     echo "$oldvalue=\"$RET\"" >> $OLDVALUES
     unset RET
    done
    chmod 600 $OLDVALUES

    ;;

  *)

    usage

    ;;

esac

# backup debconf db
backup_file /var/cache/debconf/config.dat | tee -a $logfile
backup_file /var/cache/debconf/passwords.dat | tee -a $logfile
chmod 600 $BACKUPDIR/var/cache/debconf/passwords.dat-$DATETIME.gz

# ask questions
$SCRIPTSDIR/linuxmuster-config $opt
RC=$?

# check status
if [ "$RC" != "0" ]; then
 # restore debconf db if setup has been canceled
 gunzip -c $BACKUPDIR/var/cache/debconf/config.dat-$DATETIME.gz > /var/cache/debconf/config.dat
 gunzip -c $BACKUPDIR/var/cache/debconf/passwords.dat-$DATETIME.gz > /var/cache/debconf/passwords.dat
 chmod 600 /var/cache/debconf/passwords.dat
 rm $BACKUPDIR/var/cache/debconf/config.dat-$DATETIME.gz
 rm $BACKUPDIR/var/cache/debconf/passwords.dat-$DATETIME.gz
 exit "$RC"
fi


# call configuration patch script
$SCRIPTSDIR/linuxmuster-patch $opt

chmod 600 $logfile

