#!/usr/bin/env nix-shell #!nix-shell -i bash -p bash -p rsync -p sane-scripts.sync-from-iphone -p sane-scripts.sync-music usage() { echo "sync [flags ...] [ [ ...]] [passthrough flags ...]" echo "where:" echo " host: all|desko|lappy|moby" echo " - defaults to 'all' if omitted" exit 1 } debug() { if [ -n "$SYNC_DEBUG" ]; then echo "$@" fi } ifExists() { local path="$1" shift local cmd="$@" if test -d "$path"; then debug "${cmd[@]}" ${cmd[@]} else debug "skipping action because $path doesn't exist" fi } homeMountFor() { local want=$1 local me=$(hostname) if [ "$want" = "$me" ]; then echo "$HOME" else echo "/mnt/$want/home" fi } sync_pkm() { local host=$1 local me=$(hostname) ssh "$host" "set -eux; remote=$me; "'cd ~/knowledge; old=$(git rev-parse --abbrev-ref HEAD); [ "$old" = master ]; st=$(git stash create); git reset --hard HEAD; git branch -D sync || true; git checkout -b sync; git fetch $remote master && git rebase $remote/master && (if [ -n "$st" ]; then git stash apply "$st"; fi) && git branch --move --force master || (git --reset-hard HEAD; git checkout "$old"; (if [ -n "$st" ]; then git stash apply "$st"; fi); false)' } sync_music() { local host=$1 shift local deskoHome=$(homeMountFor desko) local lappyHome=$(homeMountFor lappy) local mobyHome=$(homeMountFor moby) case $host in (desko) ifExists /mnt/servo/media/Music/Various.Artists \ sane-sync-music --compat /mnt/servo/media/Music "$deskoHome/Music" "$@" ;; (lappy) ifExists /mnt/servo/media/Music/Various.Artists \ sane-sync-music --compress --compat /mnt/servo/media/Music "$lappyHome/Music" "${syncFlags[@]}" ;; (moby) ifExists /mnt/servo/media/Music/Various.Artists \ sane-sync-music --compat /mnt/servo/media/Music "$mobyHome/Music" "${syncFlags[@]}" ;; (*) ;; esac } sync_books() { local host="$1" local deskoHome=$(homeMountFor desko) local lappyHome=$(homeMountFor lappy) local mobyHome=$(homeMountFor moby) case $host in (moby) ifExists /mnt/servo/media/Books/Audiobooks \ rsync -arv --delete /mnt/servo/media/Books/Audiobooks/ "$mobyHome/Books/Audiobooks/" # copy books from servo to moby; delete old/untracked ones, but keep KOreader state files (sdr) ifExists /mnt/servo/media/Books/Books \ rsync -arv --delete --exclude '*.sdr' /mnt/servo/media/Books/Books/ "$mobyHome/Books/Books/" # TODO: recover servo Books/Visual collection, and then re-enable syncing # ifExists /mnt/servo/media/Books/Visual \ # rsync -arv --delete --exclude '*.sdr' /mnt/servo/media/Books/Books/ "$mobyHome/Books/Visual/" ;; (*) ;; esac } sync_photos() { local host=$1 local deskoHome=$(homeMountFor desko) local lappyHome=$(homeMountFor lappy) local mobyHome=$(homeMountFor moby) case $host in (desko) sane-sync-from-iphone ;; (moby) # copy photos/screenshots from moby to desko: rsync -arv --exclude servo-macros "$mobyHome/Pictures/" "$deskoHome/Pictures/from/moby/" ;; (*) ;; esac } hosts=() targets=() passthruArgs=() parseArgs() { while [[ $# -ge 1 ]]; do local arg=$1 case $arg in (desko|lappy|moby) hosts+=("$arg") shift ;; (all) hosts+=(desko lappy moby) shift ;; (pkm|music|books|photos) targets+=("$arg") shift ;; (--verbose) if [[ "${#hosts[@]}" -eq 0 ]]; then SYNC_DEBUG=1 shift else # it's a passthru flag break fi ;; (--help) usage shift ;; (*) break ;; esac done passthruArgs+=("$@") if [[ ${#hosts[@]} -eq 0 ]]; then hosts+=(desko lappy moby) fi if [[ ${#targets[@]} -eq 0 ]]; then targets+=(pkm music photos books) fi } parseArgs "$@" debug "hosts:" "${hosts[@]}" debug "targets:" "${targets[@]}" for target in "${targets[@]}"; do for host in "${hosts[@]}"; do sync_"$target" "$host" "${passthruArgs[@]}" done done