#!/usr/bin/env bash # AUTHOR: Daesorin # CREATED: 2026-08-08 16:59 +0100 set -Eeuo pipefail # CONFIGURATION LOCAL_VAULT="${HOME}/obsidian" REMOTE_HOST="ish" REMOTE_VAULT="~/obsidian" RSYNC_FLAGS=( -az --delete --human-readable --itemize-changes ) EXCLUDES=( --exclude=".DS_Store" --exclude=".Trash-*" # Obsidian cache --exclude=".obsidian/cache/" --exclude=".obsidian/workspace*.json" --exclude=".obsidian/workspace-mobile.json" # Vim --exclude="*.swp" --exclude="*.swo" # Temporary files --exclude="*~" ) # HELP usage() { cat < iSH pull iSH -> Local status Dry-run using timestamps diff Dry-run using checksums backup Create compressed archive EOF } # CHECKS check_requirements() { command -v rsync >/dev/null \ || { echo "rsync not installed."; exit 1; } command -v ssh >/dev/null \ || { echo "ssh not installed."; exit 1; } [[ -d "$LOCAL_VAULT" ]] \ || { echo "Vault not found: $LOCAL_VAULT"; exit 1; } } # BACKUP backup() { local backup_dir="${HOME}/obsidian-backups" mkdir -p "$backup_dir" local stamp stamp="$(date +%Y%m%d-%H%M%S)" local archive="${backup_dir}/obsidian-${stamp}.tar.zst" echo "Creating backup..." tar \ --zstd \ -cf "$archive" \ -C "$HOME" \ obsidian echo echo "Backup created:" echo " $archive" } # PUSH push() { rsync \ "${RSYNC_FLAGS[@]}" \ "${EXCLUDES[@]}" \ "${LOCAL_VAULT}/" \ "${REMOTE_HOST}:${REMOTE_VAULT}/" } # PULL pull() { rsync \ "${RSYNC_FLAGS[@]}" \ "${EXCLUDES[@]}" \ "${REMOTE_HOST}:${REMOTE_VAULT}/" \ "${LOCAL_VAULT}/" } # STATUS status() { rsync \ -azin \ "${EXCLUDES[@]}" \ "${LOCAL_VAULT}/" \ "${REMOTE_HOST}:${REMOTE_VAULT}/" } # DIFF diff() { rsync \ -azcin \ "${EXCLUDES[@]}" \ "${LOCAL_VAULT}/" \ "${REMOTE_HOST}:${REMOTE_VAULT}/" } # MAIN check_requirements case "${1:-help}" in push) push ;; pull) pull ;; status) status ;; diff) diff ;; backup) backup ;; help|-h|--help) usage ;; *) echo "Unknown command: ${1}" echo usage exit 1 ;; esac