#!/bin/sh


INDEXER=`which indexer 2>/dev/null`
SEARCHD=`which searchd 2>/dev/null`
CRON_ORIG="/tmp/crontab.piler.orig"
CRON_TMP="/tmp/crontab.piler"
PILERCONF_TMP="/tmp/config.piler.88"


load_default_values() {
   PILERUSER="piler"
   PILERGROUP="piler"
   SYSCONFDIR=__SYSCONFDIR
   LOCALSTATEDIR=__LOCALSTATEDIR
   LIBEXECDIR=__LIBEXECDIR
   DATAROOTDIR=__DATAROOTDIR

   KEYTMPFILE="piler.key"
   KEYFILE="$SYSCONFDIR/piler.key"

   HOSTNAME=`hostname --fqdn`

   MYSQL_HOSTNAME="localhost"
   MYSQL_DATABASE="piler"
   MYSQL_USERNAME="piler"
   MYSQL_PASSWORD=""
   MYSQL_ROOT_PASSWORD=""

   SPHINXCFG="/usr/local/etc/sphinx.conf"

   WWWGROUP="apache"
   DOCROOT="/var/www/$HOSTNAME"

   SMARTHOST=""
   SMARTHOST_PORT=25

   SSL_CERT_DATA="/C=US/ST=Denial/L=Springfield/O=Dis/CN=www.example.com"
}


make_certificate() {
   if [ ! -f $SYSCONFDIR/piler.pem ]; then
      echo -n "Making an ssl certificate ... "
      openssl req -new -newkey rsa:4096 -days 3650 -nodes -x509 -subj "$SSL_CERT_DATA" -keyout $SYSCONFDIR/piler.pem -out 1.cert
      cat 1.cert >> $SYSCONFDIR/piler.pem
      chmod 600 $SYSCONFDIR/piler.pem
      rm 1.cert
   fi
}


display_install_intro() {
  echo ""
  echo ""
  echo "This is the postinstall utility for piler"
  echo "It should be run only at the first install. DO NOT run on an existing piler installation!"
  echo ""

  askYN "Continue? [Y/N]" "N"
  if [ $response != "yes" ]; then
     echo "Aborted."
     exit
  fi

  echo ""
}


check_user() {
   user=$1

   if [ x`whoami` != x$user ]; then echo "ERROR: postinstaller must be run as $user user"; exit 1; fi
}


isFQDN() {
  # we need min. 2 dots
  if [ x"$1" = "xdogfood" ]; then
    echo 1
    return
  fi

  if [ x"$1" = "x" ]; then
    echo 0
    return
  fi

  NF=`echo $1 | awk -F. '{print NF}'`
  if [ $NF -ge 2 ]; then 
    echo 1
  else 
    echo 0
  fi
}


ask() {
  PROMPT=$1
  DEFAULT=$2

  echo ""
  echo -n "$PROMPT [$DEFAULT] "
  read response

  if [ -z $response ]; then
    response=$DEFAULT
  fi
}


askNonBlankNoEcho() {
  PROMPT=$1
  DEFAULT=$2

  while [ 1 ]; do
    stty -echo
    ask "$PROMPT" "$DEFAULT"
    stty echo
    echo ""
    if [ ! -z $response ]; then
      break
    fi
    echo "A non-blank answer is required"
  done
}


askNonBlank() {
  PROMPT=$1
  DEFAULT=$2

  while [ 1 ]; do
    ask "$PROMPT" "$DEFAULT"
    if [ ! -z $response ]; then
      break
    fi
    echo "A non-blank answer is required"
  done
}


