#!/bin/bash # ================================================================================ # # START BACKUP # # For a backup will be done: # - local dumps for all database types will be performed # - transfer of data directories will be started # # This script should be added as cronjob (see /etc/cron.d/) # # -------------------------------------------------------------------------------- # ah - Axel Hahn <axel.hahn@iml.unibe.ch> # # 2022-01-14 ah v1.0 # 2022-02-10 ah v1.1 handle local dumps only; improve infos # ================================================================================ . $( dirname "$0" )/jobhelper.sh . `dirname $0`/inc_bash.sh typeset -i rcBackup=0 typeset -i rcTransfer=0 bStart=1 # -------------------------------------------------------------------------------- # FUNCTIONS # -------------------------------------------------------------------------------- function showHelp(){ self=$(basename "$0") cat << EOFhelp START A BACKUP This script starts - the database backups and creates dumps locally - the file backup (using restic or duplicity) SYNTAX: $self [OPTIONS] default: no parameter: OPTIONS: -d, --dryrun just show infos, do not start a backup -h, --help Show this help The following parameters force the backup type (if using duplicity): -a, --auto force auto -o, --older duplicity type=auto: repeat full backup if last full backup is older than ... like "1M" for 1 month -f, --full force full backup (if supported) -i, --inc force incrmenental backup EOFhelp } # -------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------- # --- read backup config data j_read # --- handle params while [ "$#" -gt 0 ]; do case "$1" in -h|-\?|--help) echo "Param: show help" showHelp exit 0 ;; -d|--dryrun) echo "Param: setting to DRY RUN" bStart=0 ;; -a|--auto) echo "Param: setting to AUTO" JOBDEF_TYPE=auto bStart=1 ;; -o|--older) echo "Param: setting to AUTO on duplicity" echo "$2" | grep "^[1-9][0-9]*[a-zA-Z]$" 2>/dev/null if [ $? -ne 0 ]; then >&2 echo "ERROR: the value after $1 must be a number and a letter (for unit); i.e. 1M for 1 month" exit 1 else JOBDEF_TYPE=auto JOBDEF_AUTO=$2 shift 1 fi ;; -f|--full) echo "Param: setting to FULL" JOBDEF_TYPE=full JOBDEF_AUTO= bStart=1 ;; -i|--inc) echo "Param: setting to INC" JOBDEF_TYPE=inc JOBDEF_AUTO= bStart=1 ;; *) >&2 echo "ERROR: parameter [$1] is unknown" showHelp exit 1 esac shift 1 done # --- update logfile after param overrides _j_setLogfile # -------------------------------------------------------------------------------- # show infos # -------------------------------------------------------------------------------- # TODO: # check localdump plugins ... what database types are detected # --- infos for transfer STORAGE_BASEDIR=$(_j_getvar "${STORAGEFILE}" "storage") if [ -z "$STORAGE_BASEDIR" ]; then echo "INFO: no value for backup target (in storage = ...)" echo "This is not handled as an error. I will run local backup dumps only; no transfer." else STORAGE_BIN=$( _j_getvar "${STORAGEFILE}" "bin" ) cfg_type=$(_j_getvar "${STORAGEFILE}" "type") cfg_full=$(_j_getvar "${STORAGEFILE}" "full") cfg_startfull=$(_j_getvar "${STORAGEFILE}" "start-time-full") test -z "${cfg_full}${cfg_startfull}" || cfg_info="INFO: Type is [auto]; ignoring config for full backup: [full = $cfg_full ... start-time-full = $cfg_startfull]" JOBDEF_STARTTIME=$(date +%H%M) cat << EOFbackupinfo CONFIG: Used Backup tool : $STORAGE_BIN Backup type : $(_j_getvar ${STORAGEFILE} "type") $( test "$cfg_type" = "auto" && echo "$cfg_info" )$( test "$cfg_type" = "auto" || echo "INFO: full backup: $cfg_info" ) EFFECTIVE: type : $JOBDEF_TYPE $JOBDEF_AUTO log : $JOB_LOGFILE target : $( echo ${STORAGE_BASEDIR} | sed 's#:[^:]*@#:**********@#' ) EOFbackupinfo test -z "$STORAGE_BASEDIR" || ( echo " dirs to transfer : " j_getDirs2Backup | sed "s#^# #g" ) fi | tee -a "$JOB_LOGFILE" echo # -------------------------------------------------------------------------------- # start backup # -------------------------------------------------------------------------------- j_requireUser "root" if [ $bStart -eq 1 ]; then _j_runHooks "10-before-backup" sleep 3 # ------------------------------------------------------------ # local dumps # ------------------------------------------------------------ echo "INFO: $(date) - starting backup ... type $JOBDEF_TYPE - time $JOBDEF_STARTTIME " | tee -a "$JOB_LOGFILE" touch "${JOB_DONEFILE}.01.START" cat "$JOBFILE" >>"$JOB_LOGFILE" echo "INFO: $(date) - Making local backups ... ${DIR_SELF}/localdump.sh ALL" | tee -a "$JOB_LOGFILE" "${DIR_SELF}"/localdump.sh ALL | tee -a "$JOB_LOGFILE" rcBackup=$? echo "INFO: $(date) - local backups were finished" | tee -a "$JOB_LOGFILE" echo sleep 2 # ------------------------------------------------------------ # transfer # ------------------------------------------------------------ if [ -n "$STORAGE_BASEDIR" ] && [ -x "${DIR_SELF}/transfer.sh" ]; then # transfer files # cat "$STORAGEFILE" >>"$JOB_LOGFILE" echo "INFO: $(date) - Sending data to storage... ${DIR_SELF}/transfer.sh $JOBDEF_TYPE" | tee -a "$JOB_LOGFILE" touch "${JOB_DONEFILE}.02.STARTTRANSFER" # "${DIR_SELF}"/transfer.sh $JOBDEF_TYPE "$JOBDEF_AUTO" 2>&1 | tee -a "$JOB_LOGFILE" "${DIR_SELF}"/transfer.sh $JOBDEF_TYPE "$JOBDEF_AUTO" 2>&1 rcTransfer=$? else echo | tee -a "$JOB_LOGFILE" echo "SKIP TRANSFER - No backup of dirs to a backup target." | tee -a "$JOB_LOGFILE" echo | tee -a "$JOB_LOGFILE" fi rcBackup=$rcBackup+rcTransfer echo "INFO: $(date) - DONE" | tee -a "$JOB_LOGFILE" touch "${JOB_DONEFILE}.03.DONE" # ------------------------------------------------------------ # cleanup # ------------------------------------------------------------ echo echo "INFO: $(date) - compress older logs" echo find "${DIR_LOGS}" -name "*.log" -mtime +2 -print -exec gzip {} \; color cmd find "${DIR_LOGS}" -name "*.log" -mtime +2 -print -exec gzip {} \; color reset echo echo "INFO: $(date) - cleanup logs" echo find "${DIR_LOGS}" -mtime +28 -delete -print color cmd find "${DIR_LOGS}" -mtime +28 -delete -print color reset echo # ------------------------------------------------------------ # finish # ------------------------------------------------------------ echo STATUS $0 exit with final returncode rc=$rcBackup | tee -a "$JOB_LOGFILE" echo echo "log for this executed job is" ls -l "$JOB_LOGFILE" echo else echo "Nothing to do." fi # -------------------------------------------------------------------------------- exit $rcBackup # --------------------------------------------------------------------------------