3.3.3 is 3.4.0 (#185)

* new first line of script

* no requested

* Abort!

* Test silent folder validation

* sameline

* echo newline

* echo_sameline

* what happened?

* sameline for ssh

* sqlite sameline

* Lower case

* Reset line

* clear line

* Flip the line

* version update

* Backup lowercase

* More lowercase

* Remove file names from standard messages

* Breakout backup message

* Output backup folder size

* Just H

* Invalid replication settings

* Compare updated

* Colors and updates

* Lower case for version output

* For Pihole

* Cron cleanup

* Sudo, or no sudo.

* Branch!

* Silent error validate

* Silent error validate

* Clearing up status messages

* Records

* Primary and secondary

* Gravity database

* Domain Database

* Backup output cleanup

* Move file permission validation into new functions

* Change restart

* UI variables test

* Breakout UI variables into new file

* Unified validation functions

* Replace text strings with variables

* Replace text strings with variables

* Replace logging with variables

* Convert backup to UI variables

* Switch restore to UI variables

* Fix bug where gravity database did not restore

* App validation checks

* Rev to 3.4.0

* Convert Push functions to new strings

* Completing push UI changes

* remove added line

* Move purge to UI strings

* Move automation to UI strings

* Move core strings into UI

* Exit strings

* First pass at hashing UI

* Escape the remote system query (#179)

* hashing committed

Co-authored-by: Michael Stanclift <vmstan@mstanclift-a03.local>
Co-authored-by: Veduco <59983694+Veduco@users.noreply.github.com>
This commit is contained in:
Michael Stanclift 2021-04-01 15:16:20 -05:00 committed by GitHub
parent 6466e5a384
commit d97f92ccea
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 580 additions and 595 deletions

View File

@ -1,26 +1,30 @@
<p align="center"> <p align="center">
<img src="https://vmstan.com/content/images/2021/02/gs-logo.svg" width="40%" alt="Gravity Sync"> <img src="https://vmstan.com/content/images/2021/02/gs-logo.svg" width="300" alt="Gravity Sync">
</p> </p>
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 blocking ads on your network! <span align="center">
# Gravity Sync
</span>
###
What is better than a [Pi-hole](https://github.com/pi-hole/pi-hole) blocking trackers, advertisements, and other malicious domains on your network? That's right, **two** Pi-hole blocking all that junk on your network!
- [Seriously. Why two Pi-hole?](https://github.com/vmstan/gravity-sync/wiki/Frequent-Questions#why-do-i-need-more-than-one-pi-hole) - [Seriously. Why two Pi-hole?](https://github.com/vmstan/gravity-sync/wiki/Frequent-Questions#why-do-i-need-more-than-one-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 and local DNS settings identical between the two. That's Gravity Sync. With proper preparation it should only take a few minutes to install. Ideally you set up Gravity Sync and forget about it -- and in the long term, it would be awesome if the Pi-hole team made this entire script unnecessary. But if you have more than one Pi-hole in your network you'll want a simple way to keep the list configurations and local DNS settings identical between the two. That's where Gravity Sync comes in. With proper preparation, it should only take a few minutes to install. Ideally you setup Gravity Sync and forget about it -- and in the long term, it would be awesome if the Pi-hole team made this entire script unnecessary.
# Features ## Features
Gravity Sync replicates the `gravity.db` database, which includes:
Gravity Sync replicates the Pi-hole Domain Database (`gravity.db`), which includes:
- Blocklist settings with status and comments. - Blocklist settings with status and comments.
- Domain whitelist and blacklist along with status with comments. - Domain whitelist and blacklist along with status with comments.
- Custom RegEx whitelist and blacklists. - Custom RegEx whitelist and blacklists.
- Clients and groups along with any list assignments. - Clients and groups along with any list assignments.
Gravity Sync can also (optionally) replicate FTLDNS/DNSMASQ configuration files, including: Gravity Sync can also (optionally) replicate the Local DNS Records and CNAMEs configuration files.
- Local DNS (A Records) which are stored in a separate `custom.list` file within the `/etc/pihole` directory.
- CNAME Records which are stored in a separate `05-pihole-custom-cname.conf` file in the `/etc/dnsmasq.d` directory.
### Limitations ### Limitations
@ -32,7 +36,7 @@ Gravity Sync will **not**:
- Sync DHCP settings or monitor device leases. - Sync DHCP settings or monitor device leases.
- Merge long term data, query logs, or statistics. - Merge long term data, query logs, or statistics.
# Setup Steps ## Setup Steps
1. [Review System Requirements](https://github.com/vmstan/gravity-sync/wiki/System-Requirements) 1. [Review System Requirements](https://github.com/vmstan/gravity-sync/wiki/System-Requirements)
2. [Prepare Your Pi-hole](https://github.com/vmstan/gravity-sync/wiki/Installing#primary-pi-hole) 2. [Prepare Your Pi-hole](https://github.com/vmstan/gravity-sync/wiki/Installing#primary-pi-hole)
@ -42,16 +46,16 @@ Gravity Sync will **not**:
6. [Automate Gravity Sync](https://github.com/vmstan/gravity-sync/wiki/Installing#automation) 6. [Automate Gravity Sync](https://github.com/vmstan/gravity-sync/wiki/Installing#automation)
7. [Profit](https://memory-alpha.fandom.com/wiki/Rules_of_Acquisition) 7. [Profit](https://memory-alpha.fandom.com/wiki/Rules_of_Acquisition)
# Disclaimer ## Disclaimer
Gravity Sync is not developed by or affiliated with the Pi-hole project. This is project an unofficial, community effort, that seeks to implement replication (which is currently not a part of the core Pi-hole product) in a way that provides stability and value to Pi-hole users. The code has been tested across multiple user environments but there always is an element of risk involved with running any arbitrary software you find on the Internet. Gravity Sync is not developed by or affiliated with the Pi-hole project. This is project an unofficial, community effort, that seeks to implement replication (which is currently not a part of the core Pi-hole product) in a way that provides stability and value to Pi-hole users. The code has been tested across multiple user environments but there always is an element of risk involved with running any arbitrary software you find on the Internet.
Pi-hole is and the Pi-hole logo are [registered trademarks](https://pi-hole.net/trademark-rules-and-brand-guidelines/) of Pi-hole LLC. Pi-hole is and the Pi-hole logo are [registered trademarks](https://pi-hole.net/trademark-rules-and-brand-guidelines/) of Pi-hole LLC.
# Additional Documentation ## Additional Documentation
Please refer to the [Wiki](https://github.com/vmstan/gravity-sync/wiki) for more information: Please refer to the [Wiki](https://github.com/vmstan/gravity-sync/wiki) for more information:
- [Frequently Asked Questions](https://github.com/vmstan/gravity-sync/wiki/Frequent-Questions) - [Frequently Asked Questions](https://github.com/vmstan/gravity-sync/wiki/Frequent-Questions)
- [Advanced Installation Options](https://github.com/vmstan/gravity-sync/wiki/Under-The-Covers) - [Advanced Installation Options](https://github.com/vmstan/gravity-sync/wiki/Under-The-Covers)
- [Changelog](https://github.com/vmstan/gravity-sync/blob/master/CHANGELOG.md) - [Changelog](https://github.com/vmstan/gravity-sync/wiki/Changelog)

View File

@ -1 +1 @@
3.3.2 3.4.0

View File

@ -3,7 +3,7 @@ SCRIPT_START=$SECONDS
# GRAVITY SYNC BY VMSTAN ##################### # GRAVITY SYNC BY VMSTAN #####################
PROGRAM='Gravity Sync' PROGRAM='Gravity Sync'
VERSION='3.3.2' VERSION='3.4.0'
# For documentation or downloading updates visit https://github.com/vmstan/gravity-sync # For documentation or downloading updates visit https://github.com/vmstan/gravity-sync
@ -76,6 +76,9 @@ BASH_PATH='/bin/bash' # default OS bash path
### NEVER CHANGE ANYTHING BELOW THIS LINE! ### ### NEVER CHANGE ANYTHING BELOW THIS LINE! ###
############################################## ##############################################
# Import UI Fields
source ${LOCAL_FOLDR}/includes/gs-ui.sh
# Import Color/Message Includes # Import Color/Message Includes
source ${LOCAL_FOLDR}/includes/gs-colors.sh source ${LOCAL_FOLDR}/includes/gs-colors.sh

View File

@ -7,26 +7,26 @@
## Automate Task ## Automate Task
function task_automate { function task_automate {
TASKTYPE='AUTOMATE' TASKTYPE='AUTOMATE'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
CRON_EXIST='0' CRON_EXIST='0'
CRON_CHECK=$(crontab -l | grep -q "${GS_FILENAME}" && echo '1' || echo '0') CRON_CHECK=$(crontab -l | grep -q "${GS_FILENAME}" && echo '1' || echo '0')
if [ ${CRON_CHECK} == 1 ] if [ ${CRON_CHECK} == 1 ]
then then
MESSAGE="Automation Task Already Exists" MESSAGE="${UI_AUTO_CRON_EXISTS}"
echo_info echo_warn
CRON_EXIST='1' CRON_EXIST='1'
fi fi
MESSAGE="Configuring Automated Synchronization" MESSAGE="${UI_AUTO_CRON_DISPLAY_FREQ}"
echo_info echo_info
if [[ $1 =~ ^[0-9][0-9]?$ ]] if [[ $1 =~ ^[0-9][0-9]?$ ]]
then then
INPUT_AUTO_FREQ=$1 INPUT_AUTO_FREQ=$1
else else
MESSAGE="Synchronization Frequency in Minutes (5, 10, 15, 30) or 0 to Disable (default 15)" MESSAGE="${UI_AUTO_CRON_SELECT_FREQ}"
echo_need echo_need
read INPUT_AUTO_FREQ read INPUT_AUTO_FREQ
INPUT_AUTO_FREQ="${INPUT_AUTO_FREQ:-15}" INPUT_AUTO_FREQ="${INPUT_AUTO_FREQ:-15}"
@ -39,7 +39,7 @@ function task_automate {
clear_cron clear_cron
fi fi
MESSAGE="Saving New Synchronization Automation" MESSAGE="${UI_AUTO_CRON_SAVING}"
echo_stat echo_stat
(crontab -l 2>/dev/null; echo "*/${INPUT_AUTO_FREQ} * * * * ${BASH_PATH} ${LOCAL_FOLDR}/${GS_FILENAME} smart > ${LOG_PATH}/${CRONJOB_LOG}") | crontab - (crontab -l 2>/dev/null; echo "*/${INPUT_AUTO_FREQ} * * * * ${BASH_PATH} ${LOCAL_FOLDR}/${GS_FILENAME} smart > ${LOG_PATH}/${CRONJOB_LOG}") | crontab -
error_validate error_validate
@ -49,52 +49,24 @@ function task_automate {
then then
clear_cron clear_cron
MESSAGE="Synchronization Automation Disabled" # MESSAGE="Synchronization automation has been disabled"
echo_warn # echo_warn
else else
MESSAGE="No Synchronization Automation Scheduled" MESSAGE="${UI_AUTO_CRON_DISABLED}"
echo_warn echo_warn
fi fi
else else
MESSAGE="Invalid Frequency Range" MESSAGE="${UI_INVALID_SELECTION}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
# MESSAGE="Configuring Daily Backup Frequency"
# echo_info
# if [[ $2 =~ ^[0-9][0-9]?$ ]]
# then
# INPUT_AUTO_BACKUP=$2
# else
# MESSAGE="Hour of Day to Backup (1-24) or 0 to Disable"
# echo_need
# read INPUT_AUTO_BACKUP
# fi
# if [ $INPUT_AUTO_BACKUP -gt 24 ]
# then
# MESSAGE="Invalid Frequency Range"
# echo_fail
# exit_nochange
# elif [ $INPUT_AUTO_BACKUP -lt 1 ]
# then
# MESSAGE="No Backup Automation Scheduled"
# echo_warn
# else
# MESSAGE="Saving New Backup Automation"
# echo_stat
# (crontab -l 2>/dev/null; echo "0 ${INPUT_AUTO_BACKUP} * * * ${BASH_PATH} ${LOCAL_FOLDR}/${GS_FILENAME} backup >/dev/null 2>&1") | crontab -
# error_validate
# fi
exit_withchange exit_withchange
} }
## Clear Existing Automation Settings ## Clear Existing Automation Settings
function clear_cron { function clear_cron {
MESSAGE="Removing Existing Automation" MESSAGE="${UI_AUTO_CRON_DISABLED}"
echo_stat echo_stat
crontab -l > cronjob-old.tmp crontab -l > cronjob-old.tmp
@ -108,7 +80,7 @@ function clear_cron {
## Cron Task ## Cron Task
function task_cron { function task_cron {
TASKTYPE='CRON' TASKTYPE='CRON'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_crontab show_crontab

View File

@ -5,9 +5,9 @@
# This code is called from the main gravity-sync.sh file and should not execute directly! # This code is called from the main gravity-sync.sh file and should not execute directly!
## Backup Task ## Backup Task
function task_backup { function task_backup() {
TASKTYPE='BACKUP' TASKTYPE='BACKUP'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
backup_settime backup_settime
@ -20,54 +20,54 @@ function task_backup {
exit_withchange exit_withchange
} }
function backup_settime { function backup_settime() {
BACKUPTIMESTAMP=$(date +%F-%H%M%S) BACKUPTIMESTAMP=$(date +%F-%H%M%S)
} }
function backup_local_gravity { function backup_local_gravity() {
MESSAGE="Performing Backup of Local ${GRAVITY_FI}" MESSAGE="${UI_BACKUP_SECONDARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
sqlite3 ${PIHOLE_DIR}/${GRAVITY_FI} ".backup '${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup'" sqlite3 ${PIHOLE_DIR}/${GRAVITY_FI} ".backup '${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup'"
error_validate error_validate
} }
function backup_local_custom { function backup_local_custom() {
if [ "$SKIP_CUSTOM" != '1' ] if [ "$SKIP_CUSTOM" != '1' ]
then then
if [ -f ${PIHOLE_DIR}/${CUSTOM_DNS} ] if [ -f ${PIHOLE_DIR}/${CUSTOM_DNS} ]
then then
MESSAGE="Performing Backup Up Local ${CUSTOM_DNS}" MESSAGE="${UI_BACKUP_SECONDARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
cp ${PIHOLE_DIR}/${CUSTOM_DNS} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup cp ${PIHOLE_DIR}/${CUSTOM_DNS} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup
error_validate error_validate
else else
MESSAGE="No Local ${CUSTOM_DNS} Detected" MESSAGE="No local ${CUSTOM_DNS} detected"
echo_info echo_info
fi fi
fi fi
} }
function backup_local_cname { function backup_local_cname() {
if [ "${INCLUDE_CNAME}" == '1' ] if [ "${INCLUDE_CNAME}" == '1' ]
then then
if [ -f ${DNSMAQ_DIR}/${CNAME_CONF} ] if [ -f ${DNSMAQ_DIR}/${CNAME_CONF} ]
then then
MESSAGE="Performing Backup Up Local ${CNAME_CONF}" MESSAGE="${UI_BACKUP_SECONDARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
cp ${DNSMAQ_DIR}/${CNAME_CONF} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup cp ${DNSMAQ_DIR}/${CNAME_CONF} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup
error_validate error_validate
else else
MESSAGE="No Local ${CNAME_CONF} Detected" MESSAGE="No local ${CNAME_CONF} detected"
echo_info echo_info
fi fi
fi fi
} }
function backup_remote_gravity { function backup_remote_gravity() {
MESSAGE="Performing Backup of Remote ${GRAVITY_FI}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
CMD_TIMEOUT='60' CMD_TIMEOUT='60'
@ -75,10 +75,10 @@ function backup_remote_gravity {
create_sshcmd create_sshcmd
} }
function backup_remote_custom { function backup_remote_custom() {
if [ "$SKIP_CUSTOM" != '1' ] if [ "$SKIP_CUSTOM" != '1' ]
then then
MESSAGE="Performing Backup of Remote ${CUSTOM_DNS}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
@ -87,10 +87,10 @@ function backup_remote_custom {
fi fi
} }
function backup_remote_cname { function backup_remote_cname() {
if [ "$INCLUDE_CNAME" == '1' ] if [ "$INCLUDE_CNAME" == '1' ]
then then
MESSAGE="Performing Backup of Remote ${CNAME_CONF}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
@ -99,10 +99,15 @@ function backup_remote_cname {
fi fi
} }
function backup_cleanup { function backup_cleanup() {
MESSAGE="Scrubbing ${BACKUP_RETAIN} Redundant Antimatter Containment Pods" MESSAGE="${UI_BACKUP_PURGE}"
echo_stat echo_stat
find ${LOCAL_FOLDR}/${BACKUP_FOLD}/*.backup -mtime +${BACKUP_RETAIN} -type f -delete find ${LOCAL_FOLDR}/${BACKUP_FOLD}/*.backup -mtime +${BACKUP_RETAIN} -type f -delete
error_validate error_validate
BACKUP_FOLDER_SIZE=$(du -h ${LOCAL_FOLDR}/${BACKUP_FOLD} | sed 's/\s.*$//')
MESSAGE="${BACKUP_RETAIN} ${UI_BACKUP_REMAIN} (${BACKUP_FOLDER_SIZE})"
echo_info
} }

View File

@ -44,6 +44,12 @@ function echo_good {
echo -e "\r${GOOD} ${MESSAGE}" echo -e "\r${GOOD} ${MESSAGE}"
} }
### Success
function echo_sameline {
echo -en " "
echo -en "\r"
}
### Failure ### Failure
function echo_fail { function echo_fail {
echo -e "\r${FAIL} ${MESSAGE}" echo -e "\r${FAIL} ${MESSAGE}"

View File

@ -7,7 +7,7 @@
## Compare Task ## Compare Task
function task_compare { function task_compare {
TASKTYPE='COMPARE' TASKTYPE='COMPARE'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_target show_target

View File

@ -7,7 +7,7 @@
## Configure Task ## Configure Task
function task_configure { function task_configure {
TASKTYPE='CONFIGURE' TASKTYPE='CONFIGURE'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
relocate_config_gs relocate_config_gs

View File

@ -4,11 +4,47 @@
# For documentation or downloading updates visit https://github.com/vmstan/gravity-sync # For documentation or downloading updates visit https://github.com/vmstan/gravity-sync
# This code is called from the main gravity-sync.sh file and should not execute directly! # This code is called from the main gravity-sync.sh file and should not execute directly!
# Standard Output
function start_gs {
MESSAGE="${UI_CORE_INIT}"
echo_grav
cd ${LOCAL_FOLDR}
import_gs
ph_type
MESSAGE="${UI_CORE_EVALUATING}"
echo_stat
if [ "${ROOT_CHECK_AVOID}" != "1" ]
then
new_root_check
fi
if [ "${INCLUDE_CNAME}" == "1" ] && [ "${SKIP_CUSTOM}" == "1" ]
then
MESSAGE="${UI_INVALID_DNS_CONFIG} ${CONFIG_FILE}"
echo_fail
exit_nochange
fi
}
# Standard Output No Config
function start_gs_noconfig {
MESSAGE="${UI_CORE_INIT}"
echo_grav
cd ${LOCAL_FOLDR}
MESSAGE="${UI_CORE_EVALUATING}"
echo_stat
}
## Import Settings ## Import Settings
function import_gs { function import_gs {
relocate_config_gs relocate_config_gs
MESSAGE="Importing ${CONFIG_FILE} Settings" MESSAGE="${UI_CORE_LOADING} ${CONFIG_FILE}"
echo -en "${STAT} $MESSAGE" echo -en "${STAT} $MESSAGE"
if [ -f ${LOCAL_FOLDR}/settings/${CONFIG_FILE} ] if [ -f ${LOCAL_FOLDR}/settings/${CONFIG_FILE} ]
then then
@ -22,7 +58,7 @@ function import_gs {
else else
echo_fail echo_fail
MESSAGE="${CONFIG_FILE} Missing" MESSAGE="${UI_CORE_MISSING} ${CONFIG_FILE}"
echo_info echo_info
TASKTYPE='CONFIG' TASKTYPE='CONFIG'
@ -33,7 +69,7 @@ function import_gs {
function relocate_config_gs { function relocate_config_gs {
if [ -f ${LOCAL_FOLDR}/${CONFIG_FILE} ] if [ -f ${LOCAL_FOLDR}/${CONFIG_FILE} ]
then then
MESSAGE="Relocating ${CONFIG_FILE}" MESSAGE="${UI_CORE_RELOCATING} ${CONFIG_FILE}"
echo -en "${STAT} $MESSAGE" echo -en "${STAT} $MESSAGE"
mv ${LOCAL_FOLDR}/${CONFIG_FILE} ${LOCAL_FOLDR}/settings/${CONFIG_FILE} mv ${LOCAL_FOLDR}/${CONFIG_FILE} ${LOCAL_FOLDR}/settings/${CONFIG_FILE}
@ -42,7 +78,7 @@ function relocate_config_gs {
if [ -f ${LOCAL_FOLDR}/${SYNCING_LOG} ] if [ -f ${LOCAL_FOLDR}/${SYNCING_LOG} ]
then then
MESSAGE="Relocating ${SYNCING_LOG}" MESSAGE="${UI_CORE_RELOCATING} ${SYNCING_LOG}"
echo -en "${STAT} $MESSAGE" echo -en "${STAT} $MESSAGE"
mv ${LOCAL_FOLDR}/${SYNCING_LOG} ${LOG_PATH}/${SYNCING_LOG} mv ${LOCAL_FOLDR}/${SYNCING_LOG} ${LOG_PATH}/${SYNCING_LOG}
@ -51,7 +87,7 @@ function relocate_config_gs {
if [ -f ${LOCAL_FOLDR}/${CRONJOB_LOG} ] if [ -f ${LOCAL_FOLDR}/${CRONJOB_LOG} ]
then then
MESSAGE="Relocating ${CRONJOB_LOG}" MESSAGE="${UI_CORE_RELOCATING} ${CRONJOB_LOG}"
echo -en "${STAT} $MESSAGE" echo -en "${STAT} $MESSAGE"
mv ${LOCAL_FOLDR}/${CRONJOB_LOG} ${LOG_PATH}/${CRONJOB_LOG} mv ${LOCAL_FOLDR}/${CRONJOB_LOG} ${LOG_PATH}/${CRONJOB_LOG}
@ -60,7 +96,7 @@ function relocate_config_gs {
if [ -f ${LOCAL_FOLDR}/${HISTORY_MD5} ] if [ -f ${LOCAL_FOLDR}/${HISTORY_MD5} ]
then then
MESSAGE="Relocating ${HISTORY_MD5}" MESSAGE="${UI_CORE_RELOCATING} ${HISTORY_MD5}"
echo -en "${STAT} $MESSAGE" echo -en "${STAT} $MESSAGE"
mv ${LOCAL_FOLDR}/${HISTORY_MD5} ${LOG_PATH}/${HISTORY_MD5} mv ${LOCAL_FOLDR}/${HISTORY_MD5} ${LOG_PATH}/${HISTORY_MD5}
@ -85,6 +121,17 @@ function error_validate {
fi fi
} }
## Error Validation
function silent_error_validate {
if [ "$?" != "0" ]
then
echo_fail
exit 1
else
echo_sameline
fi
}
function ph_type { function ph_type {
if [ "$PH_IN_TYPE" == "default" ] if [ "$PH_IN_TYPE" == "default" ]
then then
@ -102,45 +149,9 @@ function ph_type {
RH_EXEC="${RIHOLE_BIN}" RH_EXEC="${RIHOLE_BIN}"
elif [ "$RH_IN_TYPE" == "docker" ] elif [ "$RH_IN_TYPE" == "docker" ]
then then
RH_EXEC="sudo ${ROCKER_BIN} exec $(sudo ${ROCKER_BIN} ps -qf name=${ROCKER_CON}) pihole" RH_EXEC="sudo ${ROCKER_BIN} exec \$(sudo ${ROCKER_BIN} ps -qf name=${ROCKER_CON}) pihole"
elif [ "$RH_IN_TYPE" == "podman" ] elif [ "$RH_IN_TYPE" == "podman" ]
then then
RH_EXEC="sudo ${RODMAN_BIN} exec ${ROCKER_CON} pihole" RH_EXEC="sudo ${RODMAN_BIN} exec ${ROCKER_CON} pihole"
fi fi
} }
# Standard Output
function start_gs {
MESSAGE="${PROGRAM} ${VERSION} Executing"
echo_grav
cd ${LOCAL_FOLDR}
import_gs
ph_type
MESSAGE="Evaluating Arguments"
echo_stat
if [ "${ROOT_CHECK_AVOID}" != "1" ]
then
new_root_check
fi
if [ "${INCLUDE_CNAME}" == "1" ] && [ "${SKIP_CUSTOM}" == "1" ]
then
MESSAGE="Invalid Local DNS Settings in ${CONFIG_FILE}"
echo_fail
exit_nochange
fi
}
# Standard Output No Config
function start_gs_noconfig {
MESSAGE="${PROGRAM} ${VERSION} Executing"
echo_grav
cd ${LOCAL_FOLDR}
MESSAGE="Evaluating Arguments"
echo_stat
}

View File

@ -10,9 +10,9 @@ function exit_nochange {
if [ "${TASKTYPE}" == "" ] if [ "${TASKTYPE}" == "" ]
then then
MESSAGE="${PROGRAM} Aborting ($((SCRIPT_END-SCRIPT_START)) seconds)" MESSAGE="${PROGRAM} ${UI_EXIT_ABORT} ${UI_EXIT_CALC_END}"
else else
MESSAGE="${PROGRAM} ${TASKTYPE} Aborting ($((SCRIPT_END-SCRIPT_START)) seconds)" MESSAGE="${PROGRAM} ${TASKTYPE} ${UI_EXIT_ABORT} ${UI_EXIT_CALC_END}"
fi fi
echo_grav echo_grav
@ -25,9 +25,9 @@ function exit_withchange {
if [ "${TASKTYPE}" == "" ] if [ "${TASKTYPE}" == "" ]
then then
MESSAGE="${PROGRAM} Completed ($((SCRIPT_END-SCRIPT_START)) seconds)" MESSAGE="${PROGRAM} ${UI_EXIT_COMPLETE} ${UI_EXIT_CALC_END}"
else else
MESSAGE="${PROGRAM} ${TASKTYPE} Completed ($((SCRIPT_END-SCRIPT_START)) seconds)" MESSAGE="${PROGRAM} ${TASKTYPE} ${UI_EXIT_COMPLETE} ${UI_EXIT_CALC_END}"
fi fi
echo_grav echo_grav

View File

@ -8,12 +8,12 @@
function md5_compare { function md5_compare {
HASHMARK='0' HASHMARK='0'
MESSAGE="Analyzing ${GRAVITY_FI} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_HASHING} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
primaryDBMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${GRAVITY_FI}" | sed 's/\s.*$//') primaryDBMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${GRAVITY_FI}" | sed 's/\s.*$//')
error_validate error_validate
MESSAGE="Analyzing ${GRAVITY_FI} on $HOSTNAME" MESSAGE="${UI_HASHING_COMPARING} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//') secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//')
error_validate error_validate
@ -22,7 +22,7 @@ function md5_compare {
then then
HASHMARK=$((HASHMARK+0)) HASHMARK=$((HASHMARK+0))
else else
MESSAGE="Differenced ${GRAVITY_FI} Detected" MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_GRAVITY_NAME}"
echo_warn echo_warn
HASHMARK=$((HASHMARK+1)) HASHMARK=$((HASHMARK+1))
fi fi
@ -34,13 +34,13 @@ function md5_compare {
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS}
then then
REMOTE_CUSTOM_DNS="1" REMOTE_CUSTOM_DNS="1"
MESSAGE="Analyzing ${CUSTOM_DNS} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_HASHING} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
primaryCLMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//'") primaryCLMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//'")
error_validate error_validate
MESSAGE="Analyzing ${CUSTOM_DNS} on $HOSTNAME" MESSAGE="${UI_HASHING_COMPARING} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//') secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//')
error_validate error_validate
@ -49,23 +49,23 @@ function md5_compare {
then then
HASHMARK=$((HASHMARK+0)) HASHMARK=$((HASHMARK+0))
else else
MESSAGE="Differenced ${CUSTOM_DNS} Detected" MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_CUSTOM_NAME}"
echo_warn echo_warn
HASHMARK=$((HASHMARK+1)) HASHMARK=$((HASHMARK+1))
fi fi
else else
MESSAGE="No ${CUSTOM_DNS} Detected on ${REMOTE_HOST}" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
else else
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS}
then then
REMOTE_CUSTOM_DNS="1" REMOTE_CUSTOM_DNS="1"
MESSAGE="${REMOTE_HOST} has ${CUSTOM_DNS}" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}"
HASHMARK=$((HASHMARK+1)) HASHMARK=$((HASHMARK+1))
echo_info echo_info
fi fi
MESSAGE="No ${CUSTOM_DNS} Detected on $HOSTNAME" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}"
echo_info echo_info
fi fi
fi fi
@ -79,13 +79,13 @@ function md5_compare {
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF}
then then
REMOTE_CNAME_DNS="1" REMOTE_CNAME_DNS="1"
MESSAGE="Analyzing ${CNAME_CONF} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_HASHING} ${UI_CNAME_NAME}"
echo_stat echo_stat
primaryCNMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//'") primaryCNMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//'")
error_validate error_validate
MESSAGE="Analyzing ${CNAME_CONF} on $HOSTNAME" MESSAGE="${UI_HASHING_COMPARING} ${UI_CNAME_NAME}"
echo_stat echo_stat
secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//') secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//')
error_validate error_validate
@ -94,24 +94,24 @@ function md5_compare {
then then
HASHMARK=$((HASHMARK+0)) HASHMARK=$((HASHMARK+0))
else else
MESSAGE="Differenced ${CNAME_CONF} Detected" MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_CNAME_NAME}"
echo_warn echo_warn
HASHMARK=$((HASHMARK+1)) HASHMARK=$((HASHMARK+1))
fi fi
else else
MESSAGE="No ${CNAME_CONF} Detected on ${REMOTE_HOST}" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
else else
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF}
then then
REMOTE_CNAME_DNS="1" REMOTE_CNAME_DNS="1"
MESSAGE="${REMOTE_HOST} has ${CNAME_CONF}" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}"
HASHMARK=$((HASHMARK+1)) HASHMARK=$((HASHMARK+1))
echo_info echo_info
fi fi
MESSAGE="No ${CNAME_CONF} Detected on $HOSTNAME" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}"
echo_info echo_info
fi fi
fi fi
@ -119,11 +119,11 @@ function md5_compare {
if [ "$HASHMARK" != "0" ] if [ "$HASHMARK" != "0" ]
then then
MESSAGE="Replication Required" MESSAGE="${UI_HASHING_REQUIRED}"
echo_warn echo_warn
HASHMARK=$((HASHMARK+0)) HASHMARK=$((HASHMARK+0))
else else
MESSAGE="No Replication Required" MESSAGE="${UI_HASHING_NOREP}"
echo_info echo_info
backup_cleanup backup_cleanup
exit_nochange exit_nochange
@ -150,20 +150,20 @@ function previous_md5 {
} }
function md5_recheck { function md5_recheck {
MESSAGE="Performing Replicator Diagnostics" MESSAGE="${UI_HASHING_DIAGNOSTICS}"
echo_info echo_info
HASHMARK='0' HASHMARK='0'
MESSAGE="Reanalyzing ${GRAVITY_FI} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_REHASHING} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
primaryDBMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${GRAVITY_FI}" | sed 's/\s.*$//') primaryDBMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${GRAVITY_FI}" | sed 's/\s.*$//')
error_validate silent_error_validate
MESSAGE="Reanalyzing ${GRAVITY_FI} on $HOSTNAME" MESSAGE="${UI_HASHING_RECOMPARING} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//') secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//')
error_validate silent_error_validate
if [ "$SKIP_CUSTOM" != '1' ] if [ "$SKIP_CUSTOM" != '1' ]
then then
@ -172,28 +172,28 @@ function md5_recheck {
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS}
then then
REMOTE_CUSTOM_DNS="1" REMOTE_CUSTOM_DNS="1"
MESSAGE="Reanalyzing ${CUSTOM_DNS} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_REHASHING} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
primaryCLMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//'") primaryCLMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//'")
error_validate silent_error_validate
MESSAGE="Reanalyzing ${CUSTOM_DNS} on $HOSTNAME" MESSAGE="${UI_HASHING_RECOMPARING} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//') secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//')
error_validate silent_error_validate
else else
MESSAGE="No ${CUSTOM_DNS} Detected on ${REMOTE_HOST}" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
else else
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS}
then then
REMOTE_CUSTOM_DNS="1" REMOTE_CUSTOM_DNS="1"
MESSAGE="${REMOTE_HOST} has ${CUSTOM_DNS}" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
MESSAGE="No ${CUSTOM_DNS} Detected on $HOSTNAME" MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}"
echo_info echo_info
fi fi
fi fi
@ -207,29 +207,29 @@ function md5_recheck {
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF}
then then
REMOTE_CNAME_DNS="1" REMOTE_CNAME_DNS="1"
MESSAGE="Reanalyzing ${CNAME_CONF} on ${REMOTE_HOST}" MESSAGE="${UI_HASHING_REHASHING} ${UI_CNAME_NAME}"
echo_stat echo_stat
primaryCNMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//'") primaryCNMD5=$(${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} "md5sum ${RNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//'")
error_validate silent_error_validate
MESSAGE="Reanalyzing ${CNAME_CONF} on $HOSTNAME" MESSAGE="${UI_HASHING_RECOMPARING} ${UI_CNAME_NAME}"
echo_stat echo_stat
secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//') secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//')
error_validate silent_error_validate
else else
MESSAGE="No ${CNAME_CONF} Detected on ${REMOTE_HOST}" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
else else
if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF}
then then
REMOTE_CNAME_DNS="1" REMOTE_CNAME_DNS="1"
MESSAGE="${REMOTE_HOST} has ${CNAME_CONF}" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}"
echo_info echo_info
fi fi
MESSAGE="No ${CNAME_CONF} Detected on $HOSTNAME" MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}"
echo_info echo_info
fi fi
fi fi

View File

@ -23,19 +23,19 @@ function intent_validate {
INTENT="ENGAGE TRACTOR BEAM" INTENT="ENGAGE TRACTOR BEAM"
fi fi
MESSAGE="Type ${INTENT} to Confirm" MESSAGE="Type ${INTENT} to confirm"
echo_need echo_need
read INPUT_INTENT read INPUT_INTENT
if [ "${INPUT_INTENT}" != "${INTENT}" ] if [ "${INPUT_INTENT}" != "${INTENT}" ]
then then
MESSAGE="${TASKTYPE} Aborted" MESSAGE="${TASKTYPE} aborted"
echo_info echo_info
exit_nochange exit_nochange
fi fi
else else
MESSAGE="Verification Bypassed" MESSAGE="Verification bypassed"
echo_warn echo_warn
fi fi
} }

View File

@ -7,7 +7,7 @@
## Logs Task ## Logs Task
function task_logs { function task_logs {
TASKTYPE='LOGS' TASKTYPE='LOGS'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
logs_gs logs_gs
@ -18,7 +18,7 @@ function task_logs {
function logs_export { function logs_export {
if [ "${TASKTYPE}" != "BACKUP" ] if [ "${TASKTYPE}" != "BACKUP" ]
then then
MESSAGE="Saving File Hashes" MESSAGE="${UI_LOGGING_HASHES}"
echo_stat echo_stat
rm -f ${LOG_PATH}/${HISTORY_MD5} rm -f ${LOG_PATH}/${HISTORY_MD5}
echo -e ${primaryDBMD5} >> ${LOG_PATH}/${HISTORY_MD5} echo -e ${primaryDBMD5} >> ${LOG_PATH}/${HISTORY_MD5}
@ -30,7 +30,7 @@ function logs_export {
error_validate error_validate
fi fi
MESSAGE="Logging Successful ${TASKTYPE}" MESSAGE="${UI_LOGGING_SUCCESS} ${TASKTYPE}"
echo_stat echo_stat
echo -e $(date) "[${TASKTYPE}]" >> ${LOG_PATH}/${SYNCING_LOG} echo -e $(date) "[${TASKTYPE}]" >> ${LOG_PATH}/${SYNCING_LOG}
error_validate error_validate
@ -38,21 +38,21 @@ function logs_export {
### Output Sync Logs ### Output Sync Logs
function logs_gs { function logs_gs {
MESSAGE="Tailing ${LOG_PATH}/${SYNCING_LOG}" MESSAGE="${UI_LOGGING_DISPLAY}"
echo_info echo_info
echo -e "========================================================" echo_lines
echo -e "Recent Complete ${YELLOW}SMART${NC} Executions" echo -e "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}SMART${NC}"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep SMART tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep SMART
echo -e "Recent Complete ${YELLOW}PULL${NC} Executions" echo -e "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}PULL${NC}"
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 "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}PUSH${NC}"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PUSH tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep PUSH
echo -e "Recent Complete ${YELLOW}BACKUP${NC} Executions" echo -e "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}BACKUP${NC}"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep BACKUP tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep BACKUP
echo -e "Recent Complete ${YELLOW}RESTORE${NC} Executions" echo -e "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}RESTORE${NC}"
tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep RESTORE tail -n 7 "${LOG_PATH}/${SYNCING_LOG}" | grep RESTORE
echo -e "========================================================" echo_lines
exit_nochange exit_nochange
} }
@ -60,7 +60,7 @@ function logs_gs {
## Crontab Logs ## Crontab Logs
### Core Crontab Logs ### Core Crontab Logs
function show_crontab { function show_crontab {
MESSAGE="Replaying Last Cronjob" MESSAGE="${UI_LOGGING_DISPLAY}"
echo_stat echo_stat
if [ -f ${LOG_PATH}/${CRONJOB_LOG} ] if [ -f ${LOG_PATH}/${CRONJOB_LOG} ]
@ -68,19 +68,19 @@ function show_crontab {
if [ -s ${LOG_PATH}/${CRONJOB_LOG} ] if [ -s ${LOG_PATH}/${CRONJOB_LOG} ]
echo_good echo_good
MESSAGE="Tailing ${LOG_PATH}/${CRONJOB_LOG}" # MESSAGE="Tailing ${LOG_PATH}/${CRONJOB_LOG}"
echo_info # echo_info
echo -e "========================================================" echo_lines
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_lines
exit_nochange exit_nochange
then then
echo_fail echo_fail
MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Empty" MESSAGE="${LOG_PATH}/${CRONJOB_LOG} ${UI_LOGGING_EMPTY}"
echo_info echo_info
exit_nochange exit_nochange
@ -88,7 +88,7 @@ function show_crontab {
else else
echo_fail echo_fail
MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Missing" MESSAGE="${LOG_PATH}/${CRONJOB_LOG} ${UI_LOGGING_MISSING}"
echo_info echo_info
exit_nochange exit_nochange

View File

@ -7,7 +7,7 @@
## Pull Task ## Pull Task
function task_pull { function task_pull {
TASKTYPE='PULL' TASKTYPE='PULL'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_target show_target
@ -32,67 +32,19 @@ function pull_gs_grav {
backup_local_gravity backup_local_gravity
backup_remote_gravity backup_remote_gravity
MESSAGE="Pulling ${GRAVITY_FI} from ${REMOTE_HOST}" MESSAGE="${UI_PULL_PRIMARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull"
create_rsynccmd create_rsynccmd
MESSAGE="Replacing ${GRAVITY_FI} on $HOSTNAME" MESSAGE="${UI_REPLACE_SECONDARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
if [ "$FILE_OWNER" != "named:docker" ] validate_gravity_permissions
then
MESSAGE="Validating Settings of ${GRAVITY_FI}"
echo_stat
GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk 'OFS=":" {print $3,$4}')
if [ "$GRAVDB_OWN" != "$FILE_OWNER" ]
then
MESSAGE="Validating Ownership on ${GRAVITY_FI}"
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chown ${FILE_OWNER} ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
MESSAGE="Continuing Validation of ${GRAVITY_FI}"
echo_stat
fi
else
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chown ${FILE_OWNER} ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
GRAVDB_RWE=$(namei -m ${PIHOLE_DIR}/${GRAVITY_FI} | grep -v f: | grep ${GRAVITY_FI} | awk '{print $1}')
if [ "$GRAVDB_RWE" != "-rw-rw-r--" ]
then
MESSAGE="Validating Permissions on ${GRAVITY_FI}"
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Permissions on ${GRAVITY_FI}"
echo_stat
sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
MESSAGE="Continuing Validation of ${GRAVITY_FI}"
echo_stat
fi
echo_good
} }
## Pull Custom ## Pull Custom
@ -104,58 +56,19 @@ function pull_gs_cust {
backup_local_custom backup_local_custom
backup_remote_custom backup_remote_custom
MESSAGE="Pulling ${CUSTOM_DNS} from ${REMOTE_HOST}" MESSAGE="${UI_PULL_PRIMARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull"
create_rsynccmd create_rsynccmd
MESSAGE="Replacing ${CUSTOM_DNS} on $HOSTNAME" MESSAGE="${UI_REPLACE_SECONDARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Settings on ${CUSTOM_DNS}" validate_custom_permissions
echo_stat
CUSTOMLS_OWN=$(ls -ld ${PIHOLE_DIR}/${CUSTOM_DNS} | awk '{print $3 $4}')
if [ "$CUSTOMLS_OWN" != "rootroot" ]
then
MESSAGE="Validating Ownership on ${CUSTOM_DNS}"
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${CUSTOM_DNS}"
echo_stat
sudo chown root:root ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
MESSAGE="Continuing Validation of ${GRAVITY_FI}"
echo_stat
fi
CUSTOMLS_RWE=$(namei -m ${PIHOLE_DIR}/${CUSTOM_DNS} | grep -v f: | grep ${CUSTOM_DNS} | awk '{print $1}')
if [ "$CUSTOMLS_RWE" != "-rw-r--r--" ]
then
MESSAGE="Validating Permissions on ${CUSTOM_DNS}"
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${CUSTOM_DNS}"
echo_stat
sudo chmod 644 ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
MESSAGE="Continuing Validation of ${GRAVITY_FI}"
echo_stat
fi
echo_good
fi fi
fi fi
} }
@ -169,40 +82,35 @@ function pull_gs_cname {
backup_local_cname backup_local_cname
backup_remote_cname backup_remote_cname
MESSAGE="Pulling ${CNAME_CONF} from ${REMOTE_HOST}" MESSAGE="${UI_PULL_PRIMARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull"
create_rsynccmd create_rsynccmd
MESSAGE="Replacing ${CNAME_CONF} on $HOSTNAME" MESSAGE="${UI_REPLACE_SECONDARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Settings on ${CNAME_CONF}"
echo_stat
validate_cname_permissions validate_cname_permissions
echo_good
fi fi
fi fi
} }
## Pull Reload ## Pull Reload
function pull_gs_reload { function pull_gs_reload {
MESSAGE="Isolating Regeneration Pathways" MESSAGE="${UI_PULL_RELOAD_WAIT}"
echo_info echo_info
sleep 1 sleep 1
MESSAGE="Updating FTLDNS Configuration" MESSAGE="${UI_FTLDNS_CONFIG_UPDATE}"
echo_stat echo_stat
${PH_EXEC} restartdns reloadlists >/dev/null 2>&1 ${PH_EXEC} restartdns reloadlists >/dev/null 2>&1
error_validate error_validate
MESSAGE="Reloading FTLDNS Services" MESSAGE="${UI_FTLDNS_CONFIG_RELOAD}"
echo_stat echo_stat
${PH_EXEC} restartdns >/dev/null 2>&1 ${PH_EXEC} restartdns >/dev/null 2>&1
error_validate error_validate

View File

@ -7,51 +7,39 @@
## Purge Task ## Purge Task
function task_purge { function task_purge {
TASKTYPE="THE-PURGE" TASKTYPE="THE-PURGE"
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
MESSAGE="THIS WILL RESET YOUR ENTIRE GRAVITY SYNC INSTALLATION" echo_lines
echo_warn echo -e "THIS WILL RESET YOUR ENTIRE GRAVITY SYNC INSTALLATION"
MESSAGE="This will remove:" echo -e "This will remove:"
echo_warn echo -e "- All backups files."
MESSAGE="- All backups files." echo -e "- Your ${CONFIG_FILE} file."
echo_warn
MESSAGE="- Your ${CONFIG_FILE} file."
echo_warn
if [ -f "${LOCAL_FOLDR}/dev" ] if [ -f "${LOCAL_FOLDR}/dev" ]
then then
MESSAGE="- Your development branch updater." echo -e "- Your development branch updater."
elif [ -f "${LOCAL_FOLDR}/beta" ] elif [ -f "${LOCAL_FOLDR}/beta" ]
then then
MESSAGE="- Your beta branch updater." echo -e "- Your beta branch updater."
fi fi
echo_warn
echo -e "- All cronjob/automation tasks."
MESSAGE="- All cronjob/automation tasks." echo -e "- All job history/logs."
echo_warn echo -e "- Associated SSH id_rsa keys."
MESSAGE="- All job history/logs." echo -e ""
echo_warn echo -e "This function cannot be undone!"
MESSAGE="- Associated SSH id_rsa keys." echo -e ""
echo_warn echo -e "YOU WILL NEED TO REBUILD GRAVITY SYNC AFTER EXECUTION"
MESSAGE="This function cannot be undone!" echo -e "Pi-hole binaries, configuration and services ARE NOT impacted!"
echo_warn echo -e "Your device will continue to resolve and block DNS requests,"
echo -e "but your ${UI_GRAVITY_NAME} and ${UI_CUSTOM_NAME} WILL NOT sync anymore,"
MESSAGE="YOU WILL NEED TO REBUILD GRAVITY SYNC AFTER EXECUTION" echo -e "until you reconfigure Gravity Sync on this device."
echo_warn echo_lines
MESSAGE="Pi-hole binaries, configuration and services ARE NOT impacted!"
echo_info
MESSAGE="Your device will continue to resolve and block DNS requests,"
echo_info
MESSAGE="but your ${GRAVITY_FI} and ${CUSTOM_DNS} WILL NOT sync anymore,"
echo_info
MESSAGE="until you reconfigure Gravity Sync on this device."
echo_info
intent_validate intent_validate
MESSAGE="Cleaning Gravity Sync Directory" MESSAGE="${UI_PURGE_CLEANING_DIR}"
echo_stat echo_stat
git clean -f -X -d >/dev/null 2>&1 git clean -f -X -d >/dev/null 2>&1
@ -59,20 +47,20 @@ function task_purge {
clear_cron clear_cron
MESSAGE="Deleting SSH Key-files" MESSAGE="${UI_PURGE_DELETE_SSH_KEYS}"
echo_stat echo_stat
rm -f $HOME/${SSH_PKIF} >/dev/null 2>&1 rm -f $HOME/${SSH_PKIF} >/dev/null 2>&1
rm -f $HOME/${SSH_PKIF}.pub >/dev/null 2>&1 rm -f $HOME/${SSH_PKIF}.pub >/dev/null 2>&1
error_validate error_validate
MESSAGE="Realigning Dilithium Matrix" MESSAGE="${UI_PURGE_MATRIX_ALIGNMENT}"
echo_stat echo_info
sleep 1 sleep 1
MESSAGE="Realigning Dilithium Matrix" # MESSAGE="Realigning Dilithium Matrix"
echo_good # echo_good
update_gs update_gs
} }

View File

@ -7,7 +7,7 @@
## Push Task ## Push Task
function task_push { function task_push {
TASKTYPE='PUSH' TASKTYPE='PUSH'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_target show_target
@ -31,31 +31,31 @@ function push_gs_grav {
backup_remote_gravity backup_remote_gravity
backup_local_gravity backup_local_gravity
MESSAGE="Copying ${GRAVITY_FI} from ${REMOTE_HOST}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push"
create_rsynccmd create_rsynccmd
MESSAGE="Pushing ${GRAVITY_FI} to ${REMOTE_HOST}" MESSAGE="${UI_PUSH_SECONDARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
RSYNC_REPATH="sudo rsync" RSYNC_REPATH="sudo rsync"
RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup"
RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}"
create_rsynccmd create_rsynccmd
MESSAGE="Setting Permissions on ${GRAVITY_FI}" MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_GRAVITY_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 664 ${RIHOLE_DIR}/${GRAVITY_FI}"
create_sshcmd
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chown ${RILE_OWNER} ${RIHOLE_DIR}/${GRAVITY_FI}" CMD_REQUESTED="sudo chown ${RILE_OWNER} ${RIHOLE_DIR}/${GRAVITY_FI}"
create_sshcmd create_sshcmd
MESSAGE="${UI_SET_FILE_PERMISSION} ${UI_GRAVITY_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 664 ${RIHOLE_DIR}/${GRAVITY_FI}"
create_sshcmd
} }
## Push Custom ## Push Custom
@ -67,31 +67,31 @@ function push_gs_cust {
backup_remote_custom backup_remote_custom
backup_local_custom backup_local_custom
MESSAGE="Copying ${CUSTOM_DNS} from ${REMOTE_HOST}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.push" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.push"
create_rsynccmd create_rsynccmd
MESSAGE="Pushing ${CUSTOM_DNS} to ${REMOTE_HOST}" MESSAGE="${UI_PUSH_SECONDARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
RSYNC_REPATH="sudo rsync" RSYNC_REPATH="sudo rsync"
RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup"
RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}"
create_rsynccmd create_rsynccmd
MESSAGE="Setting Permissions on ${CUSTOM_DNS}" MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CUSTOM_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 644 ${RIHOLE_DIR}/${CUSTOM_DNS}"
create_sshcmd
MESSAGE="Setting Ownership on ${CUSTOM_DNS}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chown root:root ${RIHOLE_DIR}/${CUSTOM_DNS}" CMD_REQUESTED="sudo chown root:root ${RIHOLE_DIR}/${CUSTOM_DNS}"
create_sshcmd create_sshcmd
MESSAGE="${UI_SET_FILE_PERMISSIONS} ${UI_CUSTOM_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 644 ${RIHOLE_DIR}/${CUSTOM_DNS}"
create_sshcmd
fi fi
fi fi
} }
@ -105,48 +105,49 @@ function push_gs_cname {
backup_remote_cname backup_remote_cname
backup_local_cname backup_local_cname
MESSAGE="Copying ${CNAME_CONF} from ${REMOTE_HOST}" MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup"
RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.push" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.push"
create_rsynccmd create_rsynccmd
MESSAGE="Pushing ${CNAME_CONF} to ${REMOTE_HOST}" MESSAGE="${UI_PUSH_SECONDARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
RSYNC_REPATH="sudo rsync" RSYNC_REPATH="sudo rsync"
RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup"
RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RNSMAQ_DIR}/${CNAME_CONF}" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RNSMAQ_DIR}/${CNAME_CONF}"
create_rsynccmd create_rsynccmd
MESSAGE="Setting Permissions on ${CNAME_CONF}" MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CNAME_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 644 ${RNSMAQ_DIR}/${CNAME_CONF}"
create_sshcmd
MESSAGE="Setting Ownership on ${CNAME_CONF}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chown root:root ${RNSMAQ_DIR}/${CNAME_CONF}" CMD_REQUESTED="sudo chown root:root ${RNSMAQ_DIR}/${CNAME_CONF}"
create_sshcmd create_sshcmd
MESSAGE="${UI_SET_FILE_PERMISSIONS} ${UI_CNAME_NAME}"
echo_stat
CMD_TIMEOUT='15'
CMD_REQUESTED="sudo chmod 644 ${RNSMAQ_DIR}/${CNAME_CONF}"
create_sshcmd
fi fi
fi fi
} }
## Push Reload ## Push Reload
function push_gs_reload { function push_gs_reload {
MESSAGE="Inverting Tachyon Pulses" MESSAGE="${UI_PUSH_RELOAD_WAIT}"
echo_info echo_info
sleep 1 sleep 1
MESSAGE="Updating Remote FTLDNS Configuration" MESSAGE="${UI_FTLDNS_CONFIG_PUSH_UPDATE}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
CMD_REQUESTED="${RH_EXEC} restartdns reloadlists" CMD_REQUESTED="${RH_EXEC} restartdns reloadlists"
create_sshcmd create_sshcmd
MESSAGE="Reloading Remote FTLDNS Services" MESSAGE="${UI_FTLDNS_CONFIG_PUSH_RELOAD}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
CMD_REQUESTED="${RH_EXEC} restartdns" CMD_REQUESTED="${RH_EXEC} restartdns"

View File

@ -7,7 +7,7 @@
## Restore Task ## Restore Task
function task_restore { function task_restore {
TASKTYPE='RESTORE' TASKTYPE='RESTORE'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_target show_target
@ -27,14 +27,14 @@ function task_restore {
## Restore Gravity ## Restore Gravity
function restore_gs { function restore_gs {
MESSAGE="This will restore your settings on $HOSTNAME with a previous version!" MESSAGE=""
echo_warn echo_warn
GRAVITY_DATE_LIST=$(ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${GRAVITY_FI} | colrm 18) GRAVITY_DATE_LIST=$(ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${GRAVITY_FI} | colrm 18)
if [ "${GRAVITY_DATE_LIST}" != "" ] if [ "${GRAVITY_DATE_LIST}" != "" ]
then then
MESSAGE="Previous ${GRAVITY_FI} Versions Available to Restore" MESSAGE="${UI_RESTORE_WARNING}"
echo_info echo_info
echo_lines echo_lines
@ -42,22 +42,22 @@ function restore_gs {
echo -e "IGNORE-GRAVITY" echo -e "IGNORE-GRAVITY"
echo_lines echo_lines
MESSAGE="Select backup date to restore ${GRAVITY_FI} from" MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_GRAVITY_NAME}"
echo_need echo_need
read INPUT_BACKUP_DATE read INPUT_BACKUP_DATE
if [ "$INPUT_BACKUP_DATE" == "IGNORE-GRAVITY" ] if [ "$INPUT_BACKUP_DATE" == "IGNORE-GRAVITY" ]
then then
MESSAGE="Skipping Gravity" MESSAGE="${UI_RESTORE_SKIPPING} ${UI_GRAVITY_NAME}"
echo_warn echo_warn
elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${GRAVITY_FI}.backup ] elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${GRAVITY_FI}.backup ]
then then
MESSAGE="Backup Selected" MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_BACKUP_SELECTED}"
echo_good echo_good
DO_GRAVITY_RESTORE='1' DO_GRAVITY_RESTORE='1'
else else
MESSAGE="Invalid Request" MESSAGE="${UI_RESTORE_INVALID}"
echo_info echo_info
exit_nochange exit_nochange
@ -72,36 +72,36 @@ function restore_gs {
if [ "${CUSTOM_DATE_LIST}" != "" ] if [ "${CUSTOM_DATE_LIST}" != "" ]
then then
MESSAGE="Previous ${CUSTOM_DNS} Versions Available to Restore" # MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CUSTOM_NAME}"
echo_info # echo_info
echo_lines echo_lines
ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CUSTOM_DNS} | colrm 18 ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CUSTOM_DNS} | colrm 18
echo -e "IGNORE-CUSTOM" echo -e "IGNORE-CUSTOM"
echo_lines echo_lines
MESSAGE="Select backup date to restore ${CUSTOM_DNS} from" MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CUSTOM_NAME}"
echo_need echo_need
read INPUT_DNSBACKUP_DATE read INPUT_DNSBACKUP_DATE
if [ "$INPUT_DNSBACKUP_DATE" == "IGNORE-CUSTOM" ] if [ "$INPUT_DNSBACKUP_DATE" == "IGNORE-CUSTOM" ]
then then
MESSAGE="Skipping DNS" MESSAGE="${UI_RESTORE_SKIPPING} ${UI_CUSTOM_NAME}"
echo_warn echo_warn
elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ] elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ]
then then
MESSAGE="Backup Selected" MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_SELECTED}"
echo_good echo_good
DO_CUSTOM_RESTORE='1' DO_CUSTOM_RESTORE='1'
else else
MESSAGE="Invalid Request" MESSAGE="${UI_RESTORE_INVALID}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
else else
MESSAGE="No ${CUSTOM_DNS} Backups" MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}"
echo_info echo_info
fi fi
fi fi
@ -115,36 +115,36 @@ function restore_gs {
if [ "${CNAME_DATE_LIST}" != "" ] if [ "${CNAME_DATE_LIST}" != "" ]
then then
MESSAGE="Previous ${CNAME_CONF} Versions Available to Restore" # MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CNAME_NAME}"
echo_info # echo_info
echo_lines echo_lines
ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CNAME_CONF} | colrm 18 ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CNAME_CONF} | colrm 18
echo -e "IGNORE-CNAME" echo -e "IGNORE-CNAME"
echo_lines echo_lines
MESSAGE="Select backup date to restore ${CNAME_CONF} from" MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CNAME_NAME}"
echo_need echo_need
read INPUT_CNAMEBACKUP_DATE read INPUT_CNAMEBACKUP_DATE
if [ "$INPUT_CNAMEBACKUP_DATE" == "IGNORE-CNAME" ] if [ "$INPUT_CNAMEBACKUP_DATE" == "IGNORE-CNAME" ]
then then
MESSAGE="Skipping CNAME" MESSAGE="${UI_RESTORE_SKIPPING} ${UI_CNAME_NAME}"
echo_warn echo_warn
elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ] elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ]
then then
MESSAGE="Backup Selected" MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_SELECTED}"
echo_good echo_good
DO_CNAME_RESTORE='1' DO_CNAME_RESTORE='1'
else else
MESSAGE="Invalid Request" MESSAGE="${UI_RESTORE_INVALID}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
else else
MESSAGE="No ${CNAME_CONF} Backups" MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}"
echo_info echo_info
fi fi
fi fi
@ -152,134 +152,62 @@ function restore_gs {
if [ "$DO_GRAVITY_RESTORE" == "1" ] if [ "$DO_GRAVITY_RESTORE" == "1" ]
then then
MESSAGE="${GRAVITY_FI} from ${INPUT_BACKUP_DATE} Selected" MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_FROM} ${INPUT_BACKUP_DATE}"
echo_info echo_info
else else
MESSAGE="${GRAVITY_FI} Restore Unavailable" MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}"
echo_info echo_info
fi fi
if [ "$DO_CUSTOM_RESTORE" == "1" ] if [ "$DO_CUSTOM_RESTORE" == "1" ]
then then
MESSAGE="${CUSTOM_DNS} from ${INPUT_DNSBACKUP_DATE} Selected" MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_FROM} ${INPUT_DNSBACKUP_DATE}"
echo_info echo_info
else else
MESSAGE="${CUSTOM_DNS} Restore Unavailable" MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}"
echo_info echo_info
fi fi
if [ "$DO_CNAME_RESTORE" == "1" ] if [ "$DO_CNAME_RESTORE" == "1" ]
then then
MESSAGE="${CNAME_CONF} from ${INPUT_CNAMEBACKUP_DATE} Selected" MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_FROM} ${INPUT_CNAMEBACKUP_DATE}"
echo_info echo_info
else else
MESSAGE="${CNAME_CONF} Restore Unavailable" MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}"
echo_info echo_info
fi fi
intent_validate intent_validate
MESSAGE="Making Time Warp Calculations" MESSAGE="${UI_RESTORE_TIME_TRAVEL}"
echo_info echo_info
MESSAGE="Stopping Pi-hole Services" # MESSAGE="Stopping FTLDNS services on $HOSTNAME"
echo_stat # echo_stat
${PH_EXEC} stop >/dev/null 2>&1 # ${PH_EXEC} stop >/dev/null 2>&1
error_validate # error_validate
if [ "$DO_CUSTOM_RESTORE" == "1" ] if [ "$DO_GRAVITY_RESTORE" == "1" ]
then then
MESSAGE="Restoring ${GRAVITY_FI} on $HOSTNAME" MESSAGE="${UI_RESTORE_SECONDARY} ${UI_GRAVITY_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${GRAVITY_FI}.backup ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${GRAVITY_FI}.backup ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Ownership on ${GRAVITY_FI}" validate_gravity_permissions
echo_stat
GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk 'OFS=":" {print $3,$4}')
if [ "$GRAVDB_OWN" == "$FILE_OWNER" ]
then
echo_good
else
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chown ${FILE_OWNER} ${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_warn
MESSAGE="Setting Ownership on ${GRAVITY_FI}"
echo_stat
sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
fi fi
if [ "$DO_CUSTOM_RESTORE" == '1' ] if [ "$DO_CUSTOM_RESTORE" == '1' ]
then then
if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ] if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ]
then then
MESSAGE="Restoring ${CUSTOM_DNS} on $HOSTNAME" MESSAGE="${UI_RESTORE_SECONDARY} ${UI_CUSTOM_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Ownership on ${CUSTOM_DNS}" validate_custom_permissions
echo_stat
CUSTOMLS_OWN=$(ls -ld ${PIHOLE_DIR}/${CUSTOM_DNS} | awk '{print $3 $4}')
if [ "$CUSTOMLS_OWN" == "rootroot" ]
then
echo_good
else
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${CUSTOM_DNS}"
echo_stat
sudo chown root:root ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
fi
MESSAGE="Validating Permissions on ${CUSTOM_DNS}"
echo_stat
CUSTOMLS_RWE=$(namei -m ${PIHOLE_DIR}/${CUSTOM_DNS} | grep -v f: | grep ${CUSTOM_DNS} | awk '{print $1}')
if [ "$CUSTOMLS_RWE" == "-rw-r--r--" ]
then
echo_good
else
echo_fail
MESSAGE="Attempting to Compensate"
echo_warn
MESSAGE="Setting Ownership on ${CUSTOM_DNS}"
echo_stat
sudo chmod 644 ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
fi
fi fi
fi fi
@ -287,21 +215,18 @@ function restore_gs {
then then
if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ] if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ]
then then
MESSAGE="Restoring ${CNAME_CONF} on $HOSTNAME" MESSAGE="${UI_RESTORE_SECONDARY} ${UI_CNAME_NAME}"
echo_stat echo_stat
sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1
error_validate error_validate
MESSAGE="Validating Ownership on ${CNAME_CONF}"
echo_stat
validate_cname_permissions validate_cname_permissions
fi fi
fi fi
pull_gs_reload pull_gs_reload
MESSAGE="Do you want to push the restored configuration to the primary Pi-hole? (yes/no)" MESSAGE="${UI_RESTORE_PUSH_PROMPT}"
echo_need echo_need
read PUSH_TO_PRIMARY read PUSH_TO_PRIMARY
@ -310,10 +235,13 @@ function restore_gs {
push_gs push_gs
elif [ "${PUSH_TO_PRIMARY}" == "No" ] || [ "${PUSH_TO_PRIMARY}" == "no" ] || [ "${PUSH_TO_PRIMARY}" == "N" ] || [ "${PUSH_TO_PRIMARY}" == "n" ] elif [ "${PUSH_TO_PRIMARY}" == "No" ] || [ "${PUSH_TO_PRIMARY}" == "no" ] || [ "${PUSH_TO_PRIMARY}" == "N" ] || [ "${PUSH_TO_PRIMARY}" == "n" ]
then then
MESSAGE="${UI_RESTORE_PUSH_NOPUSH}"
echo_info
logs_export logs_export
exit_withchange exit_withchange
else else
MESSAGE="Invalid Selection - Defaulting No" MESSAGE="${UI_INVALID_SELECTION} - ${UI_RESTORE_PUSH_NOPUSH}"
echo_warn echo_warn
logs_export logs_export

View File

@ -7,17 +7,17 @@
## Sudo Creation Task ## Sudo Creation Task
function task_sudo { function task_sudo {
TASKTYPE='SUDO' TASKTYPE='SUDO'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
MESSAGE="Creating Sudoer.d Template" MESSAGE="Creating sudoers.d template file"
echo_stat echo_stat
NEW_SUDO_USER=$(whoami) NEW_SUDO_USER=$(whoami)
echo -e "${NEW_SUDO_USER} ALL=(ALL) NOPASSWD: ALL" > ${LOCAL_FOLDR}/templates/gs-nopasswd.sudo echo -e "${NEW_SUDO_USER} ALL=(ALL) NOPASSWD: ALL" > ${LOCAL_FOLDR}/templates/gs-nopasswd.sudo
error_validate error_validate
MESSAGE="Installing Sudoer.d File" MESSAGE="Installing sudoers.d file on $HOSTNAME"
echo_stat echo_stat
sudo install -m 0440 ${LOCAL_FOLDR}/templates/gs-nopasswd.sudo /etc/sudoers.d/gs-nopasswd sudo install -m 0440 ${LOCAL_FOLDR}/templates/gs-nopasswd.sudo /etc/sudoers.d/gs-nopasswd
@ -34,7 +34,7 @@ function root_check {
MESSAGE="${MESSAGE} ${TASKTYPE}" MESSAGE="${MESSAGE} ${TASKTYPE}"
echo_fail echo_fail
MESSAGE="${PROGRAM} Should Not Run As 'root'" MESSAGE="${PROGRAM} should not run as 'root'"
echo_warn echo_warn
exit_nochange exit_nochange
@ -63,7 +63,7 @@ function new_root_check {
MESSAGE="${MESSAGE} ${TASKTYPE}" MESSAGE="${MESSAGE} ${TASKTYPE}"
echo_fail echo_fail
MESSAGE="Insufficent User Rights" MESSAGE="${CURRENTUSER} has insufficent user rights for ${PROGRAM}"
echo_warn echo_warn
exit_nochange exit_nochange

View File

@ -7,7 +7,7 @@
## Smart Task ## Smart Task
function task_smart { function task_smart {
TASKTYPE='SMART' TASKTYPE='SMART'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_target show_target

View File

@ -36,15 +36,15 @@ function create_rsynccmd {
## Detect SSH-KEYGEN ## Detect SSH-KEYGEN
function detect_sshkeygen { function detect_sshkeygen {
MESSAGE="Validating SSH-KEYGEN install on $HOSTNAME" MESSAGE="Validating SSH-KEYGEN install"
echo_stat echo_stat
if hash ssh-keygen >/dev/null 2>&1 if hash ssh-keygen >/dev/null 2>&1
then then
echo_good echo_sameline
else else
echo_fail echo_fail
MESSAGE="SSH-KEYGEN is Required" MESSAGE="SSH-KEYGEN is required on $HOSTNAME"
echo_info echo_info
exit_nochange exit_nochange
@ -56,18 +56,18 @@ function generate_sshkey {
then then
if [ -f $HOME/${SSH_PKIF} ] if [ -f $HOME/${SSH_PKIF} ]
then then
MESSAGE="Using Existing ~/${SSH_PKIF}" MESSAGE="Using existing ~/${SSH_PKIF} file"
echo_info echo_info
else else
if hash ssh-keygen >/dev/null 2>&1 if hash ssh-keygen >/dev/null 2>&1
then then
MESSAGE="Generating ~/${SSH_PKIF} (SSH-KEYGEN)" MESSAGE="Generating ~/${SSH_PKIF} file"
echo_stat echo_stat
ssh-keygen -q -P "" -t rsa -f $HOME/${SSH_PKIF} >/dev/null 2>&1 ssh-keygen -q -P "" -t rsa -f $HOME/${SSH_PKIF} >/dev/null 2>&1
error_validate error_validate
else else
MESSAGE="No SSH Key Generator Located" MESSAGE="No SSH-KEYGEN available"
echo_warn echo_warn
exit_nochange exit_nochange
fi fi
@ -80,12 +80,12 @@ function export_sshkey {
then then
if [ -f $HOME/${SSH_PKIF} ] if [ -f $HOME/${SSH_PKIF} ]
then then
MESSAGE="Registering Key-Pair on ${REMOTE_HOST}" MESSAGE="Registering key-pair to ${REMOTE_HOST}"
echo_info echo_info
ssh-copy-id -f -p ${SSH_PORT} -i $HOME/${SSH_PKIF}.pub ${REMOTE_USER}@${REMOTE_HOST} ssh-copy-id -f -p ${SSH_PORT} -i $HOME/${SSH_PKIF}.pub ${REMOTE_USER}@${REMOTE_HOST}
else else
MESSAGE="Error Registering Key-Pair" MESSAGE="Error registering key-pair to ${REMOTE_HOST}"
echo_warn echo_warn
fi fi
fi fi
@ -93,59 +93,62 @@ function export_sshkey {
## Detect SSH & RSYNC ## Detect SSH & RSYNC
function detect_ssh { function detect_ssh {
MESSAGE="Validating SSH Client on $HOSTNAME" MESSAGE="Validating OpenSSH client"
echo_stat echo_stat
if hash ssh 2>/dev/null if hash ssh 2>/dev/null
then then
MESSAGE="${MESSAGE} (OpenSSH)" MESSAGE="${MESSAGE} (OpenSSH)"
echo_good echo_sameline
SSH_CMD='ssh' SSH_CMD='ssh'
elif hash dbclient 2>/dev/null elif hash dbclient 2>/dev/null
then then
MESSAGE="${MESSAGE} (Dropbear)" MESSAGE="${MESSAGE} (Dropbear)"
echo_fail echo_fail
MESSAGE="Dropbear not supported in GS ${VERSION}" MESSAGE="Dropbear is not supported in ${PROGRAM} ${VERSION}"
echo_info echo_warn
exit_nochange exit_nochange
else else
echo_fail echo_fail
exit_nochange
MESSAGE="Attempting to Compensate" # MESSAGE="Attempting to Compensate"
echo_warn # echo_warn
MESSAGE="Installing SSH Client with ${PKG_MANAGER}" # MESSAGE="Installing SSH Client with ${PKG_MANAGER}"
echo_stat # echo_stat
${PKG_INSTALL} ssh-client >/dev/null 2>&1 # ${PKG_INSTALL} ssh-client >/dev/null 2>&1
error_validate # error_validate
fi fi
MESSAGE="Validating RSYNC Installed on $HOSTNAME" MESSAGE="Validating RSYNC client"
echo_stat echo_stat
if hash rsync 2>/dev/null if hash rsync 2>/dev/null
then then
echo_good echo_sameline
else else
echo_fail echo_fail
MESSAGE="RSYNC is Required"
MESSAGE="RSYNC client install is required"
echo_warn echo_warn
exit_nochange
distro_check # distro_check
MESSAGE="Attempting to Compensate" # MESSAGE="Attempting to Compensate"
echo_warn # echo_warn
MESSAGE="Installing RSYNC with ${PKG_MANAGER}" # MESSAGE="Installing RSYNC with ${PKG_MANAGER}"
echo_stat # echo_stat
${PKG_INSTALL} rsync >/dev/null 2>&1 # ${PKG_INSTALL} rsync >/dev/null 2>&1
error_validate # error_validate
fi fi
} }
function detect_remotersync { function detect_remotersync {
MESSAGE="Creating Test File on ${REMOTE_HOST}" MESSAGE="Creating test file on ${REMOTE_HOST}"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
@ -155,7 +158,7 @@ function detect_remotersync {
MESSAGE="If pull test fails ensure RSYNC is installed on ${REMOTE_HOST}" MESSAGE="If pull test fails ensure RSYNC is installed on ${REMOTE_HOST}"
echo_warn echo_warn
MESSAGE="Pulling Test File to $HOSTNAME" MESSAGE="Pulling test file to $HOSTNAME"
echo_stat echo_stat
RSYNC_REPATH="rsync" RSYNC_REPATH="rsync"
@ -163,13 +166,13 @@ function detect_remotersync {
RSYNC_TARGET="${LOCAL_FOLDR}/gs.test" RSYNC_TARGET="${LOCAL_FOLDR}/gs.test"
create_rsynccmd create_rsynccmd
MESSAGE="Cleaning Up Local Test File" MESSAGE="Cleaning up local test file"
echo_stat echo_stat
rm ${LOCAL_FOLDR}/gs.test rm ${LOCAL_FOLDR}/gs.test
error_validate error_validate
MESSAGE="Cleaning Up Remote Test File" MESSAGE="Cleaning up remote test file"
echo_stat echo_stat
CMD_TIMEOUT='15' CMD_TIMEOUT='15'
@ -178,7 +181,7 @@ function detect_remotersync {
} }
function show_target { function show_target {
MESSAGE="Targeting ${REMOTE_USER}@${REMOTE_HOST}" MESSAGE="Remote Pi-hole: ${REMOTE_USER}@${REMOTE_HOST}"
echo_info echo_info
detect_ssh detect_ssh

107
includes/gs-ui.sh Normal file
View File

@ -0,0 +1,107 @@
# GRAVITY SYNC BY VMSTAN #####################
# gs-ui.sh ###################################
# For documentation or downloading updates visit https://github.com/vmstan/gravity-sync
# This code is called from the main gravity-sync.sh file and should not execute directly!
# Interface Settings
UI_GRAVITY_NAME='Domain Database'
UI_CUSTOM_NAME='Local DNS Records'
UI_CNAME_NAME='Local DNS CNAMEs'
# Core
UI_INVALID_SELECTION='Invalid selection'
UI_INVALID_DNS_CONFIG='Invalid DNS replication settings in'
UI_CORE_MISSING='Missing'
UI_CORE_LOADING='Loading'
UI_CORE_EVALUATING='Evaluating arguments'
UI_CORE_INIT="Initalizing ${PROGRAM} (${VERSION})"
UI_CORE_RELOCATING='Relocating'
# Exit
UI_EXIT_CALC_END="after $((SCRIPT_END-SCRIPT_START)) seconds"
UI_EXIT_ABORT='aborted'
UI_EXIT_COMPLETE='completed'
# Hashing
UI_HASHING_HASHING='Hashing the primary'
UI_HASHING_COMPARING='Comparing to the secondary'
UI_HASHING_DIFFERNCE='Differences detected in the'
UI_HASHING_DETECTED='has been detected on the'
UI_HASHING_NOTDETECTED='not detected on the'
UI_HASHING_PRIMARY='primary host'
UI_HASHING_SECONDARY='secondary host'
UI_HASHING_REQUIRED='Replication of Pi-hole settings is required'
UI_HASHING_NOREP='No replication is required at this time'
UI_HASHING_DIAGNOSTICS='Performing replicator diagnostics'
UI_HASHING_REHASHING='Rehashing the primary'
UI_HASHING_RECOMPARING='Recomparing to the secondary'
# Validation
UI_VALIDATING='Validating configuration of'
UI_VALIDATING_FAIL_CONTAINER='Unable to validate running container instance of'
UI_VALIDATING_FAIL_FOLDER='Unable to validate configuration folder for'
UI_VALIDATING_FAIL_BINARY='Unable to validate the availibility of'
UI_CORE_APP='Pi-hole'
UI_CORE_APP_DNS='DNSMASQ'
UI_CORE_APP_SQL='SQLITE3'
UI_COMPENSATE='Attempting to compensate'
UI_SET_FILE_OWNERSHIP='Setting file ownership on'
UI_SET_FILE_PERMISSION='Setting file permissions on'
UI_VAL_FILE_OWNERSHIP='Validating file ownership on'
UI_VAL_FILE_PERMISSION='Validating file permissions on'
UI_VAL_GS_FOLDERS="Validating ${PROGRAM} folders on $HOSTNAME"
UI_VAL_GS_FOLDERS_FAIL="Unable to validate ${PROGRAM} folders on $HOSTNAME"
# Configuration
UI_DROPBEAR_DEP='Dropbear support has been deprecated'
# Pull/Push
UI_PULL_PRIMARY='Pulling the primary'
UI_PUSH_SECONDARY='Pushing the secondary'
UI_REPLACE_SECONDARY='Replacing the secondary'
UI_PULL_RELOAD_WAIT='Isolating regeneration pathways'
UI_PUSH_RELOAD_WAIT='Inverting tachyon pulses'
UI_FTLDNS_CONFIG_UPDATE='Updating secondary FTLDNS configuration'
UI_FTLDNS_CONFIG_RELOAD='Reloading secondary FTLDNS services'
UI_FTLDNS_CONFIG_PUSH_UPDATE='Updating primary FTLDNS configuration'
UI_FTLDNS_CONFIG_PUSH_RELOAD='Reloading primary FTLDNS services'
# Logging
UI_LOGGING_SUCCESS='Logging successful'
UI_LOGGING_HASHES='Saving the updated hashes from this replication'
UI_LOGGING_DISPLAY='Displaying output of previous jobs'
UI_LOGGING_EMPTY='is empty'
UI_LOGGING_MISSING='is missing'
UI_LOGGING_RECENT_COMPLETE='Recent complete executions of'
# Backup
UI_BACKUP_PRIMARY='Performing backup of primary'
UI_BACKUP_SECONDARY='Performing backup of secondary'
UI_BACKUP_PURGE='Purging redundant backups on secondary Pi-hole instance'
UI_BACKUP_REMAIN='days of backups remain'
# Restore
UI_RESTORE_WARNING="This will overwrite your current Pi-hole settings on $HOSTNAME with a previous version!"
UI_RESTORE_INVALID='Invalid restoration request'
UI_RESTORE_SELECT_DATE='Select backup date from which to restore the'
UI_RESTORE_SKIPPING='Skipping restore of'
UI_RESTORE_BACKUP_SELECTED='backup selected for restoration'
UI_RESTORE_BACKUP_UNAVAILABLE='backups are unavailable'
UI_RESTORE_FROM='restoring from'
UI_RESTORE_TIME_TRAVEL='Preparing calculations for time travel'
UI_RESTORE_SECONDARY='Restoring the secondary'
UI_RESTORE_PUSH_PROMPT='Do you want to push the restored configuration to the primary Pi-hole? (Y/N)'
UI_RESTORE_PUSH_NOPUSH="Configuration will not be pushed to the primaryp Pi-hole"
# Purge
UI_PURGE_MATRIX_ALIGNMENT='Realigning dilithium crystal matrix'
UI_PURGE_DELETE_SSH_KEYS='Deleting SSH key-files'
UI_PURGE_CLEANING_DIR="Purging ${PROGRAM} directory"
# Automation
UI_AUTO_CRON_EXISTS='Automation task already exists in crontab'
UI_AUTO_CRON_DISPLAY_FREQ='Select synchronization frequency (in minutes)'
UI_AUTO_CRON_SELECT_FREQ='Valid options are 5, 10, 15, 30 or 0 to disable (default: 15)'
UI_AUTO_CRON_SAVING='Saving new synchronization task to crontab'
UI_AUTO_CRON_DISABLED='Synchronization automation has been disabled'

View File

@ -22,15 +22,15 @@ function update_gs {
GIT_CHECK=$(git status | awk '{print $1}') GIT_CHECK=$(git status | awk '{print $1}')
if [ "$GIT_CHECK" == "fatal:" ] if [ "$GIT_CHECK" == "fatal:" ]
then then
MESSAGE="Requires GitHub Installation" MESSAGE="Updater usage requires GitHub installation"
echo_warn echo_warn
exit_nochange exit_nochange
else else
MESSAGE="Updating Cache" MESSAGE="Downloading updates via GitHub"
echo_stat echo_stat
git fetch --all >/dev/null 2>&1 git fetch --all >/dev/null 2>&1
error_validate error_validate
MESSAGE="Applying Update" MESSAGE="Deploying the latest ${PROGRAM} code"
echo_stat echo_stat
git reset --hard ${BRANCH} >/dev/null 2>&1 git reset --hard ${BRANCH} >/dev/null 2>&1
error_validate error_validate
@ -40,7 +40,7 @@ function update_gs {
## Show Version ## Show Version
function show_version { function show_version {
echo_lines echo_lines
MESSAGE="${BOLD}${PROGRAM}${NC} by ${CYAN}@vmstan${NC}" MESSAGE="${PURPLE}${PROGRAM}${NC} for Pi-hole"
echo_info echo_info
MESSAGE="${BLUE}https://github.com/vmstan/gravity-sync${NC}" MESSAGE="${BLUE}https://github.com/vmstan/gravity-sync${NC}"
@ -56,19 +56,19 @@ function show_version {
DEVVERSION="" DEVVERSION=""
fi fi
MESSAGE="Running Version: ${GREEN}${VERSION}${NC} ${DEVVERSION}" MESSAGE="Running version: ${GREEN}${VERSION}${NC} ${DEVVERSION}"
echo_info echo_info
GITVERSION=$(curl -sf https://raw.githubusercontent.com/vmstan/gravity-sync/master/VERSION) GITVERSION=$(curl -sf https://raw.githubusercontent.com/vmstan/gravity-sync/master/VERSION)
if [ -z "$GITVERSION" ] if [ -z "$GITVERSION" ]
then then
MESSAGE="Latest Version: ${RED}Unknown${NC}" MESSAGE="Latest version: ${RED}Unknown${NC}"
else else
if [ "$GITVERSION" != "$VERSION" ] if [ "$GITVERSION" != "$VERSION" ]
then then
MESSAGE="Update Available: ${PURPLE}${GITVERSION}${NC}" MESSAGE="Update available: ${RED}${GITVERSION}${NC}"
else else
MESSAGE="Latest Version: ${GREEN}${GITVERSION}${NC}" MESSAGE="Latest version: ${GREEN}${GITVERSION}${NC}"
fi fi
fi fi
echo_info echo_info
@ -76,7 +76,6 @@ function show_version {
} }
function show_info() { function show_info() {
if [ -f ${LOCAL_FOLDR}/dev ] if [ -f ${LOCAL_FOLDR}/dev ]
then then
DEVVERSION="-dev" DEVVERSION="-dev"
@ -89,7 +88,7 @@ function show_info() {
echo_lines echo_lines
echo -e "${YELLOW}Local Software Versions${NC}" echo -e "${YELLOW}Local Software Versions${NC}"
echo -e "${RED}Gravity Sync${NC} ${VERSION}${DEVVERSION}" echo -e "${PURPLE}Gravity Sync${NC} ${VERSION}${DEVVERSION}"
echo -e "${BLUE}Pi-hole${NC}" echo -e "${BLUE}Pi-hole${NC}"
if [ "${PH_IN_TYPE}" == "default" ] if [ "${PH_IN_TYPE}" == "default" ]
then then
@ -222,7 +221,7 @@ function show_info() {
## Devmode Task ## Devmode Task
function task_devmode { function task_devmode {
TASKTYPE='DEV' TASKTYPE='DEV'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
if [ -f ${LOCAL_FOLDR}/dev ] if [ -f ${LOCAL_FOLDR}/dev ]
@ -248,14 +247,14 @@ function task_devmode {
touch ${LOCAL_FOLDR}/dev touch ${LOCAL_FOLDR}/dev
error_validate error_validate
MESSAGE="Updating Cache" MESSAGE="Checking available branches"
echo_stat echo_stat
git fetch --all >/dev/null 2>&1 git fetch --all >/dev/null 2>&1
error_validate error_validate
git branch -r git branch -r
MESSAGE="Select Branch to Update Against" MESSAGE="Select GitHub branch to update against"
echo_need echo_need
read INPUT_BRANCH read INPUT_BRANCH
@ -270,7 +269,7 @@ function task_devmode {
## Update Task ## Update Task
function task_update { function task_update {
TASKTYPE='UPDATE' TASKTYPE='UPDATE'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
dbclient_warning dbclient_warning
@ -283,7 +282,7 @@ function task_update {
## Version Task ## Version Task
function task_version { function task_version {
TASKTYPE='VERSION' TASKTYPE='VERSION'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_version show_version
@ -294,7 +293,7 @@ function task_version {
function task_info() { function task_info() {
TASKTYPE='INFO' TASKTYPE='INFO'
MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" MESSAGE="${MESSAGE}: ${TASKTYPE}"
echo_good echo_good
show_info show_info

View File

@ -6,34 +6,29 @@
## Validate GS Folders ## Validate GS Folders
function validate_gs_folders { function validate_gs_folders {
MESSAGE="Validating ${PROGRAM} Folders on $HOSTNAME" MESSAGE="${UI_VAL_GS_FOLDERS}"
echo_stat echo_stat
if [ ! -d ${LOCAL_FOLDR} ]
if [ ! -d ${LOCAL_FOLDR} ] || [ ! -d ${LOCAL_FOLDR}/${BACKUP_FOLD} ] || [ ! -d ${LOCAL_FOLDR}/settings ] || [ ! -d ${LOG_PATH} ]
then then
MESSAGE="Unable to Validate ${PROGRAM} Folders on $HOSTNAME" MESSAGE="${UI_VAL_GS_FOLDERS_FAIL}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
if [ ! -d ${LOCAL_FOLDR}/${BACKUP_FOLD} ] echo_sameline
then
MESSAGE="Unable to Validate ${PROGRAM} Backup Folder on $HOSTNAME"
echo_fail
exit_nochange
fi
echo_good
} }
## Validate Pi-hole Folders ## Validate Pi-hole Folders
function validate_ph_folders { function validate_ph_folders {
MESSAGE="Validating Pi-hole Configuration" MESSAGE="${UI_VALIDATING} ${UI_CORE_APP}"
echo_stat echo_stat
if [ "$PH_IN_TYPE" == "default" ] if [ "$PH_IN_TYPE" == "default" ]
then then
if [ ! -f ${PIHOLE_BIN} ] if [ ! -f ${PIHOLE_BIN} ]
then then
MESSAGE="Unable to Validate that Pi-Hole is Installed" MESSAGE="${UI_VALIDATING_FAIL_BINARY} ${UI_CORE_APP}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
@ -42,7 +37,7 @@ function validate_ph_folders {
FTLCHECK=$(sudo docker container ls | grep "${CONTAIMAGE}") FTLCHECK=$(sudo docker container ls | grep "${CONTAIMAGE}")
if [ "$FTLCHECK" == "" ] if [ "$FTLCHECK" == "" ]
then then
MESSAGE="Unable to Validate that Pi-Hole is Installed" MESSAGE="${UI_VALIDATING_FAIL_CONTAINER} ${UI_CORE_APP}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
@ -51,7 +46,7 @@ function validate_ph_folders {
FTLCHECK=$(sudo podman container ls | grep "${CONTAIMAGE}") FTLCHECK=$(sudo podman container ls | grep "${CONTAIMAGE}")
if [ "$FTLCHECK" == "" ] if [ "$FTLCHECK" == "" ]
then then
MESSAGE="Unable to Validate that Pi-Hole is Installed" MESSAGE="${UI_VALIDATING_FAIL_CONTAINER} ${UI_CORE_APP}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
@ -59,87 +54,56 @@ function validate_ph_folders {
if [ ! -d ${PIHOLE_DIR} ] if [ ! -d ${PIHOLE_DIR} ]
then then
MESSAGE="Unable to Validate Pi-Hole Configuration Directory" MESSAGE="${UI_VALIDATING_FAIL_FOLDER} ${UI_CORE_APP}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
echo_good
echo_sameline
} }
## Validate DNSMASQ Folders ## Validate DNSMASQ Folders
function validate_dns_folders { function validate_dns_folders {
MESSAGE="Validating DNSMASQ Configuration" MESSAGE="${UI_VALIDATING} ${UI_CORE_APP_DNS}"
echo_stat echo_stat
if [ ! -d ${DNSMAQ_DIR} ] if [ ! -d ${DNSMAQ_DIR} ]
then then
MESSAGE="Unable to Validate DNSMASQ Configuration Directory" MESSAGE="${UI_VALIDATING_FAIL_FOLDER} ${UI_CORE_APP_DNS}"
echo_fail echo_fail
exit_nochange exit_nochange
fi fi
echo_good echo_sameline
} }
## Validate SQLite3 ## Validate SQLite3
function validate_sqlite3 { function validate_sqlite3 {
MESSAGE="Validating SQLITE Installed on $HOSTNAME" MESSAGE="${UI_VALIDATING} ${UI_CORE_APP_SQL}"
echo_stat echo_stat
if hash sqlite3 2>/dev/null if hash sqlite3 2>/dev/null
then then
# MESSAGE="SQLITE3 Utility Detected" # MESSAGE="SQLITE3 Utility Detected"
echo_good echo_sameline
else else
MESSAGE="Unable to Validate SQLITE Install on $HOSTNAME" MESSAGE="${UI_VALIDATING_FAIL_BINARY} ${UI_CORE_APP_SQL}"
echo_warn echo_warn
MESSAGE="Installing SQLLITE3 with ${PKG_MANAGER}" #MESSAGE="Installing SQLLITE3 with ${PKG_MANAGER}"
echo_stat #echo_stat
${PKG_INSTALL} sqllite3 >/dev/null 2>&1 #${PKG_INSTALL} sqllite3 >/dev/null 2>&1
error_validate #error_validate
fi fi
} }
## Validate SSHPASS ## Validate SSHPASS
function validate_os_sshpass { function validate_os_sshpass {
# SSHPASSWORD='' MESSAGE="Connecting to ${REMOTE_HOST}"
# if hash sshpass 2>/dev/null
# then
# MESSAGE="SSHPASS Utility Detected"
# echo_warn
# if [ -z "$REMOTE_PASS" ]
# then
# MESSAGE="Using SSH Key-Pair Authentication"
# echo_info
# else
# MESSAGE="Testing Authentication Options"
# echo_stat
# timeout 5 ssh -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" -o StrictHostKeyChecking=no ${REMOTE_USER}@${REMOTE_HOST} 'exit' >/dev/null 2>&1
# if [ "$?" != "0" ]
# then
# SSHPASSWORD="sshpass -p ${REMOTE_PASS}"
# MESSAGE="Using SSH Password Authentication"
# echo_warn
# else
# MESSAGE="Valid Key-Pair Detected ${NC}(${RED}Password Ignored${NC})"
# echo_info
# fi
# fi
# else
# SSHPASSWORD=''
# MESSAGE="Using SSH Key-Pair Authentication"
# echo_info
# fi
MESSAGE="Validating Connection to ${REMOTE_HOST}"
echo_stat echo_stat
CMD_TIMEOUT='5' CMD_TIMEOUT='5'
CMD_REQUESTED="exit" CMD_REQUESTED="exit"
create_sshcmd create_sshcmd
} }
## Detect Package Manager ## Detect Package Manager
@ -177,14 +141,99 @@ function dbclient_warning {
then then
NOEMPTYBASHIF="1" NOEMPTYBASHIF="1"
else else
MESSAGE="Dropbear support has been deprecated - please convert to OpenSSH" MESSAGE="${UI_DROPBEAR_DEP}"
echo_warn echo_warn
fi fi
fi fi
} }
## Validate CNAME Permissions ## Validate Domain Database Permissions
function validate_cname_permissions { function validate_gravity_permissions() {
MESSAGE="${UI_VAL_FILE_OWNERSHIP} ${UI_GRAVITY_NAME}"
echo_stat
GRAVDB_OWN=$(ls -ld ${PIHOLE_DIR}/${GRAVITY_FI} | awk 'OFS=":" {print $3,$4}')
if [ "$GRAVDB_OWN" == "$FILE_OWNER" ]
then
echo_good
else
echo_fail
MESSAGE="${UI_COMPENSATE}"
echo_warn
MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_GRAVITY_NAME}"
echo_stat
sudo chown ${FILE_OWNER} ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
MESSAGE="${UI_VAL_FILE_PERMISSION} of ${UI_GRAVITY_NAME}"
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="${UI_COMPENSATE}"
echo_warn
MESSAGE="${UI_SET_FILE_PERMISSION} ${UI_GRAVITY_NAME}"
echo_stat
sudo chmod 664 ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1
error_validate
fi
}
## Validate Local DNS Records Permissions
function validate_custom_permissions() {
MESSAGE="${UI_VAL_FILE_OWNERSHIP} ${UI_CUSTOM_NAME}"
echo_stat
CUSTOMLS_OWN=$(ls -ld ${PIHOLE_DIR}/${CUSTOM_DNS} | awk '{print $3 $4}')
if [ "$CUSTOMLS_OWN" == "rootroot" ]
then
echo_good
else
echo_fail
MESSAGE="${UI_COMPENSATE}"
echo_warn
MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CUSTOM_NAME}"
echo_stat
sudo chown root:root ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
fi
MESSAGE="${UI_VAL_FILE_PERMISSION} ${UI_CUSTOM_NAME}"
echo_stat
CUSTOMLS_RWE=$(namei -m ${PIHOLE_DIR}/${CUSTOM_DNS} | grep -v f: | grep ${CUSTOM_DNS} | awk '{print $1}')
if [ "$CUSTOMLS_RWE" == "-rw-r--r--" ]
then
echo_good
else
echo_fail
MESSAGE="${UI_COMPENSATE}"
echo_warn
MESSAGE="${UI_SET_FILE_PERMISSION} ${UI_CUSTOM_NAME}"
echo_stat
sudo chmod 644 ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1
error_validate
fi
}
## Validate Local DNS CNAME Permissions
function validate_cname_permissions() {
MESSAGE="${UI_VAL_FILE_OWNERSHIP} ${UI_CNAME_NAME}"
echo_stat
CNAMELS_OWN=$(ls -ld ${DNSMAQ_DIR}/${CNAME_CONF} | awk '{print $3 $4}') CNAMELS_OWN=$(ls -ld ${DNSMAQ_DIR}/${CNAME_CONF} | awk '{print $3 $4}')
if [ "$CNAMELS_OWN" == "rootroot" ] if [ "$CNAMELS_OWN" == "rootroot" ]
then then
@ -192,16 +241,16 @@ function validate_cname_permissions {
else else
echo_fail echo_fail
MESSAGE="Attempting to Compensate" MESSAGE="${UI_COMPENSATE}"
echo_warn echo_warn
MESSAGE="Setting Ownership on ${CNAME_CONF}" MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CNAME_NAME}"
echo_stat echo_stat
sudo chown root:root ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 sudo chown root:root ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1
error_validate error_validate
fi fi
MESSAGE="Validating Permissions on ${CNAME_CONF}" MESSAGE="${UI_VAL_FILE_PERMISSION} ${UI_CNAME_NAME}"
echo_stat echo_stat
CNAMELS_RWE=$(namei -m ${DNSMAQ_DIR}/${CNAME_CONF} | grep -v f: | grep ${CNAME_CONF} | awk '{print $1}') CNAMELS_RWE=$(namei -m ${DNSMAQ_DIR}/${CNAME_CONF} | grep -v f: | grep ${CNAME_CONF} | awk '{print $1}')
@ -211,12 +260,13 @@ function validate_cname_permissions {
else else
echo_fail echo_fail
MESSAGE="Attempting to Compensate" MESSAGE="${UI_COMPENSATE}"
echo_warn echo_warn
MESSAGE="Setting Ownership on ${CNAME_CONF}" MESSAGE="${UI_SET_FILE_PERMISSION} ${UI_CNAME_NAME}"
echo_stat echo_stat
sudo chmod 644 ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 sudo chmod 644 ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1
error_validate error_validate
fi fi
} }