From 6d20120408d9d8abcf6fdfaf2cb2af395ffaa997 Mon Sep 17 00:00:00 2001 From: patvdv Date: Thu, 14 May 2015 16:00:51 +0200 Subject: [PATCH] Initial commit --- README.md | 14 + run_aix_system_backup.sh | 684 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 698 insertions(+) create mode 100644 README.md create mode 100644 run_aix_system_backup.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..b3f118d --- /dev/null +++ b/README.md @@ -0,0 +1,14 @@ +# AIX scripts + +This is a small collection of AIX related scripts. YMMV in terms of usage. + +* **run_aix_system_backup** : script provides a centralized backup & recovery method involving a NIM master or any other available NFS server. Features: + * Support for AIX & VIOS hosts. + * Use of specific VIOS backup tools (iosbackup, viosbr …). + * Support for local, NFS based backups (NIM or other targets). Don’t use local unless required since a local backup may be totally useless for recovery! + * Support for 2 generations of backups. + * Saving of LPAR profile data (IVM only). + * Simple error alerting via mail. +For more documentation, read http://www.kudos.be/Projects/Comprehensive_AIX_system_backup_script_%28mksysb,_iosbackup%29.html + + diff --git a/run_aix_system_backup.sh b/run_aix_system_backup.sh new file mode 100644 index 0000000..0ffe6af --- /dev/null +++ b/run_aix_system_backup.sh @@ -0,0 +1,684 @@ +#!/bin/env ksh +#****************************************************************************** +# @(#) run_aix_system_backup.sh +#****************************************************************************** +# @(#) Copyright (C) 2013 by KUDOS BVBA . All rights reserved. +# +# This program is a free software; you can redistribute it and/or modify +# it under the same terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 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 +#****************************************************************************** +# @(#) MAIN: control_pkg_db.sh +# DOES: performs an mksysb, backupios, viosbr backup of an AIX/VIOS host to a +# local, NIM-based or NFS location; optionally creates a snap of the host +# EXPECTS: (see --help for more options) +# REQUIRES: check_lock_dir_(), check_params(), check_platform(), check_run_user(), +# die(), display_usage(), do_cleanup(), log(), send_alert(), warn() +# For other pre-requisites see the documentation in display_usage() +#****************************************************************************** + +#****************************************************************************** +# DATA structures +#****************************************************************************** + +# ------------------------- CONFIGURATION starts here ------------------------- +# define the V.R.F (version/release/fix) +AIX_VRF="1.0.0" +# specify the UNIX user that needs to be used for executing the script +EXEC_USER="root" +# default list of recipients receiving error/warning e-mails +TO_MSG="foo@bar.com" +# location of log directory (default), see --log-dir) +LOG_DIR="/var/log" +# location of temporary working storage +TMP_DIR="/var/tmp" +# ------------------------- CONFIGURATION ends here --------------------------- +# miscelleaneous +PATH=${PATH}:/usr/bin:/usr/local/bin +SCRIPT_NAME=$(basename $0) +SCRIPT_DIR=$(dirname $0) +HOST_NAME=$(hostname) +RC_VIOSBR=0 +RC_BACKUPIOS=0 +RC_MKSYSB=0 +RC_SNAP=0 +RC_NFS=0 +VIOS_VERSION="" +# command-line parameters +ARG_IS_IVM=0 # whether the VIOS host is using IVM for LPAR management +ARG_IS_VIOS=0 # whether the host is a VIOS, not a VIOS by default +ARG_LOG_DIR="" # location of the log directory (~root, thaler etc) +ARG_NFS_DIR="" # location of the save directory on the NFS server +ARG_NIM_DIR="" # location of the save directory on the NIM master +ARG_LOCAL_DIR="" # location of the local save directory +ARG_MAKE_SNAP=0 # make AIX 'snap' is off by default +ARG_SEND_ALERT=0 # sending mail is off by default +ARG_USE_NFS=0 # use NFS mount from random host (via AutoFS) is off by default +ARG_USE_NIM=0 # use NFS mount from NIM (via AutoFS) is off by default +ARG_LOG=1 # logging is on by default +ARG_VERBOSE=1 # STDOUT/STDERR is on by default + + +#****************************************************************************** +# FUNCTION routines +#****************************************************************************** + +# ----------------------------------------------------------------------------- +function check_lock_dir +{ +LOCK_DIR="${TMP_DIR}/.${SCRIPT_NAME}.lock" +mkdir ${LOCK_DIR} >/dev/null || { + print -u2 "ERROR: unable to acquire lock ${LOCK_DIR}" + ARG_VERBOSE=0 warn "unable to acquire lock ${LOCK_DIR}" + if [[ -f ${LOCK_DIR}/.pid ]] + then + LOCK_PID="$(cat ${LOCK_DIR}/.pid)" + print -u2 "ERROR: active MKSYSB running on PID: ${LOCK_PID}" + ARG_VERBOSE=0 warn "active MKSYSB running on PID: ${LOCK_PID}. Exiting!" + fi + exit 1 +} +print $$ >${LOCK_DIR}/.pid + +return 0 +} + +# ----------------------------------------------------------------------------- +function check_params +{ +# --is-ivm +if (( ARG_IS_VIOS == 0 && ARG_IS_IVM != 0 )) +then + print -u2 "ERROR: you cannot use '--is-ivm' without the '--is-vios' parameter" + exit 1 +fi +# --is-vios +if (( ARG_IS_VIOS != 0 )) +then + VIOS_VERSION="$(cat /usr/ios/cli/ios.level 2>/dev/null)" + if [[ -z "${VIOS_VERSION}" ]] + then + print -u2 "ERROR: host is a not a VIO server, bailing out" + exit 1 + fi +fi +# --local-dir +if (( ARG_USE_NIM == 0 && ARG_USE_NFS == 0 )) +then + if [[ -z "${ARG_LOCAL_DIR}" ]] + then + print -u2 "ERROR: you must specify a value for parameter '--local-dir'" + exit 1 + else + # create if missing + [[ -d "${ARG_LOCAL_DIR}" ]] || mkdir -p "${ARG_LOCAL_DIR}" >/dev/null + if [ \( ! -d "${ARG_LOCAL_DIR}" \) -o \( ! -w "${ARG_LOCAL_DIR}" \) ] + then + print -u2 "ERROR: unable to create/write to the target directory at ${ARG_LOCAL_DIR}" + exit 1 + fi + fi +fi +# --use-nfs/--nfs-dir +if (( ARG_USE_NFS != 0 )) +then + if [ \( ! -z "${ARG_LOCAL_DIR}" \) -o \( ! -z "${ARG_NIM_DIR}" \) ] + then + print -u2 "ERROR: you cannot use '--use-nfs' with '--local-dir' and/or NIM parameters" + exit 1 + fi + if [[ -z "${ARG_NFS_DIR}" ]] + then + print -u2 "ERROR: you must specify a value for parameter '--nfs-dir'" + exit 1 + fi +fi +# --use-nim/--nim-dir +if (( ARG_USE_NIM != 0 )) +then + if [ \( ! -z "${ARG_LOCAL_DIR}" \) -o \( ! -z "${ARG_NFS_DIR}" \) ] + then + print -u2 "ERROR: you cannot use '--use-nim' with '--local-dir' and/or NFS parameters" + exit 1 + fi + if [[ -z "${ARG_NIM_DIR}" ]] + then + print -u2 "ERROR: you must specify a value for parameter '--nim-dir'" + exit 1 + fi +fi +# --log-dir +[[ -z "${ARG_LOG_DIR}" ]] || LOG_DIR="${ARG_LOG_DIR}" +LOG_FILE="${LOG_DIR}/${SCRIPT_NAME}.log" +if (( ARG_LOG != 0 )) +then + if [ \( ! -d "${LOG_DIR}" \) -o \( ! -w "${LOG_DIR}" \) ] + then + print -u2 "ERROR: unable to write to the log directory at ${LOG_DIR}" + exit 1 + fi +fi +# --mail-to/--send-alert +if [ \( ! -z "${ARG_MAIL_TO}" \) -a \( ${ARG_SEND_ALERT} -eq 0 \) ] +then + print -u2 "ERROR: you cannot specify '--mail-to' without '--send-alert'" + exit 1 + +fi + +return 0 +} + +# ----------------------------------------------------------------------------- +function check_platform +{ +if [[ "$(uname -s)" != "AIX" ]] +then + print -u2 "ERROR: must be run on an AIX system" + exit 1 +fi + +return 0 +} + +# ----------------------------------------------------------------------------- +function check_run_user +{ +(IFS='()'; set -- $(id); print $2) | read UID +if [[ "${UID}" != "${EXEC_USER}" ]] +then + print -u2 "ERROR: must be run as user '${EXEC_USER}'" + exit 1 +fi + +return 0 +} + +# ----------------------------------------------------------------------------- +function die +{ +NOW="$(date '+%d-%h-%Y %H:%M:%S')" + +if [[ -n "$1" ]] +then + if (( ARG_LOG != 0 )) + then + print - "$*" | while read LOG_LINE + do + print "${NOW}: ERROR: [$$]:" "${LOG_LINE}" >>${LOG_FILE} + done + fi + print - "$*" | while read LOG_LINE + do + print -u2 "ERROR:" "${LOG_LINE}" + done + (( ARG_SEND_ALERT != 0 )) && send_alert "$1" +fi + +# finish up work +do_cleanup + +exit 1 +} + +# ----------------------------------------------------------------------------- +function display_usage +{ +cat << EOT + +**** ${SCRIPT_NAME} **** +**** (c) KUDOS BVBA - UNIX (Patrick Van der Veken) **** + +Performs an mksysb, backupios, viosbr backup of an AIX/VIOS host to a +local, NIM-based or NFS location; optionally creates a snap of the host. + +Syntax: ${SCRIPT_NAME} [--help] | [--version] | (--local-dir= | + --use-nfs --nfs-dir= | + --use-nim --nim-dir=) + [--is-vios [--is-ivm]] + [--make-snap] [--no-log] [--log-dir=] + [--send-alert [--mail-to=]] + + +Parameters: + +--is-ivm - perform a bkprofdata backup for VIOS using IVM (non-HMC) +--is-vios - perform a backup using viosbr (IOS 2.1+) and backupios + tools if the client host is a VIO server. +--local-dir - location of the save directory on a local filesystem. +--log-dir - specify a log directory location. +--mail-to - list of e-mail address(es) to which e-mails will to be send to. +--make-snap - make an AIX snap (cfr. IBM support). +--nfs-dir - location of the save directory on the NFS server. Format must be in typical + NFS mount notation, i.e. nfs_srv:/nfs_dir. +--nim-dir - location of the save directory on the NIM master server. Client hostname + is automatically appended to the given value when automounting the directory. +--no-log - do not log any messages to the script log file. +--send-alert - alert via e-mail upon occurrence of errors/warnings. +--use-nfs - create the backup on a NFS mount shared by an NFS server. + See Pre-requisites section below. +--use-nim - create the backup on a NFS mount shared by the NIM master. + See Pre-requisites section below. +--version : show the script version/release/fix + +Pre-requisites for the NIM method: + 1) NIM master must be configured to allow NFS mount from the client to the remote + target directory. The NFS mount name must end in the NIM client's hostname + (see /etc/xtab, /etc/exports on NIM master). + 2) NIM client (this host) must have AutoFS configured & active for /net + (see /etc/auto_master). + 3) A correctly configured /etc/niminfo file on the NIM client. + +Pre-requisites for the NFS method: + 1) NFS server must be configured to allow NFS mount from the client to the remote + target directory (see /etc/xtab, /etc/exports on NFS server) + +Note 1: NIM & NFS methods both employ a remote NFS mount for storage and as such they operate + in a similar manner. The NIM method differs in that it will try auto-discover which + host is the NIM master. In both cases you must have forward & reverse naming resolution + working correctly! + +Note 2: please make sure sufficient disk space is available at the save location to hold + 3 generations of backups during execution of the script. Only 2 generations will + be available at any given time (one being temporary). You will find these generations + as the 'prev' and 'curr' directory sets in the save location. + +EOT + +return 0 +} + +# ----------------------------------------------------------------------------- +function do_cleanup +{ +log "performing cleanup ..." +# remove working directory +if [[ -d ${WORK_DIR} ]] +then + rm -rf ${WORK_DIR} >/dev/null + log "${WORK_DIR} working directory removed" +fi +# disable temporary mountpoint for NFS method +if (( ARG_USE_NFS != 0 )) +then + log "trying to unmount ${TARGET_DIR}" + umount ${TARGET_DIR} >/dev/null + RC_NFS=$? + if (( RC_NFS == 0 )) + then + log "succesfully unmounteded ${TARGET_DIR}" + # remove temporary mount point + rm -rf ${TARGET_DIR} >/dev/null + else + warn "could not unmount ${TARGET_DIR}, please check! [RC=${RC_NFS}]" + fi +fi +# remove lock directory +if [[ -d ${LOCK_DIR} ]] +then + rm -rf ${LOCK_DIR} >/dev/null + log "${LOCK_DIR} lock directory removed" +fi + +log "*** finish of ${SCRIPT_NAME} [${CMD_LINE}] ***" + +return 0 +} + +# ----------------------------------------------------------------------------- +function log +{ +NOW="$(date '+%d-%h-%Y %H:%M:%S')" + +if [[ -n "$1" ]] +then + if (( ARG_LOG != 0 )) + then + print - "$*" | while read LOG_LINE + do + print "${NOW}: INFO: [$$]:" "${LOG_LINE}" >>${LOG_FILE} + done + fi + if (( ARG_VERBOSE != 0 )) + then + print - "$*" | while read LOG_LINE + do + print "INFO:" "${LOG_LINE}" + done + fi +fi + +return 0 +} + +# ----------------------------------------------------------------------------- +function send_alert +{ +NOW="$(date '+%d-%h-%Y %H:%M:%S')" +SUBJ_MSG="[${HOST_NAME}] ${SCRIPT_NAME} alert (${NOW})" +TEXT_MSG="$1" + +# override/set defaults +[[ -n "${ARG_MAIL_TO}" ]] && TO_MSG="${ARG_MAIL_TO}" +[[ -z "${FROM_MSG}" ]] && FROM_MSG="${EXEC_USER}@${HOST_NAME}" + +# build message components +cat <>${LOG_FILE} + done + fi + if (( ARG_VERBOSE != 0 )) + then + print - "$*" | while read LOG_LINE + do + print "WARN:" "${LOG_LINE}" + done + fi + (( ARG_SEND_ALERT != 0 )) && send_alert "$1" +fi + +return 0 +} + + +#****************************************************************************** +# MAIN routine +#****************************************************************************** + +# parse arguments/parameters +CMD_LINE="$@" +for PARAMETER in ${CMD_LINE} +do + case ${PARAMETER} in + -is-ivm|--is-ivm) + ARG_IS_IVM=1 + ;; + -is-vios|--is-vios) + ARG_IS_VIOS=1 + ;; + -log-dir=*) + ARG_LOG_DIR="${PARAMETER#-log-dir=}" + ;; + --log-dir=*) + ARG_LOG_DIR="${PARAMETER#--log-dir=}" + ;; + -nfs-dir=*) + ARG_NFS_DIR="${PARAMETER#-nfs-dir=}" + ;; + --nfs-dir=*) + ARG_NFS_DIR="${PARAMETER#--nfs-dir=}" + ;; + -nim-dir=*) + ARG_NIM_DIR="${PARAMETER#-nim-dir=}" + ;; + --nim-dir=*) + ARG_NIM_DIR="${PARAMETER#--nim-dir=}" + ;; + -mail-to=*) + ARG_MAIL_TO="${PARAMETER#-mail-to=}" + ;; + --mail-to=*) + ARG_MAIL_TO="${PARAMETER#--mail-to=}" + ;; + -make-snap|--make-snap) + ARG_MAKE_SNAP=1 + ;; + -local-dir=*) + ARG_LOCAL_DIR="${PARAMETER#-local-dir=}" + ;; + --local-dir=*) + ARG_LOCAL_DIR="${PARAMETER#--local-dir=}" + ;; + -send-alert|--send-alert) + ARG_SEND_ALERT=1; + ;; + -use-nfs|--use-nfs) + ARG_USE_NFS=1 + ;; + -use-nim|--use-nim) + ARG_USE_NIM=1 + ;; + -no-log|--no-log) + ARG_LOG=0 + ;; + -V|-version|--version) + print "INFO: $0: ${AIX_VRF}" + exit 0 + ;; + \? | -h | -help | --help) + display_usage + exit 0 + ;; + esac +done + +# startup checks +check_params && check_run_user && check_platform + +# catch shell signals +trap 'do_cleanup; exit' 1 2 3 15 + +log "*** start of ${SCRIPT_NAME} [${CMD_LINE}] ***" +(( ARG_LOG != 0 )) && log "logging takes places in ${LOG_FILE}" + +# check/create lock file & write PID file +check_lock_dir + +# ----------------------------------------------------------------------------- +# determine target location +# ----------------------------------------------------------------------------- + +# set local target +if (( ARG_USE_NIM == 0 && ARG_USE_NFS == 0 )) +then + log "using local target ${ARG_LOCAL_DIR} for backup" + TARGET_DIR=${ARG_LOCAL_DIR} +fi + +# set & mount NFS target +if (( ARG_USE_NFS != 0 )) +then + log "using NFS mount for backup" + # ready NFS mount + TARGET_DIR="${TMP_DIR}/$$" + mkdir -p ${TARGET_DIR} >/dev/null || die "failed to create NFS mountpoint at ${TARGET_DIR}" + mount ${ARG_NFS_DIR} ${TARGET_DIR} >/dev/null + RC_NFS=$? + if (( RC_NFS == 0 )) + then + log "NFS directory ${ARG_NFS_DIR} mounted onto ${TARGET_DIR}" + else + die "could not NFS mount ${ARG_NFS_DIR} to ${TARGET_DIR} [RC=${RC_NFS}]" + fi +fi + +# set & mount NIM target +if (( ARG_USE_NIM != 0 )) +then + log "using NIM mount for backup" + # source NIM info file + [[ -f /etc/niminfo ]] || die "/etc/niminfo file is missing for NIM-based backup" + . /etc/niminfo + [[ -z "${NIM_MASTER_HOSTNAME}" ]] && die "could not determine NIM master name" + # chop a leading slash + ARG_NIM_DIR="$(print ${ARG_NIM_DIR#/*})" + [[ -z "${ARG_NIM_DIR}" ]] && \ + die "could not determine save location from '--nim-dir' value" + # ready NIM NFS mount + TARGET_DIR="/net/${NIM_MASTER_HOSTNAME}/${ARG_NIM_DIR}/${HOST_NAME}" + cd ${TARGET_DIR} >/dev/null + cd - >/dev/null + # check that we have the NIM mount + CHECK_NIM=$(mount | grep -c -E -e "^${NIM_MASTER_HOSTNAME}.*${TARGET_DIR}") + (( CHECK_NIM == 0 )) && die "could not automount ${TARGET_DIR}" +fi + +# ----------------------------------------------------------------------------- +# do backup(s) +# ----------------------------------------------------------------------------- + +# set temporary backup directory +WORK_DIR="${TARGET_DIR}/${SCRIPT_NAME}.$$" +mkdir ${WORK_DIR} >/dev/null || \ + die "could not create backup working directory in ${WORK_DIR}" +chmod 700 ${WORK_DIR} >/dev/null + +# check for VIOS? +if [ \( ARG_IS_VIOS != 0 \) -a \( -n "${VIOS_VERSION}" \) ] +then + log "VIOS check: running on a VIO server [${VIOS_VERSION}]" + # run VIOSBR, only on ioslevel 2.1+ + case "${VIOS_VERSION}" in + 1.*|2.0*) + log "VIOSBR backup not supported on this ioslevel, skipping" + ;; + 2.*) + # check standard backup directory + if [[ ! -d /home/padmin/cfgbackups ]] + then + mkdir -p /home/padmin/cfgbackups >/dev/null + chown padmin /home/padmin/cfgbackups >/dev/null + fi + log "starting the VIOSBR backup in /home/padmin/cfgbackups ..." + TIMESTAMP="$(date '+%Y%m%d')" + /usr/ios/cli/ioscli viosbr -backup -file ${HOST_NAME}_${TIMESTAMP}.viosbr >${WORK_DIR}/viosbr.log 2>&1 + RC_VIOSBR=$? + if (( RC_VIOSBR == 0 )) + then + [[ -f /home/padmin/cfgbackups/${HOST_NAME}_${TIMESTAMP}.viosbr.tar.gz ]] && \ + cp -p /home/padmin/cfgbackups/${HOST_NAME}_${TIMESTAMP}.viosbr.tar.gz ${WORK_DIR} + if (( $? == 0 )) + then + chmod 600 ${WORK_DIR}/${HOST_NAME}_${TIMESTAMP}.viosbr.tar.gz >/dev/null + log "VIOSBR file created and copied to ${WORK_DIR}" + else + warn "failed to move VIOSBR file to ${WORK_DIR}" + fi + else + warn "failed to create VIOSBR file [RC=${RC_VIOSBR}]" + fi + ;; + *) + log "VIOSBR backup not supported on this ioslevel, skipping" + ;; + esac + # run bkprofdata (IVM only, non-HMC) + if (( ARG_IS_IVM != 0 )) + then + log "starting the BKPROFDATA backup in /home/padmin ..." + TIMESTAMP="$(date '+%Y%m%d')" + su - padmin -c "bkprofdata -o backup -f ${HOST_NAME}_${TIMESTAMP}.bkprofdata" + RC_BKPROFDATA=$? + if (( RC_BKPROFDATA == 0 )) + then + [[ -f /home/padmin/${HOST_NAME}_${TIMESTAMP}.bkprofdata ]] && \ + cp -p /home/padmin/${HOST_NAME}_${TIMESTAMP}.bkprofdata ${WORK_DIR} + if (( $? == 0 )) + then + chmod 600 ${WORK_DIR}/${HOST_NAME}_${TIMESTAMP}.bkprofdata >/dev/null + log "BKPROFDATA file created and copied to ${WORK_DIR}" + else + warn "failed to move BKPROFDATA file to ${WORK_DIR}" + fi + else + warn "failed to create BKPROFDATA file [RC=${RC_BKPROFDATA}]" + fi + + fi + # run backupios + log "starting the BACKUPIOS backup in ${WORK_DIR} ..." + /usr/ios/cli/ioscli backupios -file ${WORK_DIR}/${HOST_NAME}.backupios >${WORK_DIR}/backupios.log 2>&1 + RC_BACKUPIOS=$? + if (( RC_BACKUPIOS == 0 )) + then + log "BACKUPIOS file created at ${WORK_DIR}/${HOST_NAME}.backupios" + chmod 600 ${WORK_DIR}/${HOST_NAME}.backupios >/dev/null + else + warn "failed to create BACKUPIOS file at ${WORK_DIR}/${HOST_NAME}.backupios [RC=${RC_BACKUPIOS}]" + fi +else + # run MKSYSB + log "VIOS check: running on regular AIX host or no '--is-vios' given" + log "starting the MKSYSB backup in ${WORK_DIR} ..." + mksysb -i -e ${WORK_DIR}/${HOST_NAME}.mksysb >${WORK_DIR}/mksysb.log 2>&1 + RC_MKSYSB=$? + if (( RC_MKSYSB == 0 )) + then + log "MKSYSB file created at ${WORK_DIR}/${HOST_NAME}.mksysb" + chmod 600 ${WORK_DIR}/${HOST_NAME}.mksysb >/dev/null + else + warn "failed to create MKSYSB file at ${WORK_DIR}/${HOST_NAME}.mksysb [RC=${RC_MKSYSB}]" + fi +fi + +# run SNAP +if (( ARG_MAKE_SNAP != 0 )) +then + log "requested a SNAP, creating one at the default location ..." + snap -ac >${WORK_DIR}/snap.log 2>&1 + RC_SNAP=$? + if (( RC_SNAP == 0 )) + then + [[ -f /tmp/ibmsupt/snap.pax.Z ]] && mv /tmp/ibmsupt/snap.pax.Z ${WORK_DIR} + if (( $? == 0 )) + then + chmod 600 ${WORK_DIR}/snap.pax.Z >/dev/null + log "SNAP file created and moved to ${WORK_DIR}" + else + warn "failed to move SNAP file to ${WORK_DIR}" + fi + else + warn "failed to create SNAP at default location [RC=${RC_SNAP}]" + fi +fi + +# handle backup generations, we only discard the current backup +# if RC_MKSYSB != 0 or RC_BACKUPIOS != 0 +log "rotating backup generations ..." +if (( RC_MKSYSB == 0 && RC_BACKUPIOS == 0 )) +then + [[ -d ${TARGET_DIR}/prev ]] && rm -rf ${TARGET_DIR}/prev >/dev/null + [[ -d ${TARGET_DIR}/curr ]] && mv ${TARGET_DIR}/curr ${TARGET_DIR}/prev >/dev/null + mv ${WORK_DIR} ${TARGET_DIR}/curr >/dev/null + log "available backup(s) are now:" + log "$(ls -ld ${TARGET_DIR}/*)" +fi + +# finish up work +do_cleanup + +#****************************************************************************** +# END of script +#******************************************************************************