phpservermon/puphpet/puppet/modules/puppi/files/scripts/archive.sh

169 lines
4.7 KiB
Bash

#!/bin/bash
# archive.sh - Made for Puppi
# Sources common header for Puppi scripts
. $(dirname $0)/header || exit 10
# Show help
showhelp () {
echo "This script is used to backup or restore contents to/from puppi archivedir"
echo "It has the following options:"
echo "-b <backup_source> - Backups the files to be changed in the defined directory"
echo "-r <recovery_destination> - Recovers file to the provided destination"
echo "-s <copy|move> - Specifies the backup strategy (move or copy files)"
echo "-t <tag> - Specifies a tag to be used for the backup"
echo "-d <variable> - Specifies the runtime variable that defines the predeploy dir"
echo "-c <yes|no> - Specifies if you want compressed (tar.gz) archives. Default: yes"
echo "-o 'options' - Specifies the rsync options to use during backup. Use it to specify custom "
echo " exclude patterns of files you don't want to archive, for example"
echo "-m <full|diff> - Specifies the backup type: 'full' backups all the files in backup_source,"
echo " 'diff' backups only the files deployed"
echo "-n <number> - Number of copies of backups to keep on the filesystem. Default 5"
echo
echo "Examples:"
echo "archive.sh -b /var/www/html/my_app -t html -c yes"
}
# Arguments check
if [ "$#" = "0" ] ; then
showhelp
exit
fi
# Default settings
compression=yes
backuptag=all
strategy=copy
backupmethod=full
bakret=5
while [ $# -gt 0 ]; do
case "$1" in
-b)
backuproot=$2
# [ $deploy_root ] && backuproot=$deploy_root # This is needed to allow override of $deploy_root via puppi cmd. But breaks on puppi::project::maven
action=backup
shift 2 ;;
-r)
backuproot=$2
# [ $deploy_root ] && backuproot=$deploy_root # This is needed to allow override of $deploy_root via puppi cmd. But breaks on puppi::project::maven
action=recovery
shift 2 ;;
-t)
backuptag=$2
shift 2 ;;
-s)
case "$2" in
mv) strategy="move" ;;
move) strategy="move" ;;
*) strategy="copy" ;;
esac
shift 2 ;;
-m)
case "$2" in
diff) backupmethod="diff" ;;
*) backupmethod="full" ;;
esac
shift 2 ;;
-c)
case "$2" in
yes) compression="yes" ;;
y) compression="yes" ;;
*) compression="none" ;;
esac
shift 2 ;;
-d)
predeploydir="$(eval "echo \${$(echo $2)}")"
shift 2 ;;
-o)
rsync_options=$2
shift 2 ;;
-n)
bakret=$2
shift 2 ;;
*)
showhelp
exit
;;
esac
done
# Backup and Restore functions
backup () {
mkdir -p $archivedir/$project/$tag/$backuptag
if [ $archivedir/$project/latest ] ; then
rm -f $archivedir/$project/latest
fi
ln -sf $archivedir/$project/$tag $archivedir/$project/latest
filelist=$storedir/filelist
cd $predeploydir
find . | cut -c 3- | grep -v "^$" > $filelist
if [ "$strategy" = "move" ] ; then
for file in $(cat $filelist) ; do
mv $backuproot/$file $archivedir/$project/$tag/$backuptag/
done
if [ "$backupmethod" = "full" ] ; then
rsync -a $rsync_options $backuproot/ $archivedir/$project/$tag/$backuptag/
fi
else
if [ "$backupmethod" = "full" ] ; then
rsync -a $rsync_options $backuproot/ $archivedir/$project/$tag/$backuptag/
else
rsync -a $rsync_options --files-from=$filelist $backuproot/ $archivedir/$project/$tag/$backuptag/
fi
fi
if [ "$compression" = "yes" ] ; then
cd $archivedir/$project/$tag/$backuptag/
tar -czf ../$backuptag.tar.gz .
cd $archivedir/$project/$tag/
rm -rf $archivedir/$project/$tag/$backuptag/
fi
}
recovery () {
if [ ! $rollbackversion ] ; then
echo "Variable rollbackversion must exist!"
exit 2
fi
if [ -d $archivedir/$project ] ; then
cd $archivedir/$project
else
echo "Can't find archivedir for this project"
exit 2
fi
if [ "$compression" = "yes" ] ; then
cd $backuproot/
tar -xzf $archivedir/$project/$rollbackversion/$backuptag.tar.gz .
else
rsync -a $rsync_options $rollbackversion/$backuptag/* $backuproot
fi
}
delete_old () {
# We don't count the "latest" symlink
bakret=$(expr $bakret + 1 )
cd $archivedir/$project
ddirs=$(ls -1p 2>/dev/null | wc -l)
while [ $ddirs -gt $bakret ]
do
victim=$(ls -tr 2>/dev/null | head -1)
rm -rf $victim && echo "Deleted old $archivedir/$project/$victim"
ddirs=$(ls -1p 2>/dev/null | wc -l)
done
}
# Action!
case "$action" in
backup) backup ; delete_old ;;
recovery) recovery ;;
esac