From 3efa96b292dda53a0b9eba4fbed7e0e63db97cef Mon Sep 17 00:00:00 2001
From: Jeremy O'Brien <neutral@fastmail.com>
Date: Thu, 31 Oct 2019 13:18:42 -0400
Subject: [PATCH] enhancement: Improve the backup script

- Significantly decrease time it takes to save a backup
- Remove host dependency on 'zip' binary
- Preserve file attributes on backed-up files
- Avoid copying files on the pi itself to /tmp

Signed-off-by: Jeremy O'Brien <neutral@fastmail.com>
---
 scripts/backup.sh  | 32 ++------------------------------
 scripts/restore.sh | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 30 deletions(-)
 create mode 100755 scripts/restore.sh

diff --git a/scripts/backup.sh b/scripts/backup.sh
index 281a2bb..6fa1784 100755
--- a/scripts/backup.sh
+++ b/scripts/backup.sh
@@ -3,7 +3,7 @@
 # name of the ethernet gadget interface on the host
 UNIT_HOSTNAME=${1:-10.0.0.2}
 # output backup zip file
-OUTPUT=${2:-pwnagotchi-backup.zip}
+OUTPUT=${2:-pwnagotchi-backup.tgz}
 # username to use for ssh
 USERNAME=${3:-pi}
 # what to backup
@@ -19,38 +19,10 @@ FILES_TO_BACKUP=(
   /home/pi/.bashrc
 )
 
-if ! type "zip" >/dev/null 2>&1; then
-  echo "This script requires zip, please resolve and try again"
-  exit 1
-fi
-
 ping -c 1 "${UNIT_HOSTNAME}" >/dev/null || {
   echo "@ unit ${UNIT_HOSTNAME} can't be reached, make sure it's connected and a static IP assigned to the USB interface."
   exit 1
 }
 
 echo "@ backing up $UNIT_HOSTNAME to $OUTPUT ..."
-
-ssh "${USERNAME}@${UNIT_HOSTNAME}" "sudo rm -rf /tmp/backup && sudo rm -rf /tmp/backup.zip" > /dev/null
-
-for file in "${FILES_TO_BACKUP[@]}"; do
-  dir=$(dirname "$file")
-
-  echo "@ copying $file to /tmp/backup$dir"
-
-  ssh "${USERNAME}@${UNIT_HOSTNAME}" "mkdir -p /tmp/backup${dir}" > /dev/null
-  ssh "${USERNAME}@${UNIT_HOSTNAME}" "sudo cp -r ${file} /tmp/backup${dir}" > /dev/null
-done
-
-ssh "${USERNAME}@${UNIT_HOSTNAME}" "sudo chown ${USERNAME}:${USERNAME} -R /tmp/backup" > /dev/null
-
-echo "@ pulling from $UNIT_HOSTNAME ..."
-
-rm -rf /tmp/backup
-scp -rC "${USERNAME}@${UNIT_HOSTNAME}":/tmp/backup /tmp/
-
-echo "@ compressing ..."
-
-zip -r -9 -q "$OUTPUT" /tmp/backup
-rm -rf /tmp/backup
-
+ssh "${USERNAME}@${UNIT_HOSTNAME}" "sudo tar cv ${FILES_TO_BACKUP[@]}" | gzip -9 > "$OUTPUT"
diff --git a/scripts/restore.sh b/scripts/restore.sh
new file mode 100755
index 0000000..ca60a80
--- /dev/null
+++ b/scripts/restore.sh
@@ -0,0 +1,16 @@
+#!/usr/bin/env bash
+
+# name of the ethernet gadget interface on the host
+UNIT_HOSTNAME=${1:-10.0.0.2}
+# output backup zip file
+BACKUP=${2:-pwnagotchi-backup.tgz}
+# username to use for ssh
+USERNAME=${3:-pi}
+
+ping -c 1 "${UNIT_HOSTNAME}" >/dev/null || {
+  echo "@ unit ${UNIT_HOSTNAME} can't be reached, make sure it's connected and a static IP assigned to the USB interface."
+  exit 1
+}
+
+echo "@ restoring $BACKUP to $UNIT_HOSTNAME ..."
+cat ${BACKUP} | ssh "${USERNAME}@${UNIT_HOSTNAME}" "sudo tar xzv -C /"