#! /bin/bash -e prog=${0##*/} tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip} archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive} kill=nil listen=nil verbose=nil bogus=nil opts=; unset dir sub n label usage () { cat <&2; exit 2 ;; esac case $verbose in t) set -x ;; esac case $kill in t) echo quit >"$tmp/upload.wakeup"; exit 0 ;; esac case ${DVDRIP_UPLOAD_LOCKEDP+t} in t) lockedp=t ;; *) lockedp=nil; DVDRIP_UPLOAD_LOCKEDP=t; export DVDRIP_UPLOAD_LOCKEDP ;; esac case $lockedp,$listen in t,*) ;; nil,nil) if [ -p "$tmp/upload.wakeup" ]; then echo check >"$tmp/upload.wakeup" exit 0 else exec locking "$tmp/upload.lock" "$0" ${opts:+"-$opts"} fi exit 2 ;; nil,t) exec locking -f "$tmp/upload.lock" "$0" ${opts:+"-$opts"} exit 2 ;; esac notify () { colour=$1 message=$2 echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)" } fail () { notify 1 "!!! $*"; exit 2; } warn () { notify 5 "??? $*"; } info () { notify 6 "--- $*"; } run_setrc () { notify 2 "+++ $*"; set +e; nice "$@"; rc=$?; set -e } run () { run_setrc "$@"; case $rc in 0) ;; *) fail "$1: exit $rc" ;; esac; } case $archive in *:*) archhost=${archive%%:*} archpath=${archive#*:} ;; *) unset archhost; archpath=$archive ;; esac archdo () { op=$1; shift case ${archhost+t} in t) qq= for a in "$@"; do qq="${qq:+$qq }'${a//\'/"'\\''"}'" #" # emacs is confused done "$op" ssh "$archhost" "$qq" ;; *) "$op" "$@" ;; esac } archrun () { archdo run "$@"; } check () { while :; do any=nil for i in "$tmp"/*; do if [ -f "$i/dest" ]; then read dest <"$i/dest"; any=t mv "$i/dest" "$i/dest.seen" (info "copy $i/iso -> $dest" case $dest in */*) dir=${dest%/*} ;; *) dir= ;; esac archrun mkdir -p "$archpath${dir:+/$dir}" run rsync -svPSW "$i/iso" "$archive/$dest" run rm -rf "$i") || : fi done case $any in nil) break ;; esac done } case $listen in nil) check ;; t) rm -f "$tmp/upload.newpipe" mkfifo "$tmp/upload.newpipe" mv "$tmp/upload.newpipe" "$tmp/upload.wakeup" while read line <&3; do case $line in check) check ;; quit) info "quitting on user request"; break ;; *) warn "unknown command \`$line'" ;; esac done 3<>"$tmp/upload.wakeup" rm -f "$tmp/upload.wakeup" "$tmp/upload.lock" ;; esac