154 lines
4.7 KiB
Bash
154 lines
4.7 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
# shellcheck disable=SC2155
|
|
readonly PROGNAME=$(basename "${0}")
|
|
# shellcheck disable=SC2155
|
|
readonly PROGDIR=$(readlink -m "$(dirname "${0}")")
|
|
# shellcheck disable=SC2124
|
|
readonly ARGS=$@
|
|
|
|
# Change this to wherever you install the libraries
|
|
readonly LIBDIR="/usr/local/lib/evobackup"
|
|
|
|
source "${LIBDIR}/main.sh"
|
|
|
|
show_version() {
|
|
cat <<END
|
|
${PROGNAME} version ${VERSION}
|
|
|
|
Copyright 2024 Evolix <info@evolix.fr>,
|
|
Jérémy Lecour <jlecour@evolix.fr>.
|
|
|
|
${PROGNAME} comes with ABSOLUTELY NO WARRANTY. This is free software,
|
|
and you are welcome to redistribute it under certain conditions.
|
|
See the GNU General Public License v3.0 for details.
|
|
END
|
|
}
|
|
show_help() {
|
|
cat <<END
|
|
${PROGNAME} helps managing evobackup scripts
|
|
|
|
Options
|
|
-h, --help print this message and exit
|
|
-V, --version print version and exit
|
|
--jail-init-commands print jail init commands
|
|
--copy-template=PATH copy the backup template to PATH
|
|
END
|
|
}
|
|
|
|
jail_init_commands() {
|
|
if [ ! -f /root/.ssh/id_ed25519.pub ]; then
|
|
ssh-keygen -t ed25519 -f /root/.ssh/id_ed25519 -N ''
|
|
echo ""
|
|
fi
|
|
|
|
SSH_KEY=$(cat /root/.ssh/id_ed25519.pub)
|
|
SERVER_NAME=$(hostname -s)
|
|
if [ "$(uname -s)" = "OpenBSD" ]; then
|
|
SERVER_IP=$(ifconfig egress | grep "inet " | head -1 | awk '{ print $2}')
|
|
else
|
|
SERVER_IP=$(curl -4 https://ifconfig.me 2> /dev/null || hostname -I | awk '{ print $1}')
|
|
fi
|
|
|
|
echo "Copy-paste those lines on backup server(s) :"
|
|
echo "----------"
|
|
echo "SERVER_NAME=${SERVER_NAME}"
|
|
echo "SERVER_IP=${SERVER_IP}"
|
|
echo "echo '${SSH_KEY}' > /root/\${SERVER_NAME}.pub"
|
|
echo "bkctld init \${SERVER_NAME}"
|
|
echo "bkctld key \${SERVER_NAME} /root/\${SERVER_NAME}.pub"
|
|
echo "bkctld ip \${SERVER_NAME} \${SERVER_IP}"
|
|
echo "bkctld start \${SERVER_NAME}"
|
|
echo "bkctld status \${SERVER_NAME}"
|
|
echo "grep --quiet --extended-regexp \"^\\s?NODE=\" /etc/default/bkctld && bkctld sync \${SERVER_NAME}"
|
|
echo "----------"
|
|
}
|
|
|
|
copy_template() {
|
|
dest_path=${1}
|
|
dest_dir="$(dirname "${dest_path}")"
|
|
|
|
if [ -e "${dest_path}" ]; then
|
|
printf "Path for new evobackup script '%s' already exists.\n" "${dest_path}" >&2
|
|
exit 1
|
|
elif [ ! -e "${dest_dir}" ]; then
|
|
printf "Parent directory '%s' doesn't exist. Create it first.\n" "${dest_dir}" >&2
|
|
exit 1
|
|
else
|
|
if cp "${LIBDIR}/zzz_evobackup.sh" "${dest_path}"; then
|
|
chmod 750 "${dest_path}"
|
|
|
|
sed -i "s|@COMMAND@|${PROGDIR}/${PROGNAME} ${ARGS}|" "${dest_path}"
|
|
sed -i "s|@DATE@|$(date --iso-8601=seconds)|" "${dest_path}"
|
|
sed -i "s|@VERSION@|${VERSION}|" "${dest_path}"
|
|
|
|
printf "New evobackup script has been saved to '%s'.\n" "${dest_path}"
|
|
printf "Remember to customize it (mail notifications, backup servers…).\n"
|
|
exit 0
|
|
fi
|
|
fi
|
|
}
|
|
|
|
main() {
|
|
# If no argument is provided, print help and exit
|
|
# shellcheck disable=SC2086
|
|
if [ -z "${ARGS}" ]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
# Parse options, based on https://gist.github.com/deshion/10d3cb5f88a21671e17a
|
|
while :; do
|
|
case ${1:-''} in
|
|
-V|--version)
|
|
show_version
|
|
exit 0
|
|
;;
|
|
-h|--help)
|
|
show_help
|
|
exit 0
|
|
;;
|
|
--jail-init-commands)
|
|
jail_init_commands
|
|
exit 0
|
|
;;
|
|
--copy-template)
|
|
# copy-template option, with value separated by space
|
|
if [ -n "$2" ]; then
|
|
copy_template "${2}"
|
|
shift
|
|
else
|
|
printf "'%s' requires a non-empty option argument.\n" "--copy-template" >&2
|
|
exit 1
|
|
fi
|
|
;;
|
|
--copy-template=?*)
|
|
# copy-template option, with value separated by =
|
|
copy_template "${1#*=}"
|
|
;;
|
|
--copy-template=)
|
|
# copy-template option, without value
|
|
printf "'%s' requires a non-empty option argument.\n" "--copy-template" >&2
|
|
exit 1
|
|
;;
|
|
--)
|
|
# End of all options.
|
|
shift
|
|
break
|
|
;;
|
|
-?*|[[:alnum:]]*)
|
|
# ignore unknown options
|
|
printf "unknown option '%s'.\n" "${1}" >&2
|
|
exit 1
|
|
;;
|
|
*)
|
|
# Default case: If no more options then break out of the loop.
|
|
break
|
|
;;
|
|
esac
|
|
|
|
shift
|
|
done
|
|
}
|
|
|
|
main ${ARGS}
|