]> woffs.de Git - fd/haskell-amqp-utils.git/blob - callback
formatting
[fd/haskell-amqp-utils.git] / callback
1 #!/bin/bash
2 set -o pipefail
3 declare -A h # header array
4 # default (empty) action, to be overridden in config
5 action () {
6   :
7 }
8 wrap () {
9   local IFS=
10   "$@" | while read l
11   do
12     echo "$n $l"
13   done
14 }
15 setheader () {
16   local IFS==
17   set $1
18   h[$1]=$2
19 }
20 checktimeout () {
21   if [ $(date +%s) -gt $toolate ]
22   then
23     exit 1
24   fi
25 }
26 delay () {
27   sleep 2
28 }
29 checkshaandmoveorexit () {
30   sha=$1
31   src=$2
32   dst=$3
33   if [ "$sha" ] && sha1=$(sha1sum "$src" | awk '{print$1}')
34   then
35     if [ "$sha1" = "$sha" ]
36     then
37       echo "$n $src sha1 ok"
38       wrap mv -v "$src" "$dst"
39       wrap action "$dst"
40       exit
41     else
42       echo "$n $src sha1 FALSCH"
43       # keine action, aber ACK
44       exit 0
45     fi
46   else
47     # keine sha, auch gut
48     wrap mv -v "$src" "$dst"
49     wrap action "$dst"
50     exit
51   fi
52 }
53 while [ "x$1" != x ]
54 do
55   case $1 in
56     -f) f=$2;shift ;; # filename
57     -m) m=$2;shift ;; # mime type
58     -h) setheader "$2";shift ;; # headers
59     -n) n=$2;shift ;; # seq number
60     -r) r=$2;shift ;; # routing key
61     -d) dest=$2;shift ;; # file destination dir
62     -c) . $2 || exit;shift ;; # config snippet
63     -p) prio=$2;shift ;; # priority
64     -t) t=$2;shift ;; # timestamp
65     -R) redeliv=$2;shift ;; # redelivered message
66   esac
67   shift
68 done
69 trap "rm -f -- \"$f\"" 0 1 2 3 15
70 if [ "${h[chunkSize]}" -a "${h[fileSize]}" ]
71 then
72   : ${maxwait:=20}
73   : ${dest:=/tmp/files}
74   : ${temp:=$dest/.tmp}
75   mkdir -p $dest
76   mkdir -p $temp
77   begin=$(date +%s)
78   toolate=$((begin+maxwait))
79   if [ "${h[chunkSize]}" = "${h[fileSize]}" ]
80   then
81     # einteilig
82     wrap cp -v "$f" "$temp/${h[fileName]}"
83     checkshaandmoveorexit "${h[sha1]}" "$temp/${h[fileName]}" "$dest/${h[fileName]}"
84   elif [ "${h[chunkIndex]}" ]
85   then
86     # mehrteilig
87     wrap cp -v "$f" "$temp/${h[fileName]}.part${h[chunkIndex]}"
88     if [ "${h[chunkCount]}" = "${h[chunkIndex]}" ]
89     then
90       # letzter Teil
91       # 
92       until checktimeout; [ -f "$temp/${h[fileName]}.part" ]
93       do
94         for i in `seq 1 ${h[chunkCount]}`
95         do
96           if ! [ -f "$temp/${h[fileName]}.part$i" ]
97           then
98             # einer fehlt. versuch beenden. warten bis der da ist. nochmal probieren.
99             rm -f "$temp/${h[fileName]}.part"
100             delay
101             break
102           fi
103           # ls -l "$temp/${h[fileName]}.part$i"
104           cat "$temp/${h[fileName]}.part$i" >> "$temp/${h[fileName]}.part"
105         done
106       done
107       # warten, bis die Prozesse der anderen Teile sich beendet und ihre
108       # Datei entfernt haben und keine *.part* mehr da sind
109       wrap mv -v "$temp/${h[fileName]}.part" "$temp/${h[fileName]}"
110       rm -f -- "$temp/${h[fileName]}.part${h[chunkIndex]}"
111       until checktimeout; [ "$(echo "$temp/${h[fileName]}.part"*)" = "$temp/${h[fileName]}.part*" ]
112       do
113         delay
114       done
115       checkshaandmoveorexit "${h[sha1]}" "$temp/${h[fileName]}" "$dest/${h[fileName]}"
116     else
117       # nicht letzter Teil
118       # erst ACKen, wenn alle Teile da sind und zusammengesetzt sind.
119       until checktimeout; [ -f "$temp/${h[fileName]}" ]
120       do
121         delay
122       done
123       rm -f -- "$temp/${h[fileName]}.part${h[chunkIndex]}"
124     fi
125   fi
126 else
127   # keine headerdaten, normal!
128   wrap action "$f"
129   exit
130 fi
131
132 exit 0