Compare commits
18 Commits
595ce80230
...
main
Author | SHA1 | Date | |
---|---|---|---|
23bd6ffc12 | |||
dc8a847990 | |||
079fd850e6 | |||
70bcd54cea | |||
c4b330c23c | |||
d2271af621 | |||
06217a3b93 | |||
abb4f675e0 | |||
b2d543a290 | |||
a5a53298b2 | |||
f3b0bcd7bb | |||
20e9b3b8d4 | |||
dd072f69af | |||
3b1dd2d30f | |||
20355bacae | |||
b7ae3ac2c0 | |||
2e66132717 | |||
c7c028abfc |
@ -210,6 +210,10 @@ DEFAULT_BORG_RSH='ssh -i /root/.ssh/id_ed25519-borg-backup'
|
||||
|
||||
DEFAULT_NC_DB_BACKUP_DIR="/data/backup/sql"
|
||||
|
||||
DEFAULT_MYSQL_CREDENTIALS="-u root -S /run/mysqld/mysqld.sock"
|
||||
DEFAULT_MYSQL_PERFORMANCE_SETTINGS=false
|
||||
DEFAULT_MYSQL_MAX_ALLOWED_PACKET="512M"
|
||||
|
||||
DEFAULT_BACKUP_OTHER_DIRECTORIES="/etc /home /root /var/spool/cron"
|
||||
|
||||
DEFAULT_KEEP_DAILY=10
|
||||
@ -233,15 +237,18 @@ else
|
||||
fatal "No configuration file '$conf_file' present!"
|
||||
fi
|
||||
|
||||
[[ -z "${ADMIN_EMAIL}" ]] && ADMIN_EMAIL="${DEFAULT_ADMIN_EMAIL}"
|
||||
[[ -z "${COMPANY}" ]] && COMPANY="${DEFAULT_COMPANY}"
|
||||
[[ -z "${FROM_ADDRESS}" ]] && FROM_ADDRESS="${DEFAULT_FROM_ADDRESS}"
|
||||
|
||||
[[ -z "${MYSQL_CREDENTIALS}" ]] && MYSQL_CREDENTIALS="${DEFAULT_MYSQL_CREDENTIALS}"
|
||||
[[ -z "${MYSQL_PERFORMANCE_SETTINGS}" ]] && MYSQL_PERFORMANCE_SETTINGS=${DEFAULT_MYSQL_PERFORMANCE_SETTINGS}
|
||||
[[ -z "$MYSQL_MAX_ALLOWED_PACKET" ]] && MYSQL_MAX_ALLOWED_PACKET="${DEFAULT_MYSQL_MAX_ALLOWED_PACKET}"
|
||||
|
||||
# -------------
|
||||
# - Job is already running?
|
||||
# -------------
|
||||
|
||||
[[ -z "${ADMIN_EMAIL}" ]] && ADMIN_EMAIL="${DEFAULT_ADMIN_EMAIL}"
|
||||
[[ -z "${COMPANY}" ]] && COMPANY="${DEFAULT_COMPANY}"
|
||||
[[ -z "${FROM_ADDRESS}" ]] && FROM_ADDRESS="${DEFAULT_FROM_ADDRESS}"
|
||||
|
||||
# - If job already runs, stop execution..
|
||||
# -
|
||||
if mkdir "$LOCK_DIR" 2> /dev/null ; then
|
||||
@ -541,23 +548,143 @@ fi
|
||||
blank_line
|
||||
|
||||
|
||||
if ${MYSQL_PERFORMANCE_SETTINGS}; then
|
||||
|
||||
# - GET current (global) Autocommit value
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mautocommit\033[m"
|
||||
CUR_AUTOCOMMIT="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'autocommit'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'foreign_key_checks'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mforeign_key_checks\033[m"
|
||||
CUR_FOREIGN_KEY_CHECKS="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'foreign_key_checks'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'unique_checks'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1munique_checks\033[m"
|
||||
CUR_UNIQUE_CHECKS="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'unique_checks'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'innodb_flush_log_at_trx_commit'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1minnodb_flush_log_at_trx_commit\033[m"
|
||||
CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'max_allowed_packet'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mmax_allowed_packet\033[m"
|
||||
CUR_MAX_ALLOWED_PACKET="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echononl "Set Autocommit to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL autocommit='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set foreign_key_checks to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL foreign_key_checks='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set unique_checks to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL unique_checks='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set innodb_flush_log_at_trx_commit to 2"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=2" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set max_allowed_packet to 1G"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL max_allowed_packet=1073741824" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# Create database backup
|
||||
#
|
||||
echononl "Create database backup .."
|
||||
|
||||
cat << EOF >> ${BORG_LOG_FILE}
|
||||
mysqldump --single-transaction --routines \\
|
||||
-h localhost \\
|
||||
-u${NC_DB_USER} \\
|
||||
-p${NC_DB_PASS} \\
|
||||
-e ${NC_DB} > ${NC_DB_BACKUP_DIR}/${NC_DB}-${backup_date}.sql
|
||||
mysqldump ${MYSQL_CREDENTIALS} \\
|
||||
--single-transaction \\
|
||||
--max-allowed-packet=${MYSQL_MAX_ALLOWED_PACKET} \\
|
||||
--routines \\
|
||||
--triggers \\
|
||||
--quick \\
|
||||
--extended-insert ${NC_DB} > ${NC_DB_BACKUP_DIR}/${NC_DB}-${backup_date}.sql
|
||||
EOF
|
||||
|
||||
mysqldump --single-transaction --routines \
|
||||
-h localhost \
|
||||
-u${NC_DB_USER} \
|
||||
-p${NC_DB_PASS} \
|
||||
-e ${NC_DB} > ${NC_DB_BACKUP_DIR}/${NC_DB}-${backup_date}.sql 2> ${log_file}
|
||||
mysqldump ${MYSQL_CREDENTIALS} \
|
||||
--single-transaction \
|
||||
--max-allowed-packet=${MYSQL_MAX_ALLOWED_PACKET} \
|
||||
--routines \
|
||||
--triggers \
|
||||
--quick \
|
||||
--extended-insert ${NC_DB} > ${NC_DB_BACKUP_DIR}/${NC_DB}-${backup_date}.sql 2> ${log_file}
|
||||
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
@ -566,54 +693,125 @@ else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
if ${MYSQL_PERFORMANCE_SETTINGS}; then
|
||||
|
||||
echononl "Set Autocommit to $CUR_AUTOCOMMIT"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL autocommit='$CUR_AUTOCOMMIT'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_AUTOCOMMIT=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set foreign_key_checks to $CUR_FOREIGN_KEY_CHECKS"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL foreign_key_checks='$CUR_FOREIGN_KEY_CHECKS'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_FOREIGN_KEY_CHECKS=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set unique_checks to $CUR_UNIQUE_CHECKS"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL unique_checks='$CUR_UNIQUE_CHECKS'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_UNIQUE_CHECKS=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set innodb_flush_log_at_trx_commit to $CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set max_allowed_packet to $CUR_MAX_ALLOWED_PACKET"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL max_allowed_packet=$CUR_MAX_ALLOWED_PACKET" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_MAX_ALLOWED_PACKET=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
fi
|
||||
|
||||
|
||||
echononl "Create borg backup.."
|
||||
|
||||
cat << EOF >> ${BORG_LOG_FILE}
|
||||
borg2 \\
|
||||
--remote-path borg2 \\
|
||||
--repo ${BORG_URL} \\
|
||||
create \\
|
||||
--verbose \\
|
||||
--filter AME \\
|
||||
--list \\
|
||||
--stats \\
|
||||
--show-rc \\
|
||||
--compression lz4 \\
|
||||
--exclude-caches \\
|
||||
--exclude 'home/*/.cache/*' \\
|
||||
--exclude '/root/.cache/*' \\
|
||||
--exclude '/root/.config/*' \\
|
||||
--exclude '/root/.local/*' \\
|
||||
--exclude 'var/tmp/*' \\
|
||||
${ARCHIVE_NAME} \\
|
||||
${NC_DB_BACKUP_DIR} \\
|
||||
${BORG_NC_PATH} \\
|
||||
${NC_DATA_DIR} \\
|
||||
borg2 \\
|
||||
--remote-path borg2 \\
|
||||
--repo ${BORG_URL} \\
|
||||
create \\
|
||||
--verbose \\
|
||||
--filter AME \\
|
||||
--list \\
|
||||
--stats \\
|
||||
--show-rc \\
|
||||
--compression lz4 \\
|
||||
--exclude-caches \\
|
||||
--exclude 'home/*/.cache/*' \\
|
||||
--exclude '/root/.cache/*' \\
|
||||
--exclude '/root/.config/*' \\
|
||||
--exclude '/root/.local/*' \\
|
||||
--exclude '**/tmp/*' \\
|
||||
--exclude '*.lock' \\
|
||||
--exclude '*.log' \\
|
||||
--exclude '*.log.[0-9]' \\
|
||||
--exclude '*.log.[0-9]*.gz' \\
|
||||
--exclude '**/sessions/*' \\
|
||||
--exclude '**/*.20[2-3][0-9]-[0-1][0-9]*' \\
|
||||
${ARCHIVE_NAME} \\
|
||||
${NC_DB_BACKUP_DIR} \\
|
||||
${BORG_NC_PATH} \\
|
||||
${NC_DATA_DIR} \\
|
||||
${BORG_BACKUP_DIRS}
|
||||
EOF
|
||||
|
||||
borg2 \
|
||||
--remote-path borg2 \
|
||||
--repo ${BORG_URL} \
|
||||
create \
|
||||
--verbose \
|
||||
--filter AME \
|
||||
--list \
|
||||
--stats \
|
||||
--show-rc \
|
||||
--compression lz4 \
|
||||
--exclude-caches \
|
||||
--exclude 'home/*/.cache/*' \
|
||||
--exclude '/root/.cache/*' \
|
||||
--exclude '/root/.config/*' \
|
||||
--exclude '/root/.local/*' \
|
||||
--exclude 'var/tmp/*' \
|
||||
${ARCHIVE_NAME} \
|
||||
${NC_DB_BACKUP_DIR} \
|
||||
${BORG_NC_PATH} \
|
||||
${NC_DATA_DIR} \
|
||||
${BORG_BACKUP_DIRS} \
|
||||
borg2 \
|
||||
--remote-path borg2 \
|
||||
--repo ${BORG_URL} \
|
||||
create \
|
||||
--verbose \
|
||||
--filter AME \
|
||||
--list \
|
||||
--stats \
|
||||
--show-rc \
|
||||
--compression lz4 \
|
||||
--exclude-caches \
|
||||
--exclude 'home/*/.cache/*' \
|
||||
--exclude '/root/.cache/*' \
|
||||
--exclude '/root/.config/*' \
|
||||
--exclude '/root/.local/*' \
|
||||
--exclude '**/tmp/*' \
|
||||
--exclude '*.lock' \
|
||||
--exclude '*.log' \
|
||||
--exclude '*.log.[0-9]' \
|
||||
--exclude '*.log.[0-9]*.gz' \
|
||||
--exclude '**/sessions/*' \
|
||||
--exclude '**/*.20[2-3][0-9]-[0-1][0-9]*' \
|
||||
${ARCHIVE_NAME} \
|
||||
${NC_DB_BACKUP_DIR} \
|
||||
${BORG_NC_PATH} \
|
||||
${NC_DATA_DIR} \
|
||||
${BORG_BACKUP_DIRS} \
|
||||
> ${log_file} 2>&1
|
||||
|
||||
|
||||
@ -732,48 +930,9 @@ durationReadable=$(printf "%02d hours %02d minutes %02d seconds" $durationHour $
|
||||
|
||||
echo -e "\n\n###### Server backup finished on ${endDateReadable} (${durationReadable}) ######\n" >> ${BORG_LOG_FILE}
|
||||
|
||||
|
||||
# Send Summery
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Summary.."
|
||||
fi
|
||||
|
||||
datum="$(date +"%d.%m.%Y %H:%M")"
|
||||
|
||||
filesystem_usage="$(df -h)"
|
||||
|
||||
msg_head_line="\n\n# ---\n# Server backup finished on ${endDateReadable} (${durationReadable})\n# ---\n\n"
|
||||
|
||||
msg="$(cat "${BORG_LOG_FILE}")"
|
||||
|
||||
datum="$(date +"%d.%m.%Y")"
|
||||
|
||||
content_type='Content-Type: text/plain;\n charset="utf-8"'
|
||||
|
||||
subject="Borg Backup - ${COMPANY} - ${datum}"
|
||||
subject_utf8="$(echo "$subject" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo $subject_utf8 | base64 --wrap=0)?="
|
||||
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n\${filesystem_usage}\n\${msg_head_line}\n\${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL}
|
||||
EOF
|
||||
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n${filesystem_usage}\n${msg_head_line}\n${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL} > ${log_file} 2>&1
|
||||
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
# Error Handling
|
||||
#
|
||||
declare -i error=$(grep -i -e"\[\s*ERROR" ${BORG_LOG_FILE} | wc -l)
|
||||
@ -781,25 +940,58 @@ declare -i warning=$(grep -i -e"\[\s*WARN" ${BORG_LOG_FILE} | wc -l)
|
||||
|
||||
if [ $error -gt 0 -o $warning -gt 0 ] ; then
|
||||
|
||||
# Send Summery
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Summary.."
|
||||
fi
|
||||
|
||||
datum="$(date +"%d.%m.%Y %H:%M")"
|
||||
|
||||
filesystem_usage="$(df -h)"
|
||||
|
||||
msg_head_line="\n\n# ---\n# Server backup finished on ${endDateReadable} (${durationReadable})\n# ---\n\n"
|
||||
|
||||
msg="$(cat "${BORG_LOG_FILE}")"
|
||||
|
||||
datum="$(date +"%d.%m.%Y")"
|
||||
|
||||
content_type='Content-Type: text/plain;\n charset="utf-8"'
|
||||
|
||||
subject="Borg Backup - ${COMPANY} - ${datum}"
|
||||
subject_utf8="$(echo "$subject" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo $subject_utf8 | base64 --wrap=0)?="
|
||||
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n${filesystem_usage}\n${msg_head_line}\n${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL} > ${log_file} 2>&1
|
||||
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
# Send Error Message
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Error Message to ${ADMIN_EMAIL}.."
|
||||
fi
|
||||
|
||||
host_name="$(hostname -f)"
|
||||
|
||||
err_msg="$(grep -A 2 -i -e"\[\s*ERROR" ${BORG_LOG_FILE})\n"
|
||||
warn_msg="$(grep -A 2 -i -e"\[\s*WARN" ${BORG_LOG_FILE})\n"
|
||||
|
||||
msg_top="Borg Backup Error ${COMPANY} vom ${datum}.\nBorg Backup on '${host_name}' beendet mit:"
|
||||
msg_top="Borg Backup Error ${COMPANY} vom ${datum}.\nBorg Backup on '$(hostname -f)' beendet mit:"
|
||||
msg_body_01="\t${error} Error(s)\n\t${warning} Warning(s)\n"
|
||||
msg_body_02="\n\n--- ERROR(S) ---\n${err_msg}\n\n--- WARNING(S) ...\n${warn_msg}"
|
||||
|
||||
msg="${msg_top}\n${msg_body_01}\n${msg_body_02}"
|
||||
|
||||
subject="Borg Backup Errors at ${host_name} -- ${datum}"
|
||||
#subject="Borg Backup Errors at ${host_name}"
|
||||
subject_utf8="$(echo "${subject}" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo ${subject_utf8} | base64 --wrap=0)?="
|
||||
|
||||
@ -836,6 +1028,7 @@ fi
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
echononl "Create temporary logorotate configuration file 'logrotate_borg.conf'.."
|
||||
|
||||
cat << EOF > ${LOCK_DIR}/logrotate_borg.conf 2> ${log_file}
|
||||
|
615
borg2-backup.sh
615
borg2-backup.sh
@ -140,6 +140,14 @@ echo_wait(){
|
||||
fi
|
||||
}
|
||||
|
||||
## - Check if a given array (parameter 2) contains a given string (parameter 1)
|
||||
## -
|
||||
containsElement () {
|
||||
local e
|
||||
for e in "${@:2}"; do [[ "$e" == "$1" ]] && return 0; done
|
||||
return 1
|
||||
}
|
||||
|
||||
trim() {
|
||||
local var="$*"
|
||||
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
||||
@ -166,20 +174,6 @@ else
|
||||
fi
|
||||
|
||||
|
||||
# ==========
|
||||
# - Begin Main Script
|
||||
# ==========
|
||||
|
||||
# ----------
|
||||
# - Headline
|
||||
# ----------
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# ==========
|
||||
# - Begin Main Script
|
||||
# ==========
|
||||
@ -200,7 +194,7 @@ fi
|
||||
# Default values
|
||||
# ----------
|
||||
|
||||
DEFAULT_BORG_LOG_DIR="/var/log/borg/"
|
||||
DEFAULT_BORG_LOG_DIR="/var/log/borg"
|
||||
|
||||
DEFAULT_SSH_USER="borg"
|
||||
DEFAULT_SSH_PORT=22
|
||||
@ -209,6 +203,7 @@ DEFAULT_BORG_RSH='ssh -i /root/.ssh/id_ed25519-borg-backup'
|
||||
DEFAULT_DB_BACKUP_DIR="/data/backup/sql"
|
||||
|
||||
DEFAULT_BACKUP_DIRECTORIES="/etc /home /root /var/spool/cron"
|
||||
MOUNT_NETDIR=false
|
||||
|
||||
DEFAULT_KEEP_DAILY=10
|
||||
DEFAULT_KEEP_WEEKLY=5
|
||||
@ -216,7 +211,9 @@ DEFAULT_KEEP_MONTHLY=6
|
||||
DEFAULT_KEEP_YEARLY=1
|
||||
|
||||
DEFAULT_DB_TYPE="None"
|
||||
|
||||
DEFAULT_MYSQL_CREDENTIALS="-u root -S /run/mysqld/mysqld.sock"
|
||||
DEFAULT_MYSQL_PERFORMANCE_SETTINGS=false
|
||||
|
||||
DEFAULT_PSQL_SYSTEM_USER="postgres"
|
||||
|
||||
@ -313,20 +310,36 @@ BORG_LOG_FILE="${BORG_LOG_DIR}/borg-backup.log"
|
||||
|
||||
if [[ -z "${DB_TYPE}" ]] ; then
|
||||
DB_TYPE="${DEFAULT_DB_TYPE}"
|
||||
elif [[ "${DB_TYPE,,}" = "mysql" ]] ; then
|
||||
else
|
||||
# replace comma by blank sign
|
||||
DB_TYPE=${DB_TYPE/,/ }
|
||||
fi
|
||||
|
||||
declare -a db_type_arr=()
|
||||
|
||||
for _db_type in ${DB_TYPE}; do
|
||||
if [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then
|
||||
db_type_arr+=("postgresql")
|
||||
else
|
||||
db_type_arr+=("${_db_type,,}")
|
||||
fi
|
||||
done
|
||||
|
||||
if containsElement "mysql" "${db_type_arr[@]}" ; then
|
||||
[[ -z "${MYSQL_CREDENTIALS}" ]] && MYSQL_CREDENTIALS="${DEFAULT_MYSQL_CREDENTIALS}"
|
||||
elif [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then
|
||||
[[ -z "${MYSQL_PERFORMANCE_SETTINGS}" ]] && MYSQL_PERFORMANCE_SETTINGS=${DEFAULT_MYSQL_PERFORMANCE_SETTINGS}
|
||||
fi
|
||||
|
||||
if containsElement "postgresql" "${db_type_arr[@]}" ; then
|
||||
[[ -z "${PSQL_SYSTEM_USER}" ]] && PSQL_SYSTEM_USER="${DEFAULT_PSQL_SYSTEM_USER}"
|
||||
elif [[ "${DB_TYPE,,}" = "none" ]] ; then
|
||||
DB_TYPE="None"
|
||||
else
|
||||
fatal "Unknown DB_TYPE '${DB_TYPE}'."
|
||||
fi
|
||||
|
||||
|
||||
|
||||
[[ -z "${BACKUP_DIRECTORIES}" ]] && BACKUP_DIRECTORIES="${DEFAULT_BACKUP_DIRECTORIES}"
|
||||
|
||||
[[ -n "${BACKUP_NET_DIRECTORIES}" ]] && MOUNT_NETDIR=true
|
||||
|
||||
# By default: Borg won't follow symlinks
|
||||
#
|
||||
BORG_BACKUP_DIRS=""
|
||||
@ -366,6 +379,37 @@ export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
export BORG_UNKNOWN_UNENCRYPTED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
|
||||
if $terminal ; then
|
||||
|
||||
echo ""
|
||||
echo -e " \033[1m----------\033[m"
|
||||
echo -e " \033[32mScript parameter settings:.. \033[m"
|
||||
echo -e " \033[1m----------\033[m"
|
||||
echo ""
|
||||
|
||||
|
||||
echo -e " BORG_HOST................: \033[33m${BORG_HOST}\033[m"
|
||||
echo -e " BORG_REPO................: \033[33m${BORG_REPO}\033[m"
|
||||
echo ""
|
||||
|
||||
echo -e " DB_TYPE(s)...............: \033[33m${DB_TYPE}\033[m"
|
||||
echo ""
|
||||
|
||||
|
||||
declare -i index=0
|
||||
for _dir in ${BACKUP_DIRECTORIES} ; do
|
||||
if [[ $index -lt 1 ]] ; then
|
||||
echo -e " BACKUP_DIRECTORIES.......: \033[33m${_dir}\033[m"
|
||||
else
|
||||
echo -e " \033[33m${_dir}\033[m"
|
||||
fi
|
||||
(( index++ ))
|
||||
done
|
||||
|
||||
|
||||
fi
|
||||
|
||||
|
||||
if [ ! -d "${BORG_LOG_DIR}" ]; then
|
||||
echononl "Create borg log directory.."
|
||||
mkdir -p "${BORG_LOG_DIR}" > ${log_file} 2>&1
|
||||
@ -424,16 +468,26 @@ echo "COMPANY=\"${COMPANY}\"" >> ${BORG_LOG_FILE}
|
||||
echo "FROM_ADDRESS=\"${FROM_ADDRESS}\"" >> ${BORG_LOG_FILE}
|
||||
echo "" >> ${BORG_LOG_FILE}
|
||||
|
||||
if [[ -n "${DB_TYPE}" ]] && [[ "${DB_TYPE,,}" = "!none" ]]; then
|
||||
if [[ -n "${DB_TYPE}" ]] && [[ ! "${DB_TYPE,,}" = "none" ]]; then
|
||||
echo "" >> ${BORG_LOG_FILE}
|
||||
echo "# ---" >> ${BORG_LOG_FILE}
|
||||
echo "# Create database backup .." >> ${BORG_LOG_FILE}
|
||||
echo "# ---" >> ${BORG_LOG_FILE}
|
||||
|
||||
blank_line
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mCreate (local) database backup(s).. \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
if [[ "${DB_TYPE,,}" = "mysql" ]] ; then
|
||||
if containsElement "mysql" "${db_type_arr[@]}" ; then
|
||||
|
||||
blank_line
|
||||
|
||||
echononl "Create an array of MySQL databases."
|
||||
|
||||
@ -470,22 +524,142 @@ EOF
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
if ${MYSQL_PERFORMANCE_SETTINGS} ; then
|
||||
|
||||
# - GET current (global) Autocommit value
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mautocommit\033[m"
|
||||
CUR_AUTOCOMMIT="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'autocommit'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'foreign_key_checks'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mforeign_key_checks\033[m"
|
||||
CUR_FOREIGN_KEY_CHECKS="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'foreign_key_checks'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'unique_checks'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1munique_checks\033[m"
|
||||
CUR_UNIQUE_CHECKS="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'unique_checks'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'innodb_flush_log_at_trx_commit'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1minnodb_flush_log_at_trx_commit\033[m"
|
||||
CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'innodb_flush_log_at_trx_commit'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
# - GET current (global) value for 'max_allowed_packet'
|
||||
# -
|
||||
echononl "GET current (global) value \033[1mmax_allowed_packet\033[m"
|
||||
CUR_MAX_ALLOWED_PACKET="$(mysql ${MYSQL_CREDENTIALS} -N -s -e "SHOW GLOBAL VARIABLES LIKE 'max_allowed_packet'" \
|
||||
| awk '{print$2}')" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echononl "Set Autocommit to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL autocommit='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set foreign_key_checks to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL foreign_key_checks='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set unique_checks to OFF"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL unique_checks='OFF'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set innodb_flush_log_at_trx_commit to 2"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=2" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set max_allowed_packet to 1G"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL max_allowed_packet=1073741824" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
fi
|
||||
|
||||
|
||||
for _db in ${mysql_database_arr[@]} ; do
|
||||
|
||||
echononl "Dump Database '${_db}'.."
|
||||
echononl " Dump MySQL Database '${_db}'.."
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
mysqldump ${MYSQL_CREDENTIALS} \\
|
||||
--single-transaction --routines \\
|
||||
-h localhost \\
|
||||
-e ${_db} > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql
|
||||
--single-transaction \\
|
||||
--routines \\
|
||||
--triggers \\
|
||||
--quick \\
|
||||
--extended-insert ${_db} > ${DB_BACKUP_DIR}/${_db}-mysql-${backup_date}.sql
|
||||
|
||||
EOF
|
||||
|
||||
mysqldump $MYSQL_CREDENTIALS \
|
||||
--single-transaction --routines \
|
||||
-h localhost \
|
||||
-e ${_db} > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql 2> ${log_file}
|
||||
--single-transaction \
|
||||
--routines \
|
||||
--triggers \
|
||||
--quick \
|
||||
--extended-insert ${_db} > ${DB_BACKUP_DIR}/${_db}-mysql-${backup_date}.sql 2> ${log_file}
|
||||
|
||||
if [[ -s "${log_file}" ]] ; then
|
||||
echo_failed
|
||||
@ -496,7 +670,66 @@ EOF
|
||||
|
||||
done
|
||||
|
||||
elif [[ "${DB_TYPE,,}" = "psql" ]] || [[ "${DB_TYPE,,}" = "postgresql" ]] || [[ "${DB_TYPE,,}" = "postgres" ]] ; then
|
||||
blank_line
|
||||
|
||||
if ${MYSQL_PERFORMANCE_SETTINGS} ; then
|
||||
echononl "Set Autocommit to $CUR_AUTOCOMMIT"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL autocommit='$CUR_AUTOCOMMIT'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_AUTOCOMMIT=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set foreign_key_checks to $CUR_FOREIGN_KEY_CHECKS"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL foreign_key_checks='$CUR_FOREIGN_KEY_CHECKS'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_FOREIGN_KEY_CHECKS=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set unique_checks to $CUR_UNIQUE_CHECKS"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL unique_checks='$CUR_UNIQUE_CHECKS'" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_UNIQUE_CHECKS=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set innodb_flush_log_at_trx_commit to $CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL innodb_flush_log_at_trx_commit=$CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_INNODB_FLUSH_LOG_AT_TRX_COMMIT=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
echononl "Set max_allowed_packet to $CUR_MAX_ALLOWED_PACKET"
|
||||
mysql ${MYSQL_CREDENTIALS} -N -s -e "SET GLOBAL max_allowed_packet=$CUR_MAX_ALLOWED_PACKET" >> ${log_file} 2>&1
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
CUR_MAX_ALLOWED_PACKET=""
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
fi
|
||||
fi
|
||||
|
||||
if containsElement "postgresql" "${db_type_arr[@]}" ; then
|
||||
|
||||
blank_line
|
||||
|
||||
echononl "Create an array of PostgreSQL databases."
|
||||
|
||||
@ -537,13 +770,13 @@ EOF
|
||||
|
||||
for _db in ${psql_database_arr[@]} ; do
|
||||
|
||||
echononl "Dump Database '${_db}'.."
|
||||
echononl " Dump PostgreSQL Database '${_db}'.."
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql
|
||||
su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-psql-${backup_date}.sql
|
||||
EOF
|
||||
|
||||
su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-${backup_date}.sql 2> ${log_file}
|
||||
su - ${PSQL_SYSTEM_USER} -c "pg_dump -c ${_db}" > ${DB_BACKUP_DIR}/${_db}-psql-${backup_date}.sql 2> ${log_file}
|
||||
|
||||
if [[ -s "${log_file}" ]] ; then
|
||||
echo_failed
|
||||
@ -557,50 +790,122 @@ EOF
|
||||
fi
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
if $MOUNT_NETDIR ; then
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mMount Network filesystems.. \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
fi
|
||||
|
||||
declare -i _net_dir_index=0
|
||||
MOUNTED_NET_DIRECTORIES=""
|
||||
|
||||
for _net_dir in ${BACKUP_NET_DIRECTORIES} ; do
|
||||
|
||||
echononl "Mount network directory '${_net_dir}'.."
|
||||
|
||||
if ! $(df -h 2> /dev/null | grep -q ${_net_dir} 2>/dev/null) ; then
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
mount "${_net_dir}" > /dev/null 2> ${log_file}
|
||||
EOF
|
||||
|
||||
mount "${_net_dir}" > /dev/null 2> ${log_file}
|
||||
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
if [[ ${_net_dir_index} -lt 1 ]] ; then
|
||||
MOUNTED_NET_DIRECTORIES="${_net_dir}"
|
||||
else
|
||||
MOUNTED_NET_DIRECTORIES="${MOUNTED_NET_DIRECTORIES} ${_net_dir}"
|
||||
fi
|
||||
(( _net_dir_index++ ))
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mMain part of script - Create Borg2 backup(s).. \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
|
||||
echononl "Create borg backup.."
|
||||
|
||||
cat << EOF >> ${BORG_LOG_FILE}
|
||||
borg2 \\
|
||||
--remote-path borg2 \\
|
||||
--repo ${BORG_URL} \\
|
||||
create \\
|
||||
--verbose \\
|
||||
--filter AME \\
|
||||
--list \\
|
||||
--stats \\
|
||||
--show-rc \\
|
||||
--compression lz4 \\
|
||||
--exclude-caches \\
|
||||
--exclude 'home/*/.cache/*' \\
|
||||
--exclude '/root/.cache/*' \\
|
||||
--exclude '/root/.config/*' \\
|
||||
--exclude '/root/.local/*' \\
|
||||
--exclude 'var/tmp/*' \\
|
||||
${ARCHIVE_NAME} \\
|
||||
${DB_BACKUP_DIR} \\
|
||||
${BORG_BACKUP_DIRS}
|
||||
borg2 \\
|
||||
--remote-path borg2 \\
|
||||
--repo ${BORG_URL} \\
|
||||
create \\
|
||||
--verbose \\
|
||||
--filter AME \\
|
||||
--list \\
|
||||
--stats \\
|
||||
--show-rc \\
|
||||
--compression lz4 \\
|
||||
--exclude-caches \\
|
||||
--exclude 'home/*/.cache/*' \\
|
||||
--exclude '/root/.cache/*' \\
|
||||
--exclude '/root/.config/*' \\
|
||||
--exclude '/root/.local/*' \\
|
||||
--exclude '**/tmp/*' \\
|
||||
--exclude '*.lock' \\
|
||||
--exclude '*.log' \\
|
||||
--exclude '*.log.[0-9]' \\
|
||||
--exclude '*.log.[0-9]*.gz' \\
|
||||
--exclude '**/sessions/*' \\
|
||||
--exclude '**/*.20[2-3][0-9]-[0-1][0-9]*' \\
|
||||
${ARCHIVE_NAME} \\
|
||||
${BORG_BACKUP_DIRS} ${BACKUP_NET_DIRECTORIES} \\
|
||||
${DB_BACKUP_DIR}
|
||||
EOF
|
||||
|
||||
|
||||
borg2 \
|
||||
--remote-path borg2 \
|
||||
--repo ${BORG_URL} \
|
||||
create \
|
||||
--verbose \
|
||||
--filter AME \
|
||||
--list \
|
||||
--stats \
|
||||
--show-rc \
|
||||
--compression lz4 \
|
||||
--exclude-caches \
|
||||
--exclude 'home/*/.cache/*' \
|
||||
--exclude '/root/.cache/*' \
|
||||
--exclude '/root/.config/*' \
|
||||
--exclude '/root/.local/*' \
|
||||
--exclude 'var/tmp/*' \
|
||||
${ARCHIVE_NAME} \
|
||||
${DB_BACKUP_DIR} \
|
||||
${BORG_BACKUP_DIRS} \
|
||||
borg2 \
|
||||
--remote-path borg2 \
|
||||
--repo ${BORG_URL} \
|
||||
create \
|
||||
--verbose \
|
||||
--filter AME \
|
||||
--list \
|
||||
--stats \
|
||||
--show-rc \
|
||||
--compression lz4 \
|
||||
--exclude-caches \
|
||||
--exclude 'home/*/.cache/*' \
|
||||
--exclude '/root/.cache/*' \
|
||||
--exclude '/root/.config/*' \
|
||||
--exclude '/root/.local/*' \
|
||||
--exclude '**/tmp/*' \
|
||||
--exclude '*.lock' \
|
||||
--exclude '*.log' \
|
||||
--exclude '*.log.[0-9]' \
|
||||
--exclude '*.log.[0-9]*.gz' \
|
||||
--exclude '**/sessions/*' \
|
||||
--exclude '**/*.20[2-3][0-9]-[0-1][0-9]*' \
|
||||
${ARCHIVE_NAME} \
|
||||
${BORG_BACKUP_DIRS} ${BACKUP_NET_DIRECTORIES} \
|
||||
${DB_BACKUP_DIR} \
|
||||
> ${log_file} 2>&1
|
||||
|
||||
|
||||
@ -648,7 +953,6 @@ else
|
||||
cat ${log_file} >> ${BORG_LOG_FILE}
|
||||
fi
|
||||
|
||||
|
||||
echononl "Free repository space by deleting unused chunks..."
|
||||
|
||||
cat << EOF >> ${BORG_LOG_FILE}
|
||||
@ -675,21 +979,72 @@ fi
|
||||
blank_line
|
||||
|
||||
|
||||
# Remove DB local backup
|
||||
#
|
||||
echononl "Remove local DB backups.."
|
||||
if [[ -n "${DB_TYPE}" ]] && [[ ! "${DB_TYPE,,}" = "none" ]]; then
|
||||
echo "" >> ${BORG_LOG_FILE}
|
||||
echo "# ---" >> ${BORG_LOG_FILE}
|
||||
echo "# Remove database backup .." >> ${BORG_LOG_FILE}
|
||||
echo "# ---" >> ${BORG_LOG_FILE}
|
||||
|
||||
echo "rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql" >> ${BORG_LOG_FILE}
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mSome post-script tasks ... \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql > ${log_file} 2>&1
|
||||
# Remove DB local backup
|
||||
#
|
||||
echononl "Remove local DB backups.."
|
||||
|
||||
echo "rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql" >> ${BORG_LOG_FILE}
|
||||
|
||||
rm -f ${DB_BACKUP_DIR}/*-${backup_date}.sql > ${log_file} 2>&1
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
if ${MOUNT_NETDIR} && [[ -n ${MOUNTED_NET_DIRECTORIES} ]] ; then
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mUnount Network filesystems.. \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
fi
|
||||
|
||||
for _net_dir in ${MOUNTED_NET_DIRECTORIES} ; do
|
||||
|
||||
echononl "Unmount network directory '${_net_dir}'.."
|
||||
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
umount "${_net_dir}" > /dev/null 2> ${log_file}
|
||||
EOF
|
||||
|
||||
umount "${_net_dir}" > /dev/null 2> ${log_file}
|
||||
|
||||
if [[ $? -eq 0 ]];then
|
||||
echo_ok
|
||||
else
|
||||
echo_failed
|
||||
error "$(cat ${log_file})"
|
||||
fi
|
||||
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
|
||||
# Duration of backup
|
||||
endTime=$(date +%s)
|
||||
endDateReadable=$(date --date @"$endTime" +"%d.%m.%Y - %H:%M:%S")
|
||||
@ -702,50 +1057,6 @@ durationReadable=$(printf "%02d hours %02d minutes %02d seconds" $durationHour $
|
||||
echo -e "\n\n###### Server backup finished on ${endDateReadable} (${durationReadable}) ######\n" >> ${BORG_LOG_FILE}
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
# Send Summery
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Summary.."
|
||||
fi
|
||||
|
||||
datum="$(date +"%d.%m.%Y %H:%M")"
|
||||
|
||||
filesystem_usage="$(df -h)"
|
||||
|
||||
msg_head_line="\n\n# ---\n# Server backup finished on ${endDateReadable} (${durationReadable})\n# ---\n\n"
|
||||
|
||||
msg="$(cat "${BORG_LOG_FILE}")"
|
||||
|
||||
datum="$(date +"%d.%m.%Y")"
|
||||
|
||||
content_type='Content-Type: text/plain;\n charset="utf-8"'
|
||||
|
||||
subject="Borg Backup - ${COMPANY} - ${datum}"
|
||||
subject_utf8="$(echo "$subject" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo $subject_utf8 | base64 --wrap=0)?="
|
||||
|
||||
|
||||
cat <<EOF >> ${BORG_LOG_FILE}
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n\${filesystem_usage}\n\${msg_head_line}\n\${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL}
|
||||
EOF
|
||||
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n${filesystem_usage}\n${msg_head_line}\n${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL} > ${log_file} 2>&1
|
||||
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
# Error Handling
|
||||
#
|
||||
declare -i error=$(grep -i -e"\[\s*ERROR" ${BORG_LOG_FILE} | wc -l)
|
||||
@ -753,27 +1064,58 @@ declare -i warning=$(grep -i -e"\[\s*WARN" ${BORG_LOG_FILE} | wc -l)
|
||||
|
||||
if [ $error -gt 0 -o $warning -gt 0 ] ; then
|
||||
|
||||
# Send Summery
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Summary.."
|
||||
fi
|
||||
|
||||
datum="$(date +"%d.%m.%Y %H:%M")"
|
||||
|
||||
filesystem_usage="$(df -h)"
|
||||
|
||||
msg_head_line="\n\n# ---\n# Server backup finished on ${endDateReadable} (${durationReadable})\n# ---\n\n"
|
||||
|
||||
msg="$(cat "${BORG_LOG_FILE}")"
|
||||
|
||||
datum="$(date +"%d.%m.%Y")"
|
||||
|
||||
content_type='Content-Type: text/plain;\n charset="utf-8"'
|
||||
|
||||
subject="Borg Backup - ${COMPANY} - ${datum}"
|
||||
subject_utf8="$(echo "$subject" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo $subject_utf8 | base64 --wrap=0)?="
|
||||
|
||||
|
||||
echo -e "To:${ADMIN_EMAIL}\n${content_type}\nSubject:${subject_utf8_encoded}\n${filesystem_usage}\n${msg_head_line}\n${msg}\n" | /usr/sbin/sendmail -F "Borg BACKUP ${COMPANY}" -f ${FROM_ADDRESS} ${ADMIN_EMAIL} > ${log_file} 2>&1
|
||||
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
# Send Error Message
|
||||
#
|
||||
if $terminal ; then
|
||||
echo -e -n " Send Error Message to ${ADMIN_EMAIL}.."
|
||||
fi
|
||||
|
||||
#ADMIN_EMAIL="ckubu@oopen.de"
|
||||
|
||||
host_name="$(hostname -f)"
|
||||
|
||||
err_msg="$(grep -A 2 -i -e"\[\s*ERROR" ${BORG_LOG_FILE})\n"
|
||||
warn_msg="$(grep -A 2 -i -e"\[\s*WARN" ${BORG_LOG_FILE})\n"
|
||||
|
||||
msg_top="Borg Backup Error ${COMPANY} vom ${datum}.\nBorg Backup on '${host_name}' beendet mit:"
|
||||
msg_top="Borg Backup Error ${COMPANY} vom ${datum}.\nBorg Backup on '$(hostname -f)' beendet mit:"
|
||||
msg_body_01="\t${error} Error(s)\n\t${warning} Warning(s)\n"
|
||||
msg_body_02="\n\n--- ERROR(S) ---\n${err_msg}\n\n--- WARNING(S) ...\n${warn_msg}"
|
||||
|
||||
msg="${msg_top}\n${msg_body_01}\n${msg_body_02}"
|
||||
|
||||
subject="Borg Backup Errors at ${host_name} -- ${datum}"
|
||||
#subject="Borg Backup Errors at ${host_name}"
|
||||
subject_utf8="$(echo "${subject}" | iconv -t UTF8)"
|
||||
subject_utf8_encoded="=?utf-8?B?$(echo ${subject_utf8} | base64 --wrap=0)?="
|
||||
|
||||
@ -804,12 +1146,17 @@ if [ $error -gt 0 -o $warning -gt 0 ] ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo -e " \033[32mLog-File handling ... \033[m"
|
||||
echo -e " \033[1m---\033[m"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
echononl "Create temporary logorotate configuration file 'logrotate_borg.conf'.."
|
||||
|
||||
|
680
borg2-extract-archiv.sh
Executable file
680
borg2-extract-archiv.sh
Executable file
@ -0,0 +1,680 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
script_name="$(basename $(realpath $0))"
|
||||
working_dir="$(dirname $(realpath $0))"
|
||||
|
||||
|
||||
if [[ -f "${working_dir}/conf/borg2-backup-nc.conf" ]] ; then
|
||||
conf_file="${working_dir}/conf/borg2-backup-nc.conf"
|
||||
else
|
||||
conf_file="${working_dir}/conf/borg2-backup.conf"
|
||||
fi
|
||||
|
||||
LOCK_DIR="/tmp/${script_name%%.*}.LOCK"
|
||||
log_file="${LOCK_DIR}/${script_name%%.*}.log"
|
||||
|
||||
|
||||
|
||||
# ----------
|
||||
# Base Function(s)
|
||||
# ----------
|
||||
|
||||
clean_up() {
|
||||
|
||||
# Perform program exit housekeeping
|
||||
rm -rf "$LOCK_DIR"
|
||||
blank_line
|
||||
exit $1
|
||||
}
|
||||
|
||||
echononl(){
|
||||
if $terminal ; then
|
||||
|
||||
echo X\\c > /tmp/shprompt$$
|
||||
if [ `wc -c /tmp/shprompt$$ | awk '{print $1}'` -eq 1 ]; then
|
||||
echo -e -n " $*\\c" 1>&2
|
||||
else
|
||||
echo -e -n " $*" 1>&2
|
||||
fi
|
||||
rm /tmp/shprompt$$
|
||||
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
fatal(){
|
||||
echo ""
|
||||
if $terminal ; then
|
||||
echo -e " [ \033[31m\033[1mFatal\033[m ]: $*"
|
||||
echo ""
|
||||
echo -e " \033[31m\033[1mScript was interupted\033[m!"
|
||||
else
|
||||
echo " [ Fatal ]: $*"
|
||||
echo ""
|
||||
echo " Script was terminated...."
|
||||
fi
|
||||
echo ""
|
||||
clean_up 1
|
||||
}
|
||||
error (){
|
||||
echo ""
|
||||
if $terminal ; then
|
||||
echo -e " [ \033[31m\033[1mError\033[m ]: $*"
|
||||
else
|
||||
echo "[ Error ]: $*"
|
||||
fi
|
||||
}
|
||||
|
||||
warn (){
|
||||
echo ""
|
||||
if $terminal ; then
|
||||
echo -e " [ \033[33m\033[1mWarning\033[m ]: $*"
|
||||
else
|
||||
echo "[ Warning ]: $*"
|
||||
fi
|
||||
echo ""
|
||||
}
|
||||
|
||||
warn_only_terminal () {
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e "\t[ \033[33m\033[1mWarning\033[m ]: $*"
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
info (){
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " [ \033[32m\033[1mInfo\033[m ] $*"
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
ok (){
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e " [ \033[32m\033[1mOk\033[m ] $*"
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
echo_done() {
|
||||
if $terminal ; then
|
||||
echo -e "\033[75G[ \033[32mdone\033[m ]"
|
||||
fi
|
||||
}
|
||||
echo_ok() {
|
||||
if $terminal ; then
|
||||
echo -e "\033[75G[ \033[32mok\033[m ]"
|
||||
fi
|
||||
}
|
||||
echo_warn() {
|
||||
if $terminal ; then
|
||||
echo -e "\033[75G[ \033[33mwarn\033[m ]"
|
||||
fi
|
||||
}
|
||||
echo_failed(){
|
||||
if $terminal ; then
|
||||
echo -e "\033[75G[ \033[1;31mfailed\033[m ]"
|
||||
fi
|
||||
}
|
||||
echo_skipped() {
|
||||
if $terminal ; then
|
||||
echo -e "\033[75G[ \033[90m\033[1mskipped\033[m ]"
|
||||
fi
|
||||
}
|
||||
echo_wait(){
|
||||
if $terminal ; then
|
||||
echo -en "\033[75G[ \033[5m\033[1m...\033[m ]"
|
||||
fi
|
||||
}
|
||||
|
||||
trim() {
|
||||
local var="$*"
|
||||
var="${var#"${var%%[![:space:]]*}"}" # remove leading whitespace characters
|
||||
var="${var%"${var##*[![:space:]]}"}" # remove trailing whitespace characters
|
||||
echo -n "$var"
|
||||
}
|
||||
|
||||
blank_line() {
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
fi
|
||||
}
|
||||
|
||||
# ----------
|
||||
# - Some checks ..
|
||||
# ----------
|
||||
|
||||
# - Running in a terminal?
|
||||
# -
|
||||
if [[ -t 1 ]] ; then
|
||||
terminal=true
|
||||
else
|
||||
terminal=false
|
||||
fi
|
||||
|
||||
|
||||
# -------------
|
||||
# - Job is already running?
|
||||
# -------------
|
||||
|
||||
# - If job already runs, stop execution..
|
||||
# -
|
||||
if mkdir "$LOCK_DIR" 2> /dev/null ; then
|
||||
|
||||
## - Remove lockdir when the script finishes, or when it receives a signal
|
||||
trap "clean_up 1" SIGHUP SIGINT SIGTERM
|
||||
|
||||
else
|
||||
|
||||
datum="$(date +"%d.%m.%Y %H:%M")"
|
||||
|
||||
msg="[ Error ]: A previos instance of \"`basename $0`\" seems already be running.\n\n Exiting now.."
|
||||
|
||||
echo ""
|
||||
echo "[ Error ]: A previos instance of that script \"`basename $0`\" seems already be running."
|
||||
echo ""
|
||||
echo -e " Exiting now.."
|
||||
echo ""
|
||||
|
||||
for _email in ${alert_email_arr[@]} ; do
|
||||
echo -e "To:${_email}\n${content_type}\nSubject:Error cronjob `basename $0` -- $datum\n${msg}\n" \
|
||||
| sendmail -F "Error `hostname -f`" -f $sender_address $_email
|
||||
done
|
||||
|
||||
exit 1
|
||||
|
||||
fi
|
||||
|
||||
|
||||
# ==========
|
||||
# - Begin Main Script
|
||||
# ==========
|
||||
|
||||
# ----------
|
||||
# - Headline
|
||||
# ----------
|
||||
|
||||
if $terminal ; then
|
||||
echo ""
|
||||
echo -e "\033[1m----------\033[m"
|
||||
echo -e "\033[32m\033[1mRunning script \033[m\033[1m$script_name\033[32m .. \033[m"
|
||||
echo -e "\033[1m----------\033[m"
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# ----------
|
||||
# Default values
|
||||
# ----------
|
||||
|
||||
DEFAULT_SSH_USER="borg"
|
||||
DEFAULT_SSH_PORT=22
|
||||
DEFAULT_BORG_RSH='ssh -i /root/.ssh/id_ed25519-borg-backup'
|
||||
|
||||
|
||||
|
||||
# ----------
|
||||
# Read Configurations from $conf_file
|
||||
# ----------
|
||||
|
||||
|
||||
if [[ -f "$conf_file" ]]; then
|
||||
source "$conf_file"
|
||||
else
|
||||
fatal "No configuration file '$conf_file' present!"
|
||||
fi
|
||||
|
||||
|
||||
# ----------
|
||||
# Set Parameter values
|
||||
# ----------
|
||||
|
||||
#if [[ -z "${BORG_PASSPHRASE}" ]] ; then
|
||||
# fatal "Borg Passphrase (BORG_PASSPHRASE) NOT found!"
|
||||
#fi
|
||||
|
||||
[[ -n "${BORG_PASSPHRASE}" ]] && _BORG_PASSPHRASE="${BORG_PASSPHRASE}"
|
||||
|
||||
[[ -n "${BORG_HOST}" ]] && _BORG_HOST="${BORG_HOST}"
|
||||
|
||||
[[ -n "${BORG_REPO}" ]] && _BORG_REPO="${BORG_REPO}"
|
||||
|
||||
if [[ -n "${SSH_USER}" ]] ; then
|
||||
_SSH_USER="${SSH_USER}"
|
||||
else
|
||||
_SSH_USER="${DEFAULT_SSH_USER}"
|
||||
fi
|
||||
|
||||
if [[ -n "${SSH_PORT}" ]] ; then
|
||||
_SSH_PORT="${SSH_PORT}"
|
||||
else
|
||||
_SSH_PORT="${DEFAULT_SSH_PORT}"
|
||||
fi
|
||||
|
||||
if [[ -n "${BORG_RSH}" ]] ; then
|
||||
_BORG_RSH="${BORG_RSH}"
|
||||
else
|
||||
_BORG_RSH="${DEFAULT_BORG_RSH}"
|
||||
fi
|
||||
|
||||
[[ -z "${BORG_FUSE_MOUNT_DIR}" ]] && BORG_FUSE_MOUNT_DIR="${DEFAULT_BORG_FUSE_MOUNT_DIR}"
|
||||
|
||||
# ---
|
||||
# Some automatic “answerers” (if set, they automatically answer confirmation questions):
|
||||
# ---
|
||||
|
||||
# For 'Warning: The repository at location … was previously located at ..'
|
||||
#
|
||||
BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK
|
||||
|
||||
FQHN_BORG2_HOSTNAME=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the computer that hosts the borg2 repository."
|
||||
echo ""
|
||||
if [[ -n "${_BORG_HOST}" ]] ; then
|
||||
while [[ "X${FQHN_BORG2_HOSTNAME}" = "X" ]]; do
|
||||
echononl "Borg2 Repository Host [${_BORG_HOST}]: "
|
||||
read FQHN_BORG2_HOSTNAME
|
||||
if [[ "X${FQHN_BORG2_HOSTNAME}" = "X" ]]; then
|
||||
FQHN_BORG2_HOSTNAME="${_BORG_HOST}"
|
||||
break
|
||||
fi
|
||||
if [[ ${FQHN_BORG2_HOSTNAME} =~ ^127 ]] || [[ "${FQHN_BORG2_HOSTNAME,,}" =~ "localhost" ]] ; then
|
||||
break
|
||||
fi
|
||||
if [[ ! ${FQHN_BORG2_HOSTNAME} =~ \. ]]; then
|
||||
echo -e "\n\tGiven Host \033[33m\033[1m${FQHN_BORG2_HOSTNAME}\033[m seems not to be a full qualified hostname.\n"
|
||||
FQHN_BORG2_HOSTNAME=""
|
||||
fi
|
||||
done
|
||||
else
|
||||
while [[ "X${FQHN_BORG2_HOSTNAME}" = "X" ]]; do
|
||||
echononl "Full borg2 hostname: "
|
||||
read FQHN_BORG2_HOSTNAME
|
||||
if [[ ${FQHN_BORG2_HOSTNAME} =~ ^127 ]] || [[ "${FQHN_BORG2_HOSTNAME,,}" =~ "localhost" ]] ; then
|
||||
break
|
||||
fi
|
||||
if [[ "X${FQHN_BORG2_HOSTNAME}" = "X" ]]; then
|
||||
echo -e "\n\t\033[33m\033[1mFull qualified hostname is reqired\033[m\n"
|
||||
fi
|
||||
if [[ ! $FQHN_BORG2_HOSTNAME =~ \. ]]; then
|
||||
echo -e "\n\tGiven Host \033[33m\033[1m$FQHN_BORG2_HOSTNAME\033[m seems not to be a full qualified hostname.\n"
|
||||
FQHN_BORG2_HOSTNAME=""
|
||||
fi
|
||||
done
|
||||
fi
|
||||
BORG_HOST="${FQHN_BORG2_HOSTNAME,,}"
|
||||
|
||||
|
||||
FQPN_BORG2_REPO=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the borg2 repository path from which files are to be extracted."
|
||||
echo ""
|
||||
if [[ -n "${_BORG_REPO}" ]] ; then
|
||||
echononl "Full Qualified Borg2 Repository Path [${_BORG_REPO}]: "
|
||||
read FQPN_BORG2_REPO
|
||||
if [[ "X${FQPN_BORG2_REPO}" = "X" ]]; then
|
||||
FQPN_BORG2_REPO="${_BORG_REPO}"
|
||||
fi
|
||||
else
|
||||
while [[ "X${FQPN_BORG2_REPO}" = "X" ]]; do
|
||||
echononl "Full Qualified Borg2 Repository Path: "
|
||||
read FQPN_BORG2_REPO
|
||||
if [[ "X${FQPN_BORG2_REPO}" = "X" ]]; then
|
||||
echo -e "\n\t\033[33m\033[1mFull qualified hostname is reqired\033[m\n"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
BORG_REPO="${FQPN_BORG2_REPO}"
|
||||
|
||||
|
||||
LIST_OF_FILES_TO_RESTORE=
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify a space-separated list of files or directories to be restored."
|
||||
echo ""
|
||||
echo -e " Type \"\033[33mall\033[m\" or leave emty to restore the full archive"
|
||||
echo ""
|
||||
echononl "List of files or directories: "
|
||||
read LIST_OF_FILES_TO_RESTORE
|
||||
if [[ "X${LIST_OF_FILES_TO_RESTORE}" = "X" ]] || [[ "$(trim ${LIST_OF_FILES_TO_RESTORE,,})" = 'all' ]] ; then
|
||||
LIST_OF_FILES_TO_RESTORE=""
|
||||
fi
|
||||
|
||||
|
||||
BORG_PASSPHRASE=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the password for borg2 repository '$(basename "${BORG_REPO}")'."
|
||||
echo ""
|
||||
if [[ -n "${_BORG_PASSPHRASE}" ]] ; then
|
||||
echononl "Repositories Passphrase [${_BORG_PASSPHRASE}]: "
|
||||
read BORG_PASSPHRASE
|
||||
if [[ "X${BORG_PASSPHRASE}" = "X" ]]; then
|
||||
BORG_PASSPHRASE="${_BORG_PASSPHRASE}"
|
||||
fi
|
||||
else
|
||||
while [[ "X${BORG_PASSPHRASE}" = "X" ]]; do
|
||||
echononl "Repositories Passphrase: "
|
||||
read BORG_PASSPHRASE
|
||||
if [[ "X${BORG_PASSPHRASE}" = "X" ]]; then
|
||||
echo -e "\n\t\033[33m\033[1m is reqired\033[m\n"
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! ${BORG_HOST} =~ ^127 ]] && [[ ! ${BORG_HOST,,} =~ localhost ]] ; then
|
||||
SSH_USER=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the ssh user to connect to the Borg2 host '${BORG_HOST}'."
|
||||
echo ""
|
||||
echononl "SSH user [${_SSH_USER}]: "
|
||||
read SSH_USER
|
||||
if [[ "X${SSH_USER}" = "X" ]]; then
|
||||
SSH_USER="${_SSH_USER}"
|
||||
fi
|
||||
|
||||
|
||||
SSH_PORT=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the ssh port to connect to the Borg2 host '${BORG_HOST}'."
|
||||
echo ""
|
||||
while [[ "X${SSH_PORT}" = "X" ]]; do
|
||||
echononl "SSH user [${_SSH_PORT}]: "
|
||||
read SSH_PORT
|
||||
if [[ "X${SSH_PORT}" = "X" ]]; then
|
||||
SSH_PORT="${_SSH_PORT}"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
BORG_RSH=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the ssh command which is used to connect to the Borg2 host '${BORG_HOST}'."
|
||||
echo ""
|
||||
while [[ "X${BORG_RSH}" = "X" ]]; do
|
||||
echononl "SSH command [${_BORG_RSH}]: "
|
||||
read BORG_RSH
|
||||
if [[ "X${BORG_RSH}" = "X" ]]; then
|
||||
BORG_RSH="${_BORG_RSH}"
|
||||
fi
|
||||
done
|
||||
|
||||
export BORG_RSH
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
|
||||
export BORG_HOST
|
||||
export BORG_PASSPHRASE
|
||||
export BORG_REPO
|
||||
|
||||
# List Borg Backups
|
||||
#
|
||||
(
|
||||
source ${working_dir}/borg2-list-backups.sh
|
||||
)
|
||||
|
||||
BORG_BACKUP_ID=""
|
||||
echo ""
|
||||
echo -e " \033[33m---------------------------------------------\033[m"
|
||||
echo " Which Borg2 Archiv should be extracted?"
|
||||
echo ""
|
||||
echo " Give a Borg2 Backup ID from above list"
|
||||
echo ""
|
||||
while [[ "X${BORG_BACKUP_ID}" = "X" ]]; do
|
||||
echo -n " Borg2 Backup ID: "
|
||||
read BORG_BACKUP_ID
|
||||
if [[ "X$(trim ${BORG_BACKUP_ID})" = "X" ]] ; then
|
||||
echo -e "\n\t\033[33m\033[1mIncorrect entry\033[m\n"
|
||||
fi
|
||||
done
|
||||
echo -e " \033[33m---------------------------------------------\033[m"
|
||||
echo ""
|
||||
|
||||
|
||||
BORG_RESTORE_PATH_BACKUP_SERVER="/backup/RESTORE/$(basename "${BORG_REPO}")/${BORG_BACKUP_ID}"
|
||||
|
||||
|
||||
_BORG_RESTORE_PATH="/data/RESTORE/$(basename "${BORG_REPO}")/${BORG_BACKUP_ID}"
|
||||
|
||||
BORG_RESTORE_PATH=""
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify the pathname to which the archive or parts of it are to be restored.."
|
||||
echo ""
|
||||
while [[ "X${BORG_RESTORE_PATH}" = "X" ]]; do
|
||||
echononl "FQPN of restore path [${_BORG_RESTORE_PATH}]: "
|
||||
read BORG_RESTORE_PATH
|
||||
if [[ "X${BORG_RESTORE_PATH}" = "X" ]]; then
|
||||
BORG_RESTORE_PATH="${_BORG_RESTORE_PATH}"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
if [[ ${BORG_HOST} =~ ^127 ]] || [[ ${BORG_HOST,,} =~ localhost ]] ; then
|
||||
BORG_URL="${BORG_REPO}"
|
||||
else
|
||||
BORG_URL="ssh://${SSH_USER}@${BORG_HOST}:${SSH_PORT}${BORG_REPO}"
|
||||
fi
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
echo -e "\t\033[32mStart script for extracting borg2 backup..\033[m"
|
||||
echo ""
|
||||
echo -e "\tBORG_HOST................: ${BORG_HOST}"
|
||||
echo -e "\tBORG_REPO................: ${BORG_REPO}"
|
||||
echo ""
|
||||
echo -e "\tBORG_PASSPHRASE..........: ${BORG_PASSPHRASE}"
|
||||
echo ""
|
||||
echo -e "\tSSH_USER ................: ${SSH_USER}"
|
||||
echo -e "\tSSH_PORT.................: ${SSH_PORT}"
|
||||
echo -e "\tBORG_RSH.................: ${BORG_RSH}"
|
||||
echo ""
|
||||
echo -e "\tBORG_URL.................: ${BORG_URL}"
|
||||
echo ""
|
||||
echo -e "\tBORG_RESTORE_PATH........: ${BORG_RESTORE_PATH}"
|
||||
if [[ -z "${LIST_OF_FILES_TO_RESTORE}" ]]; then
|
||||
echo -e "\tLIST_OF_FILES_TO_RESTORE.: \033[33mRestore the full archive\033[m"
|
||||
else
|
||||
echo -e "\tLIST_OF_FILES_TO_RESTORE.: ${LIST_OF_FILES_TO_RESTORE}"
|
||||
fi
|
||||
echo ""
|
||||
echo ""
|
||||
|
||||
declare -i _CHOOSE
|
||||
echo -e " Ho to continue?"
|
||||
echo ""
|
||||
echo -e " \033[1m[1] Restore files from repository $(basename "${BORG_REPO}") archive ${BORG_BACKUP_ID}\033[m"
|
||||
echo -e " [2] Only print out the commands for restoring files/folders"
|
||||
echo -e " [3] Exit borg2 extract script."
|
||||
echo ""
|
||||
echo " Type a number or press <RETURN> to choose highlighted value"
|
||||
echo ""
|
||||
echononl "Eingabe: "
|
||||
while [[ -z "${_CHOOSE}" ]]; do
|
||||
read OPTION
|
||||
[[ -z "$OPTION" ]] && OPTION=1
|
||||
case $OPTION in
|
||||
1) _CHOOSE=1
|
||||
;;
|
||||
2) _CHOOSE=2
|
||||
;;
|
||||
3) _CHOOSE=3
|
||||
;;
|
||||
*)
|
||||
echo ""
|
||||
echo -e "\tFalsche Eingabe ! [1/2/3] or type <RETURN> for the highlited default"
|
||||
echo ""
|
||||
echononl "Eingabe: "
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ${_CHOOSE} -gt 2 ]] ; then
|
||||
echo ""
|
||||
clean_up 0
|
||||
elif [[ ${_CHOOSE} -gt 1 ]] ; then
|
||||
|
||||
echo -e "\033[40m\033[37m
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RSH=\"${BORG_RSH}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${BORG_RESTORE_PATH}\"
|
||||
|
||||
cd \"${BORG_RESTORE_PATH}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE}
|
||||
"
|
||||
if [[ ! ${BORG_HOST} =~ ^127 ]] && [[ ! ${BORG_HOST,,} =~ localhost ]] ; then
|
||||
|
||||
echo -e "
|
||||
On Backup Host type:
|
||||
====================
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${BORG_RESTORE_PATH_BACKUP_SERVER}\"
|
||||
|
||||
cd "${BORG_RESTORE_PATH_BACKUP_SERVER}"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_REPO} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE}
|
||||
"
|
||||
fi
|
||||
|
||||
echo -e "-----------------------------------------------------------------------------------------\033[m\n"
|
||||
clean_up 0
|
||||
fi
|
||||
|
||||
echo ""
|
||||
info "\033[32mStart restoring from archive with the above settings\033[m?"
|
||||
echo -n " To continue type uppercase 'YES': "
|
||||
read OK
|
||||
echo ""
|
||||
if [[ "$OK" != "YES" ]] ; then
|
||||
fatal "Abort by user request - Answer as not 'YES'"
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echononl "Create Restore Directory '${BORG_RESTORE_PATH}'."
|
||||
if [ ! -d "${BORG_RESTORE_PATH}" ]; then
|
||||
mkdir -p "${BORG_RESTORE_PATH}" > ${log_file} 2>&1
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
|
||||
fatal "Creating restore directory '${BORG_RESTORE_PATH}' failed!"
|
||||
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
else
|
||||
echo_skipped
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
echononl "Change into Restore Path '${BORG_RESTORE_PATH}'.."
|
||||
|
||||
cd "${BORG_RESTORE_PATH}" > ${log_file} 2>&1
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
fatal "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echo -e "\033[40m\033[37m
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RSH=\"${BORG_RSH}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${BORG_RESTORE_PATH}\"
|
||||
|
||||
cd \"${BORG_RESTORE_PATH}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE}
|
||||
"
|
||||
if [[ ! ${BORG_HOST} =~ ^127 ]] && [[ ! ${BORG_HOST,,} =~ localhost ]] ; then
|
||||
|
||||
echo -e "
|
||||
On Backup Host type:
|
||||
====================
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${BORG_RESTORE_PATH_BACKUP_SERVER}\"
|
||||
|
||||
cd "${BORG_RESTORE_PATH_BACKUP_SERVER}"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_REPO} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE}
|
||||
"
|
||||
fi
|
||||
echo -e "-----------------------------------------------------------------------------------------\033[m\n"
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
|
||||
echo " Restore from archive '$(basename "${BORG_REPO}")::${BORG_BACKUP_ID}' to"
|
||||
echononl " '${BORG_RESTORE_PATH}'.."
|
||||
if [[ ${FQHN_BORG2_HOSTNAME} =~ ^127 ]] || [[ "${FQHN_BORG2_HOSTNAME,,}" =~ "localhost" ]] ; then
|
||||
borg2 --remote-path borg2 --repo ${BORG_REPO} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE} > "${log_file}" 2>&1
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
else
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} extract ${BORG_BACKUP_ID} ${LIST_OF_FILES_TO_RESTORE} > "${log_file}" 2>&1
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
error "$(cat "${log_file}")"
|
||||
else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
info "The data restored from the archive can be found in the directory:
|
||||
|
||||
\033[1m${BORG_RESTORE_PATH}\033[m"
|
||||
|
||||
clean_up 0
|
||||
|
@ -225,10 +225,12 @@ DEFAULT_BORG_RSH='ssh -i /root/.ssh/id_ed25519-borg-backup'
|
||||
# ----------
|
||||
|
||||
|
||||
if [[ -f "$conf_file" ]]; then
|
||||
source "$conf_file"
|
||||
else
|
||||
fatal "No configuration file '$conf_file' present!"
|
||||
if [[ -z "${BORG_HOST}" ]] || [[ -z "${BORG_REPO}" ]] || [[ -z "${BORG_PASSPHRASE}" ]] ; then
|
||||
if [[ -f "$conf_file" ]]; then
|
||||
source "$conf_file"
|
||||
else
|
||||
fatal "No configuration file '$conf_file' present!"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
@ -278,10 +280,20 @@ export BORG_RELOCATED_REPO_ACCESS_IS_OK
|
||||
|
||||
echo -e " \033[1mDate\033[33GBorg Backup ID\033[m\n"
|
||||
|
||||
while read -r _borg_id _date_weekday _date_date _date_time _time_stamp_borg_backup || [[ -n $_line ]] ; do
|
||||
if [[ ${BORG_HOST} =~ ^127 ]] || [[ "${BORG_HOST,,}" =~ "localhost" ]] ; then
|
||||
|
||||
echo -e " ${_date_weekday} ${_date_date} ${_date_time} [ \033[33m${_borg_id}\033[m ]"
|
||||
while read -r _borg_id _date_weekday _date_date _date_time _time_stamp_borg_backup || [[ -n $_line ]] ; do
|
||||
|
||||
done < <(borg2 --remote-path borg2 --repo ${BORG_URL} rlist)
|
||||
echo -e " ${_date_weekday} ${_date_date} ${_date_time} [ \033[33m${_borg_id}\033[m ]"
|
||||
|
||||
done < <(borg2 --remote-path borg2 --repo ${BORG_REPO} rlist)
|
||||
|
||||
else
|
||||
while read -r _borg_id _date_weekday _date_date _date_time _time_stamp_borg_backup || [[ -n $_line ]] ; do
|
||||
|
||||
echo -e " ${_date_weekday} ${_date_date} ${_date_time} [ \033[33m${_borg_id}\033[m ]"
|
||||
|
||||
done < <(borg2 --remote-path borg2 --repo ${BORG_URL} rlist)
|
||||
fi
|
||||
|
||||
clean_up 0
|
||||
|
@ -267,6 +267,149 @@ export BORG_RSH
|
||||
#
|
||||
BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK
|
||||
blank_line
|
||||
|
||||
|
||||
LIST_OF_FILES_OR_DIRECTORIES=
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
echo "Specify a space-separated list of files or directories to be part of the mounted filesystem."
|
||||
echo ""
|
||||
echo -e " Type \"\033[33mall\033[m\" or leave emty to mount the full archive"
|
||||
echo ""
|
||||
echononl "List of files or directories: "
|
||||
read LIST_OF_FILES_OR_DIRECTORIES
|
||||
if [[ "X${LIST_OF_FILES_OR_DIRECTORIES}" = "X" ]] || [[ "$(trim ${LIST_OF_FILES_OR_DIRECTORIES,,})" = 'all' ]] ; then
|
||||
LIST_OF_FILES_OR_DIRECTORIES=""
|
||||
fi
|
||||
|
||||
blank_line
|
||||
|
||||
echo -e "\033[32m--\033[m"
|
||||
echo ""
|
||||
|
||||
# List Borg Backups
|
||||
#
|
||||
(
|
||||
source ${working_dir}/borg2-list-backups.sh
|
||||
)
|
||||
|
||||
echo ""
|
||||
echo -e " \033[33m--------------------------------------------\033[m"
|
||||
echo " Which Borg Archiv shoul be mounted?"
|
||||
echo ""
|
||||
echo -e " \033[33mNote:\033[m it is an read-only fuse filesystem!"
|
||||
echo ""
|
||||
echo " Give a Borg Backup ID from above list"
|
||||
echo ""
|
||||
echo -n " Borg Backup ID: "
|
||||
read BORG_BACKUP_ID
|
||||
echo -e " \033[33m--------------------------------------------\033[m"
|
||||
echo ""
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
|
||||
echo ""
|
||||
echo ""
|
||||
echo -e "\t\033[32mStart script for (readonly) mounting repository archiv '${BORG_BACKUP_ID}'..\033[m"
|
||||
echo ""
|
||||
echo -e "\tBORG_HOST......................: ${BORG_HOST}"
|
||||
echo -e "\tBORG_REPO......................: ${BORG_REPO}"
|
||||
echo ""
|
||||
echo -e "\tBORG_PASSPHRASE................: ${BORG_PASSPHRASE}"
|
||||
echo ""
|
||||
echo -e "\tSSH_USER ......................: ${SSH_USER}"
|
||||
echo -e "\tSSH_PORT.......................: ${SSH_PORT}"
|
||||
echo -e "\tBORG_RSH.......................: ${BORG_RSH}"
|
||||
echo ""
|
||||
echo -e "\tBORG_URL.......................: ${BORG_URL}"
|
||||
echo ""
|
||||
echo -e "\tBORG_FUSE_MOUNT_DIR............: ${BORG_FUSE_MOUNT_DIR}"
|
||||
if [[ -z "${LIST_OF_FILES_OR_DIRECTORIES}" ]]; then
|
||||
echo -e "\tLIST_OF_FILES_OR_DIRECTORIES...: \033[33mMount the full archive\033[m"
|
||||
else
|
||||
echo -e "\tLIST_OF_FILES_OR_DIRECTORIES...: ${LIST_OF_FILES_OR_DIRECTORIES}"
|
||||
fi
|
||||
echo ""
|
||||
echo ""
|
||||
|
||||
declare -i _CHOOSE
|
||||
echo -e " Ho to continue?"
|
||||
echo ""
|
||||
echo -e " \033[1m[1] Mount files from repository $(basename "${BORG_REPO}") archive ${BORG_BACKUP_ID}\033[m"
|
||||
echo -e " [2] Only print out the commands for mounting files/folders"
|
||||
echo -e " [3] Exit borg2 mount script."
|
||||
echo ""
|
||||
echo " Type a number or press <RETURN> to choose highlighted value"
|
||||
echo ""
|
||||
echononl "Eingabe: "
|
||||
while [[ -z "${_CHOOSE}" ]]; do
|
||||
read OPTION
|
||||
[[ -z "$OPTION" ]] && OPTION=1
|
||||
case $OPTION in
|
||||
1) _CHOOSE=1
|
||||
;;
|
||||
2) _CHOOSE=2
|
||||
;;
|
||||
3) _CHOOSE=3
|
||||
;;
|
||||
*)
|
||||
echo ""
|
||||
echo -e "\tFalsche Eingabe ! [1/2/3] or type <RETURN> for the highlited default"
|
||||
echo ""
|
||||
echononl "Eingabe: "
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [[ ${_CHOOSE} -gt 2 ]] ; then
|
||||
echo ""
|
||||
clean_up 0
|
||||
elif [[ ${_CHOOSE} -gt 1 ]] ; then
|
||||
|
||||
_MOUNT_DIR_BACKUP_HOST="${BORG_FUSE_MOUNT_DIR}/$(basename "${BORG_REPO}")"
|
||||
|
||||
echo -e "\033[40m\033[37m
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RSH=\"${BORG_RSH}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${BORG_FUSE_MOUNT_DIR}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} mount -a ${BORG_BACKUP_ID} ${BORG_FUSE_MOUNT_DIR} ${LIST_OF_FILES_OR_DIRECTORIES}
|
||||
|
||||
|
||||
On Backup Host type:
|
||||
====================
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${_MOUNT_DIR_BACKUP_HOST}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_REPO} mount -a ${BORG_BACKUP_ID} ${_MOUNT_DIR_BACKUP_HOST} ${LIST_OF_FILES_OR_DIRECTORIES}
|
||||
|
||||
|
||||
You can find the mounted fuse archive at;
|
||||
|
||||
${_MOUNT_DIR_BACKUP_HOST}/${BORG_BACKUP_ID}
|
||||
|
||||
|
||||
In Order to unmount repository archive type:
|
||||
|
||||
umount ${_MOUNT_DIR_BACKUP_HOST}
|
||||
|
||||
-----------------------------------------------------------------------------------------
|
||||
\033[m\n"
|
||||
|
||||
clean_up 0
|
||||
fi
|
||||
|
||||
echononl "Create Restore Directory '${BORG_FUSE_MOUNT_DIR}'."
|
||||
if [ ! -d "${BORG_FUSE_MOUNT_DIR}" ]; then
|
||||
@ -286,29 +429,51 @@ fi
|
||||
|
||||
blank_line
|
||||
|
||||
_MOUNT_DIR_BACKUP_HOST="${BORG_FUSE_MOUNT_DIR}/$(basename "${BORG_REPO}")"
|
||||
|
||||
# List Borg Backups
|
||||
#
|
||||
(
|
||||
source ${working_dir}/borg2-list-backups.sh
|
||||
)
|
||||
echo -e "\033[40m\033[37m
|
||||
-----------------------------------------------------------------------------------------
|
||||
|
||||
echo ""
|
||||
echo -e " \033[33m--------------------------------------------\033[m"
|
||||
echo " Which Borg Archiv shoul be mounted?"
|
||||
echo ""
|
||||
echo -e " \033[33mNote:\033[m it is an read-only fuse filesystem!"
|
||||
echo ""
|
||||
echo " Give a Borg Backup ID from above list"
|
||||
echo ""
|
||||
echo -n " Borg Backup ID:: "
|
||||
read BORG_BACKUP_ID
|
||||
echo -e " \033[33m--------------------------------------------\033[m"
|
||||
echo ""
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RSH=\"${BORG_RSH}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
echononl "Mount archive '$(basename "${BORG_REPO}")::${BORG_BACKUP_ID}' to '${BORG_FUSE_MOUNT_DIR}'.."
|
||||
mkdir -p \"${BORG_FUSE_MOUNT_DIR}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} mount -a ${BORG_BACKUP_ID} ${BORG_FUSE_MOUNT_DIR} >> "${log_file}" 2>&1
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} mount -a ${BORG_BACKUP_ID} ${BORG_FUSE_MOUNT_DIR} ${LIST_OF_FILES_OR_DIRECTORIES}
|
||||
|
||||
|
||||
On Backup Host type:
|
||||
====================
|
||||
|
||||
export BORG_PASSPHRASE=\"${BORG_PASSPHRASE}\"
|
||||
export BORG_REPO=\"${BORG_REPO}\"
|
||||
export BORG_RELOCATED_REPO_ACCESS_IS_OK=yes
|
||||
|
||||
mkdir -p \"${_MOUNT_DIR_BACKUP_HOST}\"
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_REPO} mount -a ${BORG_BACKUP_ID} ${_MOUNT_DIR_BACKUP_HOST} ${LIST_OF_FILES_OR_DIRECTORIES}
|
||||
|
||||
|
||||
You can find the mounted fuse archive at;
|
||||
|
||||
${_MOUNT_DIR_BACKUP_HOST}/${BORG_BACKUP_ID}
|
||||
|
||||
|
||||
In Order to unmount repository archive type:
|
||||
|
||||
umount ${_MOUNT_DIR_BACKUP_HOST}
|
||||
|
||||
-----------------------------------------------------------------------------------------
|
||||
\033[m\n"
|
||||
|
||||
blank_line
|
||||
|
||||
echo "Mount archive '$(basename "${BORG_REPO}")::${BORG_BACKUP_ID}' to"
|
||||
echononl " '${BORG_FUSE_MOUNT_DIR}'.."
|
||||
|
||||
borg2 --remote-path borg2 --repo ${BORG_URL} mount -a ${BORG_BACKUP_ID} ${BORG_FUSE_MOUNT_DIR} ${LIST_OF_FILES_OR_DIRECTORIES} > "${log_file}" 2>&1
|
||||
|
||||
if [[ $? -gt 0 ]] ; then
|
||||
echo_failed
|
||||
@ -317,4 +482,11 @@ else
|
||||
echo_ok
|
||||
fi
|
||||
|
||||
|
||||
blank_line
|
||||
|
||||
info "You can find the readonly mounted files from repository archive '${BORG_BACKUP_ID}' at directory:
|
||||
|
||||
\033[1m${BORG_FUSE_MOUNT_DIR}/${BORG_BACKUP_ID}\033[m"
|
||||
|
||||
clean_up 0
|
||||
|
@ -114,6 +114,41 @@
|
||||
#NC_DB_BACKUP_DIR="/data/backup/sql"
|
||||
|
||||
|
||||
# ---
|
||||
# DB related parameters
|
||||
# ---
|
||||
|
||||
# MYSQL_PERFORMANCE_SETTINGS
|
||||
#
|
||||
# To increase performance, some global variables are changed before writing the database dump.
|
||||
#
|
||||
# Settings are:
|
||||
# - SET GLOBAL autocommit='OFF'
|
||||
# - SET GLOBAL foreign_key_checks='OFF'
|
||||
# - SET GLOBAL unique_checks='OFF'
|
||||
# - SET GLOBAL innodb_flush_log_at_trx_commit=2
|
||||
# - SET GLOBAL max_allowed_packet=1073741824
|
||||
#
|
||||
# After the databases have been backed up, the values are reset.
|
||||
#
|
||||
# Defaults to:
|
||||
#
|
||||
# MYSQL_PERFORMANCE_SETTINGS=false
|
||||
#
|
||||
#MYSQL_PERFORMANCE_SETTINGS=false
|
||||
|
||||
|
||||
# MYSQL_MAX_ALLOWED_PACKET
|
||||
#
|
||||
# Set/Change this value only for dumping the NC database
|
||||
#
|
||||
# Defaults to:
|
||||
#
|
||||
# #MYSQL_MAX_ALLOWED_PACKET=1G
|
||||
#
|
||||
#MYSQL_MAX_ALLOWED_PACKET=1G
|
||||
|
||||
|
||||
# ---
|
||||
# Other Backups
|
||||
# ---
|
||||
|
@ -88,14 +88,15 @@
|
||||
#
|
||||
# possible values:
|
||||
# - MySQL
|
||||
# - PostgreSQL or postgres or psql
|
||||
# - PostgreSQL (or postgres or psql)
|
||||
# - MySQL,PostgreSQL (or MySQL PostgreSQL)
|
||||
# - None
|
||||
#
|
||||
# Defaults to:
|
||||
#
|
||||
# DB_TYPE="None"
|
||||
# DB_TYPE = "None"
|
||||
#
|
||||
# DB_TYPE="None"
|
||||
#DB_TYPE = "None"
|
||||
|
||||
|
||||
# MYSQL_CREDENTIALS
|
||||
@ -129,6 +130,26 @@
|
||||
#MYSQL_CREDENTIALS="-u root -S /run/mysqld/mysqld.sock"
|
||||
|
||||
|
||||
# MYSQL_PERFORMANCE_SETTINGS
|
||||
#
|
||||
# To increase performance, some global variables are changed before writing the database dump.
|
||||
#
|
||||
# Settings are:
|
||||
# - SET GLOBAL autocommit='OFF'
|
||||
# - SET GLOBAL foreign_key_checks='OFF'
|
||||
# - SET GLOBAL unique_checks='OFF'
|
||||
# - SET GLOBAL innodb_flush_log_at_trx_commit=2
|
||||
# - SET GLOBAL max_allowed_packet=1073741824
|
||||
#
|
||||
# After the databases have been backed up, the values are reset.
|
||||
#
|
||||
# Defaults to:
|
||||
#
|
||||
# MYSQL_PERFORMANCE_SETTINGS=false
|
||||
#
|
||||
#MYSQL_PERFORMANCE_SETTINGS=false
|
||||
|
||||
|
||||
# PSQL_SYSTEM_USER
|
||||
#
|
||||
# User who owns PostgreSQL services
|
||||
@ -168,6 +189,21 @@
|
||||
#BACKUP_DIRECTORIES="/etc /home /root /var/spool/cron"
|
||||
|
||||
|
||||
# BACKUP_NET_DIRECTORIES
|
||||
#
|
||||
# Defaults to:
|
||||
#
|
||||
# BACKUP_NET_DIRECTORIES=""
|
||||
#
|
||||
# - Blank separated list of net directories -
|
||||
#
|
||||
# !! Note !!
|
||||
#
|
||||
# every net directoty
|
||||
#
|
||||
#BACKUP_NET_DIRECTORIES=""
|
||||
|
||||
|
||||
# KEEP_DAILY
|
||||
#
|
||||
# Number of daily archives to keep
|
||||
|
Reference in New Issue
Block a user