#!/bin/sh

: ${aicontact:=scripts@mit.edu}
: ${aimaintainer:=scripts.mit.edu}
: ${ailocker:=scripts}


checkfailed() {
  if [ -f "$lroot/web_scripts/$addrend/.failed" ]; then
    rm -f "$lroot/web_scripts/$addrend/.failed"
    exit 1
  fi
}

die() {
  echo "== INSTALLATION FAILED =="
  echo "Sorry, the installation failed:"
  echo "$@"
  echo "Please contact $aicontact and provide a copy of the output of this installer."
  exit 1
}

attach scripts
[ "$ailocker" != "scripts" ] && attach "$ailocker"

sshrun() {
  /afs/athena.mit.edu/contrib/scripts/bin$scriptsdev/scripts-ssh "$lname" "$@" 2>/dev/null
}

vsshrun() {
  /afs/athena.mit.edu/contrib/scripts/bin$scriptsdev/scripts-ssh "$lname" "$@"
}

checksqlpass() {
    errors=`sshrun "/mit/scripts/sql/bin$scriptsdev/test-password"`
    if [ "$errors" != "" ]; then
        if [ "$1" -eq 1 ]; then
          rm -f "$lroot/.sql/my.cnf"
        fi
        echo
        echo "ERROR:"
        printf "$2"
        exit
    fi
}

override=1
if [ "$override" = "" ]; then
echo "The $aimaintainer automatic installers are currently unavailable."
echo "We hope to make them available again soon."
echo "If you would like us to notify you as soon as they are available again,"
echo "let us know by sending us an e-mail at $aicontact"
exit 
fi

echo 
echo "== Welcome to the $aimaintainer installer for $sname =="
echo

echo "For documentation, including a link to the Athena rules of use,"
echo "see <http://scripts.mit.edu/start>."
echo
echo "Please report problems with this installer to $aicontact."

if [ -n "$SCRIPTS_INSTALL_LOCKER" ]; then
    lname=$SCRIPTS_INSTALL_LOCKER
else
    echo
    echo "Are you performing this install for:"
    echo "1. Your personal Athena account"
    echo "2. A locker that you control (a club, a course, etc)"
    echo "If you do not understand this question, you should answer '1'."
    printf "Please enter either '1' or '2' (without quotes): "
    read whofor
    if [ "$whofor" = 1 ]; then
        lname="${ATHENA_USER:-$USER}"
    elif [ "$whofor" = 2 ]; then
        echo
        echo "OK.  $sname will be installed into a locker of your choice that"
        echo "you control.  Please enter the name of the selected locker below."
        echo "(For the locker /mit/lsc -- which has a full path of"
        echo "/afs/athena.mit.edu/activity/l/lsc -- you would simply enter lsc)."
        printf "Locker name: "
        read lname
    else
        echo
        echo "ERROR:"
        echo "You must select either '1' or '2'."
        exit 1
    fi
    while true; do
        if attach "$lname"; then
            break
        fi
        echo "$lname is not a valid locker name."
        printf "Locker name: "
        read lname
    done
    unset whofor
fi
lroot="/mit/$lname" 

echo
echo Checking the status of your scripts.mit.edu account...

attach scripts 2>/dev/null
. "/mit/scripts/bin$scriptsdev/signup-web"

if [ -n "$SCRIPTS_INSTALL_ADDREND" ]; then
    addrend=$SCRIPTS_INSTALL_ADDREND
else
    echo
    echo "Your new copy of $sname will appear on the web at a URL"
    echo "that starts with http://$lname.scripts.mit.edu/"
    echo "Please decide upon a complete URL and enter it below."
    echo "You must enter one or more characters after mit.edu/"
    echo "The completed address must only contain a-z, 0-9, and /."
    printf "Desired address: http://$lname.scripts.mit.edu/"
    read addrend
fi

addrend=`perl -0e 'print $ARGV[0] =~ /^([\w\/-]*[\w-])\/*$/' -- "$addrend"`
if [ "$addrend" = "" ]; then
	echo
	echo "ERROR:"
	echo "You must enter one or more characters after mit.edu/"
	echo "The completed address must only contain a-z, 0-9, and /."
	exit 1
fi

if [ -d "$lroot/web_scripts/$addrend" ]; then
    echo
    echo "ERROR:"
    echo "You already have a directory corresponding to that web address."
    echo "Please remove that directory, choose a different address, or"
    echo "contact $aicontact for assistance."
    exit 1
fi

if [ "$requires_sql" = "" ]; then
  requires_sql=1
fi

if [ ! -f "$lroot/.my.cnf" ]; then
  mkdir "$lroot/.sql" 2>/dev/null
  fs sa "$lroot/.sql" daemon.scripts write
  fs sa "$lroot/.sql" daemon.sql write
  ln -nfs "$lroot/.sql/my.cnf" "$lroot/.my.cnf" 2>/dev/null
fi

fs sa "$lroot/.sql" system:anyuser none
fs sa "$lroot/.sql" system:authuser none

if [ "$requires_sql" -eq 1 ]; then
  sqlinfo=`sshrun "/mit/scripts/sql/bin$scriptsdev/get-password"`
  if [ "$sqlinfo" = "" ]; then
      echo 
      echo "You already have a MySQL account but you do not have a .my.cnf file."
      echo "If you do not remember your MySQL account password, you can change it"
      echo "at http://sql.mit.edu using MIT certificates."
      printf "Please type your MySQL password and press [enter]: "
      stty -echo
      read sqlpass
      stty echo
      echo
      sqlhost="sql.mit.edu"
      sqluser=$lname
      . "/mit/scripts/sql/bin$scriptsdev/save-password"
      checksqlpass 1 'The MySQL password that you typed appears to be incorrect.\n'
      echo
      echo "OK.  Continuing with the install..."
  else
      checksqlpass 0 'The MySQL login information in your .my.cnf file\nappears to be incorrect.\n'
  fi