askYN() {
  PROMPT=$1
  DEFAULT=$2

  if [ "x$DEFAULT" = "xyes" -o "x$DEFAULT" = "xYes" -o "x$DEFAULT" = "xy" -o "x$DEFAULT" = "xY" ]; then
    DEFAULT="Y"
  else
    DEFAULT="N"
  fi
  
  while [ 1 ]; do
    ask "$PROMPT" "$DEFAULT"
    response=$(perl -e "print lc(\"$response\");")
    if [ -z $response ]; then
      :
    else
      if [ $response = "yes" -o $response = "y" ]; then
        response="yes"
        break
      else 
        if [ $response = "no" -o $response = "n" ]; then
          response="no"
          break
        fi
      fi
    fi
    echo "A Yes/No answer is required"
  done
}


preinstall_check() {
   check_user root

   if [ "x$INDEXER" = "x" ]; then "ERROR: cannot find sphinx indexer"; echo ""; exit ; fi

   if [ "x$SEARCHD" = "x" ]; then "ERROR: cannot find sphinx searchd"; echo ""; exit 0; fi

   if [ -f $KEYFILE ]; then echo "ERROR: found existing keyfile ($KEYFILE), aborting install"; echo ""; exit 0; fi
}


gather_webserver_data() {
   askNonBlank "Please enter the path of your documentroot" "$DOCROOT"
   DOCROOT=$response

   if [ -d $DOCROOT ]; then echo "ERROR: vhost docroot should NOT exist, abroting install"; echo ""; exit 0; fi

   askNonBlank "Please enter the webserver groupname" "$WWWGROUP"
   WWWGROUP=$response
}


gather_mysql_account() {

   askNonBlank "Please enter mysql hostname" "$MYSQL_HOSTNAME"
   MYSQL_HOSTNAME=$response

   askNonBlank "Please enter mysql database" "$MYSQL_DATABASE"
   MYSQL_DATABASE=$response

   askNonBlank "Please enter mysql user name" "$MYSQL_USERNAME"
   MYSQL_USERNAME=$response

   askNonBlankNoEcho "Please enter mysql password for $MYSQL_USERNAME" ""
   MYSQL_PASSWORD=$response

   askNonBlankNoEcho "Please enter mysql root password" ""
   MYSQL_ROOT_PASSWORD=$response

   s=`echo "use information_schema; select TABLE_NAME from TABLES where TABLE_SCHEMA='$MYSQL_DATABASE'" | mysql -h $MYSQL_HOSTNAME -u root --password=$MYSQL_ROOT_PASSWORD`
   if [ $? -eq 0 ];
   then
      echo "mysql connection successful"; echo;
      if [ `echo $s | grep -c metadata` -eq 1 ]; then echo "ERROR: Detected metadata table in $MYSQL_DATABASE. Aborting"; exit 0; fi
   else
      echo "ERROR: failed to connect to mysql";
      gather_mysql_account
   fi

}


gather_sphinx_data() {

   if [ $INDEXER = "/usr/bin/indexer" ]; then SPHINXCFG="/etc/sphinx/sphinx.conf"; fi

   if test -f /etc/sphinxsearch/sphinx.conf || test -f /etc/sphinxsearch/sphinx.conf.sample ; then SPHINXCFG="/etc/sphinxsearch/sphinx.conf"; fi

   askNonBlank "Please enter the path of sphinx.conf" "$SPHINXCFG"
   SPHINXCFG=$response
}


gather_smtp_relay_data() {
   ask "Please enter smtp relay" "$SMARTHOST"
   SMARTHOST=$response

   ask "Please enter smtp relay port" "$SMARTHOST_PORT"
   SMARTHOST_PORT=$response
}


