From 41e524870de76ca7110efadaf71051bd86c5052a Mon Sep 17 00:00:00 2001 From: Nathaniel Landau Date: Fri, 2 Jan 2015 22:27:03 -0500 Subject: [PATCH] Tweaks to syncTemplate.sh --- lib/sharedFunctions.sh | 11 ++ lib/utils.sh | 6 +- syncScripts/SyncTemplate.sh | 315 ++++++++++++++++++++---------------- 3 files changed, 189 insertions(+), 143 deletions(-) diff --git a/lib/sharedFunctions.sh b/lib/sharedFunctions.sh index db1492e..1ff4928 100755 --- a/lib/sharedFunctions.sh +++ b/lib/sharedFunctions.sh @@ -8,6 +8,17 @@ # # ################################################## +# scriptPath +# ------------------------------------------------------ +# This function will populate the variable SOURCEPATH with the +# full path of the script being run. +# Note: The function must be run within the script before using +# the variable +# ------------------------------------------------------ +function scriptPath() { + SCRIPTPATH=$( cd "$( dirname "$0" )" && pwd ) +} + # readFile # ------------------------------------------------------ # Function to read a line from a file. diff --git a/lib/utils.sh b/lib/utils.sh index b6fd7d7..e7b616d 100755 --- a/lib/utils.sh +++ b/lib/utils.sh @@ -14,7 +14,7 @@ while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symli SOURCE="$(readlink "$SOURCE")" [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located done -SCRIPTPATH="$( cd -P "$( dirname "$SOURCE" )" && pwd )" +SOURCEPATH="$( cd -P "$( dirname "$SOURCE" )" && pwd )" # Write the list of utility files to be sourced FILES=" @@ -26,8 +26,8 @@ FILES=" # Source the Utility Files for file in $FILES do - if [ -f "$SCRIPTPATH/$file" ]; then - source "$SCRIPTPATH/$file" + if [ -f "$SOURCEPATH/$file" ]; then + source "$SOURCEPATH/$file" else e_error "$file does not exist. Exiting" Exit 1 diff --git a/syncScripts/SyncTemplate.sh b/syncScripts/SyncTemplate.sh index 32c51b4..31bad63 100755 --- a/syncScripts/SyncTemplate.sh +++ b/syncScripts/SyncTemplate.sh @@ -46,7 +46,7 @@ CONFIG="../etc/$SCRIPTNAME.cfg" # HELP # When -h is passed to the script, this will display inline help function HELP () { - echo -e "\nHelp for $SCRIPTNAME" + e_bold "\nHelp for $SCRIPTNAME" echo -e "This script will give you the option of using rsync" echo -e "or Unison. Rsync is for one-way syncing, Unison is for" echo -e "two-way syncing.\n" @@ -54,8 +54,9 @@ function HELP () { echo -e "what information is written in the config file, this script" echo -e "will perform different behavior.\n" echo -e "USAGE:" - echo -e " 1) IMPORTANT: Copy this script and rename it for your purpose before running." - echo -e " 2) Run the script. This will create a blank config file for you and then exit." + echo -e " 1) Copy this script and rename it for your purpose before running." + echo -e " The script will do this for you when run." + echo -e " 2) Run the new script. This will create a blank config file for you and then exit." echo -e " 3) Enter your information within the config file" echo -e " 4) Run the script again.\n" echo -e "This script requires a config file located at: \"$CONFIG\"" @@ -68,16 +69,50 @@ function HELP () { exit 0 } -# Here we source the Config file or create a new one if none exists. -if is_file "$CONFIG"; then - source "$CONFIG" -else - seek_confirmation "Config file does not exist. Would you like to create one?" - if is_not_confirmed; then - die "No config file. Exiting" +# READ OPTIONS +# Reads the options passed to the script +# from the command line +# ------------------------ +while getopts "hnz" opt; do + case $opt in + h) # show help + HELP + ;; + n) # Show progress in terminal + DRYRUN="n" + ;; + z) # Compress Data + COMPRESS="z" + ;; + \?) + HELP + ;; + esac +done + +# Create new copy of the script if template is being executed +function newCopy() { + scriptPath + if [ "$SCRIPTNAME" = "SyncTemplate.sh" ]; then + e_bold "name your new script:" + read newname + cp "$SCRIPTPATH"/"$SCRIPTNAME" "$SCRIPTPATH"/"$newname" + e_success "$newname created." + exit 0 + fi +} + +function configFile() { + # Here we source the Config file or create a new one if none exists. + if is_file "$CONFIG"; then + source "$CONFIG" else - touch "$CONFIG" -cat >"$CONFIG" <"$CONFIG" <"$CONFIG" <> "$LOGFILE" - die "We are currently on $THISHOST and can not proceed. Be sure to run this script on the non-canonical host." -fi +function hostCheck() { + if [ "$THISHOST" = "$CANONICALHOST" ]; then + echo "$NOW - Script was not run since we were on the wrong host" >> "$LOGFILE" + die "We are currently on $THISHOST and can not proceed. Be sure to run this script on the non-canonical host." + fi +} # MethodCheck # Confirm we have either Unison or Rsync specified # in the config file. Exit if not -if [ "$METHOD" != "rsync" ] && [ "$METHOD" != "unison" ]; then - echo "$NOW - Script aborted without a method specified in the config file." >> "$LOGFILE" - die "We can not continue. Please specify a sync method in the config file." -fi - -# Time the script by logging the start time -STARTTIME=$(date +"%s") - -# Log Script Start to $LOGFILE -echo -e "-----------------------------------------------------" >> "$LOGFILE" -echo -e "$NOW - $SCRIPTNAME Begun" >> "$LOGFILE" -echo -e "-----------------------------------------------------\n" >> "$LOGFILE" - -if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then - # Mount AFP volume - if is_not_dir "$REMOTEVOLUME"; then - e_arrow "Mounting drive" - mkdir "$REMOTEVOLUME" - mount_afp "$MOUNTPOINT" "$REMOTEVOLUME" - sleep 10 - echo "$NOW - $REMOTEVOLUME Mounted" >> "$LOGFILE" - e_success "$REMOTEVOLUME Mounted" - else - e_success "$REMOTEVOLUME already mounted" +function MethodCheck() { + if [ "$METHOD" != "rsync" ] && [ "$METHOD" != "unison" ]; then + echo "$NOW - Script aborted without a method specified in the config file." >> "$LOGFILE" + die "We can not continue. Please specify a sync method in the config file." fi -fi +} + +function mainScript() { + # Time the script by logging the start time + STARTTIME=$(date +"%s") + + # Log Script Start to $LOGFILE + echo -e "-----------------------------------------------------" >> "$LOGFILE" + echo -e "$NOW - $SCRIPTNAME Begun" >> "$LOGFILE" + echo -e "-----------------------------------------------------\n" >> "$LOGFILE" + -# Test for source directories. -# If the don't exist we can't continue -if is_dir "$TARGETDIRECTORY"; then - e_success "$TARGETDIRECTORY exists" -else if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then - unmountDrive "$REMOTEVOLUME" - if is_dir "$REMOTEVOLUME"; then - rm -r "$REMOTEVOLUME" - fi - fi - echo -e "$NOW - Script aborted since $TARGETDIRECTORY was not found. Exited.\n" >> "$LOGFILE" - die "$TARGETDIRECTORY does not exist. Exiting." -fi - -# Test for local directory -if is_dir "$SOURCEDIRECTORY"; then - e_success "$SOURCEDIRECTORY exists" -else - if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then - unmountDrive "$REMOTEVOLUME" - if is_dir "$REMOTEVOLUME"; then - rm -r "$REMOTEVOLUME" - fi - fi - echo -e "$NOW - Script aborted since $SOURCEDIRECTORY was not found. Exited.\n" >> "$LOGFILE" - die "$SOURCEDIRECTORY does not exist. Exiting." -fi - -# Time to sync -if [ "$METHOD" = "rsync" ]; then - /usr/bin/rsync -vahh"$DRYRUN""$COMPRESS" --progress --force --delete --exclude-from="$EXCLUDE" "$SOURCEDIRECTORY" "$TARGETDIRECTORY" --log-file="$LOGFILE" -fi -if [ "$METHOD" = "unison" ]; then - - # Check if Unison is installed. It is not a standard package - if type_not_exists 'unison'; then - seek_confirmation "Unison not installed, install it?" - if is_confirmed; then - hasHomebrew - brewMaintenance - brew install unison + # Mount AFP volume + if is_not_dir "$REMOTEVOLUME"; then + e_arrow "Mounting drive" + mkdir "$REMOTEVOLUME" + mount_afp "$MOUNTPOINT" "$REMOTEVOLUME" + sleep 10 + echo "$NOW - $REMOTEVOLUME Mounted" >> "$LOGFILE" + e_success "$REMOTEVOLUME Mounted" else - if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then - unmountDrive "$REMOTEVOLUME" - if is_dir "$REMOTEVOLUME"; then - rm -r "$REMOTEVOLUME" - fi - fi - die "Can not continue without Unison." + e_success "$REMOTEVOLUME already mounted" fi fi - if [ "$USEPROFILE" != "true"]; then - # Run Unison without a profile - unison "$SOURCEDIRECTORY" "$TARGETDIRECTORY" + # Test for source directories. + # If they don't exist we can't continue + + # test for target + if is_dir "$TARGETDIRECTORY"; then + e_success "$TARGETDIRECTORY exists" else - # Run unison with a profile - unison "$UNISONPROFILE" + if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then + unmountDrive "$REMOTEVOLUME" + if is_dir "$REMOTEVOLUME"; then + rm -r "$REMOTEVOLUME" + fi + fi + echo -e "$NOW - Script aborted since target dir: $TARGETDIRECTORY was not found. Exited.\n" >> "$LOGFILE" + die "target directory: $TARGETDIRECTORY does not exist. Exiting." fi -fi -# Unmount the drive (if mounted) -if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then - unmountDrive "$REMOTEVOLUME" -fi + # Test for source directory + if is_dir "$SOURCEDIRECTORY"; then + e_success "$SOURCEDIRECTORY exists" + else + if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then + unmountDrive "$REMOTEVOLUME" + if is_dir "$REMOTEVOLUME"; then + rm -r "$REMOTEVOLUME" + fi + fi + echo -e "$NOW - Script aborted since source dir: $SOURCEDIRECTORY was not found. Exited.\n" >> "$LOGFILE" + die "source directory: $SOURCEDIRECTORY does not exist. Exiting." + fi -# Time the script by logging the end time -ENDTIME=$(date +"%s") -TOTALTIME=$(($ENDTIME-$STARTTIME-20)) + # Time to sync + if [ "$METHOD" = "rsync" ]; then + /usr/bin/rsync -vahh"$DRYRUN""$COMPRESS" --progress --force --delete --exclude-from="$EXCLUDE" "$SOURCEDIRECTORY" "$TARGETDIRECTORY" --log-file="$LOGFILE" + fi + if [ "$METHOD" = "unison" ]; then -# notify with pushover if requested -if [ "$PUSHOVERNOTIFY" = "true" ]; then - pushover "$SCRIPTNAME Completed" "$SCRIPTNAME was run in $(convertsecs $TOTALTIME)" -fi + # Check if Unison is installed. It is not a standard package + if type_not_exists 'unison'; then + seek_confirmation "Unison not installed, install it?" + if is_confirmed; then + hasHomebrew + brewMaintenance + brew install unison + else + if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then + unmountDrive "$REMOTEVOLUME" + if is_dir "$REMOTEVOLUME"; then + rm -r "$REMOTEVOLUME" + fi + fi + die "Can not continue without Unison." + fi + fi -echo -e "\n-----------------------------------------------------" >> "$LOGFILE" -echo "$NOW - $SCRIPTNAME completed in $(convertsecs $TOTALTIME)" >> "$LOGFILE" -echo -e "-----------------------------------------------------\n" >> "$LOGFILE" + if [ "$USEPROFILE" != "true"]; then + # Run Unison without a profile + unison "$SOURCEDIRECTORY" "$TARGETDIRECTORY" + else + # Run unison with a profile + unison "$UNISONPROFILE" + fi + fi -e_success "$NOW - $SCRIPTNAME completed in $(convertsecs $TOTALTIME)" \ No newline at end of file + # Unmount the drive (if mounted) + if [ "$NEEDMOUNT" = "true" ] || [ "$NEEDMOUNT" = "TRUE" ]; then + unmountDrive "$REMOTEVOLUME" + fi + + # Time the script by logging the end time + ENDTIME=$(date +"%s") + TOTALTIME=$(($ENDTIME-$STARTTIME-20)) + + # notify with pushover if requested + if [ "$PUSHOVERNOTIFY" = "true" ]; then + pushover "$SCRIPTNAME Completed" "$SCRIPTNAME was run in $(convertsecs $TOTALTIME)" + fi + + echo -e "\n-----------------------------------------------------" >> "$LOGFILE" + echo "$NOW - $SCRIPTNAME completed in $(convertsecs $TOTALTIME)" >> "$LOGFILE" + echo -e "-----------------------------------------------------\n" >> "$LOGFILE" + + e_success "$NOW - $SCRIPTNAME completed in $(convertsecs $TOTALTIME)" +} + +newCopy +configFile +hostCheck +MethodCheck +mainScript \ No newline at end of file