diff --git a/README.md b/README.md index c9e0151..edec98f 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,9 @@ What is better than a [Pi-hole](https://github.com/pi-hole/pi-hole) blocking ads That's Gravity Sync. -![Pull execution](https://user-images.githubusercontent.com/3002053/82774990-f88c6200-9e0b-11ea-97e5-23c8b38f32e3.png) +![Pull execution](https://user-images.githubusercontent.com/3002053/82855198-4074bd00-9ed0-11ea-96ca-65e0f3d9b71a.gif) -Gravity Sync will **not** overwrite device specific settings such as local network configuration, admin/API passwords/keys, upstream DNS resolvers, etc. It will also **not** keep DHCP settings or device leases synchronized. +Gravity Sync will **not** overwrite device specific settings such as local network configuration, admin/API passwords/keys, local hostfiles, upstream DNS resolvers, etc. It will also **not** keep DHCP settings or device leases synchronized. ## Prerequisites @@ -50,9 +50,9 @@ Download the latest release from [GitHub](https://github.com/vmstan/gravity-sync ``` cd ~ -wget https://github.com/vmstan/gravity-sync/archive/v1.3.1.zip -unzip v1.3.1.zip -mv ~/gravity-sync-1.3.1 ~/gravity-sync +wget https://github.com/vmstan/gravity-sync/archive/v1.3.2.zip +unzip v1.3.2.zip +mv ~/gravity-sync-1.3.2 ~/gravity-sync cd gravity-sync ``` diff --git a/gravity-sync.sh b/gravity-sync.sh index e0c1a66..dded614 100755 --- a/gravity-sync.sh +++ b/gravity-sync.sh @@ -52,7 +52,7 @@ INFO="[${YELLOW}INFO${NC}]" # Import Settings function import_gs { MESSAGE="Importing ${CONFIG_FILE} Settings" - echo -e "${STAT} $MESSAGE" + echo -en "${STAT} $MESSAGE" if [ -f $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} ] then source $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} @@ -62,7 +62,7 @@ function import_gs { echo -e "${INFO} ${MESSAGE}" else - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" MESSAGE="${CONFIG_FILE} Missing" echo -e "${INFO} ${MESSAGE}" @@ -106,40 +106,40 @@ function pull_gs { md5_compare MESSAGE="Pulling ${GRAVITY_FI} from ${REMOTE_HOST}" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} rsync -v -e 'ssh -p 22' ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} rsync -v -e 'ssh -p 22' ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull >/dev/null 2>&1 error_validate MESSAGE="Backing Up ${GRAVITY_FI} on $HOSTNAME" - echo -e "${STAT} ${MESSAGE}" - cp -v ${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.backup + echo -en "${STAT} ${MESSAGE}" + cp -v ${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.backup >/dev/null 2>&1 error_validate MESSAGE="Replacing ${GRAVITY_FI} on $HOSTNAME" - echo -e "${STAT} ${MESSAGE}" - sudo cp -v $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} + echo -en "${STAT} ${MESSAGE}" + sudo cp -v $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 error_validate MESSAGE="Setting Permissions on ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" - sudo chmod 644 ${PIHOLE_DIR}/${GRAVITY_FI} + echo -en "${STAT} ${MESSAGE}" + sudo chmod 644 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 error_validate MESSAGE="Setting Ownership on ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" - sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI} + echo -en "${STAT} ${MESSAGE}" + sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 error_validate sleep 3 MESSAGE="Updating FTLDNS Configuration" - echo -e "${STAT} ${MESSAGE}" - pihole restartdns reloadlists + echo -en "${STAT} ${MESSAGE}" + pihole restartdns reloadlists >/dev/null 2>&1 error_validate MESSAGE="Reloading FTLDNS Services" - echo -e "${STAT} ${MESSAGE}" - pihole restartdns + echo -en "${STAT} ${MESSAGE}" + pihole restartdns >/dev/null 2>&1 error_validate logs_export @@ -159,35 +159,35 @@ function push_gs { Yes ) MESSAGE="Backing Up ${GRAVITY_FI} from ${REMOTE_HOST}" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} rsync -v -e 'ssh -p 22' ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} rsync -v -e 'ssh -p 22' ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push >/dev/null 2>&1 error_validate MESSAGE="Pushing ${GRAVITY_FI} to ${REMOTE_HOST}" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} rsync --rsync-path="sudo rsync" -v -e 'ssh -p 22' ${PIHOLE_DIR}/${GRAVITY_FI} ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} rsync --rsync-path="sudo rsync" -v -e 'ssh -p 22' ${PIHOLE_DIR}/${GRAVITY_FI} ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 error_validate MESSAGE="Setting Permissions on ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo chmod 644 ${PIHOLE_DIR}/${GRAVITY_FI}" + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo chmod 644 ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1 error_validate MESSAGE="Setting Ownership on ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI}" + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} "sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1 error_validate sleep 3 MESSAGE="Updating FTLDNS Configuration" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} 'pihole restartdns reloadlists' + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} 'pihole restartdns reloadlists' >/dev/null 2>&1 error_validate MESSAGE="Reloading FTLDNS Services" - echo -e "${STAT} ${MESSAGE}" - ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} 'pihole restartdns' + echo -en "${STAT} ${MESSAGE}" + ${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} 'pihole restartdns' >/dev/null 2>&1 error_validate logs_export @@ -215,6 +215,31 @@ function logs_gs { exit_nochange } +## Crontab Logic +function show_crontab { + CRONPATH="$HOME/${LOCAL_FOLDR}/${CRONJOB_LOG}" + + MESSAGE="Replaying Last Cronjob" + echo -e "${STAT} ${MESSAGE}" + + if [ -f ${CRONPATH} ] + then + if [ -s ${CRONPATH} ] + echo -e "${GOOD} ${MESSAGE}" + logs_crontab + exit_nochange + then + echo -e "${FAIL} ${MESSAGE}" + echo -e "${INFO} ${CRONPATH} appears empty" + exit_nochange + fi + else + echo -e "${FAIL} ${MESSAGE}" + echo -e "${YELLOW}${CRONPATH}${NC} cannot be located" + exit_nochange + fi +} + ## Check Last Crontab function logs_crontab { echo -e "========================================================" @@ -237,22 +262,22 @@ function logs_export { ## Validate GS Folders function validate_gs_folders { MESSAGE="Locating $HOME/${LOCAL_FOLDR}" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" if [ -d $HOME/${LOCAL_FOLDR} ] then - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" else - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" exit_nochange fi MESSAGE="Locating $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" if [ -d $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD} ] then - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" else - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" exit_nochange fi } @@ -260,12 +285,12 @@ function validate_gs_folders { ## Validate PH Folders function validate_ph_folders { MESSAGE="Locating ${PIHOLE_DIR}" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" if [ -d ${PIHOLE_DIR} ] then - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" else - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" exit_nochange fi } @@ -299,8 +324,8 @@ function validate_os_sshpass { echo -e "${INFO} ${MESSAGE}" MESSAGE="Testing SSH Connection" - echo -e "${STAT} ${MESSAGE}" - timeout 5 ${SSHPASSWORD} ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'exit' + echo -en "${STAT} ${MESSAGE}" + timeout 5 ${SSHPASSWORD} ssh -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'exit' >/dev/null 2>&1 error_validate } @@ -336,17 +361,18 @@ function exit_nochange { ## Changes Made function exit_withchange { - echo -e "${INFO} ${PROGRAM} ${TASKTYPE} Completed" + SCRIPT_END=$SECONDS + echo -e "${INFO} ${PROGRAM} ${TASKTYPE} Completed in $((SCRIPT_END-SCRIPT_START)) seconds" exit 0 } # Error Validation function error_validate { if [ "$?" != "0" ]; then - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" exit 1 else - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" fi } @@ -360,12 +386,12 @@ function md5_compare { echo -e "${INFO} Comparing ${GRAVITY_FI} Changes" MESSAGE="Analyzing Remote ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" primaryMD5=$(${SSHPASSWORD} ssh ${REMOTE_USER}@${REMOTE_HOST} 'md5sum /etc/pihole/gravity.db') error_validate MESSAGE="Analyzing Local ${GRAVITY_FI}" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" secondMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI}) error_validate @@ -380,21 +406,22 @@ function md5_compare { } # SCRIPT EXECUTION ########################### +SCRIPT_START=$SECONDS MESSAGE="Evaluating Script Arguments" - echo -e "${STAT} ${MESSAGE}" + echo -en "${STAT} ${MESSAGE}" case $# in 0) - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" list_gs_arguments ;; 1) case $1 in pull) - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" import_gs @@ -409,7 +436,7 @@ case $# in ;; push) - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" import_gs @@ -430,7 +457,7 @@ case $# in update) # TASKTYPE='UPDATE' - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" echo -e "${INFO} Update Requested" update_gs @@ -439,7 +466,7 @@ case $# in beta) # TASKTYPE='BETA' - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" echo -e "${INFO} Beta Update Requested" beta_gs @@ -448,15 +475,18 @@ case $# in logs) TASKTYPE='LOGS' + + echo -e "\r${GOOD} ${MESSAGE}" + MESSAGE="Logs Requested" - echo -e "${GOOD} ${MESSAGE}" + echo -e "${INFO} ${MESSAGE}" logs_gs ;; compare) TASKTYPE='COMPARE' - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" import_gs echo -e "${INFO} Validating Folder Configuration" @@ -469,35 +499,14 @@ case $# in cron) TASKTYPE='CRON' - echo -e "${GOOD} ${MESSAGE}" + echo -e "\r${GOOD} ${MESSAGE}" - CRONPATH="$HOME/${LOCAL_FOLDR}/${CRONJOB_LOG}" - - MESSAGE="Replaying Last Cronjob" - echo -e "${STAT} ${MESSAGE}" - - if [ -f ${CRONPATH} ] - then - if [ -s ${CRONPATH} ] - echo -e "${GOOD} ${MESSAGE}" - logs_crontab - exit_nochange - then - echo -e "${FAIL} ${MESSAGE}" - echo -e "${INFO} ${CRONPATH} appears empty" - exit_nochange - fi - else - echo -e "${FAIL} ${MESSAGE}" - echo -e "${YELLOW}${CRONPATH}${NC} cannot be located" - exit_nochange - fi + show_crontab ;; *) - MESSAGE="'${YELLOW}$1${NC}' is an Invalid Argument" - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" list_gs_arguments exit_nochange ;; @@ -505,8 +514,7 @@ case $# in ;; *) - MESSAGE="Too Many Arguments" - echo -e "${FAIL} ${MESSAGE}" + echo -e "\r${FAIL} ${MESSAGE}" list_gs_arguments exit_nochange ;;