#!/usr/bin/env sh INPUT_PATH= CONFIG_PATH= HOSTNAME= PORT= USER= IDENTITY= HOSTKEY= save_input() { input_file="$(mktemp -tp /tmp)" cat > "$input_file" <&0 echo "$input_file" return 0 } read_config() { HOSTNAME="$(jq -r .source.hostname < "$1")" PORT="$(jq -r '.source.port // "22"' < "$1")" USER="$(jq -r .source.user < "$1")" IDENTITY="$(jq -r .source.identity < "$1")" HOSTKEY="$(jq -r .source.hostkey < "$1")" return 0 } write_config() { directory="$(mktemp -dp /tmp)" config="$directory/config" identity_file="$directory/identity" knownhosts_file="$directory/knownhosts" { echo "host $HOSTNAME" echo " HostName $HOSTNAME" echo " Port $PORT" echo " User $USER" echo " IdentityFile $identity_file" echo " UserKnownHostsFile $knownhosts_file" } > "$config" echo "$IDENTITY" > "$identity_file" echo "$HOSTKEY" > "$knownhosts_file" chmod 600 "$identity_file" "$knownhosts_file" "$config" echo "$config" return 0 } INPUT_PATH="$(save_input)" read_config "$INPUT_PATH" CONFIG_PATH="$(write_config)" export INPUT_PATH export CONFIG_PATH get_version() { jq -r '.version // []' < "$INPUT_PATH" } get_files() { jq -r '.source.files?[]' < "$INPUT_PATH" } get_command() { jq -r '.params.command?' < "$INPUT_PATH" } get_directory() { jq -r '.params.directory // "/"' < "$INPUT_PATH" } get_workdir() { jq -r '.params.workdir // "$HOME"' < "$INPUT_PATH" } fetch_file_infos() { files_file="$(mktemp -tp /tmp)" ssh -F "$CONFIG_PATH" "$HOSTNAME" sh -s << EOF > "$files_file" files="$("$1")" echo "\$files" | while read -r file; do echo "\$file" [ -e "\$file" ] && echo true || echo false [ -e "\$file" ] && echo "\$(stat --format=%Y "\$file")" || echo done EOF echo "$files_file" return 0 } _compute_version() { echo "[" last_line= line_file= line_exists= line_modify= while read -r line; do if [ -z "$line_file" ]; then line_file="$line" elif [ -z "$line_exists" ]; then line_exists="$line" elif [ -z "$line_modify" ]; then line_modify="$line" else if "$line_exists"; then echo '{"path":' "\"$line_file\"," '"modify":' "$line_modify" '}', fi line_file="$line" line_exists= line_modify= fi done < "$1" if [ -n "$line_file" ] && [ -n "$line_exists" ] && [ -n "$line_modify" ] && "$line_exists"; then echo '{"path":' "\"$line_file\"," '"modify":' "$line_modify" '}' fi echo "]" } compute_version() { _compute_version "$@" | jq -r tostring }