Files
2024-10-30 01:50:38 +01:00

84 lines
2.5 KiB
Bash

#!/bin/sh
# Copyright (c) 2017 Markus Weippert
# GNU General Public License v3.0 (see https://www.gnu.org/licenses/gpl-3.0.txt)
PARAMS="
backup/bool
dest/str/r
directory_mode/str
force=thirsty/bool//true
original_basename=_original_basename/str
src/str
validate/str
$FILE_PARAMS
"
RESPONSE_VARS="src dest md5sum=md5sum_src checksum backup_file"
init() {
md5sum_src=""
checksum=""
backup_file=""
}
main() {
local tmp _IFS
[ -e "$src" ] || fail "Source $src not found"
[ -r "$src" ] || fail "Source $src not readable"
[ ! -d "$src" ] || fail "Remote copy does not support recursive copy of directory: $src"
checksum_src="$(dgst sha1 "$src")" || :
md5sum_src="$(md5 "$src")"
md5sum_dest=""
[ -z "$original_basename" -o "${dest%/}" = "$dest" ] || {
dest="$dest/$original_basename"
tmp="$(dirname -- "$dest")"
[ -d "$tmp" ] || {
_IFS="$IFS"; IFS="/"; set -- $tmp; IFS="$_IFS"
tmp="$mode"; mode="$directory_mode"
local d
local p=""
for d; do
[ -n "$d" ] || continue
p="$p/$d"
[ ! -d "$p" ] || continue
try mkdir "$p"
set_file_attributes "$p"
done
mode="$tmp"
}
}
[ ! -d "$dest" ] || {
dest="${dest%/}"
[ -z "$original_basename" ] &&
dest="$dest/$(basename -- "$src")" ||
dest="$dest/$original_basename"
}
tmp="$(dirname -- "$dest")"
[ -e "$dest" ] && {
[ ! -h "$dest" -o -z "$follow" ] || dest="$(realpath "$dest")"
[ -n "$force" ] || fail "file already exists"
[ ! -r "$dest" ] || md5sum_dest="$(md5 "$dest")"
} || [ -d "$tmp" ] || fail "Destination directory $tmp does not exist"
[ -w "$tmp" ] || fail "Destination $tmp not writeable"
[ "$md5sum_src" = "$md5sum_dest" -a ! -h "$dest" ] || {
[ -n "$_ansible_check_mode" ] || {
[ -z "$backup" ] || backup_file="$(backup_local "$dest")"
[ ! -h "$dest" ] || { rm -f -- "$dest"; touch -- "$dest"; }
[ -z "$validate" ] || {
[ "${validate/%s/}" != "$validate" ] ||
fail "validate must contain %s: $validate"
tmp="$($(printf "$validate" "$src") 2>&1)" ||
fail "failed to validate: $tmp"
}
try 'cat -- "$src" > "$dest"'
}
changed
}
[ -n "$_ansible_check_mode" ] || set_file_attributes "$dest"
}