#!/bin/bash
# Default variables
GIT_FOLDER="/tmp/pwnagotchi"
GIT_URL="https://github.com/evilsocket/pwnagotchi/"
VERSION="master"
SUPPORTED_RESTART_MODES=( 'auto' 'manual' )
MODE="auto"
BACKUPCONFIG=0
RESTORECONFIG=0

# Functions
function usage() {
    cat <<EOF

 usage: $0 [OPTIONS]
 Note: This should be run from the pwnagotchi itself!

   Options:
      -v        # Version to update to, can be a branch or commit. (default: master)
      -u        # Url to clone from. (default: https://github.com/evilsocket/pwnagotchi)
      -m        # Mode to restart to. (Supported: ${SUPPORTED_RESTART_MODES[*]}; default: auto)
      -b        # Backup the current pwnagotchi config and hostname references, then overwrite with defaults.
      -r        # Restore the current pwnagotchi config and hostname references after upgrade. (-b will be enabled.)
      -h        # Shows this help.

EOF
    exit 0
}

function test_root() {
    if ! [ $(id -u) = 0 ]; then
        echo "[!] This script must be run as root."
        exit 1
    fi
}

function test_github() {
    wget -q  --spider $GIT_URL
    if [ $? -ne 0 ]; then
        echo "[!] Cannot reach github. This script requires internet access, ensure connection sharing is working."
        exit 2
    fi
}

while getopts "v:u:m:brh" o; do
  case "${o}" in
    v)
      VERSION="${OPTARG}"
      ;;
    u)
      GIT_URL="${OPTARG}"
      ;;
    m)
      if [[ "${SUPPORTED_RESTART_MODES[*]}" =~ ${OPTARG} ]]; then
        MODE="${OPTARG}"
      else
        usage
      fi
      ;;
    b)
      BACKUPCONFIG=1
      ;;
    r)
      BACKUPCONFIG=1
      RESTORECONFIG=1
      ;;
    h)
      usage
      ;;
    *)
      usage
      ;;
  esac
done
shift $((OPTIND-1))

echo "[+] Checking prerequisites."
test_root
test_github

# clean up old files, clone master, set checkout to commit if needed.
echo "[+] Cloning to $GIT_FOLDER..."
rm $GIT_FOLDER -rf
git clone $GIT_URL $GIT_FOLDER -q
cd $GIT_FOLDER
if [ $VERSION != "master" ]; then
    git checkout $VERSION -q
fi

if [ $BACKUPCONFIG -eq 1 ]; then
    echo "[+] Creating backup of config.yml and hostname references"
    mv /root/pwnagotchi/config.yml /root/config.yml.bak -f
    mv /etc/hosts /root/hosts.bak -f
    mv /etc/hostname /root/hostname.bak -f
    mv /etc/motd /etc/motd.bak -f
    mv /etc/network/interfaces /root/interfaces.bak -f
fi

echo "[+] Installing $(git log -1 --format="%h")"
rm /root/pwnagotchi -rf # ensures old files are removed
rsync -aPq $GIT_FOLDER/sdcard/boot/*   /boot/
rsync -aPq $GIT_FOLDER/sdcard/rootfs/* /
cd /tmp
rm $GIT_FOLDER -rf

if [ $RESTORECONFIG -eq 1 ]; then
    echo "[+] Restoring backup of config.yml and hostname references"
    mv /root/config.yml.bak /root/pwnagotchi/config.yml -f
    mv /root/hosts.bak /etc/hosts -f
    mv /root/hostname.bak /etc/hostname -f
    mv /root/interfaces.bak /etc/network/interfaces -f
    mv /etc/motd.bak /etc/motd -f
fi

echo "[+] Restarting pwnagotchi in $MODE mode. $( screen -X -S pwnagotchi quit)"
if [ $MODE == "auto" ]; then
    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.auto
elif [ $MODE == "manual" ]; then
    sudo -H -u root /usr/bin/screen -dmS pwnagotchi -c /root/pwnagotchi/data/screenrc.manual
fi
echo "[+] Finished"