diff --git a/es_configs/es_systems.xml b/es_configs/es_systems.xml
index 41f00e31..c55ae691 100644
--- a/es_configs/es_systems.xml
+++ b/es_configs/es_systems.xml
@@ -1410,7 +1410,7 @@
tools
RetroDECK Tools
/var/config/retrodeck/tools
- .sh .SH
+ .sh .SH .py .PY
bash %ROM%
tools
tools
diff --git a/retrodeck.sh b/retrodeck.sh
index 13282d77..a84cf308 100644
--- a/retrodeck.sh
+++ b/retrodeck.sh
@@ -189,6 +189,7 @@ finit() {
mkdir -pv $rdhome/states
mkdir -pv $rdhome/screenshots
mkdir -pv $rdhome/bios/pico-8
+ mkdir -pv $rdhome/.logs
# XMLSTARLET HERE
cp -f /app/retrodeck/es_settings.xml /var/config/emulationstation/.emulationstation/es_settings.xml
diff --git a/tools/cloud-sync.py b/tools/cloud-sync.py
new file mode 100644
index 00000000..ed6cf9c9
--- /dev/null
+++ b/tools/cloud-sync.py
@@ -0,0 +1,46 @@
+#!/usr/bin/python3
+
+import os
+import shutil
+import configparser
+
+retrodeck_folder = os.path.expanduser('~')+"/retrodeck"
+
+rclone_executable = os.path.expanduser('~')+"/retrodeck/rclone/rclone"
+
+sync_config_path=f"/var/config/rclone/cloud-sync.conf"
+sync_config_def_path=f"/var/config/rclone/cloud-sync.conf.default"
+
+rclone_config_path=f"/var/config/rclone/rclone.conf"
+rclone_config_def_path=f"/var/config/rclone/rclone.conf.default"
+
+rules_config_path=f"/var/config/rclone/cloud-sync-rules.conf"
+rules_config_def_path=f"/var/config/rclone/cloud-sync-rules.conf.default"
+
+# make sure we have some configs
+if not os.path.exists(sync_config_path):
+ shutil.copyfile(sync_config_def_path, sync_config_path)
+
+# https://stackoverflow.com/questions/2819696/parsing-properties-file-in-python/25493615#25493615
+
+with open(sync_config_path, 'r') as f:
+ config_string = '[dummy_section]\n' + f.read()
+config = configparser.ConfigParser()
+config.read_string(config_string)
+sync_remote = config['dummy_section']['CLOUD_SYNC_REMOTE'].replace('"', "")
+sync_path = config['dummy_section']['CLOUD_SYNC_PATH'].replace('"', "").rstrip("/")
+
+
+if not os.path.exists(rclone_config_path):
+ #shutil.copyfile(rclone_config_def_path, rclone_config_path)
+ raise(FileNotFoundError)
+
+if not os.path.exists(rules_config_path):
+ shutil.copyfile(rules_config_def_path, rules_config_path)
+
+# sync states
+#print("Syncing savestates")
+#os.system(f"rclone bisync -v --workdir /var/cache/rclone/bisync {retrodeck_folder}/roms/ \"{sync_remote}\":\"{sync_path}/savestates\" --include *.state* --log-file {retrodeck_folder}/.logs/cloud-sync.log")
+
+print("Syncing saves, screenshots, and gamedata")
+os.system(f"rclone bisync -v --workdir /var/cache/rclone/bisync {retrodeck_folder}/roms/ \"{sync_remote}\":\"{sync_path}/\" --filters-file {rules_config_path} --log-file {retrodeck_folder}/.logs/cloud-sync.log")
\ No newline at end of file