diff --git a/src/boring-backup b/src/boring-backup index 9eb1ed4..6512a78 100755 --- a/src/boring-backup +++ b/src/boring-backup @@ -202,20 +202,21 @@ for script in "${__args[@]}"; do # Increase iterator ((__i++)) || true - # Unset on_error function to prevent misuse + # Unset functions and variables to prevent misuse unset on_error + unset backups # Unset user defined variables - unset backups unset compression unset name_prefix unset name_date_format + unset s3cmd_options + unset s3cmd_config unset s3_access_key unset s3_secret_key - unset s3_access_token - unset s3_endpoint unset s3_region - unset s3cmd_config + unset s3_host + unset s3_host_bucket unset tar_options unset tar_exclude unset mysqldump_options diff --git a/src/lib/backup.sh b/src/lib/backup.sh index 463d2dc..dc52243 100644 --- a/src/lib/backup.sh +++ b/src/lib/backup.sh @@ -70,7 +70,7 @@ process_target() { ftp) handler='tgt_ftp';; sftp) handler='tgt_sftp';; rsync) handler='tgt_rsync';; - s3) handler='tgt_s3';; + s3) handler='tgt_s3cmd';; sj) handler='tgt_sj';; swift) handler='tgt_swift';; dav) handler='tgt_dav';; diff --git a/src/lib/handlers/targets/s3cmd.sh b/src/lib/handlers/targets/s3cmd.sh new file mode 100644 index 0000000..2be2cbd --- /dev/null +++ b/src/lib/handlers/targets/s3cmd.sh @@ -0,0 +1,83 @@ +#!/usr/bin/env bash + +# s3cmd.sh - upload files to S3 compatible object storage. +# Copyright (c) 2022 ge +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +tgt_s3cmd() { + # Upload files location from __main_target_path to object storage + # using s3cmd(1). Handle 's3' URI scheme. + # + # Usage: tgt_s3cmd URI + + log "Run handler ${FUNCNAME[0]}()" + + local uri + local src_path + + uri="$1" + + if [[ "${uri%%:*}" != 's3' ]]; then + log -p "Error: Wrong URI scheme: ${uri%%:*}" >&2; exit 1 + fi + + is_installed s3cmd + + if [[ "${uri: -1}" != '/' ]]; then + uri="$uri/" # Add trailing slash + fi + + s3cmd_options="${s3cmd_options:---preserve --quiet --no-progress}" + + # Set s3cmd comand. See s3cmd(1) + if [ -n "$s3cmd_config" ]; then + # Use configuration file + # shellcheck disable=SC2154 + set -- s3cmd $s3cmd_options --config "$s3cmd_config" \ + put "${backups[@]}" "$uri" + elif [ -n "$s3_access_key" ] && \ + [ -n "$s3_secret_key" ] && \ + [ -n "$s3_host" ] && \ + [ -n "$s3_host_bucket" ] + then + s3_region="${s3_region:-na}" # fallback to 'no available' region + # Use parameters provided from backup script + # shellcheck disable=SC2154 + set -- s3cmd $s3cmd_options \ + --access_key="$s3_access_key" \ + --secret_key="$s3_secret_key" \ + --region="$s3_region" \ + --host="$s3_host" \ + --host-bucket="$s3_host_bucket" \ + put "${backups[@]}" "$uri" + else + # Exit if no configuration + log -p "Error: Bad s3cmd credentials."\ + "See boring-backup(1) for details" >&2 + exit 1 + fi + + echo "Run command: $*" | + sed -E 's/--secret_key=[a-zA-Z0-9]+ /--secret_key=xxx /' | log + # ^^^ hide secret_key from output ^^^ + + # Upload backups + if "$@" 2>> "$__log_file"; then + : # Success + else + handle_error \ + "Error: Something went wrong when executing command:\n\t$*" + fi +} diff --git a/src/lib/lib.sh b/src/lib/lib.sh index e8e3ed2..3d63d85 100644 --- a/src/lib/lib.sh +++ b/src/lib/lib.sh @@ -27,6 +27,7 @@ LIBRARY="${LIBRARY:-./lib}" . "$LIBRARY/handlers/sources/mysqldump.sh" . "$LIBRARY/handlers/sources/pg_dump.sh" . "$LIBRARY/handlers/targets/cp.sh" +. "$LIBRARY/handlers/targets/s3cmd.sh" if [ -f "$LIBRARY/extra.sh" ]; then . "$LIBRARY/extra.sh"