#!/bin/bash # SPDX-FileCopyrightText: 2022 Frank Doepper # # SPDX-License-Identifier: GPL-3.0-only set -o pipefail declare -A h # header array # default (empty) action, to be overridden in config action () { : } wrap () { local IFS= "$@" | while read l do echo "$n $l" done } setheader () { local IFS== set $1 h[$1]=$2 } checktimeout () { if [ $(date +%s) -gt $toolate ] then exit 1 fi } delay () { sleep 2 } checkshaandmoveorexit () { sha=$1 src=$2 dst=$3 if [ "$sha" ] && sha1=$(sha1sum "$src" | awk '{print$1}') then if [ "$sha1" = "$sha" ] then echo "$n $src sha1 ok" wrap mv -v "$src" "$dst" wrap action "$dst" exit else echo "$n $src sha1 FALSCH" # keine action, aber ACK exit 0 fi else # keine sha, auch gut wrap mv -v "$src" "$dst" wrap action "$dst" exit fi } while [ "x$1" != x ] do case $1 in -f) f=$2;shift ;; # filename -m) m=$2;shift ;; # mime type -h) setheader "$2";shift ;; # headers -n) n=$2;shift ;; # seq number -r) r=$2;shift ;; # routing key -d) dest=$2;shift ;; # file destination dir -c) . $2 || exit;shift ;; # config snippet -p) prio=$2;shift ;; # priority -t) t=$2;shift ;; # timestamp -R) redeliv=$2;shift ;; # redelivered message esac shift done trap "rm -f -- \"$f\"" 0 1 2 3 15 if [ "${h[chunkSize]}" -a "${h[fileSize]}" ] then : ${maxwait:=20} : ${dest:=/tmp/files} : ${temp:=$dest/.tmp} mkdir -p $dest mkdir -p $temp begin=$(date +%s) toolate=$((begin+maxwait)) if [ "${h[chunkSize]}" = "${h[fileSize]}" ] then # einteilig wrap cp -v "$f" "$temp/${h[fileName]}" checkshaandmoveorexit "${h[sha1]}" "$temp/${h[fileName]}" "$dest/${h[fileName]}" elif [ "${h[chunkIndex]}" ] then # mehrteilig wrap cp -v "$f" "$temp/${h[fileName]}.part${h[chunkIndex]}" if [ "${h[chunkCount]}" = "${h[chunkIndex]}" ] then # letzter Teil # until checktimeout; [ -f "$temp/${h[fileName]}.part" ] do for i in `seq 1 ${h[chunkCount]}` do if ! [ -f "$temp/${h[fileName]}.part$i" ] then # einer fehlt. versuch beenden. warten bis der da ist. nochmal probieren. rm -f "$temp/${h[fileName]}.part" delay break fi # ls -l "$temp/${h[fileName]}.part$i" cat "$temp/${h[fileName]}.part$i" >> "$temp/${h[fileName]}.part" done done # warten, bis die Prozesse der anderen Teile sich beendet und ihre # Datei entfernt haben und keine *.part* mehr da sind wrap mv -v "$temp/${h[fileName]}.part" "$temp/${h[fileName]}" rm -f -- "$temp/${h[fileName]}.part${h[chunkIndex]}" until checktimeout; [ "$(echo "$temp/${h[fileName]}.part"*)" = "$temp/${h[fileName]}.part*" ] do delay done checkshaandmoveorexit "${h[sha1]}" "$temp/${h[fileName]}" "$dest/${h[fileName]}" else # nicht letzter Teil # erst ACKen, wenn alle Teile da sind und zusammengesetzt sind. until checktimeout; [ -f "$temp/${h[fileName]}" ] do delay done rm -f -- "$temp/${h[fileName]}.part${h[chunkIndex]}" fi fi else # keine headerdaten, normal! wrap action "$f" exit fi exit 0