Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/dvdrip
[dvdrip] / dvdrip-upload
1 #! /bin/bash -e
2
3 prog=${0##*/}
4 tmp=${DVDRIP_TMPDIR-${HOME?}/tmp/dvdrip}
5 archive=${DVDRIP_ARCHIVE-jem.distorted.org.uk:/mnt/dvd/archive}
6 kill=nil listen=nil verbose=nil bogus=nil opts=; unset dir sub n label
7 usage () {
8 cat <<EOF
9 usage: $prog [-klv]
10 EOF
11 }
12 while getopts "hklv" opt; do
13 case $opt in
14 h) usage; exit 0 ;;
15 k) kill=t ;;
16 l) listen=t; opts=${opts}l ;;
17 v) verbose=t; opts=${opts}v ;;
18 *) bogus=t ;;
19 esac
20 done
21 shift $(( $OPTIND - 1 ))
22 case $# in
23 0) ;;
24 *) bogus=t ;;
25 esac
26 case $bogus in t) usage >&2; exit 2 ;; esac
27 case $verbose in t) set -x ;; esac
28
29 case $kill in
30 t) echo quit >"$tmp/upload.wakeup"; exit 0 ;;
31 esac
32
33 case ${DVDRIP_UPLOAD_LOCKEDP+t} in
34 t) lockedp=t ;;
35 *) lockedp=nil; DVDRIP_UPLOAD_LOCKEDP=t; export DVDRIP_UPLOAD_LOCKEDP ;;
36 esac
37 case $lockedp,$listen in
38 t,*) ;;
39 nil,nil)
40 if [ -p "$tmp/upload.wakeup" ]; then
41 echo check >"$tmp/upload.wakeup"
42 exit 0
43 else
44 exec locking "$tmp/upload.lock" "$0" ${opts:+"-$opts"}
45 fi
46 exit 2
47 ;;
48 nil,t)
49 exec locking -f "$tmp/upload.lock" "$0" ${opts:+"-$opts"}
50 exit 2
51 ;;
52 esac
53
54 notify () {
55 colour=$1 message=$2
56 echo "$(tput bold; tput setaf $colour)$message$(tput sgr0; tput op)"
57 }
58 fail () { notify 1 "!!! $*"; exit 2; }
59 warn () { notify 5 "??? $*"; }
60 info () { notify 6 "--- $*"; }
61 run_setrc () {
62 notify 2 "+++ $*";
63 set +e; nice "$@"; rc=$?; set -e
64 }
65 run () { run_setrc "$@"; case $rc in 0) ;; *) fail "$1: exit $rc" ;; esac; }
66
67 case $archive in
68 *:*) archhost=${archive%%:*} archpath=${archive#*:} ;;
69 *) unset archhost; archpath=$archive ;;
70 esac
71
72 archdo () {
73 op=$1; shift
74 case ${archhost+t} in
75 t)
76 qq=
77 for a in "$@"; do
78 qq="${qq:+$qq }'${a//\'/"'\\''"}'" #" # emacs is confused
79 done
80 "$op" ssh "$archhost" "$qq"
81 ;;
82 *)
83 "$op" "$@"
84 ;;
85 esac
86 }
87 archrun () { archdo run "$@"; }
88
89 check () {
90 while :; do
91 any=nil
92 for i in "$tmp"/*; do
93 if [ -f "$i/dest" ]; then
94 read dest <"$i/dest"; any=t
95 mv "$i/dest" "$i/dest.seen"
96 (info "copy $i/iso -> $dest"
97 case $dest in
98 */*) dir=${dest%/*} ;;
99 *) dir= ;;
100 esac
101 archrun mkdir -p "$archpath${dir:+/$dir}"
102 run rsync -svPSW "$i/iso" "$archive/$dest"
103 run rm -rf "$i") || :
104 fi
105 done
106 case $any in nil) break ;; esac
107 done
108 }
109
110 case $listen in
111 nil)
112 check
113 ;;
114 t)
115 rm -f "$tmp/upload.newpipe"
116 mkfifo "$tmp/upload.newpipe"
117 mv "$tmp/upload.newpipe" "$tmp/upload.wakeup"
118 while read line <&3; do
119 case $line in
120 check) check ;;
121 quit) info "quitting on user request"; break ;;
122 *) warn "unknown command \`$line'" ;;
123 esac
124 done 3<>"$tmp/upload.wakeup"
125 rm -f "$tmp/upload.wakeup" "$tmp/upload.lock"
126 ;;
127 esac