From 02e6ccbd8ea2b33611993ca612688ddf45d3383e Mon Sep 17 00:00:00 2001
From: Simone Margaritelli <evilsocket@gmail.com>
Date: Sat, 5 Oct 2019 14:22:20 +0200
Subject: [PATCH] misc: refactored backup and update plugins

---
 sdcard/rootfs/root/pwnagotchi/config.yml      | 10 +++++-
 .../pwnagotchi/plugins/default/auto-backup.py | 36 ++++++++-----------
 .../pwnagotchi/plugins/default/auto-update.py | 27 +++++++-------
 .../pwnagotchi/scripts/pwnagotchi/utils.py    | 18 ++++++++++
 4 files changed, 54 insertions(+), 37 deletions(-)

diff --git a/sdcard/rootfs/root/pwnagotchi/config.yml b/sdcard/rootfs/root/pwnagotchi/config.yml
index 7a2fa4f..f45f7f4 100644
--- a/sdcard/rootfs/root/pwnagotchi/config.yml
+++ b/sdcard/rootfs/root/pwnagotchi/config.yml
@@ -14,9 +14,17 @@ main:
         interval: 1 # every day
         files:
           - /root/brain.nn
+          - /root/brain.json
+          - /root/custom.yaml
+          - /root/handshakes
+          - /etc/ssh
+          - /etc/hostname
+          - /etc/hosts
+          - /etc/motd
+          - /var/log/pwnagotchi.log
         commands:
           - 'tar czf /tmp/backup.tar.gz {files}'
-          - 'scp /tmp/backup.tar.gz 10.0.0.1:/backups/backup-$(date).tar.gz'
+          - 'scp /tmp/backup.tar.gz pwnagotchi@10.0.0.1:/home/pwnagotchi/backups/backup-$(date).tar.gz'
       gps:
         enabled: false
       twitter:
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
index 5bc186d..7312201 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-backup.py
@@ -4,21 +4,18 @@ __name__ = 'auto-backup'
 __license__ = 'GPL3'
 __description__ = 'This plugin backups files when internet is availaible.'
 
-import os
+from pwnagotchi.utils import StatusFile
 import logging
+import os
 import subprocess
-from datetime import datetime
 
 OPTIONS = dict()
-LAST_UPDATE = None
 READY = False
+STATUS = StatusFile('/root/.auto-backup')
+
 
 def on_loaded():
-    """
-    Gets called when the plugin gets loaded
-    """
     global READY
-    global LAST_UPDATE
 
     if 'files' not in OPTIONS or ('files' in OPTIONS and OPTIONS['files'] is None):
         logging.error("AUTO-BACKUP: No files to backup.")
@@ -32,31 +29,28 @@ def on_loaded():
         logging.error("AUTO-BACKUP: No commands given.")
         return
 
-    if os.path.exists('/root/.auto-backup'):
-        LAST_BACKUP = datetime.fromtimestamp(os.path.getmtime('/root/.auto-backup'))
-
     READY = True
 
 
 def on_internet_available(display, config, log):
-    """
-    Called in manual mode when there's internet connectivity
-    """
-    global LAST_UPDATE
+    global STATUS
 
     if READY:
-        if LAST_BACKUP is not None:
-            if (datetime.now() - LAST_BACKUP).days < OPTIONS['interval']:
-                return
+        if STATUS.newer_then_days(OPTIONS['interval']):
+            return
 
         files_to_backup = " ".join(OPTIONS['files'])
         try:
+            display.set('status', 'Backing up ...')
+            display.update()
+
             for cmd in OPTIONS['commands']:
                 subprocess.call(cmd.format(files=files_to_backup).split(), stdout=open(os.devnull, 'wb'))
-            logging.info("AUTO-BACKUP: Successfuly ran backup commands.")
-            LAST_BACKUP = datetime.now()
-            with open('/root/.auto-backup', 'w') as f:
-                f.write('success')
+
+            logging.info("AUTO-BACKUP: backup done")
+            STATUS.update()
         except OSError as os_e:
             logging.info(f"AUTO-BACKUP: Error: {os_e}")
 
+        display.set('status', 'Backup done!')
+        display.update()
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-update.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-update.py
index ca2d6fc..4a1f135 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-update.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/plugins/default/auto-update.py
@@ -4,40 +4,36 @@ __name__ = 'auto-update'
 __license__ = 'GPL3'
 __description__ = 'This plugin performs an "apt update && apt upgrade" when internet is availaible.'
 
-import os
 import logging
 import subprocess
-from datetime import datetime
+from pwnagotchi.utils import StatusFile
 
 OPTIONS = dict()
-LAST_UPDATE = None
 READY = False
-STATUS_FILE = '/root/.auto-update'
+STATUS = StatusFile('/root/.auto-update')
 
 
 def on_loaded():
     global READY
-    global LAST_UPDATE
 
     if 'interval' not in OPTIONS or ('interval' in OPTIONS and OPTIONS['interval'] is None):
         logging.error("AUTO-UPDATE: Interval is not set.")
         return
 
-    if os.path.exists(STATUS_FILE):
-        LAST_UPDATE = datetime.fromtimestamp(os.path.getmtime(STATUS_FILE))
-
     READY = True
 
 
 def on_internet_available(display, config, log):
-    global LAST_UPDATE
+    global STATUS
 
     if READY:
-        if LAST_UPDATE is not None:
-            if (datetime.now() - LAST_UPDATE).days < OPTIONS['interval']:
-                return
+        if STATUS.newer_then_days(OPTIONS['interval']):
+            return
 
         try:
+            display.set('status', 'Updating ...')
+            display.update()
+
             logging.info("AUTO-UPDATE: updating packages index ...")
 
             update = subprocess.Popen('apt update -y', shell=True, stdin=None,
@@ -52,8 +48,9 @@ def on_internet_available(display, config, log):
 
             logging.info("AUTO-UPDATE: complete.")
 
-            LAST_UPDATE = datetime.now()
-            with open(STATUS_FILE, 'w') as f:
-                f.write('success')
+            STATUS.update()
         except Exception as e:
             logging.exception("AUTO-UPDATE ERROR")
+
+        display.set('status', 'Updated!')
+        display.update()
diff --git a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/utils.py b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/utils.py
index 28a627a..d1b2ba0 100644
--- a/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/utils.py
+++ b/sdcard/rootfs/root/pwnagotchi/scripts/pwnagotchi/utils.py
@@ -1,3 +1,4 @@
+from datetime import datetime
 import logging
 import glob
 import os
@@ -78,3 +79,20 @@ def blink(times=1, delay=0.3):
         led(False)
         time.sleep(delay)
     led(True)
+
+
+class StatusFile(object):
+    def __init__(self, path):
+        self._path = path
+        self._updated = None
+
+        if os.path.exists(path):
+            self._updated = datetime.fromtimestamp(os.path.getmtime(path))
+
+    def newer_then_days(self, days):
+        return self._updated is not None and (datetime.now() - self._updated).days < days
+
+    def update(self, data=None):
+        self._updated = datetime.now()
+        with open(self._path, 'w') as fp:
+            fp.write(str(self._updated) if data is None else data)