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