[Refdb-cvs] CVS: refdb/scripts refdb-backup,1.3.2.4,1.3.2.5
Status: Beta
Brought to you by:
mhoenicka
From: David N. <dav...@us...> - 2005-10-02 22:44:19
|
Update of /cvsroot/refdb/refdb/scripts In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv368 Modified Files: Tag: Release_0_9_5_stable refdb-backup Log Message: Remove dependence on bash string chopping; general tidying Index: refdb-backup =================================================================== RCS file: /cvsroot/refdb/refdb/scripts/refdb-backup,v retrieving revision 1.3.2.4 retrieving revision 1.3.2.5 diff -u -U2 -r1.3.2.4 -r1.3.2.5 --- refdb-backup 3 Feb 2005 11:45:20 -0000 1.3.2.4 +++ refdb-backup 1 Oct 2005 11:17:14 -0000 1.3.2.5 @@ -11,10 +11,12 @@ # VARIABLES -references_backup="references" # base of references backup file name -notes_backup="xnotes.xml" # notes backup file name -styles_directory="styles" # name of styles directory (intra-archive) + +self="$( basename ${0} )" +ref_base="references" # base of references backup file name +note_filename="xnotes.xml" # notes backup file name +style_dir="styles" # name of styles directory (intra-archive) logfile="log_backup" # name of log file -archive="refdb_backup_`date '+%Y%m%d_%H%M'`.tar.gz" # archive name -start_dir=`pwd` # directory in which utility is run +archive="refdb_backup_$( date '+%Y%m%d_%H%M' ).tar.gz" # archive name +start_dir=$( pwd ) # directory in which utility is run backup_dir=${start_dir} # overridden by '-d' option format="ris" # overridden by '-f' option @@ -23,4 +25,5 @@ parameters="[-u USER] [-w PWD] [-f FORMAT] [-d DIR] [-s]" # cmd-line args feedback="true" # whether user receives screen feedback +divider="----------------------------------------------------------------" @@ -32,13 +35,14 @@ # 3 - copy to log? ( 0 = true, 1 = false ) # 4 - terminate with newline? ( 0 = true, 1 = false ) +# prints: nil # return: nil feedback () { # decide on use of newline flag - if [ $4 -ne 0 ] ; then use_newline="-n" ; else use_newline="" ; fi + if [ ${4} -ne 0 ] ; then use_newline="-n" ; else use_newline="" ; fi # add indents as required - msg=$1 + msg="${1}" loop=1 while [ 1 ] ; do - [ ${loop} -gt $2 ] && break + [ ${loop} -gt ${2} ] && break [ ${feedback} ] && echo -n " " loop=$(( ${loop} + 1 )) @@ -47,5 +51,5 @@ [ ${feedback} ] && echo ${use_newline} ${msg} # log feedback - [ $3 -eq 0 ] && echo ${use_newline} ${msg} >> ${logfile} + [ ${3} -eq 0 ] && echo ${use_newline} ${msg} >> ${logfile} } # Report success of operation @@ -54,9 +58,9 @@ # return: nil report () { - if [ $1 -eq 0 ] ; then - [ "$2" = "log" ] && echo "OK." >> ${logfile} + if [ ${1} -eq 0 ] ; then + [ "${2}" = "log" ] && echo "OK." >> ${logfile} feedback " OK." 0 1 0 else - [ "$2" = "log" ] && echo "Failed." >> ${logfile} + [ "${2}" = "log" ] && echo "Failed." >> ${logfile} feedback " Failed." 0 1 0 fi @@ -64,19 +68,24 @@ # Report failure and abort # params: 1 - message -# 2 - success flag ( "succeeded" = yes | "*" = no ) +# 2 - success flag (0|* = success|failure) # return: nil endScript () { + # set status message + local result="failed" + [ ${2} -eq 0 ] && result="succeeded" # attempt to change back to initial directory - cd ${start_dir} || \ - feedback "Error: Unable to cd to start dir '${start_dir}'." 0 1 0 + err_msg="Error: Unable to cd to start dir '${start_dir}'." + cd ${start_dir} || feedback "${err_msg}" 0 1 0 # attempt to delete temporary files - err_msg="Error: Unable to delete temporary directory '${tempdir}'." - [ -d ${tempdir} ] && rm -fr ${tempdir} || feedback ${err_msg} 0 1 0 + err_msg="Error: Unable to delete temporary directory '${tmp_dir}'." + [ -d ${tmp_dir} ] && rm -fr ${tmp_dir} || feedback ${err_msg} 0 1 0 # provide feedback regarding success of backup - feedback " " 0 1 0 ; feedback "$1" 0 1 0 - feedback " " 0 1 0 ; feedback "refdb backup $2." 0 1 0 - feedback "`basename $0` is finished." 0 1 0 + if [ ${2} -ne 0 ] ; then err_msg="Error: " ; else err_msg="" ; fi + err_msg="${err_msg}${1}" + feedback " " 0 1 0 ; feedback "${err_msg}" 0 1 0 + feedback " " 0 1 0 ; feedback "refdb backup ${result}." 0 1 0 + feedback "${self} is finished." 0 1 0 # provide exit status to shell - if [ "$2" = "succeeded" ] ; then exit 0 ; else exit 1 ; fi + exit ${2} } # Show usage @@ -84,10 +93,10 @@ # return: nil displayUsage () { - echo "`basename $0`: Backs up RefDB data." + echo "${self}: Backs up RefDB data." echo echo "Backs up references, notes and styles from RefDB." echo - echo "Usage: `basename $0` ${parameters}" - echo " `basename $0` [ -h ]" + echo "Usage: ${self} ${parameters}" + echo " ${self} [-h]" echo echo "Options: -u USER = username for RefDB clients ('refdba'|'refdbc')" @@ -105,4 +114,48 @@ echo "'refdb_backup_YYYYMMDD_HHMM.tar.gz'." } +# Remove terminal slash from string +# params: 1 - string +# prints: altered string +# return: nil +removeTerminalSlash () { + echo "$( echo "${1}" | sed -e 's/\(.*\)\/$/\1/' )" +} +# Normalise path (make absolute) +# params: 1 - path +# prints: normalised path +# return: nil +normalisePath () { + local path="${1}" + # deal with shorthand for home directory + path="$( echo ${path} | sed -e "s?^~?${HOME}?" )" + # deal with relative path + [ $( echo ${path} | grep -c -- "^/" ) -eq 0 ] && path="$( pwd )/${path}" + # remove relative "parent" directories + while [ $( echo "${path}" | grep -c -- "\.\.\/.*\?\/" ) -gt 0 ] ; do + path="$( echo "${path}" \ + | perl -pe 's:(.*\/)[^\.\.].*?\/\.\.\/(.*):\1\2:' )" + done + # remove terminal slash from directory + path="$( removeTerminalSlash "${path}" )" + # return result + echo "${path}" +} +# Contains space? +# params: 1 - string +# prints: nil +# return: 0|1 (no space|space) +noSpace () { + return $( echo "${1}" | grep -c -- " " ) +} +# Directory exists and is readable and writable +# params: 1 - directory +# prints: nil +# return: 0|1 (exists|does not exist) +# invoke: if dirValid "${dir_name}" ; then ... +# needs: functions [noSpace] +dirValid () { + test -d "${1}" -a -r "${1}" -a -w "${1}" && noSpace "${1}" && return 0 + return 1 +} @@ -113,6 +166,6 @@ case ${opt} in h ) displayUsage && exit 0;; - f ) format=${OPTARG};; - d ) backup_dir=${OPTARG};; + f ) format="${OPTARG}";; + d ) backup_dir="${OPTARG}";; u ) refdba="${refdba} -u \"${OPTARG}\"" refdbc="${refdbc} -u \"${OPTARG}\"";; @@ -121,11 +174,11 @@ s ) feedback="";; \? ) echo "Error: Invalid flag '${OPTARG}' detected" - echo "Usage: `basename $0` ${parameters}" - echo "Try '`basename $0` -h' for help" + echo "Usage: ${self} ${parameters}" + echo "Try '${self} -h' for help" echo -ne "\a" exit 1;; \: ) echo "Error: No argument supplied for flag '${OPTARG}'" - echo "Usage: `basename $0` ${parameters}" - echo "Try '`basename $0` -h' for help" + echo "Usage: ${self} ${parameters}" + echo "Try '${self} -h' for help" echo -ne "\a" exit 1;; @@ -137,43 +190,31 @@ # - format ('ris'|'risx') case ${format} in - ris ) extension="ris";; - risx ) extension="xml";; - * ) endScript \ - "Error: '${format}' is an invalid reference storage format." \ - "failed";; + ris ) ext="ris";; + risx ) ext="xml";; + * ) endScript "Invalid storage format '${format}'." 1;; esac # - directory must be writable - # remove terminal slash '/' -[ `echo ${backup_dir} | grep "\/$"` ] && backup_dir=${backup_dir%%/} - # convert relative to absolute dirpath -[ `echo ${backup_dir} | grep -v "^\/"` ] && \ - backup_dir="${start_dir}/${backup_dir}" - # now can test -if [ ! -d ${backup_dir} -o ! -w ${backup_dir} ] ; then - endScript "Error: '${backup_dir}' is not a writable directory." "failed" -fi +backup_dir="$( normalisePath "${backup_dir}" )" +dirValid "${backup_dir}" || endScript "'${backup_dir}' is not writable." 1 # Test for RefDB access ${refdba} -C listdb &> /dev/null || \ - endScript "Error: Unable to access RefDB using client 'refdba'." "failed" + endScript "Unable to access RefDB using client 'refdba'." 1 ${refdbc} -C listdb &> /dev/null || \ - endScript "Error: Unable to access RefDB using client 'refdbc'." "failed" + endScript "Unable to access RefDB using client 'refdbc'." 1 # Will use temporary directory for working # - ensure deletion on exit and change to working directory -tempdir_base="`basename $0`.XXXXXX" -tempdir=`mktemp -dq ${tempdir_base}` \ - || endScript "Error: Unable to create temporary directory." "failed" -trap "rm -fr ${tempdir}" 0 1 2 3 5 15 # delete on exit -cd ${tempdir} || \ - endScript "Error: Unable to cd to temporary directory '${tempdir}'." \ - "failed" +tmp_dir="$( mktemp -dq )" \ + || endScript "Unable to create temporary directory." 1 +trap "rm -fr ${tmp_dir}" 0 1 2 3 5 15 # delete on exit +cd ${tmp_dir} || endScript "Unable to cd to temp dir '${tmp_dir}'." 1 # Informational message -feedback "`basename $0` is running..." 0 1 0 ; feedback " " 0 1 0 +feedback "${self} is running..." 0 1 0 ; feedback " " 0 1 0 # Record date/time of backup -echo "RefDB backup performed by '`basename $0`'." > ${logfile} -echo "Performed: `date '+%Y-%m-%d, %H:%M:%S'`." >> ${logfile} +echo "RefDB backup performed by '${self}'." > ${logfile} +echo "Performed: $( date '+%Y-%m-%d, %H:%M:%S' )." >> ${logfile} feedback "Storage format: ${format}." 0 0 0 feedback " " 0 1 0 @@ -181,41 +222,40 @@ # Cycle through databases in turn and backup references and notes -for db in `${refdba} -C listdb | cut -d ' ' -f 1` ; do +for db in $( ${refdba} -C listdb 2> /dev/null | cut -d ' ' -f 1 ) ; do feedback "Processing database: ${db}" 0 0 0 - dirname="db_${db}" - feedback "Creating subdirectory '${dirname}' ..." 1 0 1 - mkdir ${dirname} &> /dev/null - report $? log + dir_name="db_${db}" + feedback "Creating subdirectory '${dir_name}' ..." 1 0 1 + mkdir ${dir_name} &> /dev/null + report ${?} log # dump references - reffile="${dirname}/${references_backup}.${extension}" + ref_file="${dir_name}/${ref_base}.${ext}" feedback "Backing up references ..." 1 0 1 - ${refdbc} -C getref -d ${db} -t ${format} -o ${reffile} ":ID:>0" \ + ${refdbc} -C getref -d ${db} -t ${format} -o ${ref_file} ":ID:>0" \ &> /dev/null - report $? log + report ${?} log # dump notes - notefile="${dirname}/${notes_backup}" + note_file="${dir_name}/${note_filename}" feedback "Backing up notes ..." 1 0 1 - ${refdbc} -C getnote -d ${db} -t xnote -o ${notefile} ":NID:>0" \ + ${refdbc} -C getnote -d ${db} -t xnote -o ${note_file} ":NID:>0" \ &> /dev/null - report $? log + report ${?} log done +unset ref_base note_filename format refdbc ext dir_name note_file # Cycle through styles in turn and back them up feedback "Processing styles" 0 0 0 -feedback "Creating styles directory '${styles_directory}' ..." 1 0 1 -mkdir ${styles_directory} &> /dev/null -report $? log -for style in `${refdba} -C liststyle` ; do +feedback "Creating styles directory '${style_dir}' ..." 1 0 1 +mkdir ${style_dir} &> /dev/null +report ${?} log +styles="$( ${refdba} -C liststyle 2> /dev/null )" +for style in ${styles} ; do feedback "Backing up style: ${style} ..." 1 0 1 # remove terminal period from file name if present - if [ `echo ${style} | grep "\.$" | wc -l` -eq 1 ] ; then - stylefile=${style%*.} - else - stylefile=${style} - fi - stylefile="${styles_directory}/${stylefile}.xml" + stylefile="$( echo "${style}" | sed -e 's:\(.*\)\.$:\1:' )" + stylefile="${style_dir}/${stylefile}.xml" ${refdba} -C getstyle -o ${stylefile} ${style} &> /dev/null - report $? log + report ${?} log done +unset style_dir refdba styles # Now done @@ -226,19 +266,18 @@ feedback "Create archive" 0 1 0 feedback "Writing archive ..." 1 1 1 -tar -czf ${archive} * -exit_status=$? && report ${exit_status} -[ ${exit_status} -ne 0 ] \ - && endScript "Error: Unable to write archive." "failed" +tar -czf ${archive} * &> /dev/null +exit_status=${?} +report ${exit_status} +[ ${exit_status} -eq 0 ] || endScript "Unable to write archive." 1 # Move archive to backup directory feedback "Copying archive to target directory..." 1 1 1 mv -f ${archive} ${backup_dir} &> /dev/null -exit_status=$? && report ${exit_status} +exit_status=${?} && report ${exit_status} [ ${exit_status} -ne 0 ] \ - && endScript "Error: Unable to move archive to backup directory." \ - "failed" + && endScript "Unable to move archive to backup dir." 1 # Finished [ "${backup_dir}" != "${start_dir}" ] && archive="${backup_dir}/${archive}" feedback " " 0 1 0 ; feedback "Backup archive: '${archive}'." 0 1 0 -endScript "Backup finished." "succeeded" +endScript "Backup finished." 0 |