#!/bin/bash

id=`id -u`
CHOWN=/usr/sbin/chown # default
CHGRP=/usr/bin/chgrp

TestAndCreateDir() {
    if [ ! -d "$1" ]; then
        #echo "Directory $1 does not exist. Creating it.";
        mkdir "$1";
        if [ "$id" = 0 ]; then
          $CHOWN "$WEB_USER" "$1"
          $CHGRP "$WEB_GROUP" "$1"
        fi
    fi
}

if [ $# -ne 1 ]
then
  echo "ERROR: No settings file specified."
  echo "Usage: install-civs <settings-file>";
  exit 1;
fi

settings_file="$1"

. "$settings_file" || exit 1

echo "Read settings file."

if [ -z "$ADMIN_KEY" ]
then
    echo "ERROR: Must define $ADMIN_KEY in $settings_file to be something secret."
    exit 1
fi

echo "Building executables"

make -s gettimeofday timeout lockserv

TestAndCreateDir "$HTMLDIR";
TestAndCreateDir "$CGIBINDIR";
TestAndCreateDir "$CIVSDATADIR";
TestAndCreateDir "$CIVSDATADIR/elections";
TestAndCreateDir "$CIVSDATADIR/invites";

rm -f "$CIVSDATADIR/elections/admission_control" "$CIVSDATADIR/lockserv"

SubstituteFile() {
    echo "  $1 -> $2"
    sed									      \
         -e 's|@ADDTOPATH@|'$ADDTOPATH'|'				      \
         -e 's|@ADMIN_KEY@|'$ADMIN_KEY'|'				      \
         -e 's|@AUTH_SENDER@|'$AUTH_SENDER'|'				      \
         -e 's|@CGIBINDIR@|'"$CGIBINDIR"'|'				      \
         -e 's|@CIVSBINURL@|'"$CIVSBINURL"'|'				      \
         -e 's|@CIVSDATADIR@|'"$CIVSDATADIR"'|'				      \
         -e 's|@CIVSHOME@|'"$CIVSHOME"'|'				      \
         -e 's|@CIVSURL@|'"$CIVSURL"'|'					      \
         -e 's|@DONATE_URL@|'$DONATE_URL'|'				      \
         -e 's|@EMAIL_SALT@|'$EMAIL_SALT'|'				      \
         -e 's|@FILTER_TAGS@|'$FILTER_TAGS'|'				      \
         -e 's|@FIXUTF8@|'$FIXUTF8'|'				              \
         -e 's|@LOCALDEBUG@|'$LOCALDEBUG'|'				      \
         -e 's|@LOG_HOME_VISITS@|'$LOG_HOME_VISITS'|'			      \
         -e 's|@MAX_CHOICES@|'$MAX_CHOICES'|'				      \
         -e 's|@MAX_EMAIL_LOAD@|'$MAX_EMAIL_LOAD'|'			      \
         -e 's|@MAX_IMAGE_SIZE@|'$MAX_IMAGE_SIZE'|'			      \
         -e 's|@MAX_UPLOAD_SIZE@|'$MAX_UPLOAD_SIZE'|'			      \
         -e 's|@MAX_VOTER_ADD@|'$MAX_VOTER_ADD'|'			      \
         -e 's|@PERL@|'$PERL'|'						      \
         -e 's|@PERLEXT@|'$PERLEXT'|'					      \
         -e 's|@PROTO@|'$PROTO'|'					      \
         -e 's|@SMTP_AUTH_PASSWD@|'$SMTP_AUTH_PASSWD'|'			      \
         -e 's|@SMTP_AUTH_USER@|'$SMTP_AUTH_USER'|'			      \
         -e 's|@SMTP_HOST@|'$SMTP_HOST'|'				      \
         -e 's|@SMTP_PORT@|'$SMTP_PORT'|'				      \
         -e 's|@SMTP_STARTTLS@|'$SMTP_STARTTLS'|'			      \
         -e 's|@SMTP_USE_SSL@|'$SMTP_USE_SSL'|'				      \
         -e 's|@SUGGESTION_BOX@|'$SUGGESTION_BOX'|'			      \
         -e 's|@SUPERVISOR@|'$SUPERVISOR'|'				      \
         -e 's|@THISHOST@|'$THISHOST'|'					      \
         -e 's|@USING_ISA@|'$USING_ISA'|'				      \
         -e 's|@UTF8_SUFFIX@|'$UTF8_SUFFIX'|'				      \
    < "$1" > "$2"
}

CopyFile() {
    echo "  $1 -> $2"
    cp "$1" "$2"
}

echo "Installing web pages"

for f in civs_create.html* index.html* public_elections.html*             \
    proportional.html* sec_priv.html* acks.html changelog.html*           \
    news.html* *.var rp.html* publicized_polls.html* faq.html*            \
    style.css results.js vote.js ajax.js ezdom.js civs_hdr.js             \
    mail_mgmt.js opt_in.js add_voters.js hebrew.css
do
    case "$f" in
        *.var)    dest="${HTMLDIR}/${f}";;
        *.html.*) dest="${HTMLDIR}/${f}${UTF8_SUFFIX}";;
        *.html)   dest="${HTMLDIR}/${f}${EN_SUFFIX}";;
        *)        dest="${HTMLDIR}/${f}";;
    esac
    SubstituteFile "$f" "$dest"
