--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dev/provisioning/modules/puppi/files/scripts/archive.sh Fri Jan 15 15:35:00 2016 +0100
@@ -0,0 +1,168 @@
+#!/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