Merge pull request #22 from vmstan/development

1.6.0
This commit is contained in:
Michael Stanclift 2020-05-28 22:07:36 -05:00 committed by GitHub
commit f0e3a06c7e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 394 additions and 202 deletions

View File

@ -1,6 +1,6 @@
# Gravity Sync # Gravity Sync
## Background ## Background
What is better than a [Pi-hole](https://github.com/pi-hole/pi-hole) blocking ads via DNS on your network? That's right, Two Pi-hole! But if you have more than one Pi-hole (PH) in your network you'll want a simple way to keep the list configurations identical between the two. What is better than a [Pi-hole](https://github.com/pi-hole/pi-hole) blocking ads via DNS on your network? That's right, Two Pi-hole! But if you have more than one Pi-hole in your network you'll want a simple way to keep the list configurations identical between the two.
That's Gravity Sync. That's Gravity Sync.
@ -13,7 +13,7 @@ Gravity Sync will **not** overwrite device specific settings such as local netwo
## Prerequisites ## Prerequisites
Gravity Sync **requires** Pi-hole 5.0 or higher. Gravity Sync **requires** Pi-hole 5.0 or higher.
You will need to designate one Pi-Hole as primary and one as secondary. This is where you'll make all your configuration changes through the Web UI, doing things such as; manual whitelisting, adding blocklists, device/group management, and other list settings. Gravity Sync will pull the configuration of the primary PH to the secondary. It will also bring over the downloaded blocklist files after a `pihole -g` update on the primary, so you do not need to reach out to all your blocklist hosts for updates after syncing. You will need to designate one Pi-Hole as primary and one as secondary. This is where you'll make all your configuration changes through the Web UI, doing things such as; manual whitelisting, adding blocklists, device/group management, and other list settings. Gravity Sync will pull the configuration of the primary Pi-hole to the secondary. It will also bring over the downloaded blocklist files after a `pihole -g` update on the primary, so you do not need to reach out to all your blocklist hosts for updates after syncing.
The designation of primary and secondary is purely at your discretion and depends on your desired use case. The designation of primary and secondary is purely at your discretion and depends on your desired use case.
@ -44,9 +44,9 @@ Download the latest release from [GitHub](https://github.com/vmstan/gravity-sync
```bash ```bash
cd ~ cd ~
wget https://github.com/vmstan/gravity-sync/archive/v1.5.0.zip wget https://github.com/vmstan/gravity-sync/archive/v1.6.0zip
unzip v1.5.0.zip unzip v1.6.0.zip
mv ~/gravity-sync-1.5.0 ~/gravity-sync mv ~/gravity-sync-1.6.0 ~/gravity-sync
cd gravity-sync cd gravity-sync
``` ```
@ -95,7 +95,7 @@ Gravity Sync uses SSH to run commands on the primary Pi-hole, and sync the two s
#### Key-Pair Authentication #### Key-Pair Authentication
This is the preferred option, as it's more reliable and less dependant on third party plugins. This is the preferred option, as it's more reliable and less dependant on third party plugins.
You'll need to generate an SSH key for your secondary PH user and copy it to your primary PH. This will allow you to connect to and copy the gravity.db file without needing a password each time. When generating the SSH key, accept all the defaults and do not put a passphrase on your key file. You'll need to generate an SSH key for your secondary Pi-hole user and copy it to your primary Pi-hole. This will allow you to connect to and copy the gravity.db file without needing a password each time. When generating the SSH key, accept all the defaults and do not put a passphrase on your key file.
*Note: If you already have this setup on your systems for other purposes, you can skip this step.* *Note: If you already have this setup on your systems for other purposes, you can skip this step.*
@ -104,12 +104,12 @@ ssh-keygen -t rsa
ssh-copy-id -i ~/.ssh/id_rsa.pub REMOTE_USER@REMOTE_HOST ssh-copy-id -i ~/.ssh/id_rsa.pub REMOTE_USER@REMOTE_HOST
``` ```
Subsitute REMOTE_USER for the account on the primary PH with sudo permissions, and REMOTE_HOST for the IP or DNS name of the PH you have designated as the primary. Subsitute REMOTE_USER for the account on the primary Pi-hole with sudo permissions, and REMOTE_HOST for the IP or DNS name of the Pi-hole you have designated as the primary.
Make sure to leave the `REMOTE_PASS` variable set to nothing in `gravity-sync.conf` if you want to use key-pair authentication. Make sure to leave the `REMOTE_PASS` variable set to nothing in `gravity-sync.conf` if you want to use key-pair authentication.
#### Password Authentication #### Password Authentication
This is the non-preferred option, as it depends on an non-standard utility called `sshpass` which must be installed on your secondary PH. Install it using your package manager of choice. The example below is for Raspberry Pi OS (previously Raspbian) or Ubuntu. This is the non-preferred option, as it depends on an non-standard utility called `sshpass` which must be installed on your secondary Pi-hole. Install it using your package manager of choice. The example below is for Raspberry Pi OS (previously Raspbian) or Ubuntu.
```bash ```bash
sudo apt install sshpass sudo apt install sshpass
@ -126,13 +126,13 @@ Gravity Sync will validate that the `sshpass` utility is installed on your syste
Save. Keep calm, carry on. Save. Keep calm, carry on.
## Execution ## Execution
Now test the script. You can run a comparison between the two which will be non-distruptive and see if everything has been configured correctly. Now, test Gravity Sync. You can run a comparison between primary and secondary databases, which will be non-distruptive, and see if everything has been configured correctly.
```bash ```bash
./gravity-sync.sh compare ./gravity-sync.sh compare
``` ```
Assuming Gravity Sync runs successfully, it'll indicate if there are changes pending between the two databases. If not, I suggest making a subtle change to a whitelist/blacklist on your primary PH, such as changing a description field or disabling a whitelist item, and then running `./gravity-sync.sh compare` again to validate your installation is working correctly. Assuming Gravity Sync runs successfully, it will indicate if there are changes pending between the two databases. If not, make a subtle change to a whitelist/blacklist on your primary Pi-hole, such as changing a description field or disabling a whitelist item, and then running `./gravity-sync.sh compare` again to validate your installation is working correctly.
### The Pull Function ### The Pull Function
@ -142,20 +142,31 @@ The Gravity Sync Pull, is the standard method of sync operation, and will not pr
./gravity-sync.sh pull ./gravity-sync.sh pull
``` ```
If the execution completes, you will now have overwritten your running gravity.db on the secondary PH after creating a copy of the running database (`gravity.db.backup`) in the `backup` subfolder located with your script. Gravity Sync will also keep a copy of the last sync'd gravity.db from the master, in the `backup` folder identified as `gravity.db.pull` for future use. If the execution completes, you will now have overwritten your running gravity.db on the secondary Pi-hole after creating a copy of the running database (`gravity.db.backup`) in the `backup` subfolder located with your script. Gravity Sync will also keep a copy of the last sync'd gravity.db from the primary (in the `backup` folder identified as `gravity.db.pull`) for future use.
Finally, a file called `gravity-sync.log` will be created in the `gravity-sync` folder along side the script with the date the script was last executed appended to the bottom. Finally, a file called `gravity-sync.log` will be created in the `gravity-sync` folder along side the script with the date the script was last executed appended to the bottom.
You can check for successful pull attempts by running: `./gravity-sync.sh logs` You can check for successful pull attempts by running: `./gravity-sync.sh logs`
### The Push Function ### The Push Function
Gravity Sync includes the ability to `push` from the secondary PH back to the primary. This would be useful in a situation where your primary PH is down for an extended period of time, and you have made list changes on the secondary PH that you want to force back to the primary, when it comes online. Gravity Sync includes the ability to `push` from the secondary Pi-hole back to the primary. This would be useful in a situation where your primary Pi-hole is down for an extended period of time, and you have made list changes on the secondary Pi-hole that you want to force back to the primary, when it comes online.
```bash ```bash
./gravity-sync.sh push ./gravity-sync.sh push
``` ```
Before executing, this will make a copy of the remote database under `backup/gravity.db.push` then sync the local configuration to the primary PH. Before executing, this will make a copy of the remote database under `backup/gravity.db.push` then sync the local configuration to the primary Pi-hole.
This function purposefuly asks for user interaction to avoid being accidentally automated.
### The Restore Function
Graviy Sync can also `restore` the database on the secondary Pi-hole in the event you've overwritten it accidentally. This might happen in the above scenario where you've had your primary Pi-hole down for an extended period, made changes to the secondary, but perhaps didn't get a chance to perform a `push` of the changes back to the primary, before your automated sync ran.
```bash
./gravity-sync.sh restore
```
This will copy your last `gravity.db.backup` to the running copy on the secondary Pi-hole.
This function purposefuly asks for user interaction to avoid being accidentally automated. This function purposefuly asks for user interaction to avoid being accidentally automated.
@ -225,3 +236,5 @@ chmod +x gravity-sync.sh
- If you'd like to know what version of the script you have running by running `./gravity-sync.sh version` - If you'd like to know what version of the script you have running by running `./gravity-sync.sh version`
- If the update script fails, make sure you did your original deployment via `git clone` and not a manual install. - If the update script fails, make sure you did your original deployment via `git clone` and not a manual install.
- If it doesn't kick off, you can manually execute a `git pull` while in the `gravity-sync` directory. - If it doesn't kick off, you can manually execute a `git pull` while in the `gravity-sync` directory.
If all else fails, delete the entire `gravity-sync` folder from your system and re-deploy. This will have no impact on your replicated databases.

View File

@ -26,3 +26,4 @@ REMOTE_PASS=''
# LOG_PATH='' # LOG_PATH=''
# SYNCING_LOG='' # SYNCING_LOG=''
# CRONJOB_LOG='' # CRONJOB_LOG=''
# VERIFY_PASS='' # 0=Verify 1=Bypass

View File

@ -2,7 +2,7 @@
# GRAVITY SYNC BY VMSTAN ##################### # GRAVITY SYNC BY VMSTAN #####################
PROGRAM='Gravity Sync' PROGRAM='Gravity Sync'
VERSION='1.5.0' VERSION='1.6.0'
# Execute from the home folder of the user who owns it (ex: 'cd ~/gravity-sync') # Execute from the home folder of the user who owns it (ex: 'cd ~/gravity-sync')
# For documentation or downloading updates visit https://github.com/vmstan/gravity-sync # For documentation or downloading updates visit https://github.com/vmstan/gravity-sync
@ -24,10 +24,13 @@ LOG_PATH="$HOME/${LOCAL_FOLDR}" # replace in gravity-sync.conf to overwrite
SYNCING_LOG='gravity-sync.log' # replace in gravity-sync.conf to overwrite SYNCING_LOG='gravity-sync.log' # replace in gravity-sync.conf to overwrite
CRONJOB_LOG='gravity-sync.cron' # replace in gravity-sync.conf to overwrite CRONJOB_LOG='gravity-sync.cron' # replace in gravity-sync.conf to overwrite
# PH Folder/File Locations # Interaction Customization
PIHOLE_DIR='/etc/pihole' # default PH data directory VERIFY_PASS='0' # replace in gravity-sync.conf to overwrite
GRAVITY_FI='gravity.db' # default PH database file
PIHOLE_BIN='/usr/local/bin/pihole' # default PH binary directory # Pi-hole Folder/File Locations
PIHOLE_DIR='/etc/pihole' # default Pi-hole data directory
GRAVITY_FI='gravity.db' # default Pi-hole database file
PIHOLE_BIN='/usr/local/bin/pihole' # default Pi-hole binary directory
# OS Settings # OS Settings
BASH_PATH='/bin/bash' # default OS bash path BASH_PATH='/bin/bash' # default OS bash path
@ -73,12 +76,12 @@ function import_gs {
error_validate error_validate
MESSAGE="Using ${REMOTE_USER}@${REMOTE_HOST}" MESSAGE="Using ${REMOTE_USER}@${REMOTE_HOST}"
echo -e "${INFO} ${MESSAGE}" echo_info
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
MESSAGE="${CONFIG_FILE} Missing" MESSAGE="${CONFIG_FILE} Missing"
echo -e "${INFO} ${MESSAGE}" echo_info
TASKTYPE='CONFIG' TASKTYPE='CONFIG'
config_generate config_generate
@ -93,7 +96,7 @@ function update_gs {
# logs_export # dumps log prior to execution because script stops after successful pull # logs_export # dumps log prior to execution because script stops after successful pull
MESSAGE="Requires GitHub Installation" MESSAGE="Requires GitHub Installation"
echo -e "${INFO} ${MESSAGE}" echo_info
git reset --hard git reset --hard
git pull git pull
exit exit
@ -105,7 +108,7 @@ function beta_gs {
# logs_export # dumps log prior to execution because script stops after successful pull # logs_export # dumps log prior to execution because script stops after successful pull
MESSAGE="Requires GitHub Installation" MESSAGE="Requires GitHub Installation"
echo -e "${INFO} ${MESSAGE}" echo_info
git reset --hard git reset --hard
git fetch origin git fetch origin
git pull origin development git pull origin development
@ -115,77 +118,72 @@ function beta_gs {
# Gravity Core Functions # Gravity Core Functions
## Pull Function ## Pull Function
function pull_gs { function pull_gs {
TASKTYPE='PULL'
echo -e "${INFO} ${TASKTYPE} Requested"
md5_compare md5_compare
echo -e "${INFO} ${TASKTYPE} Commencing"
MESSAGE="Backing Up ${GRAVITY_FI} on $HOSTNAME" MESSAGE="Backing Up ${GRAVITY_FI} on $HOSTNAME"
echo -en "${STAT} ${MESSAGE}" echo_stat
cp ${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.backup >/dev/null 2>&1 cp ${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.backup >/dev/null 2>&1
error_validate error_validate
MESSAGE="Pulling ${GRAVITY_FI} from ${REMOTE_HOST}" MESSAGE="Pulling ${GRAVITY_FI} from ${REMOTE_HOST}"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} rsync -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull >/dev/null 2>&1 ${SSHPASSWORD} rsync -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull >/dev/null 2>&1
error_validate error_validate
MESSAGE="Replacing ${GRAVITY_FI} on $HOSTNAME" MESSAGE="Replacing ${GRAVITY_FI} on $HOSTNAME"
echo -en "${STAT} ${MESSAGE}" echo_stat
sudo cp $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 sudo cp $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Ownership on ${GRAVITY_FI}" MESSAGE="Validating Ownership on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk '{print $3 $4}') GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk '{print $3 $4}')
if [ $GRAVDB_OWN == "piholepihole" ] if [ $GRAVDB_OWN == "piholepihole" ]
then then
echo -e "\r${GOOD} ${MESSAGE}" echo_good
else else
echo -e "\r${FAIL} $MESSAGE" echo_fail
MESSAGE2="Attempting to Compensate" MESSAGE="Attempting to Compensate"
echo -e "${INFO} ${MESSAGE2}" echo_info
MESSAGE="Setting Ownership on ${GRAVITY_FI}" MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
fi fi
MESSAGE="Validating Permissions on ${GRAVITY_FI}" MESSAGE="Validating Permissions on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
GRAVDB_RWE=$(namei -m ${PIHOLE_DIR}/${GRAVITY_FI} | grep -v f: | grep ${GRAVITY_FI} | awk '{print $1}') GRAVDB_RWE=$(namei -m ${PIHOLE_DIR}/${GRAVITY_FI} | grep -v f: | grep ${GRAVITY_FI} | awk '{print $1}')
if [ $GRAVDB_RWE = "-rw-rw-r--" ] if [ $GRAVDB_RWE = "-rw-rw-r--" ]
then then
echo -e "\r${GOOD} ${MESSAGE}" echo_good
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
MESSAGE2="Attempting to Compensate" MESSAGE="Attempting to Compensate"
echo -e "${INFO} ${MESSAGE2}" echo_info
MESSAGE="Setting Ownership on ${GRAVITY_FI}" MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
fi fi
MESSAGE="Inverting Tachyon Pulse" MESSAGE="Inverting Tachyon Pulse"
echo -e "${INFO} ${MESSAGE}" echo_info
sleep 1 sleep 1
MESSAGE="Updating FTLDNS Configuration" MESSAGE="Updating FTLDNS Configuration"
echo -en "${STAT} ${MESSAGE}" echo_stat
${PIHOLE_BIN} restartdns reloadlists >/dev/null 2>&1 ${PIHOLE_BIN} restartdns reloadlists >/dev/null 2>&1
error_validate error_validate
MESSAGE="Reloading FTLDNS Services" MESSAGE="Reloading FTLDNS Services"
echo -en "${STAT} ${MESSAGE}" echo_stat
${PIHOLE_BIN} restartdns >/dev/null 2>&1 ${PIHOLE_BIN} restartdns >/dev/null 2>&1
error_validate error_validate
@ -195,66 +193,122 @@ function pull_gs {
## Push Function ## Push Function
function push_gs { function push_gs {
TASKTYPE='PUSH'
echo -e "${INFO} ${TASKTYPE} Requested"
md5_compare md5_compare
echo -e "${WARN} Are you sure you want to overwrite the primary PH configuration on ${REMOTE_HOST}?" intent_validate
select yn in "Yes" "No"; do
case $yn in
Yes )
MESSAGE="Backing Up ${GRAVITY_FI} from ${REMOTE_HOST}" MESSAGE="Backing Up ${GRAVITY_FI} from ${REMOTE_HOST}"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} rsync -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push >/dev/null 2>&1 ${SSHPASSWORD} rsync -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push >/dev/null 2>&1
error_validate error_validate
MESSAGE="Pushing ${GRAVITY_FI} to ${REMOTE_HOST}" MESSAGE="Pushing ${GRAVITY_FI} to ${REMOTE_HOST}"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} rsync --rsync-path="sudo rsync" -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${PIHOLE_DIR}/${GRAVITY_FI} ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 ${SSHPASSWORD} rsync --rsync-path="sudo rsync" -e "ssh -p ${SSH_PORT} -i $HOME/${SSH_PKIF}" ${PIHOLE_DIR}/${GRAVITY_FI} ${REMOTE_USER}@${REMOTE_HOST}:${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Setting Permissions on ${GRAVITY_FI}" MESSAGE="Setting Permissions on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1
error_validate error_validate
MESSAGE="Setting Ownership on ${GRAVITY_FI}" MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI}" >/dev/null 2>&1
error_validate error_validate
MESSAGE="Contacting Borg Collective" MESSAGE="Contacting Borg Collective"
echo -e "${INFO} ${MESSAGE}" echo_info
sleep 1 sleep 1
MESSAGE="Updating FTLDNS Configuration" MESSAGE="Updating FTLDNS Configuration"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "${PIHOLE_BIN} restartdns reloadlists" >/dev/null 2>&1 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "${PIHOLE_BIN} restartdns reloadlists" >/dev/null 2>&1
error_validate error_validate
MESSAGE="Reloading FTLDNS Services" MESSAGE="Reloading FTLDNS Services"
echo -en "${STAT} ${MESSAGE}" echo_stat
${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "${PIHOLE_BIN} restartdns" >/dev/null 2>&1 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "${PIHOLE_BIN} restartdns" >/dev/null 2>&1
error_validate error_validate
logs_export logs_export
exit_withchange exit_withchange
;; }
No ) function restore_gs {
exit_nochange MESSAGE="This will restore ${GRAVITY_FI} on $HOSTNAME with the previous version!"
;; echo_warn
esac
done intent_validate
MESSAGE="Restoring ${GRAVITY_FI} on $HOSTNAME"
echo_stat
sudo cp $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.backup ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
MESSAGE="Validating Ownership on ${GRAVITY_FI}"
echo_stat
GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk '{print $3 $4}')
if [ $GRAVDB_OWN == "piholepihole" ]
then
echo_good
else
echo_fail
MESSAGE="Attempting to Compensate"
echo_info
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chown pihole:pihole ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
MESSAGE="Validating Permissions on ${GRAVITY_FI}"
echo_stat
GRAVDB_RWE=$(namei -m ${PIHOLE_DIR}/${GRAVITY_FI} | grep -v f: | grep ${GRAVITY_FI} | awk '{print $1}')
if [ $GRAVDB_RWE = "-rw-rw-r--" ]
then
echo_good
else
echo_fail
MESSAGE="Attempting to Compensate"
echo_info
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
MESSAGE="Evacuating Saucer Section"
echo_info
sleep 1
MESSAGE="Updating FTLDNS Configuration"
echo_stat
${PIHOLE_BIN} restartdns reloadlists >/dev/null 2>&1
error_validate
MESSAGE="Reloading FTLDNS Services"
echo_stat
${PIHOLE_BIN} restartdns >/dev/null 2>&1
error_validate
logs_export
exit_withchange
} }
# Logging Functions # Logging Functions
## Core Logging ## Core Logging
### Write Logs Out ### Write Logs Out
function logs_export { function logs_export {
echo -e "${INFO} Logging Timestamps to ${SYNCING_LOG}" MESSAGE="Logging Timestamps to ${SYNCING_LOG}"
echo_info
echo -e $(date) "[${TASKTYPE}]" >> ${LOG_PATH}/${SYNCING_LOG} echo -e $(date) "[${TASKTYPE}]" >> ${LOG_PATH}/${SYNCING_LOG}
} }
@ -262,13 +316,16 @@ function logs_export {
function logs_gs { function logs_gs {
import_gs import_gs
echo -e "${INFO} Tailing ${LOG_PATH}/${SYNCING_LOG}" MESSAGE="Tailing ${LOG_PATH}/${SYNCING_LOG}"
echo_info
echo -e "========================================================" echo -e "========================================================"
echo -e "Recent Complete ${YELLOW}PULL${NC} Executions" echo -e "Recent Complete ${YELLOW}PULL${NC} Executions"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PULL tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PULL
echo -e "Recent Complete ${YELLOW}PUSH${NC} Executions" echo -e "Recent Complete ${YELLOW}PUSH${NC} Executions"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PUSH tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PUSH
echo -e "========================================================" echo -e "========================================================"
exit_nochange exit_nochange
} }
@ -278,27 +335,36 @@ function show_crontab {
import_gs import_gs
MESSAGE="Replaying Last Cronjob" MESSAGE="Replaying Last Cronjob"
echo -en "${STAT} ${MESSAGE}" echo_stat
if [ -f ${LOG_PATH}/${CRONJOB_LOG} ] if [ -f ${LOG_PATH}/${CRONJOB_LOG} ]
then then
if [ -s ${LOG_PATH}/${CRONJOB_LOG} ] if [ -s ${LOG_PATH}/${CRONJOB_LOG} ]
echo -e "\r${GOOD} ${MESSAGE}" echo_good
MESSAGE="Tailing ${LOG_PATH}/${CRONJOB_LOG}"
echo_info
echo -e "${INFO} Tailing ${LOG_PATH}/${CRONJOB_LOG}"
echo -e "========================================================" echo -e "========================================================"
date -r ${LOG_PATH}/${CRONJOB_LOG} date -r ${LOG_PATH}/${CRONJOB_LOG}
cat ${LOG_PATH}/${CRONJOB_LOG} cat ${LOG_PATH}/${CRONJOB_LOG}
echo -e "========================================================" echo -e "========================================================"
exit_nochange exit_nochange
then then
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
echo -e "${INFO} ${LOG_PATH}/${CRONJOB_LOG} appears empty"
MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Empty"
echo_info
exit_nochange exit_nochange
fi fi
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
echo -e "${INFO} ${LOG_PATH}/${CRONJOB_LOG} not yet created"
MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Missing"
echo_info
exit_nochange exit_nochange
fi fi
} }
@ -307,35 +373,35 @@ function show_crontab {
## Validate GS Folders ## Validate GS Folders
function validate_gs_folders { function validate_gs_folders {
MESSAGE="Locating $HOME/${LOCAL_FOLDR}" MESSAGE="Locating $HOME/${LOCAL_FOLDR}"
echo -en "${STAT} ${MESSAGE}" echo_stat
if [ -d $HOME/${LOCAL_FOLDR} ] if [ -d $HOME/${LOCAL_FOLDR} ]
then then
echo -e "\r${GOOD} ${MESSAGE}" echo_good
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
exit_nochange exit_nochange
fi fi
MESSAGE="Locating $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}" MESSAGE="Locating $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD}"
echo -en "${STAT} ${MESSAGE}" echo_stat
if [ -d $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD} ] if [ -d $HOME/${LOCAL_FOLDR}/${BACKUP_FOLD} ]
then then
echo -e "\r${GOOD} ${MESSAGE}" echo_good
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
exit_nochange exit_nochange
fi fi
} }
## Validate PH Folders ## Validate Pi-hole Folders
function validate_ph_folders { function validate_ph_folders {
MESSAGE="Locating ${PIHOLE_DIR}" MESSAGE="Locating ${PIHOLE_DIR}"
echo -en "${STAT} ${MESSAGE}" echo_stat
if [ -d ${PIHOLE_DIR} ] if [ -d ${PIHOLE_DIR} ]
then then
echo -e "\r${GOOD} ${MESSAGE}" echo_good
else else
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
exit_nochange exit_nochange
fi fi
} }
@ -343,7 +409,7 @@ function validate_ph_folders {
## Validate SSHPASS ## Validate SSHPASS
function validate_os_sshpass { function validate_os_sshpass {
MESSAGE="Checking SSH Configuration" MESSAGE="Checking SSH Configuration"
echo -e "${INFO} ${MESSAGE}" echo_info
if hash sshpass 2>/dev/null if hash sshpass 2>/dev/null
then then
@ -367,10 +433,10 @@ function validate_os_sshpass {
MESSAGE="Using SSH Key-Pair Authentication" MESSAGE="Using SSH Key-Pair Authentication"
fi fi
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Testing SSH Connection" MESSAGE="Testing SSH Connection"
echo -en "${STAT} ${MESSAGE}" echo_stat
timeout 5 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i '$HOME/${SSH_PKIF}' -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'exit' >/dev/null 2>&1 timeout 5 ${SSHPASSWORD} ssh -p ${SSH_PORT} -i '$HOME/${SSH_PKIF}' -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'exit' >/dev/null 2>&1
error_validate error_validate
} }
@ -378,33 +444,72 @@ function validate_os_sshpass {
## Error Validation ## Error Validation
function error_validate { function error_validate {
if [ "$?" != "0" ]; then if [ "$?" != "0" ]; then
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
exit 1 exit 1
else else
echo -e "\r${GOOD} ${MESSAGE}" echo_good
fi fi
} }
## Validate Sync Required ## Validate Sync Required
function md5_compare { function md5_compare {
echo -e "${INFO} Comparing ${GRAVITY_FI} Changes" MESSAGE="Comparing ${GRAVITY_FI} Changes"
echo_info
MESSAGE="Analyzing Remote ${GRAVITY_FI}" MESSAGE="Analyzing Remote ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
primaryMD5=$(${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${PIHOLE_DIR}/${GRAVITY_FI}") primaryMD5=$(${SSHPASSWORD} ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${PIHOLE_DIR}/${GRAVITY_FI}")
error_validate error_validate
MESSAGE="Analyzing Local ${GRAVITY_FI}" MESSAGE="Analyzing Local ${GRAVITY_FI}"
echo -en "${STAT} ${MESSAGE}" echo_stat
secondMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI}) secondMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI})
error_validate error_validate
if [ "$primaryMD5" == "$secondMD5" ] if [ "$primaryMD5" == "$secondMD5" ]
then then
echo -e "${INFO} No Differences in ${GRAVITY_FI}" MESSAGE="No Differences in ${GRAVITY_FI}"
echo_info
exit_nochange exit_nochange
else else
echo -e "${INFO} Changes Detected in ${GRAVITY_FI}" MESSAGE="Changes Detected in ${GRAVITY_FI}"
echo_info
fi
}
## Validate Intent
function intent_validate {
if [ "$VERIFY_PASS" == "0" ]
then
PHASER=$((( RANDOM % 4 ) + 1 ))
if [ "$PHASER" = "1" ]
then
INTENT="FIRE PHOTON TORPEDOS"
elif [ "$PHASER" = "2" ]
then
INTENT="FIRE ALL PHASERS"
elif [ "$PHASER" = "3" ]
then
INTENT="EJECT THE WARPCORE"
elif [ "$PHASER" = "4" ]
then
INTENT="ENGAGE TRACTOR BEAM"
fi
MESSAGE="Enter ${INTENT} at this prompt to confirm"
echo_need
read INPUT_INTENT
if [ "${INPUT_INTENT}" != "${INTENT}" ]
then
MESSAGE="${TASKTYPE} Aborted"
echo_info
exit_nochange
fi
else
MESSAGE="Verification Bypassed"
echo_warn
fi fi
} }
@ -412,53 +517,53 @@ function md5_compare {
## Generate New Configuration ## Generate New Configuration
function config_generate { function config_generate {
MESSAGE="Creating ${CONFIG_FILE} from Template" MESSAGE="Creating ${CONFIG_FILE} from Template"
echo -en "${STAT} ${MESSAGE}" echo_stat
cp $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}.example $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} cp $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}.example $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
MESSAGE="Enter IP or DNS of primary Pi-hole server: " MESSAGE="Enter IP or DNS of primary Pi-hole server"
echo -en "${NEED} ${MESSAGE}" echo_need
read INPUT_REMOTE_HOST read INPUT_REMOTE_HOST
MESSAGE="Enter SSH user with SUDO rights on primary Pi-hole server: " MESSAGE="Enter SSH user with SUDO rights on primary Pi-hole server"
echo -en "${NEED} ${MESSAGE}" echo_need
read INPUT_REMOTE_USER read INPUT_REMOTE_USER
MESSAGE="Saving Host to ${CONFIG_FILE}" MESSAGE="Saving Host to ${CONFIG_FILE}"
echo -en "${STAT} ${MESSAGE}" echo_stat
sed -i "/REMOTE_HOST='192.168.1.10'/c\REMOTE_HOST='${INPUT_REMOTE_HOST}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} sed -i "/REMOTE_HOST='192.168.1.10'/c\REMOTE_HOST='${INPUT_REMOTE_HOST}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
MESSAGE="Saving User to ${CONFIG_FILE}" MESSAGE="Saving User to ${CONFIG_FILE}"
echo -en "${STAT} ${MESSAGE}" echo_stat
sed -i "/REMOTE_USER='pi'/c\REMOTE_USER='${INPUT_REMOTE_USER}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} sed -i "/REMOTE_USER='pi'/c\REMOTE_USER='${INPUT_REMOTE_USER}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
if hash sshpass 2>/dev/null if hash sshpass 2>/dev/null
then then
MESSAGE="SSHPASS Utility Detected" MESSAGE="SSHPASS Utility Detected"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Do you want to configure password based SSH authentication?" MESSAGE="Do you want to configure password based SSH authentication?"
echo -e "${WARN} ${MESSAGE}" echo_warn
MESSAGE="Your password will be stored clear-text in the ${CONFIG_FILE}!" MESSAGE="Your password will be stored clear-text in the ${CONFIG_FILE}!"
echo -e "${WARN} ${MESSAGE}" echo_warn
MESSAGE="Leave blank to use (preferred) SSH Key-Pair Authentication: " MESSAGE="Leave blank to use (preferred) SSH Key-Pair Authentication"
echo -en "${NEED} ${MESSAGE}" echo_need
read INPUT_REMOTE_PASS read INPUT_REMOTE_PASS
MESSAGE="Saving Password to ${CONFIG_FILE}" MESSAGE="Saving Password to ${CONFIG_FILE}"
echo -en "${STAT} ${MESSAGE}" echo_stat
sed -i "/REMOTE_PASS=''/c\REMOTE_PASS='${INPUT_REMOTE_PASS}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} sed -i "/REMOTE_PASS=''/c\REMOTE_PASS='${INPUT_REMOTE_PASS}'" $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
else else
MESSAGE="SSHPASS Not Installed" MESSAGE="SSHPASS Not Installed"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Defaulting to SSH Key-Pair Authentication" MESSAGE="Defaulting to SSH Key-Pair Authentication"
echo -e "${INFO} ${MESSAGE}" echo_info
fi fi
if [ -z $INPUT_REMOTE_PASS ] if [ -z $INPUT_REMOTE_PASS ]
@ -466,13 +571,13 @@ function config_generate {
if [ -f $HOME/${SSH_PKIF} ] if [ -f $HOME/${SSH_PKIF} ]
then then
MESSAGE="Using Existing ~/${SSH_PKIF}" MESSAGE="Using Existing ~/${SSH_PKIF}"
echo -e "${INFO} ${MESSAGE}" echo_info
else else
MESSAGE="Generating ~/${SSH_PKIF}" MESSAGE="Generating ~/${SSH_PKIF}"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Accept All Defaults" MESSAGE="Accept All Defaults"
echo -e "${WARN} ${MESSAGE}" echo_warn
MESSAGE="Complete Key-Pair Creation" MESSAGE="Complete Key-Pair Creation"
echo -e "${NEED} ${MESSAGE}" echo -e "${NEED} ${MESSAGE}"
@ -486,7 +591,7 @@ function config_generate {
fi fi
MESSAGE="Importing New ${CONFIG_FILE}" MESSAGE="Importing New ${CONFIG_FILE}"
echo -en "${STAT} ${MESSAGE}" echo_stat
source $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} source $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
@ -495,7 +600,7 @@ function config_generate {
if [ -f $HOME/${SSH_PKIF} ] if [ -f $HOME/${SSH_PKIF} ]
then then
MESSAGE="Registering Key-Pair on ${REMOTE_HOST}" MESSAGE="Registering Key-Pair on ${REMOTE_HOST}"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Enter ${REMOTE_USER}@${REMOTE_HOST} Password Below" MESSAGE="Enter ${REMOTE_USER}@${REMOTE_HOST} Password Below"
echo -e "${NEED} ${MESSAGE}" echo -e "${NEED} ${MESSAGE}"
@ -520,37 +625,30 @@ function config_generate {
function config_delete { function config_delete {
source $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} source $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
MESSAGE="Configuration File Exists" MESSAGE="Configuration File Exists"
echo -e "${WARN} ${MESSAGE}" echo_warn
echo -e "========================================================" echo -e "========================================================"
cat $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} cat $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
echo -e "========================================================" echo -e "========================================================"
MESSAGE="Are you sure you want to erase this configuration?" MESSAGE="Are you sure you want to erase this configuration?"
echo -e "${WARN} ${MESSAGE}" echo_warn
intent_validate
select yn in "Yes" "No"; do
case $yn in
Yes )
MESSAGE="Erasing Existing Configuration" MESSAGE="Erasing Existing Configuration"
echo -en "${STAT} ${MESSAGE}" echo_stat
rm -f $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} rm -f $HOME/${LOCAL_FOLDR}/${CONFIG_FILE}
error_validate error_validate
config_generate config_generate
;;
No )
exit_nochange
;;
esac
done
} }
# Exit Codes # Exit Codes
## No Changes Made ## No Changes Made
function exit_nochange { function exit_nochange {
echo -e "${INFO} ${PROGRAM} ${TASKTYPE} Aborting" MESSAGE="${PROGRAM} ${TASKTYPE} Aborting"
echo_info
exit 0 exit 0
} }
@ -558,7 +656,7 @@ function exit_nochange {
function exit_withchange { function exit_withchange {
SCRIPT_END=$SECONDS SCRIPT_END=$SECONDS
MESSAGE="${PROGRAM} ${TASKTYPE} Completed in $((SCRIPT_END-SCRIPT_START)) seconds" MESSAGE="${PROGRAM} ${TASKTYPE} Completed in $((SCRIPT_END-SCRIPT_START)) seconds"
echo -e "${INFO} ${MESSAGE}" echo_info
exit 0 exit 0
} }
@ -572,8 +670,9 @@ function list_gs_arguments {
echo -e " ${YELLOW}automate${NC} Add scheduled task to run sync" echo -e " ${YELLOW}automate${NC} Add scheduled task to run sync"
echo -e "" echo -e ""
echo -e "Replication Options:" echo -e "Replication Options:"
echo -e " ${YELLOW}pull${NC} Sync the ${GRAVITY_FI} database on primary PH to this server" echo -e " ${YELLOW}pull${NC} Sync the ${GRAVITY_FI} database on primary Pi-hole to this server"
echo -e " ${YELLOW}push${NC} Force any changes made on this server back to the primary PH" echo -e " ${YELLOW}push${NC} Force any changes made on this server back to the primary Pi-hole"
echo -e " ${YELLOW}restore${NC} Restore ${GRAVITY_FI} on this server from previous copy"
echo -e " ${YELLOW}compare${NC} Just check for differences between primary and secondary" echo -e " ${YELLOW}compare${NC} Just check for differences between primary and secondary"
echo -e "" echo -e ""
echo -e "Update Options:" echo -e "Update Options:"
@ -590,14 +689,15 @@ function list_gs_arguments {
# Output Version # Output Version
function show_version { function show_version {
echo -e "${INFO} ${PROGRAM} ${VERSION}" MESSAGE="${PROGRAM} ${VERSION}"
echo_info
} }
# Task Stack # Task Stack
## Automate Task ## Automate Task
function task_automate { function task_automate {
TASKTYPE='AUTOMATE' TASKTYPE='AUTOMATE'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
import_gs import_gs
@ -605,14 +705,14 @@ function task_automate {
if [ ${CRON_CHECK} == 1 ] if [ ${CRON_CHECK} == 1 ]
then then
MESSAGE="Automation Task Already Exists" MESSAGE="Automation Task Already Exists"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="Use 'crontab -e' to manually remove/edit" MESSAGE="Use 'crontab -e' to manually remove/edit"
echo -e "${INFO} ${MESSAGE}" echo_info
exit_nochange exit_nochange
fi fi
MESSAGE="Set Automation Frequency Per Hour" MESSAGE="Set Automation Frequency Per Hour"
echo -e "${INFO} ${MESSAGE}" echo_info
MESSAGE="1 = Every 60 Minutes" MESSAGE="1 = Every 60 Minutes"
echo -e "++++++ ${MESSAGE}" echo -e "++++++ ${MESSAGE}"
@ -625,8 +725,8 @@ function task_automate {
MESSAGE="12 = Every 05 Minutes" MESSAGE="12 = Every 05 Minutes"
echo -e "++++++ ${MESSAGE}" echo -e "++++++ ${MESSAGE}"
MESSAGE="Input Automation Frequency: " MESSAGE="Input Automation Frequency"
echo -en "${NEED} ${MESSAGE}" echo_need
read INPUT_AUTO_FREQ read INPUT_AUTO_FREQ
if [ $INPUT_AUTO_FREQ == 1 ] if [ $INPUT_AUTO_FREQ == 1 ]
@ -651,35 +751,72 @@ function task_automate {
fi fi
MESSAGE="Saving to Crontab" MESSAGE="Saving to Crontab"
echo -en "${STAT} ${MESSAGE}" echo_stat
(crontab -l 2>/dev/null; echo "*/${AUTO_FREQ} * * * * ${BASH_PATH} $HOME/${LOCAL_FOLDR}/${GS_FILENAME} pull > ${LOG_PATH}/${CRONJOB_LOG}") | crontab - (crontab -l 2>/dev/null; echo "*/${AUTO_FREQ} * * * * ${BASH_PATH} $HOME/${LOCAL_FOLDR}/${GS_FILENAME} pull > ${LOG_PATH}/${CRONJOB_LOG}") | crontab -
error_validate error_validate
exit_withchange exit_withchange
} }
# Echo Stack
## Informative
function echo_info {
echo -e "${INFO} ${MESSAGE}"
}
## Warning
function echo_warn {
echo -e "${WARN} ${MESSAGE}"
}
## Executing
function echo_stat {
echo -en "${STAT} ${MESSAGE}"
}
## Success
function echo_good {
echo -e "\r${GOOD} ${MESSAGE}"
}
## Failure
function echo_fail {
echo -e "\r${FAIL} ${MESSAGE}"
}
## Request
function echo_need {
echo -en "${NEED} ${MESSAGE}: "
}
# SCRIPT EXECUTION ########################### # SCRIPT EXECUTION ###########################
SCRIPT_START=$SECONDS SCRIPT_START=$SECONDS
MESSAGE="Evaluating Script Arguments" MESSAGE="Evaluating Script Arguments"
echo -en "${STAT} ${MESSAGE}" echo_stat
case $# in case $# in
0) 0)
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
list_gs_arguments list_gs_arguments
;; ;;
1) 1)
case $1 in case $1 in
pull) pull)
echo -e "\r${GOOD} ${MESSAGE}" TASKTYPE='PULL'
echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
import_gs import_gs
MESSAGE="Validating Folder Configuration" MESSAGE="Validating Folder Configuration"
echo -e "${INFO} ${MESSAGE}" echo_info
validate_gs_folders validate_gs_folders
validate_ph_folders validate_ph_folders
validate_os_sshpass validate_os_sshpass
@ -689,11 +826,16 @@ case $# in
;; ;;
push) push)
echo -e "\r${GOOD} ${MESSAGE}" TASKTYPE='PUSH'
echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
import_gs import_gs
echo -e "${INFO} Validating Folder Configuration" MESSAGE="Validating Folder Configuration"
echo_info
validate_gs_folders validate_gs_folders
validate_ph_folders validate_ph_folders
validate_os_sshpass validate_os_sshpass
@ -702,49 +844,80 @@ case $# in
exit exit
;; ;;
restore)
TASKTYPE='RESTORE'
echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
import_gs
MESSAGE="Validating Folder Configuration"
echo_info
validate_gs_folders
validate_ph_folders
# validate_os_sshpass
restore_gs
exit
;;
version) version)
TASKTYPE='VERSION' TASKTYPE='VERSION'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
show_version show_version
exit_nochange exit_nochange
;; ;;
update) update)
# TASKTYPE='UPDATE' TASKTYPE='UPDATE'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
echo -e "${INFO} Update Requested"
update_gs update_gs
exit_nochange exit_nochange
;; ;;
beta) beta)
# TASKTYPE='BETA' TASKTYPE='BETA'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
echo -e "${INFO} Beta Update Requested"
beta_gs beta_gs
exit_nochange exit_nochange
;; ;;
logs) logs)
TASKTYPE='LOGS' TASKTYPE='LOGS'
echo_good
echo -e "\r${GOOD} ${MESSAGE}" MESSAGE="${TASKTYPE} Requested"
echo_info
MESSAGE="Logs Requested"
echo -e "${INFO} ${MESSAGE}"
logs_gs logs_gs
;; ;;
compare) compare)
TASKTYPE='COMPARE' TASKTYPE='COMPARE'
echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
echo -e "\r${GOOD} ${MESSAGE}"
import_gs import_gs
echo -e "${INFO} Validating Folder Configuration" MESSAGE="Validating OS Configuration"
echo_info
validate_gs_folders validate_gs_folders
validate_ph_folders validate_ph_folders
validate_os_sshpass validate_os_sshpass
@ -754,15 +927,20 @@ case $# in
cron) cron)
TASKTYPE='CRON' TASKTYPE='CRON'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
MESSAGE="${TASKTYPE} Requested"
echo_info
show_crontab show_crontab
;; ;;
config) config)
TASKTYPE='CONFIGURE' TASKTYPE='CONFIGURE'
echo -e "\r${GOOD} ${MESSAGE}" echo_good
echo -e "${INFO} Entering ${TASKTYPE} Mode"
MESSAGE="${TASKTYPE} Requested"
echo_info
if [ -f $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} ] if [ -f $HOME/${LOCAL_FOLDR}/${CONFIG_FILE} ]
then then
@ -770,7 +948,7 @@ case $# in
else else
MESSAGE="${CONFIG_FILE} Missing" MESSAGE="${CONFIG_FILE} Missing"
echo -e "${INFO} ${MESSAGE}" echo_info
config_generate config_generate
fi fi
@ -785,14 +963,14 @@ case $# in
;; ;;
*) *)
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
list_gs_arguments list_gs_arguments
;; ;;
esac esac
;; ;;
*) *)
echo -e "\r${FAIL} ${MESSAGE}" echo_fail
list_gs_arguments list_gs_arguments
;; ;;
esac esac