chiark / gitweb /
dvdrip-retry-botched-vobs: Retry using the newly determined block list.
[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