Files
mastering-unix-ss/chapter27/dirvish_ctrl
Fabio Scotto di Santolo 4cc88d2f6e initial commit
2020-07-28 19:28:25 +02:00

1141 lines
29 KiB
Bash
Executable File

#!/bin/bash
#
# SCRIPT: dirvish_ctrl
# AUTHOR: Randy Michael
# DATE: 5/14/2007
# REV: 1.0
# PLATFORM: Most any UNIX platform
#
# PURPOSE: This script is used to interface with the Dirvish
# backup utilities.
#
# set -x # Uncomment to debug this script
#
# set -n # Uncomment to check the script's syntax
# # without any execution. Do not forget to
# # recomment this line!
#
########################################
# REVISION LIST:
########################################
#
# IF YOU MODIFY THIS SCRIPT DOCUMENT THE CHANGE(S)!!!
#
########################################
#
# Revised by:
# Revision Date:
# Revision:
#
#
########################################
#
# Revised by:
# Revision Date:
# Revision:
#
########################################
# DEFINE FILES AND VARIABLES HERE
########################################
RESTORE_AREA=/dirvish_restores
DIRVISH_SERVER=$(hostname)
DEFAULT_CONF=/tmp/dirvish_build_conf.out
LOGFILE=${DIR}/$(basename $0).log
echo -e "\n\t\tDirvish Log Created: $(date) \n" >$LOGFILE
DONE=0
PATH=$PATH:/usr/sbin:/usr/local/sbin:.
########################################
# DEFINE FUNCTIONS HERE
########################################
display_main_menu ()
{
# This function displays the main menu
clear # Clear the screen
# Display the menu header and menu
echo -e "\n\n\tWELCOME TO DIRVISH BACKUP COMMAND-CENTER
\t1) Dirvish RunAll Backups
\t2) Dirvish Run Backup
\t3) Dirvish Locate/Restore Image
\t4) Dirvish Expire/Delete Backup(s)
\t5) Dirvish Add a New Backup
\t6) Dirvish Remove a Backup
\t7) Dirvish Manage Backup Banks
\t8) EXIT
"
echo -e "\tSelect an Option: \c"
}
########################################
read_input ()
{
# This function is used to save user input
LINE= # Initialize LINE to NULL
while true
do
read "ENTRY"
if [[ $ENTRY = 99 ]]
then
echo "$LINE"
break
fi
LINE="$LINE
$ENTRY"
done
}
########################################
parse_conf ()
{
# This function parses through the Dirvish Master
# Configuration File, specified by $M_CONFIG, to
# gather a list of all of the defined Dirvish banks.
# set -x # Uncomment to debug this function
# Initial local variables
BANK_LIST=
START=0
# Loop through the $M_CONFIG file until we find
# the 'bank:' stanza, then add each bank to a list
# until we reach another stanza, 'stanza:'
# Loop through the $M_CONFIG file until we find
# the 'bank:' stanza, then add each bank to a list
# until we reach another stanza, 'stanza:'
while read DATA
do
[[ $DATA = 'bank:' ]] && START=1 && continue
if (( START == 1 ))
then
if $(echo "$DATA" | grep -q ':')
then
break
else
if [[ -z "$BANK_LIST" ]]
then
BANK_LIST="$DATA"
else
BANK_LIST="$BANK_LIST $DATA"
fi
fi
fi
done < $M_CONFIG # Feed the while loop from the bottom
echo "$BANK_LIST" # Return the list
}
########################################
build_default_conf ()
{
# Define files and variables here
HN="$1" # Hostname of server to add
BANK="$2" # Bank to use for backup
DAYS="$3" # Days before backups expire
TREE="$4" # Directory tree to back up
IGNORE_LIST="$5" # Files and directories to ignore
OUTFILE=$DEFAULT_CONF # Name of the output file
# All of the following output is used to build the
# new default.conf file for this backup
{
echo "client: $HN"
echo "bank: $BANK"
echo "vault: $HN"
echo "server: $DIRVISH_SERVER"
echo "expire: $DAYS day"
echo "index: gzip"
echo "log: gzip"
echo "image: ${HN}-%y%m%d%H%M%S"
echo "tree: $TREE"
echo -e "\nexclude:"
echo "$IGNORE_LIST" | sed /^$/d | while read Q
do
echo -e "\t$Q"
done
} >$OUTFILE
}
########################################
run_all ()
{
# This function runs all of the backups defined in
# the Dirvish master configuration file stanza "Runall:"
clear # Clear the screen
echo -e "\n\n"
# Execute all master.conf defined backups
dirvish-runall
if (( $? == 0 ))
then
echo -e "\n\tBackups Complete...Press Enter to Continue...\c"
else
echo -e "\n\tDirvish Backup ERROR...Press Enter to Continue...\c"
fi
read KEY
}
########################################
run_backup ()
{
# This function runs one particular backup
# set -x # Uncomment to debug this function
clear # Clear the screen
# Display the screen heading and query the user
echo -e "\n\n\t\tRUN A PARTICULAR BACKUP\n"
echo -e "\tEnter a Hostname to Backup: \c"
read HTBU # Host to Backup
echo "Searching for default.conf in ${HTBU}'s Vault"
BANK_LIST=$(parse_conf)
for P in $BANK_LIST
do
# Find the Default Config file (default.conf) for $HTBU
DCF=$(find ${P}/${HTBU} -type f -name default.conf)
if [[ ! -z $DCF ]]
then
echo -e "\nFound Configuration File...Starting Backup..."
dirvish --vault $HTBU
RC=$?
echo -e "\nDirvish Exit Code: $RC"
echo -e "\nBackup Complete..."
echo -e "\nPress Enter to Continue...\c"
read KEY
break
else
echo -e "\nERROR: Could not Locate the Configuration File for $HTBU"
echo -e "\n...You Need to Configure $HTBU for Dirvish Backup First"
echo -e "\nPress Enter to Continue...\c"
read KEY
fi
done
if [[ -z "$DCF" ]]
then
echo -e "\nERROR: Could not Locate the Configuration File for $HTBU"
echo -e "\n...You Need to Configure $HTBU for Dirvish Backup First"
echo -e "\nPress Enter to Continue...\c"
read KEY
fi
}
########################################
chk_create_dir ()
{
# This function is used to add a new Dirvish "bank" to
# the Dirvish backup server, which should be this machine
D=$1 # Directory name to add
if [ ! -d $D ] # Check if the directory already exists
then
echo -e "\n$D Directory Does Not Exist...Create $D Directory? (y/n): \c"
read ANS
case $ANS in
y|Y) echo -e "\nCreating $D Directory..."
mkdir -p $D
if (( $? == 0 ))
then
echo -e "\n$D Directory Created"
else
echo -e "\n$D Directory Creation Failed...See Administrator..."
fi
;;
n|N) echo -e "\nSkipping Creating the $D Directory"
echo -e "\nWARNING: Until the $D Directory is Created Dirvish Cannot use this Bank\n"
;;
*) echo -e "\nInvalid Input..."
;;
esac
fi
}
########################################
locate_restore_image ()
{
# set -x # Uncomment to debug this function
clear # Clear the screen
# Display the screen heading, query the user, display the
# files matching the search, and ask if the user wants to
# restore the files. If a restore is requested we ensure
# there is a directory for the target server in the $RESTORE_AREA,
# if not create it, and copy the files into this subdirectory in
# the $RESTORE_AREA.
echo -e "\n\n\t\tLOCATE/RESTORE A BACKUP IMAGE\n"
echo -e "Enter the Hostname where the File/Directory Resides: \c"
read H
echo -e "\nEnter as Much of the Directory path and File Name as You Know:\n"
read "DP"
if [ "$DP" = '/' ]
then
echo -e "\nERROR: This Program is Not Intended for Full System Restores...\n"
sleep 2
return
fi
echo -e "\nSearching for Archive Images..."
# Search and display all matching files one page at a time
dirvish-locate $H ${DP} | more
QUIT=0
until (( QUIT == 1 ))
do
echo -e "\nDid You Find What You Want? (y/n): \c"
read ANS1
case $ANS1 in
y|Y) echo -e "\nDo You Want to Perform a Restore? (y/n): \c"
read ANS2
while true
do
case $ANS2 in
y|Y) QUIT=1
break
;;
n|N) echo -e "\nPress Enter to Continue...\c"
read KEY
return 0
;;
*) echo -e "\nInvalid Input..."
;;
esac
done
;;
n|N) return 0
;;
*) echo -e "\nInvalid Input..."
;;
esac
done
echo -e "\nEnter the FULL PATHNAME of the File/Directory You Want to Restore:\n"
read TARGET
if [ -z "$TARGET" ]
then
echo -e "\nInvalid Entry..."
sleep 2
return
fi
if [[ $(echo "$TARGET" | cut -c1) != '/' ]]
then
echo -e "\nERROR: $TARGET is Not a Valid Full Pathname...\n"
sleep 2
break
fi
echo -e "\nSearching Images..."
dirvish-locate "$H" "${TARGET}" | more
echo -e "\nEnter the Image to Restore From: \c"
read IMAGE_NAME
echo
# Check to ensure that the defined $RESTORE_AREA
# directory has been created on the system.
if [[ ! -d $RESTORE_AREA ]]
then
mkdir -p $RESTORE_AREA
fi
# Ensure that a subdirectory exists for this host
if [[ ! -d ${RESTORE_AREA}/${H} ]]
then
mkdir -p ${RESTORE_AREA}/${H}
fi
BANK_LIST=$(parse_conf)
# This is where we restore the data
for BANK in $BANK_LIST
do
if [ -d "$TARGET" ]
then
# If $TARGET is a directory we only want the last
# part of the path, not the entire path.
TARGET=$(basename "$TARGET")
find ${BANK}/${H}/${IMAGE_NAME}/tree -name "${TARGET}*" -print \
-exec cp -rp {} "${RESTORE_AREA}/${H}" \; 2>/dev/null
if (( $? == 0 ))
then
echo -e "\nFiles Restored to the Following Restore Area:"
echo -e "\n${RESTORE_AREA}/${H}/${TARGET}\n\n"
break
else
echo -e "\nRestore Failed...See Administrator...\n"
break
fi
else
# We are working with a file
D_NAME=$(dirname "$TARGET" | cut -d '/' -f3-)
F_NAME=$(basename "$TARGET")
echo "DIRNAME is $D_NAME"
# Find and copy the file(s) to the $RESTORE_AREA
find ${BANK}/${H}/${IMAGE_NAME}/tree/*${D_NAME} -name "${F_NAME}" \
-print -exec cp -rp {} "${RESTORE_AREA}/${H}" \; 2>/dev/null
if (( $? == 0 ))
then
echo -e "\nFiles Restored to the Following Restore Area:"
echo -e "\n${RESTORE_AREA}/${H}/${F_NAME}\n\n"
break
else
echo -e "\nRestore Failed...See Administrator...\n"
break
fi
fi
done
echo -e "\nPress Enter to Continue...\c"
read KEY
}
########################################
expire_backup ()
{
# This function is used to expire backups
# set -x # Uncomment to debug this function
clear # Clear the screen
# Display the screen header and menu
echo -e "
\n\n\t\tDIRVISH EXPIRE BACKUP(S)\n
\n\t1) Delete Expired Backups for ALL Hosts
\n\t2) Delete Expired Backups for One Host
\n\t3) Expire One Backup for One Host
\n\t4) Expire All Backups for One Host
\n\t5) Previous Menu
\n\n\tSelect an Option: \c"
read ANS
case $ANS in
1) echo -e "\n\tDeleting Expired Backups for ALL Hosts..."
dirvish-expire --tree
echo -e "\n\tTasks Complete..."
echo -e "\n\tPress Enter to Continue...\c"
read KEY
;;
2) echo -e "\n\tEnter the Hostname to Delete Expired Backups: \c"
read H
dirvish-expire --tree --vault $H | more
echo -e "\n\tTasks Complete..."
echo -e "\n\tPress Enter to Continue...\c"
read KEY
;;
3) EXPIRE_STAMP="$(date "+%Y-%m-%d %H:%M:%S")"
echo -e "\n\tEnter the Hostname for the Backup Image: \c"
read H
BANK_LIST=$(parse_conf)
MYPWD=$(pwd)
for B in $BANK_LIST
do
if [ -d ${B}/${H} ]
then
cd ${B}/${H}
IMAGE_LIST=$(find . -type d -name "*-[0-9][0-9]*" | cut -c3-)
fi
done
echo -e "\nSelect an Image to Expire from the Following List:\n"
echo -e "\n$IMAGE_LIST" | more
echo -e "\n\nEnter the Image to Expire: \c"
read IMAGE_NAME
cd $MYPWD
if [[ -r ${B}/${H}/${IMAGE_NAME}/summary ]]
then
# This is where we expire a backup that is not currently
# expired. The 'summary' file contains the expire datestamp
echo -e "\n\tExpiring Image: $IMAGE_NAME"
sed s/"$(grep Expire ${B}/${H}/${IMAGE_NAME}/summary)"/"$(grep Expire ${B}/${H}/${IMAGE_NAME}/summary | cut -f 1-4 -d ' ') $EXPIRE_STAMP"/g "${B}/${H}/${IMAGE_NAME}/summary" > "${B}/${H}/${IMAGE_NAME}/summary2"
mv "${B}/${H}/${IMAGE_NAME}/summary2" "${B}/${H}/${IMAGE_NAME}/summary"
fi
# We expired the backups; now we ask the user if we should delete
# the expired images
STOP=0
until (( STOP == 1 ))
do
echo -e "\n\tTasks Complete...Do You Want to Delete This Expired Image? (y/n): \c"
read ANS
case $ANS in
y|Y) echo -e "\n\tDeleting Expired Image: $IMAGE_NAME"
# This next command deletes all expired images for $H
dirvish-expire --vault $H
RC=$?
echo -e "\n\tDirvish-expire Completed with Return Code: $RC"
echo -e "\n\tTasks Complete..."
echo -e "\n\tPress Enter to Continue...\c"
read KEY
STOP=1
;;
n|N) STOP=1
continue
;;
*) echo -e "\n\tInvalid Entry..."
;;
esac
done
;;
4) EXPIRE_STAMP=$(date "+%Y-%m-%d %H:%M:%S")
clear
echo -e "\nEnter the Hostname for the Backup Image: \c"
read H
BANK_LIST=$(parse_conf)
MYPWD=$(pwd)
for P in $BANK_LIST
do
if [ -d ${P}/${H} ]
then
cd ${P}/${H}
IMAGE_LIST=$(find . -type d -name "*-[0-9][0-9]*" | cut -c3-)
B=$P
fi
done
echo -e "\nSetting to Following Images to Expire:\n\n"
echo "$IMAGE_LIST" | more
cd $MYPWD
echo -e "\nPress Enter to Continue...\c"
echo "$IMAGE_LIST" | while read IMAGE_NAME
do
if [ -f ${B}/${H}/${IMAGE_NAME}/summary ]
then
echo "Expiring $IMAGE_NAME"
sed s/"$(grep Expire ${B}/${H}/${IMAGE_NAME}/summary)"/"$(grep Expire ${B}/${H}/${IMAGE_NAME}/summary | cut -f 1-4 -d ' ') $EXPIRE_STAMP"/g "${B}/${H}/${IMAGE_NAME}/summary" > "${B}/${H}/${IMAGE_NAME}/summary2"
if (( $? == 0 ))
then
mv ${B}/${H}/${IMAGE_NAME}/summary2 ${B}/${H}/${IMAGE_NAME}/summary
fi
fi
done
STOP=0
until (( STOP == 1 ))
do
echo -e "\nTasks Complete...Do You Want to Delete Expired Images? (y/n): \c"
read ANS
case $ANS in
y|Y) echo -e "\nDeleting Expired Images...\n"
dirvish-expire --vault $H
RC=$?
echo -e "\nDirvish-expire Completed with Return Code: $RC"
echo -e "\nTasks Complete..."
echo -e "\nPress Enter to Continue...\c"
read KEY
STOP=1
;;
n|N) STOP=1
continue
;;
*) echo -e "\n\tInvalid Entry..."
;;
esac
done
;;
5) :
;;
*) echo -e "\nInvalid Entry"
;;
esac
}
########################################
add_backup ()
{
# This function is used to define a new backup to Dirvish
# set -x # Uncomment to debug this function
# Get a list of available banks
BANK_LIST=$(parse_conf)
ESCAPE=0
until (( ESCAPE == 1 ))
do
clear
echo -e "
\n\n\t\t DIRVISH ADD A BACKUP
\n\tSelect Each Option to Add a New Backup
\n\t1) Enter Hostname
\n\t2) Select a Bank for this Backup
\n\t3) Enter Directory Tree to Back up
\n\t4) Enter Directory Trees to Ignore
\n\t5) Enter Days to Retain Each Backup
\n\t6) Add this New Dirvish Backup Definition
\n\t7) Create the Initial Dirvish Backup
\n\t8) Main Menu
\n\n\tSelect Each Option to Add a New Backup
\n\n\tEnter Option: \c"
read OPTION # Read in the user response
# Perform the desired operation
case $OPTION in
1) echo -e "\n\tEnter the Hostname for this Backup: \c"
read HN
for B in $BANK_LIST
do
P=$(find $B -type d -name $HN)
if [ ! -z $P ]
then
echo -e "\n\tWARNING: Vault $HN Already Exists in the Following Bank:"
echo -e "\n\t$P"
echo -e "\n\tDo you want to create a new default.conf file for $HN? (y/n): \c"
ANS=n # Set the default answer to 'n', No.
read ANS
case $ANS in
y|Y) continue
;;
n|N) return
;;
esac
fi
done
;;
2) FINISH=0
until (( FINISH == 1 ))
do
clear
BANK=
echo -e "\n\n\t\tSELECT A BANK TO STORE THIS BACKUP\n"
echo -e "\nAvailable Banks:\n"
for B in $BANK_LIST
do
echo -e "\t$B"
done
echo -e "\nPlease Enter a Bank: \c:"
read BANK
if $(echo $BANK_LIST | grep -q ${BANK})
then
echo "$BANK selected for $HN"
FINISH=1
else
echo -e "\nERROR: $BANK is not a Valid Bank"
sleep 2
continue
fi
done
;;
3) echo -e "\n\tEnter the Directoy Tree to Backup: \c"
read TREE
continue
;;
4) clear
echo -e "\n\n\tDIRECTORY TREE(S) and FILES TO IGNORE\n"
echo -e "\nThe Specified Directory Tree Contains the Following Files/Directories:\n\n"
if [ $HN = $(hostname) ]
then
ls $TREE | more
else
ssh $HN ls $TREE | more
fi
echo -e "\nDo you want to Exclude any Files or Directories from the Backups? (y/n): \c"
read ANS3
case $ANS3 in
y|Y) echo -e "\n\tEnter Directories and Files to Ignore One per Line\n"
echo -e "Enter 99 when finished\n"
IGNORE_LIST=$(read_input)
continue
;;
n|N) IGNORE_LIST=$(echo)
continue
;;
*) echo -e "\nInvalid Entry..."
;;
esac
;;
5) echo -e "\n\tDays before each Backup Expires: \c"
read DAYS
continue
;;
6) clear
echo -e "\n\n\tADD NEW BACKUP TO DIRVISH"
if [[ -r "${BANK}/${HN}/dirvish/default.conf" ]]
then
echo -e "\nWARNING: default.conf File Exists...Rebuild default.conf? (y/n): \c"
read ANS
case $ANS in
y|Y) echo -e "\n\nCreating default.conf Dirvish Configuration File for $HN"
build_default_conf $HN "$BANK" $DAYS "$TREE" "$IGNORE_LIST"
echo -e "\nCopying file to: ${BANK}/${HN}/dirvish/default.conf"
mkdir -p ${BANK}/${HN}/dirvish
cp -f $DEFAULT_CONF ${BANK}/${HN}/dirvish/default.conf
echo -e "\n\n...Press ENTER to Continue...\c"
read ANS
;;
*) break
;;
esac
else
echo -e "\n\nCreating default.conf Dirvish Configuration File for $HN"
build_default_conf $HN "$BANK" $DAYS "$TREE" "$IGNORE_LIST"
echo -e "\nCopying file to: ${BANK}/${HN}/dirvish/default.conf"
mkdir -p ${BANK}/${HN}/dirvish
cp -f $DEFAULT_CONF ${BANK}/${HN}/dirvish/default.conf
echo -e "\n...Press ENTER to Continue...\c"
read ANS
fi
;;
7) clear
echo -e "\n\n\tCREATE INITIAL DIRVISH BACKUP"
echo -e "\n"
if [[ ! -d "${BANK}/${HN}" ]]
then
echo -e "\nCreating Vault $HN for this Backup"
mkdir -p "${BANK}/${HN}"
mkdir -p "${BANK}/${HN}/dirvish"
else
echo -e "\nBackup Vault for $HN Exists...Continuing..."
fi
if [[ ! -r "${BANK}/${HN}/dirvish/default.conf" ]]
then
# Now we have enough information to build the
# new default.conf file
echo -e "Creating default.conf Dirvish Configuration File for $HN"
build_default_conf $HN "$BANK" $DAYS "$TREE" "$IGNORE_LIST"
echo -e "\nCopying file to: ${BANK}/${HN}/dirvish/default.conf"
cp -f $DEFAULT_CONF ${BANK}/${HN}/dirvish/default.conf
# Now we need to run an initial backup
echo -e "\nRun an Initial Backup Now? (y/n): \c"
read BACK_NOW
case $BACK_NOW in
y|Y) echo -e "\nExecuting Initial Dirvish Backup for $HN..."
dirvish --vault $HN --init
RC=$?
echo -e "\nInitial Backup for $HN Completed with a Return Code: $RC"
echo -e "\nPress Enter to Continue...\c"
read KEY
;;
n|N) echo -e "\nInitial Backup Skipped..."
echo -e "\nDo Not Forget to Run an Initial Dirvish Backup!"
echo -e "\nTo Manually Run an Initial Backup Enter:\n"
echo -e "\t/usr/sbin/dirvish --vault $HN --init\n"
echo -e "\nPress Enter to Continue...\c"
read KEY
;;
*) echo -e "\nInvalid Input..."
;;
esac
else
FINISH=0
until (( FINISH == 1 ))
do
echo -e "\nRun an Initial Backup Now? (y/n): \c"
read BACK_NOW
case $BACK_NOW in
y|Y) echo -e "\nExecuting Initial Dirvish Backup for $HN..."
dirvish --vault $HN --init
RC=$?
echo -e "\nInitial Backup for $HN Completed with a Return Code: $RC"
echo -e "\nPress Enter to Continue...\c"
read KEY
FINISH=1
;;
n|N) echo -e "\nInitial Backup Skipped..."
echo -e "\nDo Not Forget to Run an Initial Dirvish Backup!"
echo -e "\nTo Manually Run an Initial Backup Enter:\n"
echo -e "\tdirvish --vault $HN --init\n"
echo -e "\nPress Enter to Continue...\c"
read KEY
FINISH=1
;;
*) echo -e "Invalid Entry..."
sleep 2
;;
esac
done
fi
continue
;;
8) break
;;
esac
done
}
########################################
delete_backup ()
{
# This function is used to delete backups from the Dirvish server
clear # Clear the screen
echo -e "\n\n\tREMOVE A SERVER FROM DIRVISH BACKUPS\n"
echo -e "\n\tEnter the Host to Remove from Dirvish Backups: \c"
read H
BANK_LIST=$(parse_conf)
for P in $BANK_LIST
do
VAULT_ID=$(find $P -type d -name "$H")
if [[ ! -z "$VAULT_ID" ]]
then
STOP=0
until (( STOP == 1 ))
do
echo -e "\n\tRemove Backup Vault $H from the Dirvish Backup Server? (y/n): \c"
read ANS
case $ANS in
y|Y) echo -e "\n\tRemoving Backup Vault for $H from Dirvish Backups...\c"
rm -fr "$VAULT_ID"
echo -e "\n\tBackup Vault Removed...Press Enter to Continue...\c"
read KEY
STOP=1
;;
n|N) echo -e "\n\tVault Removal Canceled...Press Enter to Continue...\c"
read KEY
STOP=1
continue
;;
*) echo -e "\n\tInvalid Entry..."
;;
esac
done
fi
done
}
########################################
manage_banks ()
{
# This function is used to add and delete Dirvish banks
# set -x # Uncomment to debug this function
clear # Clear the screen`
# Get a list of currently defined Dirvish banks
BANK_LIST=$(parse_conf)
# Display the screen header information
echo -e "\n\n\tMANAGE DIRVISH BACKUP BANKS"
echo -e "\n\nCurrently Configured Backup Bank(s):\n"
NO_BANK=0
# If this is an initial installation there will not
# be any Dirvish banks defined.
if [ -z "$BANK_LIST" ]
then
NO_BANK=1
echo -e "\nNo Backup Banks Have Been Defined in Dirvish\n"
else
BANK_FILE=/tmp/backlist.out
>$BANK_FILE
COUNT=0
for B in $BANK_LIST
do
((COUNT == COUNT + 1))
LAST_ENTRY=$B
echo -e "\t$B" | tee -a $BANK_FILE
done
fi
# Display the menu options
echo -e "\n\n1) Add a New Backup Bank"
echo -e "\n2) Delete a Current Backup Bank"
echo -e "\n3) Return to the Previous Menu"
echo -e "\n\nSelect an Option: \c"
# Read the user input
read OPT
case $OPT in
1) # Add a New Backup Bank
echo -e "\nEnter the Bank to Add: \c"
read A_BANK
echo -e "\nAdding New Backup Bank: $A_BANK"
if (( NO_BANK == 0 ))
then
sed "s!$LAST_ENTRY!& \n\t${A_BANK}!g" $D_CONFIG > ${D_CONFIG}.modified
if (( $? == 0 ))
then
# Save the old Dirvish master config file with today's datestamp
cp ${D_CONFIG} ${D_CONFIG}.$(date +%m%d%Y)
cp ${D_CONFIG}.modified ${D_CONFIG}
echo -e "\n$A_BANK Successfully Added to Dirvish Master Config File"
# Check to see if the $A_BANK directoey exists, if not
# ask the user if it is okay to create it.
chk_create_dir $A_BANK
else
echo -e "\nERROR: Adding $A_BANK Failed...See Administrator..."
fi
else
if $(grep -q "bank:" $D_CONFIG)
then
# NOTICE: It is important to note that sed does not "require"
# us to use / as a field separator. Here we are using ! as a
# sed field separator because we are working with UNIX directory
# paths, sed gets confused using / as a field separator.
sed "s!bank:!& \n\t${A_BANK}!g" $D_CONFIG > ${D_CONFIG}.modified
if (( $? == 0 ))
then
cp ${D_CONFIG} ${D_CONFIG}.$(date +%m%d%Y)
cp ${D_CONFIG}.modified ${D_CONFIG}
echo -e "\n$A_BANK Successfully Added to Dirvish Master Config File"
chk_create_dir $A_BANK
else
echo -e "\nERROR: Adding $A_BANK Failed...See Administrator..."
fi
else
echo -e "bank:\n\t$A_BANK" >> ${D_CONFIG}.modified
if (( $? == 0 ))
then
cp ${D_CONFIG} ${D_CONFIG}.$(date +%m%d%Y)
cp ${D_CONFIG}.modified ${D_CONFIG}
echo -e "\n$A_BANK Successfully Added to Dirvish Master Config File"
chk_create_dir $A_BANK
else
echo -e "\nERROR: Adding $A_BANK Failed...See Administrator..."
fi
fi
fi
rm -f $BANK_FILE
echo -e "\nPress Enter to Continue...\c"
read KEY
;;
2) echo -e "\nEnter the Backup Bank to Remove: \c"
read R_BANK
if [ -d $R_BANK ]
then
POPULATED=$(ls $R_BANK | wc -l)
if (( POPULATED > 0 ))
then
echo -e "\nWARNING: The Bank $R_BANK has the Following Backup Images:\n"
ls $R_BANK | more
echo -e "\nAre you Sure you Want to Remove this Bank and all of the Backup Images? (y/n): \c"
read ANS
case $ANS in
y|Y) continue
;;
n|N) break
;;
*) echo -e "\nInvalid Input..."
;;
esac
fi
fi
if $(cat "$BANK_FILE" | grep -q "$R_BANK")
then
if (( COUNT == 1 ))
then
echo -e "\nWARNING: $R_BANK is the Only Backup Bank Currently Configured!"
echo -e "\nRemoving this Bank Will Cripple Dirvish..."
fi
echo -e "\nAre you Sure You Want to Remove the $R_BANK Bank? (y/n): \c"
read ANS4
case $ANS4 in
y|Y) cat $D_CONFIG | grep -v $R_BANK > ${D_CONFIG}.modified
cp -p $D_CONFIG ${D_CONFIG}.bak.$(date +%m%d%y)
cp ${D_CONFIG}.modified $D_CONFIG
echo -e "\n$R_BANK Removed from the Dirvish Configuration File..."
if [ -d $R_BANK ]
then
echo -e "\nDo You Want to Remove the $R_BANK Directory? (y/n): \c"
read ANS
case $ANS in
y|Y) rm -r $R_BANK
if (( $? == 0 ))
then
echo -e "\n$R_BANK Directory Removed Successully"
else
echo -e "\nERROR: Remove $R_BANK Directory Failed"
fi
;;
n|N) echo -e "\nSkipping $R_BANK Directory Removal"
;;
*) echo -e "\nInvalid Input..."
;;
esac
fi
;;
n|N) echo -e "\nSkipping Bank Removal\n"
;;
*) echo -e "\nInvalid Entry..."
;;
esac
else
echo -e "\nERROR: $R_BANK is Not a Valid Bank"
fi
echo -e "\nPress Enter to Continue...\c"
read KEY
;;
3) continue
;;
*) echo -e "\nInvalid Entry...\n"
;;
esac
}
########################################
check_root_user ()
{
case $(uname) in
SunOS) if [[ $LOGNAME != root ]]
then
echo -e "\n\n\tERROR: Only the root User can Execute this Program..."
echo -e "\n\n\t...EXITING...\n"
exit 1
fi
;;
*) if [[ $(whoami) != root ]]
then
echo -e "\n\n\tERROR: Only the root User can Execute this Program..."
echo -e "\n\n\t...EXITING...\n"
exit 1
fi
esac
}
########################################
check_config ()
{
# Find the Dirvish Master Configuration File
if [ -r /etc/dirvish.conf ]
then
M_CONFIG=/etc/dirvish.conf
elif [ -r /etc/dirvish/master.conf ]
then
M_CONFIG=/etc/dirvish/master.conf
else
echo -e "\n\n\tERROR: Dirvish is not configured on this system"
echo -e "\tTo use this program install rsync and dirvish first."
echo -e "\n\t...Exiting...\n"
exit 2
fi
}
########################################
# BEGINNING OF MAIN
########################################
check_root_user
check_config
until (( DONE == 1 ))
do
display_main_menu
read OPTION
case $OPTION in
1) # Dirvish RunAll
run_all
;;
2) # Dirvish Run Backup
run_backup
;;
3) # Dirvish Locate Image
locate_restore_image
;;
4) # Dirvish Expire Backup(s)
expire_backup
;;
5) # Dirvish Add Backup
add_backup
;;
6) # Dirvish Delete Backup
delete_backup
;;
7) # Manage Backup Banks
manage_banks
;;
8) clear
DONE=1
;;
*) echo -e "\n\tERROR: Invalid Entry..."
sleep 2
;;
esac
done