autoshare/modules/archive.sh
2024-11-09 07:04:40 +00:00

68 lines
1.4 KiB
Bash
Executable file

#!/bin/bash
# This script packs a file or directory into a 7z archive with the given password.
# It can (optionally) split the archives into volumes of a fixed size in megabytes.
archive_dir="$(dirname "$0")/../archives"
input_file="${1}"
archive_pwd="${2}"
size="$3"
cleanup() {
[[ -n "$archive" ]] && rm -f "$archive*"
echo "Cleaned up all $archive files" >&2
}
check_dependencies() {
if ! mkdir -p "$archive_dir"; then
echo "ERROR: Unable to create archive directory"
exit 1
fi
if ! command -v 7z 2>&1 >/dev/null; then
echo "ERROR: 7z must be installed"
exit 1
fi
}
check_input() {
if [[ ! -e "${input_file}" ]]; then
echo "ERROR: Input file '${input_file}' does not exist"
exit 2
fi
echo "Archiving file/directory '${input_file}'" >&2
}
set_volumes() {
volumes=
if [[ "$size" =~ ^[1-9][0-9]*$ ]]; then
volumes="-v${size}m"
elif [[ -n "$size" ]]; then
echo "Invalid size $size, must be a number"
exit 2
fi
echo "Volumes set to '$volumes'" >&2
}
generate_name() {
archive="$archive_dir/$(base64 /dev/urandom | tr -dc [:alnum:] | head -c 20).7z"
echo "Generated archive name $archive" >&2
}
create_archive() {
echo "Packing ${input_file} into archive $archive with password ${archive_pwd}"
[[ -n "$volumes" ]] && echo "and volumes of size $size MB"
7z a -mhe=on "-p${archive_pwd}" "$volumes" "$archive" "${input_file}" >&2
}
trap cleanup 1 2 3 6
check_dependencies
check_input
set_volumes
generate_name
create_archive