76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
#!/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
 |