done

echo "Installing CGI scripts"

for f in add_voters beatpath.pm beatpath2.pm civs_common.pm               \
    voting.pm close control create_election download_ballots              \
    remove_writein upload_ballots results top_polls.pm                    \
    get_top_polls languages.pm election.pm mail.pm start_election         \
    vote refresh_top_polls mail_mgmt opt_in publicize_election            \
    status clear_caches delete_election.pl edit_poll                      \
    remove_defunct_elections request_deactivation request_activation      \
    resend_link send_result_key.pm rp.pm runoff.pm minimax.pm             \
    admctrl.pm base_language.pm english.pm hungarian.pm italian.pm        \
    french.pm german.pm hebrew.pm portuguese.pm chinese.pm                \
    spanish.pm thai.pm russian.pm hindi.pm
do
    target="${CGIBINDIR}/${f}"
    if [ -n "$PERLEXT" ]
    then
        case $target in
            *.pm) ;;
            *.pl) ;;
            *) target="${target}${PERLEXT}";;
        esac
    fi
    SubstituteFile "cgi-bin/$f" "$target"
    chmod a+x "$target"
done

echo "Installing images"

mkdir -p "${HTMLDIR}/images"

for f in images/{check123b,sample-ballot,vertstrip,check-civs}.png
do
    dest="${HTMLDIR}/${f}"
    CopyFile "$f" "$dest"
done

if [ ! -s $CIVSDATADIR/private_host_id ]; then
    echo "*********************************************";
    echo "                 WARNING                     ";
    echo "*********************************************";
    echo "";
    echo "No private key exists for the server!";
    echo "";
    echo "Creating a private key using the openssl pseudo-random number";
    echo "generator.  If you want more randomness than this, you will";
    echo "need to create your own key.  See the INSTALL file for more";
    echo "information."
    echo "";
    openssl rand -base64 -out $CIVSDATADIR/private_host_id 32;
    echo "*********************************************";
fi

if [ ! -s $CIVSDATADIR/nonce_seed ]; then
        echo "Seeding the CIVS nonce generator.";
        openssl rand -hex -out $CIVSDATADIR/nonce_seed 32;
fi

echo "Setting permissions"

touch $CIVSDATADIR/nonce_seed $CIVSDATADIR/log $CIVSDATADIR/cgi-log	      \
      $CIVSDATADIR/global_lock $CIVSDATADIR/email-control.txt
if [ "$id" = 0 ]; then
    $CHOWN "$WEB_USER" $CIVSDATADIR/nonce_seed $CIVSDATADIR/log		      \
                      $CIVSDATADIR/cgi-log $CIVSDATADIR/global_lock	      \
                      $CIVSDATADIR/email-control.txt
    $CHGRP "$WEB_GROUP" $CIVSDATADIR/nonce_seed $CIVSDATADIR/log		      \
                      $CIVSDATADIR/cgi-log $CIVSDATADIR/global_lock	      \
                      $CIVSDATADIR/email-control.txt
fi
chmod 600 $CIVSDATADIR/nonce_seed
chmod 644 $CIVSDATADIR/log $CIVSDATADIR/cgi-log $CIVSDATADIR/global_lock      \
          $CIVSDATADIR/email-control.txt

echo "Installing executables"

if [ -e gettimeofday.exe ]; then
    CopyFile gettimeofday.exe $CIVSDATADIR/gettimeofday.exe;
else
    CopyFile gettimeofday $CIVSDATADIR/gettimeofday
fi
if [ -e timeout.exe ]; then
    CopyFile timeout.exe $CIVSDATADIR/timeout.exe;
else
    CopyFile timeout $CIVSDATADIR/timeout
fi
if [ -e lockserv.exe ]; then
    CopyFile lockserv.exe $CIVSDATADIR/lockserv.exe;
else
    CopyFile lockserv $CIVSDATADIR/lockserv
fi

echo "Install completed.  Check for any errors reported above.";