make_cron_entries() {

   crontab -u $PILERUSER -l > $CRON_ORIG

   grep PILERSTART $CRON_ORIG > /dev/null 2>&1
   if [ $? != 0 ]; then
      cat /dev/null > $CRON_ORIG
   fi

   grep PILEREND $CRON_ORIG > /dev/null 2>&1
   if [ $? != 0 ]; then
      cat /dev/null > $CRON_ORIG
   fi


   rm -f $CRON_TMP

   echo ""
   echo "### PILERSTART" >> $CRON_TMP
   echo "*/5 * * * * LC_ALL=C mpstat | tail -1 | awk '{print \$11}' > $LOCALSTATEDIR/piler/stat/cpu.stat" >> $CRON_TMP

   echo "5,35 * * * * $LIBEXECDIR/piler/indexer.delta.sh" >> $CRON_TMP
   echo "30   2 * * * $LIBEXECDIR/piler/indexer.main.sh" >> $CRON_TMP
   echo "*/15 * * * * $INDEXER --quiet tag1 --rotate" >> $CRON_TMP
   echo "*/15 * * * * $INDEXER --quiet note1 --rotate" >> $CRON_TMP
   echo "30   6 * * * /usr/bin/php $LIBEXECDIR/piler/generate_stats.php --webui $DOCROOT" >> $CRON_TMP

   echo "### PILEREND" >> $CRON_TMP
}


make_new_key() {
   dd if=/dev/urandom bs=56 count=1 of=$KEYTMPFILE 2>/dev/null

   if [ `stat -c '%s' $KEYTMPFILE` -ne 56 ]; then echo "could not read 56 bytes from /dev/urandom to $KEYTMPFILE"; exit 1; fi
}


show_summary() {
   echo
   echo
   echo "INSTALLATION SUMMARY:"
   echo

   echo "piler user: $PILERUSER"
   echo "keyfile: $KEYFILE"
   echo

   echo "mysql host: $MYSQL_HOSTNAME"
   echo "mysql database: $MYSQL_DATABASE"
   echo "mysql username: $MYSQL_USERNAME"
   echo "mysql password: *******"
   echo

   echo "sphinx indexer: $INDEXER"
   echo "sphinx config file: $SPHINXCFG"
   echo

   echo "vhost docroot: $DOCROOT"
   echo "www group: $WWWGROUP"
   echo

   echo "smtp relay host: $SMARTHOST"
   echo "smtp relay port: $SMARTHOST_PORT"
   echo

   echo "piler crontab:"
   cat $CRON_TMP
   echo; echo;

   askYN "Correct? [Y/N]" "N"
   if [ $response != "yes" ]; then
      echo "Aborted."
      exit
   fi

}


execute_post_install_tasks() {

   askYN "Continue and modify system? [Y/N]" "N"
   if [ $response != "yes" ]; then
      echo "Aborted."
      exit
   fi

   echo;
   echo -n "Creating mysql database... ";
   sed -e "s%MYSQL_HOSTNAME%$MYSQL_HOSTNAMEg%" -e "s%MYSQL_DATABASE%$MYSQL_DATABASE%g" -e "s%MYSQL_USERNAME%$MYSQL_USERNAME%g" -e "s%MYSQL_PASSWORD%$MYSQL_PASSWORD%g" $DATAROOTDIR/piler/db-mysql-root.sql.in | mysql -h $MYSQL_HOSTNAME -u root --password=$MYSQL_ROOT_PASSWORD
   mysql -h $MYSQL_HOSTNAME -u $MYSQL_USERNAME --password=$MYSQL_PASSWORD $MYSQL_DATABASE < $DATAROOTDIR/piler/db-mysql.sql
   echo "Done."

   echo -n "Writing sphinx configuration... ";
   sed -e "s%MYSQL_HOSTNAME%$MYSQL_HOSTNAME%" -e "s%MYSQL_DATABASE%$MYSQL_DATABASE%" -e "s%MYSQL_USERNAME%$MYSQL_USERNAME%" -e "s%MYSQL_PASSWORD%$MYSQL_PASSWORD%" $SYSCONFDIR/sphinx.conf.dist > $SPHINXCFG
   echo "Done."

   echo -n "Initializing sphinx indices... ";
   su $PILERUSER -c "indexer --all"
   echo "Done."


   echo -n "installing cron entries for $PILERUSER... "
   crontab -u $PILERUSER $CRON_TMP
   echo "Done."


   echo -n "installing keyfile ($KEYTMPFILE) to $KEYFILE... "
   cp $KEYTMPFILE $KEYFILE
   chgrp $PILERUSER $KEYFILE
   chmod 640 $KEYFILE
   rm -f $KEYTMPFILE
   echo "Done."

   make_certificate

   sed -e "s/mysqlpwd=verystrongpassword/mysqlpwd=$MYSQL_PASSWORD/" -e "s/tls_enable=0/tls_enable=1/" $SYSCONFDIR/piler.conf > $PILERCONF_TMP
   cat $PILERCONF_TMP > $SYSCONFDIR/piler.conf
   rm -f $PILERCONF_TMP

   chmod 755 $LOCALSTATEDIR/piler/stat

   if [ -d webui ]; then webui_install; fi

}


