#!/usr/bin/env bash # Save (encrypted) password database to cloud storage # # Usage: # save-passwddb - Save databases to cloud # save-passwddb init - Restore databases from cloud (with single backup archive) RCLONE_REMOTE="proton" SOURCE_DIR="$HOME/doc" TARGET_DIR="$RCLONE_REMOTE:doc" BACKUP_DIR="$HOME/doc/bak" function save_databases() { if [ 0 -lt "$(ls $SOURCE_DIR/*.kdbx 2>/dev/null | wc -w)" ]; then echo "[save] Saving KeePassXC databases and database keys" rclone copy "$SOURCE_DIR" "$TARGET_DIR" \ --include "/*.{kdbx,kdbx.key}" \ --progress echo "[save] Done" else echo "[save] No password database found, restore with:" echo "" echo " $0 init" exit 1 fi } function backup_existing() { mkdir -p "$BACKUP_DIR" local timestamp=$(date +%Y%m%d-%H%M%S) local backup_file="$BACKUP_DIR/passwddb_backup_${timestamp}.tar.gz" echo "[backup] Creating backup archive: ${backup_file}" tar -czf "$backup_file" -C "$SOURCE_DIR" $(find "$SOURCE_DIR" -maxdepth 1 -type f \( -name "*.kdbx" -o -name "*.kdbx.key" \) -printf "%f ") echo "[backup] Backup complete" } function restore_databases() { echo "[init] Checking for existing files..." local existing_files=$(find "$SOURCE_DIR" -maxdepth 1 -type f \( -name "*.kdbx" -o -name "*.kdbx.key" \) -print) if [ -n "$existing_files" ]; then echo "[init] Found existing database files:" echo "$existing_files" | while read -r file; do echo " - $file" done read -p "[init] Create backup archive of existing files? [y/N] " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then backup_existing fi fi echo "[init] Restoring KeePassXC databases and database keys" mkdir -p "$SOURCE_DIR" rclone copy "$TARGET_DIR" "$SOURCE_DIR" \ --include "*.{kdbx,kdbx.key}" \ --progress echo "[init] Done" } case "$1" in ""|save) save_databases ;; init) restore_databases ;; *) echo "Usage: $0 [init|save]" exit 1 ;; esac