fi

origdir=`pwd`
mkdir -p "$lroot/web_scripts_tmp"
cd "$lroot/web_scripts_tmp"
fs sa . system:anyuser none
fs sa . system:authuser none
fs sa . daemon.scripts write
fs sa . system:scripts-security-upd write
echo "This directory is necessary to store login sessions and other transient files for auto-installed packages from scripts.mit.edu." > DO_NOT_DELETE.txt
mkdir -p "$lroot/web_scripts/$addrend"
cd "$lroot/web_scripts/$addrend"
fs sa . system:anyuser none
fs sa . system:authuser none
fs sa . daemon.scripts write
fs sa . system:scripts-security-upd write

# This version is deprecated, use create_scripts_dir instead

if [ "$create_dir" = "" ]; then
  create_dir=0
fi

if [ "$create_dir" -eq 1 ]; then
  mkdir -p "$lroot/scripts-$deploy"
  fs sa "$lroot/scripts-$deploy" system:anyuser none
  fs sa "$lroot/scripts-$deploy" system:authuser none
  fs sa "$lroot/scripts-$deploy" daemon.scripts write
  fs sa "$lroot/scripts-$deploy" system:scripts-security-upd write
fi

# This is the better version

if [ "$create_scripts_dir" = "" ]; then
  create_scripts_dir=0
fi

if [ "$create_scripts_dir" -eq 1 ]; then
  mkdir -p "$lroot/Scripts/$deploy"
  fs sa "$lroot/Scripts/$deploy" system:anyuser none
  fs sa "$lroot/Scripts/$deploy" system:authuser none
  fs sa "$lroot/Scripts/$deploy" daemon.scripts write
  fs sa "$lroot/Scripts/$deploy" system:scripts-security-upd write
fi

if [ "$wizard" != "" ]; then
  if [ "$create_scripts_dir" -eq 1 ]; then
    vsshrun "/mit/$ailocker/wizard/bin/wizard" "install" "--web-stub-path" "$lroot/web_scripts/$addrend" "$@" "$wizard" "$lroot/Scripts/$deploy/$addrend"
  else
    vsshrun "/mit/$ailocker/wizard/bin/wizard" "install" "$@" "$wizard" "$lroot/web_scripts/$addrend"
  fi
  exit 0
fi

if [ "$prompt_username" = "" ]; then
  admin_username="admin"
  prompt_username=0
fi
if [ "$prompt_password" = "" ]; then
  prompt_password=1
fi

if [ "$prompt_username" -eq 1 ]; then
    echo
    echo "You will be able to log in to $sname using a username of your choice."
    echo "Please decide upon a username and enter it below."
    echo "Your username must contain only alphanumeric characters (a-z, 0-9)."
    printf "Desired username: "
    read admin_username
    admin_username=`perl -0e 'print $ARGV[0] =~ /^([[:alnum:]]+)$/' -- "$admin_username"`
    if [ "$admin_username" = "" ]; then
        echo
        echo ERROR:
        echo "Your username must contain only alphanumeric characters (a-z, 0-9)."
        echo "You will need to run the installer again and choose a different username."
        exit 1
    fi
fi

if [ "$prompt_password" -eq 1 ]; then
    stty -echo
    sshrun "/mit/$ailocker/deploy$scriptsdev/bin/prompt-password" "$sname" "$deploy" "$addrend" "$admin_username"
    stty echo
fi

echo
echo "Unpacking $sname... (this step might take several minutes)"
# xavid: use p to keep the same permissions as in the file
athrun scripts gtar zxpf "/mit/$ailocker/deploy$scriptsdev/$deploy.tar.gz"
files=`athrun scripts gfind . -mindepth 1 -maxdepth 1 | grep -v .admin`
numfiles=`echo "$files" | wc -l`
if [ ! -z "$files" ]; then
    if [ "$numfiles" -eq 1 ]; then
        athrun scripts gfind . -mindepth 2 -maxdepth 2 | xargs -i mv \{} .
        rmdir "$files"
    fi
fi
if [ -f "/mit/$ailocker/deploy$scriptsdev/php.ini/$deploy" ]; then
        nodot=`echo "$lname" | sed "/\./s///"`;
        sed -e "/SCRIPTS_USER/ s//$lname/" -e "/SCRIPTS_NODOT/ s//$nodot/" "/mit/$ailocker/deploy$scriptsdev/php.ini/$deploy" > php.ini
        athrun scripts gfind . -mindepth 1 -type d -exec sh -c 'ln -sf "`echo "$1" | sed '\''s,[^/],,g; s,/,../,g'\''`php.ini" "$1/"' -- {} \;
fi
cd "$origdir"

vsshrun "/mit/$ailocker/deploy$scriptsdev/bin/$deploy" "$sname" "$deploy" "$addrend" "$admin_username" "$requires_sql" "$scriptsdev" "${ATHENA_USER:-$USER}" || die "Unknown failure during configuration"
rm -f "$lroot/web_scripts/$addrend/.scripts-tmp"
checkfailed

echo
echo "== Installation complete! =="
echo "You should now be able to access your new copy of $sname at"
echo "http://$lname.scripts.mit.edu/$addrend/"
echo "(You can replace the http with https if you want to use encryption)"
echo "If you have trouble accessing it, feel free to contact"
echo "the $aimaintainer team by e-mailing $aicontact"
exit 0