webui_install() {

   echo -n "Copying www files to $DOCROOT... "
   mkdir -p $DOCROOT || exit 1

   cp -R webui/* $DOCROOT
   cp -R webui/.htaccess $DOCROOT
   chmod 770 $DOCROOT/tmp $DOCROOT/images
   chgrp $WWWGROUP $DOCROOT/tmp
   chgrp $WWWGROUP $DOCROOT/system/helper/phpqrcode/cache

   echo "<?php" > $DOCROOT/config-site.php
   echo >> $DOCROOT/config-site.php

   echo "\$config['SITE_NAME'] = '$HOSTNAME';" >> $DOCROOT/config-site.php
   echo "\$config['SITE_URL'] = 'http://$HOSTNAME/';" >> $DOCROOT/config-site.php
   echo "\$config['DIR_BASE'] = '$DOCROOT/';" >> $DOCROOT/config-site.php

   echo >> $DOCROOT/config-site.php

   echo "\$config['ENABLE_SYSLOG'] = 1;" >> $DOCROOT/config-site.php

   echo >> $DOCROOT/config-site.php

   echo "\$config['SMTP_DOMAIN'] = '$HOSTNAME';" >> $DOCROOT/config-site.php
   echo "\$config['SMTP_FROMADDR'] = 'no-reply@$HOSTNAME';" >> $DOCROOT/config-site.php
   echo "\$config['ADMIN_EMAIL'] = 'admin@$HOSTNAME';" >> $DOCROOT/config-site.php

   echo >> $DOCROOT/config-site.php

   echo "\$config['DB_DRIVER'] = 'mysql';" >> $DOCROOT/config-site.php
   echo "\$config['DB_PREFIX'] = '';" >> $DOCROOT/config-site.php
   echo "\$config['DB_HOSTNAME'] = '$MYSQL_HOSTNAME';" >> $DOCROOT/config-site.php
   echo "\$config['DB_USERNAME'] = '$MYSQL_USERNAME';" >> $DOCROOT/config-site.php
   echo "\$config['DB_PASSWORD'] = '$MYSQL_PASSWORD';" >> $DOCROOT/config-site.php
   echo "\$config['DB_DATABASE'] = '$MYSQL_DATABASE';" >> $DOCROOT/config-site.php

   echo >> $DOCROOT/config-site.php

   echo "\$config['SMARTHOST'] = '$SMARTHOST';" >> $DOCROOT/config-site.php
   echo "\$config['SMARTHOST_PORT'] = $SMARTHOST_PORT;" >> $DOCROOT/config-site.php

   echo >> $DOCROOT/config-site.php

   echo "?>" >> $DOCROOT/config-site.php

   echo "Done."
}


clean_up_temp_stuff() {
   rm -f $CRON_TMP

   echo; echo "Done post installation tasks."; echo
}


load_default_values


#LOGFILE="/tmp/piler-install.log.$$"
#touch $LOGFILE
#chmod 600 $LOGFILE

preinstall_check

display_install_intro

gather_webserver_data
gather_mysql_account
gather_sphinx_data
gather_smtp_relay_data


make_cron_entries
make_new_key

show_summary

execute_post_install_tasks

clean_up_temp_stuff


