From 0b2c156d29dea219a10f3d5e613adda56bd191ce Mon Sep 17 00:00:00 2001
From: Aaron Bieber <aaron@bolddaemon.com>
Date: Mon, 11 Nov 2019 07:44:52 -0700
Subject: [PATCH] Make backup / restore use POSIX shell for portability.

backup.sh:
  - Add use getopts for a more friendly user interface.
  - Add timeout to ping check.
  - Add unix epoch to backup file names.
  - Backup ssh information (/etc/ssh, $USER/.ssh).

restore.sh:
  - Add use getopts for a more friendly user interface.
  - Add timeout to ping check.
  - If user doesn't specify a backup file to restore, attempt to
    find the latest for the host name passed in.

Signed-off-by: Aaron Bieber <aaron@bolddaemon.com>
---
 scripts/backup.sh  | 62 +++++++++++++++++++++++++++++++++-------------
 scripts/restore.sh | 47 +++++++++++++++++++++++++++++++----
 2 files changed, 87 insertions(+), 22 deletions(-)

diff --git a/scripts/backup.sh b/scripts/backup.sh
index da011dd..3ba9fd8 100755
--- a/scripts/backup.sh
+++ b/scripts/backup.sh
@@ -1,26 +1,54 @@
-#!/usr/bin/env bash
+#!/bin/sh
+
+usage() {
+	echo "Usage: backup.sh [-honu] [-h] [-u user] [-n host name or ip] [-o output]"
+}
+
+while getopts "ho:n:u:" arg; do
+	case $arg in
+		h)
+			usage
+			exit
+			;;
+		n)
+			UNIT_HOSTNAME=$OPTARG
+			;;
+		o)
+			OUTPUT=$OPTARG
+			;;
+		u)
+			USERNAME=$OPTARG
+			;;
+		*)
+			usage
+			exit 1
+	esac
+done
 
 # name of the ethernet gadget interface on the host
-UNIT_HOSTNAME=${1:-10.0.0.2}
+UNIT_HOSTNAME=${UNIT_HOSTNAME:-10.0.0.2}
 # output backup tgz file
-OUTPUT=${2:-pwnagotchi-backup.tgz}
+OUTPUT=${OUTPUT:-${UNIT_HOSTNAME}-backup-$(date +%s).tgz}
 # username to use for ssh
-USERNAME=${3:-pi}
+USERNAME=${USERNAME:-pi}
 # what to backup
-FILES_TO_BACKUP=(
-  /root/brain.nn
-  /root/brain.json
-  /root/.api-report.json
-  /root/.bashrc
-  /root/handshakes
-  /root/peers
-  /etc/pwnagotchi/
-  /var/log/pwnagotchi.log
-  /var/log/pwnagotchi*.gz
-  /home/pi/.bashrc
-)
+FILES_TO_BACKUP="/root/brain.nn \
+  /root/brain.json \
+  /root/.api-report.json \
+  /root/.ssh \
+  /root/.bashrc \
+  /root/.profile \
+  /root/handshakes \
+  /root/peers \
+  /etc/pwnagotchi/ \
+  /etc/ssh/ \
+  /var/log/pwnagotchi.log \
+  /var/log/pwnagotchi*.gz \
+  /home/pi/.ssh \
+  /home/pi/.bashrc \
+  /home/pi/.profile"
 
-ping -c 1 "${UNIT_HOSTNAME}" >/dev/null || {
+ping -w 3 -c 1 "${UNIT_HOSTNAME}" > /dev/null 2>&1 || {
   echo "@ unit ${UNIT_HOSTNAME} can't be reached, make sure it's connected and a static IP assigned to the USB interface."
   exit 1
 }
diff --git a/scripts/restore.sh b/scripts/restore.sh
index 50aa5ec..6303f88 100755
--- a/scripts/restore.sh
+++ b/scripts/restore.sh
@@ -1,13 +1,50 @@
-#!/usr/bin/env bash
+#!/bin/sh
 
+usage() {
+	echo "Usage: restore.sh [-bhnu] [-h] [-b backup name] [-n host name] [-u user name]"
+}
+
+while getopts "hb:n:u:" arg; do
+	case $arg in
+		b)
+			BACKUP=$OPTARG
+			;;
+		h)
+			usage
+			exit
+			;;
+		n)
+			UNIT_HOSTNAME=$OPTARG
+			;;
+		u)
+			USERNAME=$OPTARG
+			;;
+		*)
+			exit 1
+	esac
+done
 # name of the ethernet gadget interface on the host
-UNIT_HOSTNAME=${1:-10.0.0.2}
+UNIT_HOSTNAME=${UNIT_HOSTNAME:-10.0.0.2}
 # output backup tgz file
-BACKUP=${2:-pwnagotchi-backup.tgz}
+if [ -z $BACKUP ]; then
+	BACKUP=$(ls -rt ${UNIT_HOSTNAME}-backup-*.tgz 2>/dev/null | tail -n1)
+	if [ -z $BACKUP ]; then
+		echo "@ Can't find backup file. Please specify one with '-b'"
+		exit 1
+	fi
+	echo "@ Found backup file:"
+	echo "\t${BACKUP}"
+	echo -n "@ continue restroring this file? (y/n) "
+	read CONTINUE
+	CONTINUE=$(echo "${CONTINUE}" | tr "[:upper:]" "[:lower:]")
+	if [ "${CONTINUE}" != "y" ]; then
+		exit 1
+	fi
+fi
 # username to use for ssh
-USERNAME=${3:-pi}
+USERNAME=${USERNAME:-pi}
 
-ping -c 1 "${UNIT_HOSTNAME}" >/dev/null || {
+ping -w 3 -c 1 "${UNIT_HOSTNAME}" > /dev/null 2>&1 || {
   echo "@ unit ${UNIT_HOSTNAME} can't be reached, make sure it's connected and a static IP assigned to the USB interface."
   exit 1
 }