Move independent repo myunison into this repo
authorIan Kelling <ian@iankelling.org>
Sun, 16 Apr 2017 00:44:58 +0000 (17:44 -0700)
committerIan Kelling <ian@iankelling.org>
Sun, 16 Apr 2017 00:44:58 +0000 (17:44 -0700)
Merge remote-tracking branch 'myunison/master'

myunison [new file with mode: 0755]
unison-snapshot [new file with mode: 0755]

diff --git a/myunison b/myunison
new file mode 100755 (executable)
index 0000000..2e0f149
--- /dev/null
+++ b/myunison
@@ -0,0 +1,94 @@
+#!/bin/bash -l
+
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+
+# note, we could have done machine specific subvols,
+# but there were so few files, it just didn't seem
+# necessary to have an rw copy on those machines
+# which did not have the whole p subvol.
+
+gen_args=()
+do_snapshot=true
+batch=false
+while [[ $1 ]]; do
+    case $1 in
+        -ob) gen_args+=(--ours -b); batch=true; shift ;;
+        -b) gen_args+=(-b); batch=true; shift ;;
+        -n) do_snapshot=false; shift ;;
+        -h|--help)
+            echo "$0: help is head of $BASH_SOURCE:"
+            head -n 30 "$BASH_SOURCE"
+            exit 0
+            ;;
+        --) shift; break ;;
+        -*) gen_args+=($1) ; shift ;;
+        *) host=$1; shift ;;
+    esac
+done
+if [[ ! $host ]]; then
+    host=$1
+fi
+
+if [[ $host == demohost ]]; then
+    do_snapshot=false
+fi
+
+# arch and debian don't play nice with unison.
+# "connection lost" on unison-gtk, with bignum errs in term,
+# and simply freezing on cli, all means compiled under
+# different ocaml versions.
+# I had the great realization that unison is a self contained
+# binary with no special runtime dependencies.
+# However, I got a gtk error running the ui version.
+# todo: I should test pushing my unison version instead
+# of pulling it.
+echo "$0: running: gen ${gen_args[@]}"
+/p/c/subdir_files/.unison/gen ${gen_args[@]}
+if [[ ! $host ]]; then
+    echo "$0: error: expected argument for hostname"
+    exit 1
+fi
+
+
+# todo: this doesn't deal with if the host is running arch too
+
+# debian uses this path, and has gtk version linked as /usr/bin/unison,
+# but I'd rather not push the gtk version
+push_path=/usr/bin/unison-latest-stable
+if [[ ! -e $push_path ]]; then
+    push_path=/usr/bin/unison
+fi
+# note, i'd prefer to use /usr/local/bin, but it's not in arch's default
+# path for root.
+scp /usr/bin/unison-latest-stable root@$host:/usr/bin/unison
+
+if $do_snapshot; then
+    unison-snapshot
+    if ! ssh root@$host "! type unison-snapshot || unison-snapshot"; then
+        if [[ ! ${gen_args[@]} ]]; then
+            # gen_args are all about syncing with new systems where
+            # we could expect the remote snapshot to not be available yet.
+            echo "$0: error: failed remote unison-snapshot"
+            exit 1
+        fi
+    fi
+fi
+
+if $batch; then
+    # todo, figure out what the cli version is called in non-debian distros
+    f=unison-latest-stable
+else
+    f=unison-gtk
+    type -t $f &>/dev/null || f=unison-gtk2 # for arch
+fi
+
+if s $f  "$host"; then
+    if [[ $host == frodo ]]; then
+        # only send data to the machine i do full backups to
+        p=/p/c/machine_specific/$HOSTNAME/.unison/
+        s rsync -rlptgohi $p root@$host:$p
+    fi
+    p=/p/c/machine_specific/$host/.unison/
+    s rsync -rlptgohvi root@$host:$p $p
+fi
diff --git a/unison-snapshot b/unison-snapshot
new file mode 100755 (executable)
index 0000000..154eed0
--- /dev/null
@@ -0,0 +1,25 @@
+#!/bin/bash -l
+set -eE -o pipefail
+trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
+
+sv() { echo "$@"; "$@"; }
+
+date=unison-$(date "+%Y:%m:%d")
+for mountp in /mnt/root/q /mnt/iroot/i; do
+    [[ -e $mountp ]] || continue
+    date_path=${mountp%/*}/$date
+    todays=( $date_path-* )
+    IFS=$'\n' todays=($(sort -Vr <<<"${todays[*]}")); unset IFS
+    if [[ -e ${todays[0]} ]]; then
+        snapshot=$date_path-$(( ${todays[0]##*-} + 1 ))
+    else
+        snapshot=$date_path-1
+    fi
+    sv s btrfs subvolume snapshot -r $mountp $snapshot
+    existing=( ${mountp%/*}/unison-* )
+    IFS=$'\n' existing=($(sort -Vr <<<"${existing[*]}")); unset IFS
+    # keep 10 unison snapshots around
+    if (( ${#existing[@]} > 10 )); then
+        sv s btrfs subvolume delete ${existing[@]:10}
+    fi
+done