158 lines
2.5 KiB
Bash
Executable file
158 lines
2.5 KiB
Bash
Executable file
#!/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 <<EOF
|
|
obsd - Obsidian Vault Synchroniser
|
|
|
|
Usage:
|
|
obsd push
|
|
obsd pull
|
|
obsd status
|
|
obsd diff
|
|
obsd backup
|
|
obsd help
|
|
|
|
Commands
|
|
|
|
push Local -> 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
|