diff -r a2342f26c9de -r b0b56e0f8c7f dev/provisioning/modules/puppi/files/scripts/archive.sh --- /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 - Backups the files to be changed in the defined directory" + echo "-r - Recovers file to the provided destination" + echo "-s - Specifies the backup strategy (move or copy files)" + echo "-t - Specifies a tag to be used for the backup" + echo "-d - Specifies the runtime variable that defines the predeploy dir" + echo "-c - 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 - Specifies the backup type: 'full' backups all the files in backup_source," + echo " 'diff' backups only the files deployed" + echo "-n - 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