#!/bin/sh

# steps to take following a release of new code to keep things working.
#
# the following scripts may be created to customize behavior:
# 
# site_utils/site_sync_code
#
# - pull code from a source repository
#
# site_utils/site_install_cli
#
# - install or update client code (new "atest" build?)
#
# site_utils/site_restart_apache
#
# - suid helper or similar?
# 
# site_utils/site_restart_final
# 
# - any finishing touches you may require.

# --- 

INIT_SCR=/etc/init.d/autotest

# ---

print_status() {
  STATUS=$1

  echo "--- $STATUS"
}

fatal() {
  echo "*** Fatal error.  Giving up."
  exit 1
}

# ---

MY_DIR=`dirname $0`

if (! test -f $INIT_SCR)
then
  echo "Error: $INIT_SCR must be installed."
  exit 1
fi

BECOME_USER=`grep ^BECOME_USER= $INIT_SCR`

if (test "$BECOME_USER" == "")
then
  echo "Error: BECOME_USER not defined in $INIT_SCR"
  exit 1
fi

BASE_DIR=`grep ^BASE_DIR= $INIT_SCR`

if (test "$BASE_DIR" == "")
then
  echo "Error: BASE_DIR not defined in $INIT_SCR"
  exit 1
fi

eval $BECOME_USER
eval $BASE_DIR

# --- stop autotest persistent code

print_status "Stopping autotest persistent code"
$INIT_SCR stop

# --- sync code (site-specific)

if (test -x $BASE_DIR/site_utils/site_sync_code)
then
  print_status "Syncing code"
  su $BECOME_USER -c $BASE_DIR/site_utils/site_sync_code || exit 1
fi

# --- run database migrations

# - AFE

print_status "Running AFE migrations"
( cd $BASE_DIR/frontend &&
  su $BECOME_USER -c "python ../database/migrate.py \
    --database=AUTOTEST_WEB safesync"
  su $BECOME_USER -c "python manage.py syncdb --noinput"
  su $BECOME_USER -c "python manage.py syncdb --noinput"
)

# - TKO

print_status "Running TKO migrations"
( cd $BASE_DIR/tko &&
  su $BECOME_USER -c "python ../database/migrate.py \
    --database=TKO safesync"
)

# - SITE_DB

print_status "Running site_db migrations"
( cd $BASE_DIR/site_db &&
  su $BECOME_USER -c "python ../database/migrate.py \
    --database=TKO safesync"
)

# - Django syncdb

print_status "Running syncdb on Django interface"
# Due to the way Django creates permissions objects, we sometimes need
# to run syncdb twice.
for i in 1 2; do
  ( cd $BASE_DIR/frontend && 
    su $BECOME_USER -c "python manage.py syncdb --noinput"
  )
done

# --- compile GWT

print_status "Compiling GWT code."
( cd $BASE_DIR &&
  su $BECOME_USER -c "$BASE_DIR/utils/compile_gwt_clients.py -a" || fatal
)

# --- fix gwt permissions

print_status "Fixing permissions"
( cd $BASE_DIR/frontend/client &&
  find | xargs chmod o+r &&
  find -type d | xargs chmod o+rx ) || fatal

# --- update cli repository (site-specific)

if (test -x $BASE_DIR/site_utils/site_install_cli)
then
  print_status "Updating cli repository"
  su $BECOME_USER -c $BASE_DIR/site_utils/site_install_cli || fatal
fi

# --- restart autotest persistent code

print_status "Restarting autotest persistent code"
$INIT_SCR start || fatal

# --- possibly restart Apache (site-specific)

if (test -x $BASE_DIR/site_utils/site_restart_apache)
then
  print_status "Restarting Apache"
  su $BECOME_USER -c $BASE_DIR/site_utils/site_restart_apache || fatal
fi

# --- do any site-specific finalization

if (test -x $BASE_DIR/site_utils/site_restart_final)
then
  print_status "Finalizing release"
  su $BECOME_USER -c $BASE_DIR/site_utils/site_restart_final || fatal
fi
