#!/bin/sh # @(#) -------------------------------------------------------------------- # @(#) Script syncronizes the remote directory onto a special backup server # @(#) -------------------------------------------------------------------- # @(#) # @(#) This script is called 'rzyncbackup': # @(#) Configuration file: ~/USER/.myrzyncfiles # @(#) # @(#) 2-Nov-2006, pf@imm.dtu.dk # @(#) 6-Nov-2006, pf@imm.dtu.dk # @(#) 7-Nov-2006, pf@imm.dtu.dk # @(#) 9-Nov-2006, pf@imm.dtu.dk # @(#) 20-Nov-2006, pf@imm.dtu.dk # @(#) 22-Jan-2007, pf@imm.dtu.dk # @(#) 23-Jan-2007, pf@imm.dtu.dk # @(#) 24-Jan-2007, pf@imm.dtu.dk # @(#) 08-Feb-2007, pf@imm.dtu.dk # @(#) 09-Feb-2007, pf@imm.dtu.dk # @(#) 27-Feb-2007, pf@imm.dtu.dk # @(#) 23-Mar-2007, pf@imm.dtu.dk # @(#) 26-Mar-2007, pf@imm.dtu.dk # @(#) 26-Apr-2007, pf@imm.dtu.dk # @(#) 27-Apr-2007, pf@imm.dtu.dk # @(#) 08-May-2007, pf@imm.dtu.dk # @(#) 05-Jul-2007, added variable MYRZYNCEXCLUDE - il@imm.dtu.dk # @(#) 10-Jul-2007, added check that backup server is pingable - il@imm.dtu.dk # @(#) 10-Jul-2007, added rsync exit check - il@imm.dtu.dk # @(#) 23-Jan-2008, pf@imm.dtu.dk, user specific directory in /tmp # @(#) 06-Jun-2008, il@imm.dtu.dk, changed default content of $MYRZYNCEXCLUDE # @(#) 09-Jun-2009, il@imm.dtu.dk, changed $TARGETNODE to be a FQDN # @(#) # @(#) The backup server is allways accessed through it's alias. # @(#) # @(#) Remote backup directory root cannot be '/home' # @(#) because '/home/USER' cannot be copied to '/home/USER' # @(#) - remote directory could be named '/backup/USER' # @(#) (the mountpoint is '/backup' instead of '/home') # @(#) # @(#) How-2-setup: # @(#) ------------ # @(#) ssh-keygen -t dsa (creates: /home/USER/.ssh/id_dsa.pub) # @(#) Copy this file to the remote node and append it to # @(#) /remotehome/USER/.ssh/authorized_keys # @(#) Logon the remote node and: # @(#) mkdir .ssh # @(#) cat id_dsa.pub >> .ssh/authorized_keys # @(#) # @(#) How 2 test: ssh remotenode (should log you in without password) # @(#) # @(#) NOTE!!!: Change 'TARGETNODE' to appropriate remote node name # Start of main: TARGETNODE="userbackup1.imm.dtu.dk" cd EXXIT=0 NISUSERNAMEFILE="${HOME}/.nisUserName" MYRZYNCFILES="${HOME}/.myrzyncfiles" MYRZYNCEXCLUDE="${HOME}/.myrzyncexclude" MYHOSTNAME="${HOME}/.myhostname" FIRSTRUN=no VERBOSE="yes" PATH=/bin:/usr/bin:/sbin:/usr/sbin export path PING=`which ping` # Check that we can actually ping the backup server #VAR=`$PING -s 1 -c 1 $TARGETNODE > /dev/null; echo $?` #if [ $VAR -ne 0 ]; then # echo "Cannot ping $TARGETNODE." # exit 1 #fi [ ! -f ${NISUSERNAMEFILE} ] && { FIRSTRUN=yes while [ 1 ] do echo "* Is your remote user name different from your user name" echo -n " on this system? Please answer yes or no: " read ANS case "${ANS}" in "") continue ;; y|yes|Y|YES) while [ 1 ] do echo -n "* Please type the remote user name: " read NISUSER case ${NISUSER} in "") continue ;; *) echo "${NISUSER}" > ${NISUSERNAMEFILE} break 1 ;; esac done break 1 ;; n|no|N|NO) NISUSER=`whoami` echo "${NISUSER}" > ${NISUSERNAMEFILE} break 1 ;; esac continue done } USER=`whoami` [ ! -f ${MYRZYNCFILES} ] && { echo "* No ${MYRZYNCFILES} file, creating one with" echo " $HOME as the first line" echo "$HOME" > ${MYRZYNCFILES} } [ ! -f ${MYRZYNCEXCLUDE} ] && { echo "* No ${MYRZYNCEXCLUDE} file, creating one with" echo ".mozilla/*/*/Cache/" echo ".mozilla/*/*/Cache/" > ${MYRZYNCEXCLUDE} } [ ${FIRSTRUN} = "yes" ] && { echo "* File ${NISUSERNAMEFILE} created " echo " (containes the remote user name you just typed)" echo "" echo "* Try to logon to the backup node by typing the following command:" echo "ssh ${NISUSER}@${TARGETNODE}" echo "* Run $0 again in order to perform the backup." exit 0 } # Concatenate the lines in the input file to one line # and save it in a file in order to preserve it when # exiting the 'do' loop. RSTRING="" RSTRINGFILE=/tmp/${USER}/rstringfile.tmp EXXITFILE=/tmp/${USER}/exxit.tmp cp /dev/null ${EXXITFILE} [ -d /tmp/${USER} ] || mkdir -p /tmp/${USER} BLANK=" " N=0 cat ${MYRZYNCFILES} | while read INPUT do HERE=`pwd` N=`expr ${N} + 1` [ ! -x ${INPUT} ] && { # /tmp/${USER}/backup_logfile.now echo "* Error in line # ${N}: ${INPUT}" > /tmp/${USER}/backup_logfile.now echo " ${INPUT}: no such directory" >> /tmp/${USER}/backup_logfile.now echo "* Please edit the configuration file: ${HERE}/${MYRZYNCFILES}" >> /tmp/${USER}/backup_logfile.now echo "* Error in line # ${N}: ${INPUT}" echo " ${INPUT}: no such directory" echo "* Please edit the configuration file: ${HERE}/${MYRZYNCFILES}" echo "* Error in line # ${N}: ${INPUT}: no such directory" > ${EXXITFILE} } RSTRING="${RSTRING} ${INPUT}" echo "${RSTRING}" > ${RSTRINGFILE} done RSTRING=`cat ${RSTRINGFILE}` CONTENS=`file ${EXXITFILE}` echo ${CONTENS}|grep 'empty' > /dev/null 2>&1 RES=$? [ ${RES} -ne 0 ] && { exit 1 } TEMPFILE1=/tmp/${USER}/tempfile1.sh CURNODE=`hostname | cut -d\. -f1` [ ! -f ${MYHOSTNAME} ] && { echo ${CURNODE} > ${MYHOSTNAME} } FLAGS="$1 $2 $3 $4 $5 $6 $7 $8" echo "${FLAGS}" | grep '\-v' > /dev/null 2>&1 [ $? -eq 0 ] && { VERBOSE="yes" } NISUSER=`cat ${NISUSERNAMEFILE}` REMHOME=`ssh ${NISUSER}@${TARGETNODE} ls -d /backup/${NISUSER}` [ "${REMHOME}" = "/home/${USER}" ] && { echo "* Home directory on target node same as current." exit 1 } # Create remote backup directory specific to originating node: ssh ${NISUSER}@${TARGETNODE} "mkdir -p ${REMHOME}/${CURNODE} && chmod 700 ${REMHOME}/${CURNODE}" # Write time of start to log file: START=`date` # Clean up before copying: PREV_LOG_FILE="/tmp/${USER}/prev_log_file.txt" cp /dev/null ${PREV_LOG_FILE} # Copy the previous log file from remote server (in order to append to it): [ ${FIRSTRUN} = "no" ] && { scp ${NISUSER}@${TARGETNODE}:/${REMHOME}/${CURNODE}/backup_logfile ${PREV_LOG_FILE} > /dev/null 2>&1 } # Write to preliminary log file: echo "* Backup started at ${START} nodename=${CURNODE} user=${USER}" > /tmp/${USER}/backup_logfile echo "* OBS: Backup NOT completed (${START}) nodename=${CURNODE} user=${USER} !!!" >> /tmp/${USER}/backup_logfile # # Copy the preliminary log file unto the backup server: # If the 'rsync' process is interrupted the log file on the # target node will state that the backup did not complete successfully. # If the 'rsync' process completes then the log file is overwritten. scp /tmp/${USER}/backup_logfile ${NISUSER}@${TARGETNODE}:/${REMHOME}/${CURNODE} >> /tmp/${USER}/list_of_last_rsync_backup.txt 2>&1 # Write start time to the final log file: echo "* Backup started at ${START} nodename=${CURNODE} user=${USER}"> /tmp/${USER}/backup_logfile.now # Let's ROCK (Start to 'rsync').... NOW=$(date +"%b-%d-%y-%H:%M") LOG="/tmp/${USER}/rsync_backup_${NOW}.log" echo "Running rsync to $TARGETNODE" rsync -e ssh --exclude-from=${MYRZYNCEXCLUDE} --delete-excluded -vogltprHR --delete-after --stats --progress ${FLAGS} ${RSTRING}/ ${NISUSER}@${TARGETNODE}:${REMHOME}/${CURNODE} > ${LOG} 2>&1 if [ $? -ne 0 ]; then echo "Error: rsync exited with a non zero value" echo "Some error(s) were encountered, please check rsync log file" echo "${LOG}" exit 2 fi # This is the end... THE_END=`date` # Write end-of-job to the final log file: echo "* Backup finished at ${THE_END} nodename=${CURNODE} user=${USER}" >> /tmp/${USER}/backup_logfile.now # # Append the new log file to the old log file: cat ${PREV_LOG_FILE} /tmp/${USER}/backup_logfile.now > /tmp/${USER}/backup_logfile # Copy the final log file unto the backup server: scp -pq /tmp/${USER}/backup_logfile ${NISUSER}@${TARGETNODE}:/${REMHOME}/${CURNODE} >> /tmp/${USER}/list_of_last_rsync_backup.txt 2>&1 scp -pq /tmp/${USER}/rsync_backup_${NOW}.log ${NISUSER}@${TARGETNODE}:/${REMHOME}/${CURNODE} # Clean up: rm -f ${PREV_LOG_FILE} rm -f ${RSTRINGFILE} rm -f ${EXXITFILE} # # Copy this script onto the backup server # (to document if changes has been made) SHORTFILENAME=`basename $0` scp $0 ${NISUSER}@${TARGETNODE}:/${REMHOME}/${CURNODE}/${SHORTFILENAME}.current > /dev/null 2>&1 [ ${VERBOSE} = "no" ] && { cat ${LOG} echo "* List of files: ${LOG}" } #----------------------------------------------------------------------------- exit 0