diff --git a/README.md b/README.md index 76e293e..4cf28f7 100644 --- a/README.md +++ b/README.md @@ -1,26 +1,30 @@

- Gravity Sync +Gravity Sync

-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! + + +# Gravity Sync + + + +### + +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) -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 - -Gravity Sync replicates the `gravity.db` database, which includes: +## Features +Gravity Sync replicates the Pi-hole Domain Database (`gravity.db`), which includes: - Blocklist settings with status and comments. - Domain whitelist and blacklist along with status with comments. - Custom RegEx whitelist and blacklists. - Clients and groups along with any list assignments. -Gravity Sync can also (optionally) replicate FTLDNS/DNSMASQ configuration files, including: - -- 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. +Gravity Sync can also (optionally) replicate the Local DNS Records and CNAMEs configuration files. ### Limitations @@ -32,7 +36,7 @@ Gravity Sync will **not**: - Sync DHCP settings or monitor device leases. - 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) 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) 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. 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: - [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) -- [Changelog](https://github.com/vmstan/gravity-sync/blob/master/CHANGELOG.md) +- [Changelog](https://github.com/vmstan/gravity-sync/wiki/Changelog) \ No newline at end of file diff --git a/VERSION b/VERSION index 4772543..fbcbf73 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.3.2 +3.4.0 \ No newline at end of file diff --git a/gravity-sync.sh b/gravity-sync.sh index 443b898..957b46d 100755 --- a/gravity-sync.sh +++ b/gravity-sync.sh @@ -3,7 +3,7 @@ SCRIPT_START=$SECONDS # GRAVITY SYNC BY VMSTAN ##################### PROGRAM='Gravity Sync' -VERSION='3.3.2' +VERSION='3.4.0' # 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! ### ############################################## +# Import UI Fields +source ${LOCAL_FOLDR}/includes/gs-ui.sh + # Import Color/Message Includes source ${LOCAL_FOLDR}/includes/gs-colors.sh diff --git a/includes/gs-automate.sh b/includes/gs-automate.sh index 0c1e72a..435d3a2 100644 --- a/includes/gs-automate.sh +++ b/includes/gs-automate.sh @@ -7,26 +7,26 @@ ## Automate Task function task_automate { TASKTYPE='AUTOMATE' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good CRON_EXIST='0' CRON_CHECK=$(crontab -l | grep -q "${GS_FILENAME}" && echo '1' || echo '0') if [ ${CRON_CHECK} == 1 ] then - MESSAGE="Automation Task Already Exists" - echo_info + MESSAGE="${UI_AUTO_CRON_EXISTS}" + echo_warn CRON_EXIST='1' fi - MESSAGE="Configuring Automated Synchronization" + MESSAGE="${UI_AUTO_CRON_DISPLAY_FREQ}" echo_info if [[ $1 =~ ^[0-9][0-9]?$ ]] then INPUT_AUTO_FREQ=$1 else - MESSAGE="Synchronization Frequency in Minutes (5, 10, 15, 30) or 0 to Disable (default 15)" + MESSAGE="${UI_AUTO_CRON_SELECT_FREQ}" echo_need read INPUT_AUTO_FREQ INPUT_AUTO_FREQ="${INPUT_AUTO_FREQ:-15}" @@ -39,7 +39,7 @@ function task_automate { clear_cron fi - MESSAGE="Saving New Synchronization Automation" + MESSAGE="${UI_AUTO_CRON_SAVING}" echo_stat (crontab -l 2>/dev/null; echo "*/${INPUT_AUTO_FREQ} * * * * ${BASH_PATH} ${LOCAL_FOLDR}/${GS_FILENAME} smart > ${LOG_PATH}/${CRONJOB_LOG}") | crontab - error_validate @@ -49,52 +49,24 @@ function task_automate { then clear_cron - MESSAGE="Synchronization Automation Disabled" - echo_warn + # MESSAGE="Synchronization automation has been disabled" + # echo_warn else - MESSAGE="No Synchronization Automation Scheduled" + MESSAGE="${UI_AUTO_CRON_DISABLED}" echo_warn fi else - MESSAGE="Invalid Frequency Range" + MESSAGE="${UI_INVALID_SELECTION}" echo_fail exit_nochange 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 } ## Clear Existing Automation Settings function clear_cron { - MESSAGE="Removing Existing Automation" + MESSAGE="${UI_AUTO_CRON_DISABLED}" echo_stat crontab -l > cronjob-old.tmp @@ -108,7 +80,7 @@ function clear_cron { ## Cron Task function task_cron { TASKTYPE='CRON' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_crontab diff --git a/includes/gs-backup.sh b/includes/gs-backup.sh index f138e1a..0bfc01e 100644 --- a/includes/gs-backup.sh +++ b/includes/gs-backup.sh @@ -5,9 +5,9 @@ # This code is called from the main gravity-sync.sh file and should not execute directly! ## Backup Task -function task_backup { +function task_backup() { TASKTYPE='BACKUP' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good backup_settime @@ -20,54 +20,54 @@ function task_backup { exit_withchange } -function backup_settime { +function backup_settime() { BACKUPTIMESTAMP=$(date +%F-%H%M%S) } -function backup_local_gravity { - MESSAGE="Performing Backup of Local ${GRAVITY_FI}" +function backup_local_gravity() { + MESSAGE="${UI_BACKUP_SECONDARY} ${UI_GRAVITY_NAME}" echo_stat sqlite3 ${PIHOLE_DIR}/${GRAVITY_FI} ".backup '${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup'" error_validate } -function backup_local_custom { +function backup_local_custom() { if [ "$SKIP_CUSTOM" != '1' ] then if [ -f ${PIHOLE_DIR}/${CUSTOM_DNS} ] then - MESSAGE="Performing Backup Up Local ${CUSTOM_DNS}" + MESSAGE="${UI_BACKUP_SECONDARY} ${UI_CUSTOM_NAME}" echo_stat cp ${PIHOLE_DIR}/${CUSTOM_DNS} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup error_validate else - MESSAGE="No Local ${CUSTOM_DNS} Detected" + MESSAGE="No local ${CUSTOM_DNS} detected" echo_info fi fi } -function backup_local_cname { +function backup_local_cname() { if [ "${INCLUDE_CNAME}" == '1' ] then if [ -f ${DNSMAQ_DIR}/${CNAME_CONF} ] then - MESSAGE="Performing Backup Up Local ${CNAME_CONF}" + MESSAGE="${UI_BACKUP_SECONDARY} ${UI_CNAME_NAME}" echo_stat cp ${DNSMAQ_DIR}/${CNAME_CONF} ${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup error_validate else - MESSAGE="No Local ${CNAME_CONF} Detected" + MESSAGE="No local ${CNAME_CONF} detected" echo_info fi fi } -function backup_remote_gravity { - MESSAGE="Performing Backup of Remote ${GRAVITY_FI}" +function backup_remote_gravity() { + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_GRAVITY_NAME}" echo_stat CMD_TIMEOUT='60' @@ -75,10 +75,10 @@ function backup_remote_gravity { create_sshcmd } -function backup_remote_custom { +function backup_remote_custom() { if [ "$SKIP_CUSTOM" != '1' ] then - MESSAGE="Performing Backup of Remote ${CUSTOM_DNS}" + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CUSTOM_NAME}" echo_stat CMD_TIMEOUT='15' @@ -87,10 +87,10 @@ function backup_remote_custom { fi } -function backup_remote_cname { +function backup_remote_cname() { if [ "$INCLUDE_CNAME" == '1' ] then - MESSAGE="Performing Backup of Remote ${CNAME_CONF}" + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CNAME_NAME}" echo_stat CMD_TIMEOUT='15' @@ -99,10 +99,15 @@ function backup_remote_cname { fi } -function backup_cleanup { - MESSAGE="Scrubbing ${BACKUP_RETAIN} Redundant Antimatter Containment Pods" +function backup_cleanup() { + MESSAGE="${UI_BACKUP_PURGE}" echo_stat find ${LOCAL_FOLDR}/${BACKUP_FOLD}/*.backup -mtime +${BACKUP_RETAIN} -type f -delete 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 } \ No newline at end of file diff --git a/includes/gs-colors.sh b/includes/gs-colors.sh index 6ef56f2..44186b9 100644 --- a/includes/gs-colors.sh +++ b/includes/gs-colors.sh @@ -44,6 +44,12 @@ function echo_good { echo -e "\r${GOOD} ${MESSAGE}" } +### Success +function echo_sameline { + echo -en " " + echo -en "\r" +} + ### Failure function echo_fail { echo -e "\r${FAIL} ${MESSAGE}" diff --git a/includes/gs-compare.sh b/includes/gs-compare.sh index bb3b17e..8ab8dbc 100644 --- a/includes/gs-compare.sh +++ b/includes/gs-compare.sh @@ -7,7 +7,7 @@ ## Compare Task function task_compare { TASKTYPE='COMPARE' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_target diff --git a/includes/gs-config.sh b/includes/gs-config.sh index 8e85fd7..b7d7e6e 100644 --- a/includes/gs-config.sh +++ b/includes/gs-config.sh @@ -7,7 +7,7 @@ ## Configure Task function task_configure { TASKTYPE='CONFIGURE' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good relocate_config_gs diff --git a/includes/gs-core.sh b/includes/gs-core.sh index 64f98c2..8b57928 100644 --- a/includes/gs-core.sh +++ b/includes/gs-core.sh @@ -4,11 +4,47 @@ # 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! +# 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 function import_gs { relocate_config_gs - MESSAGE="Importing ${CONFIG_FILE} Settings" + MESSAGE="${UI_CORE_LOADING} ${CONFIG_FILE}" echo -en "${STAT} $MESSAGE" if [ -f ${LOCAL_FOLDR}/settings/${CONFIG_FILE} ] then @@ -22,7 +58,7 @@ function import_gs { else echo_fail - MESSAGE="${CONFIG_FILE} Missing" + MESSAGE="${UI_CORE_MISSING} ${CONFIG_FILE}" echo_info TASKTYPE='CONFIG' @@ -33,7 +69,7 @@ function import_gs { function relocate_config_gs { if [ -f ${LOCAL_FOLDR}/${CONFIG_FILE} ] then - MESSAGE="Relocating ${CONFIG_FILE}" + MESSAGE="${UI_CORE_RELOCATING} ${CONFIG_FILE}" echo -en "${STAT} $MESSAGE" mv ${LOCAL_FOLDR}/${CONFIG_FILE} ${LOCAL_FOLDR}/settings/${CONFIG_FILE} @@ -42,7 +78,7 @@ function relocate_config_gs { if [ -f ${LOCAL_FOLDR}/${SYNCING_LOG} ] then - MESSAGE="Relocating ${SYNCING_LOG}" + MESSAGE="${UI_CORE_RELOCATING} ${SYNCING_LOG}" echo -en "${STAT} $MESSAGE" mv ${LOCAL_FOLDR}/${SYNCING_LOG} ${LOG_PATH}/${SYNCING_LOG} @@ -51,7 +87,7 @@ function relocate_config_gs { if [ -f ${LOCAL_FOLDR}/${CRONJOB_LOG} ] then - MESSAGE="Relocating ${CRONJOB_LOG}" + MESSAGE="${UI_CORE_RELOCATING} ${CRONJOB_LOG}" echo -en "${STAT} $MESSAGE" mv ${LOCAL_FOLDR}/${CRONJOB_LOG} ${LOG_PATH}/${CRONJOB_LOG} @@ -60,7 +96,7 @@ function relocate_config_gs { if [ -f ${LOCAL_FOLDR}/${HISTORY_MD5} ] then - MESSAGE="Relocating ${HISTORY_MD5}" + MESSAGE="${UI_CORE_RELOCATING} ${HISTORY_MD5}" echo -en "${STAT} $MESSAGE" mv ${LOCAL_FOLDR}/${HISTORY_MD5} ${LOG_PATH}/${HISTORY_MD5} @@ -85,6 +121,17 @@ function error_validate { fi } +## Error Validation +function silent_error_validate { + if [ "$?" != "0" ] + then + echo_fail + exit 1 + else + echo_sameline + fi +} + function ph_type { if [ "$PH_IN_TYPE" == "default" ] then @@ -102,45 +149,9 @@ function ph_type { RH_EXEC="${RIHOLE_BIN}" elif [ "$RH_IN_TYPE" == "docker" ] 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" ] then RH_EXEC="sudo ${RODMAN_BIN} exec ${ROCKER_CON} pihole" 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 -} diff --git a/includes/gs-exit.sh b/includes/gs-exit.sh index c5a6245..339ae3d 100644 --- a/includes/gs-exit.sh +++ b/includes/gs-exit.sh @@ -10,9 +10,9 @@ function exit_nochange { if [ "${TASKTYPE}" == "" ] then - MESSAGE="${PROGRAM} Aborting ($((SCRIPT_END-SCRIPT_START)) seconds)" + MESSAGE="${PROGRAM} ${UI_EXIT_ABORT} ${UI_EXIT_CALC_END}" else - MESSAGE="${PROGRAM} ${TASKTYPE} Aborting ($((SCRIPT_END-SCRIPT_START)) seconds)" + MESSAGE="${PROGRAM} ${TASKTYPE} ${UI_EXIT_ABORT} ${UI_EXIT_CALC_END}" fi echo_grav @@ -25,9 +25,9 @@ function exit_withchange { if [ "${TASKTYPE}" == "" ] then - MESSAGE="${PROGRAM} Completed ($((SCRIPT_END-SCRIPT_START)) seconds)" + MESSAGE="${PROGRAM} ${UI_EXIT_COMPLETE} ${UI_EXIT_CALC_END}" else - MESSAGE="${PROGRAM} ${TASKTYPE} Completed ($((SCRIPT_END-SCRIPT_START)) seconds)" + MESSAGE="${PROGRAM} ${TASKTYPE} ${UI_EXIT_COMPLETE} ${UI_EXIT_CALC_END}" fi echo_grav diff --git a/includes/gs-hashing.sh b/includes/gs-hashing.sh index af5cedd..9548052 100644 --- a/includes/gs-hashing.sh +++ b/includes/gs-hashing.sh @@ -8,12 +8,12 @@ function md5_compare { HASHMARK='0' - MESSAGE="Analyzing ${GRAVITY_FI} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_HASHING} ${UI_GRAVITY_NAME}" 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.*$//') error_validate - MESSAGE="Analyzing ${GRAVITY_FI} on $HOSTNAME" + MESSAGE="${UI_HASHING_COMPARING} ${UI_GRAVITY_NAME}" echo_stat secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//') error_validate @@ -22,7 +22,7 @@ function md5_compare { then HASHMARK=$((HASHMARK+0)) else - MESSAGE="Differenced ${GRAVITY_FI} Detected" + MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_GRAVITY_NAME}" echo_warn HASHMARK=$((HASHMARK+1)) 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} then REMOTE_CUSTOM_DNS="1" - MESSAGE="Analyzing ${CUSTOM_DNS} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_HASHING} ${UI_CUSTOM_NAME}" 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.*$//'") error_validate - MESSAGE="Analyzing ${CUSTOM_DNS} on $HOSTNAME" + MESSAGE="${UI_HASHING_COMPARING} ${UI_CUSTOM_NAME}" echo_stat secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//') error_validate @@ -49,23 +49,23 @@ function md5_compare { then HASHMARK=$((HASHMARK+0)) else - MESSAGE="Differenced ${CUSTOM_DNS} Detected" + MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_CUSTOM_NAME}" echo_warn HASHMARK=$((HASHMARK+1)) fi else - MESSAGE="No ${CUSTOM_DNS} Detected on ${REMOTE_HOST}" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}" echo_info fi else if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} then REMOTE_CUSTOM_DNS="1" - MESSAGE="${REMOTE_HOST} has ${CUSTOM_DNS}" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}" HASHMARK=$((HASHMARK+1)) echo_info fi - MESSAGE="No ${CUSTOM_DNS} Detected on $HOSTNAME" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}" echo_info 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} then REMOTE_CNAME_DNS="1" - MESSAGE="Analyzing ${CNAME_CONF} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_HASHING} ${UI_CNAME_NAME}" 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.*$//'") error_validate - MESSAGE="Analyzing ${CNAME_CONF} on $HOSTNAME" + MESSAGE="${UI_HASHING_COMPARING} ${UI_CNAME_NAME}" echo_stat secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//') error_validate @@ -94,24 +94,24 @@ function md5_compare { then HASHMARK=$((HASHMARK+0)) else - MESSAGE="Differenced ${CNAME_CONF} Detected" + MESSAGE="${UI_HASHING_DIFFERNCE} ${UI_CNAME_NAME}" echo_warn HASHMARK=$((HASHMARK+1)) fi else - MESSAGE="No ${CNAME_CONF} Detected on ${REMOTE_HOST}" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}" echo_info fi else if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} then REMOTE_CNAME_DNS="1" - MESSAGE="${REMOTE_HOST} has ${CNAME_CONF}" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}" HASHMARK=$((HASHMARK+1)) echo_info fi - MESSAGE="No ${CNAME_CONF} Detected on $HOSTNAME" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}" echo_info fi fi @@ -119,11 +119,11 @@ function md5_compare { if [ "$HASHMARK" != "0" ] then - MESSAGE="Replication Required" + MESSAGE="${UI_HASHING_REQUIRED}" echo_warn HASHMARK=$((HASHMARK+0)) else - MESSAGE="No Replication Required" + MESSAGE="${UI_HASHING_NOREP}" echo_info backup_cleanup exit_nochange @@ -150,20 +150,20 @@ function previous_md5 { } function md5_recheck { - MESSAGE="Performing Replicator Diagnostics" + MESSAGE="${UI_HASHING_DIAGNOSTICS}" echo_info HASHMARK='0' - MESSAGE="Reanalyzing ${GRAVITY_FI} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_REHASHING} ${UI_GRAVITY_NAME}" 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.*$//') - error_validate + silent_error_validate - MESSAGE="Reanalyzing ${GRAVITY_FI} on $HOSTNAME" + MESSAGE="${UI_HASHING_RECOMPARING} ${UI_GRAVITY_NAME}" echo_stat secondDBMD5=$(md5sum ${PIHOLE_DIR}/${GRAVITY_FI} | sed 's/\s.*$//') - error_validate + silent_error_validate if [ "$SKIP_CUSTOM" != '1' ] 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} then REMOTE_CUSTOM_DNS="1" - MESSAGE="Reanalyzing ${CUSTOM_DNS} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_REHASHING} ${UI_CUSTOM_NAME}" 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.*$//'") - error_validate + silent_error_validate - MESSAGE="Reanalyzing ${CUSTOM_DNS} on $HOSTNAME" + MESSAGE="${UI_HASHING_RECOMPARING} ${UI_CUSTOM_NAME}" echo_stat secondCLMD5=$(md5sum ${PIHOLE_DIR}/${CUSTOM_DNS} | sed 's/\s.*$//') - error_validate + silent_error_validate else - MESSAGE="No ${CUSTOM_DNS} Detected on ${REMOTE_HOST}" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}" echo_info fi else if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RIHOLE_DIR}/${CUSTOM_DNS} then REMOTE_CUSTOM_DNS="1" - MESSAGE="${REMOTE_HOST} has ${CUSTOM_DNS}" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_DETECTED} ${UI_HASHING_PRIMARY}" echo_info fi - MESSAGE="No ${CUSTOM_DNS} Detected on $HOSTNAME" + MESSAGE="${UI_CUSTOM_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}" echo_info 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} then REMOTE_CNAME_DNS="1" - MESSAGE="Reanalyzing ${CNAME_CONF} on ${REMOTE_HOST}" + MESSAGE="${UI_HASHING_REHASHING} ${UI_CNAME_NAME}" 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.*$//'") - error_validate + silent_error_validate - MESSAGE="Reanalyzing ${CNAME_CONF} on $HOSTNAME" + MESSAGE="${UI_HASHING_RECOMPARING} ${UI_CNAME_NAME}" echo_stat secondCNMD5=$(md5sum ${DNSMAQ_DIR}/${CNAME_CONF} | sed 's/\s.*$//') - error_validate + silent_error_validate else - MESSAGE="No ${CNAME_CONF} Detected on ${REMOTE_HOST}" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}" echo_info fi else if ${SSHPASSWORD} ${SSH_CMD} -p ${SSH_PORT} -i "$HOME/${SSH_PKIF}" ${REMOTE_USER}@${REMOTE_HOST} test -e ${RNSMAQ_DIR}/${CNAME_CONF} then REMOTE_CNAME_DNS="1" - MESSAGE="${REMOTE_HOST} has ${CNAME_CONF}" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_PRIMARY}" echo_info fi - MESSAGE="No ${CNAME_CONF} Detected on $HOSTNAME" + MESSAGE="${UI_CNAME_NAME} ${UI_HASHING_NOTDETECTED} ${UI_HASHING_SECONDARY}" echo_info fi fi diff --git a/includes/gs-intent.sh b/includes/gs-intent.sh index dd0286c..e166b28 100644 --- a/includes/gs-intent.sh +++ b/includes/gs-intent.sh @@ -23,19 +23,19 @@ function intent_validate { INTENT="ENGAGE TRACTOR BEAM" fi - MESSAGE="Type ${INTENT} to Confirm" + MESSAGE="Type ${INTENT} to confirm" echo_need read INPUT_INTENT if [ "${INPUT_INTENT}" != "${INTENT}" ] then - MESSAGE="${TASKTYPE} Aborted" + MESSAGE="${TASKTYPE} aborted" echo_info exit_nochange fi else - MESSAGE="Verification Bypassed" + MESSAGE="Verification bypassed" echo_warn fi } \ No newline at end of file diff --git a/includes/gs-logging.sh b/includes/gs-logging.sh index e8de821..5d7e60d 100644 --- a/includes/gs-logging.sh +++ b/includes/gs-logging.sh @@ -7,7 +7,7 @@ ## Logs Task function task_logs { TASKTYPE='LOGS' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good logs_gs @@ -18,7 +18,7 @@ function task_logs { function logs_export { if [ "${TASKTYPE}" != "BACKUP" ] then - MESSAGE="Saving File Hashes" + MESSAGE="${UI_LOGGING_HASHES}" echo_stat rm -f ${LOG_PATH}/${HISTORY_MD5} echo -e ${primaryDBMD5} >> ${LOG_PATH}/${HISTORY_MD5} @@ -30,7 +30,7 @@ function logs_export { error_validate fi - MESSAGE="Logging Successful ${TASKTYPE}" + MESSAGE="${UI_LOGGING_SUCCESS} ${TASKTYPE}" echo_stat echo -e $(date) "[${TASKTYPE}]" >> ${LOG_PATH}/${SYNCING_LOG} error_validate @@ -38,21 +38,21 @@ function logs_export { ### Output Sync Logs function logs_gs { - MESSAGE="Tailing ${LOG_PATH}/${SYNCING_LOG}" + MESSAGE="${UI_LOGGING_DISPLAY}" echo_info - echo -e "========================================================" - echo -e "Recent Complete ${YELLOW}SMART${NC} Executions" + echo_lines + echo -e "${UI_LOGGING_RECENT_COMPLETE} ${YELLOW}SMART${NC}" 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 - 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 - 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 - 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 - echo -e "========================================================" + echo_lines exit_nochange } @@ -60,7 +60,7 @@ function logs_gs { ## Crontab Logs ### Core Crontab Logs function show_crontab { - MESSAGE="Replaying Last Cronjob" + MESSAGE="${UI_LOGGING_DISPLAY}" echo_stat if [ -f ${LOG_PATH}/${CRONJOB_LOG} ] @@ -68,19 +68,19 @@ function show_crontab { if [ -s ${LOG_PATH}/${CRONJOB_LOG} ] echo_good - MESSAGE="Tailing ${LOG_PATH}/${CRONJOB_LOG}" - echo_info + # MESSAGE="Tailing ${LOG_PATH}/${CRONJOB_LOG}" + # echo_info - echo -e "========================================================" + echo_lines date -r ${LOG_PATH}/${CRONJOB_LOG} cat ${LOG_PATH}/${CRONJOB_LOG} - echo -e "========================================================" + echo_lines exit_nochange then echo_fail - MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Empty" + MESSAGE="${LOG_PATH}/${CRONJOB_LOG} ${UI_LOGGING_EMPTY}" echo_info exit_nochange @@ -88,7 +88,7 @@ function show_crontab { else echo_fail - MESSAGE="${LOG_PATH}/${CRONJOB_LOG} is Missing" + MESSAGE="${LOG_PATH}/${CRONJOB_LOG} ${UI_LOGGING_MISSING}" echo_info exit_nochange diff --git a/includes/gs-pull.sh b/includes/gs-pull.sh index d5a9c96..e1b26d9 100644 --- a/includes/gs-pull.sh +++ b/includes/gs-pull.sh @@ -7,7 +7,7 @@ ## Pull Task function task_pull { TASKTYPE='PULL' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_target @@ -32,67 +32,19 @@ function pull_gs_grav { backup_local_gravity backup_remote_gravity - MESSAGE="Pulling ${GRAVITY_FI} from ${REMOTE_HOST}" + MESSAGE="${UI_PULL_PRIMARY} ${UI_GRAVITY_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull" create_rsynccmd - MESSAGE="Replacing ${GRAVITY_FI} on $HOSTNAME" + MESSAGE="${UI_REPLACE_SECONDARY} ${UI_GRAVITY_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.pull ${PIHOLE_DIR}/${GRAVITY_FI} >/dev/null 2>&1 error_validate - if [ "$FILE_OWNER" != "named:docker" ] - 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 + validate_gravity_permissions } ## Pull Custom @@ -104,58 +56,19 @@ function pull_gs_cust { backup_local_custom backup_remote_custom - MESSAGE="Pulling ${CUSTOM_DNS} from ${REMOTE_HOST}" + MESSAGE="${UI_PULL_PRIMARY} ${UI_CUSTOM_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull" create_rsynccmd - MESSAGE="Replacing ${CUSTOM_DNS} on $HOSTNAME" + MESSAGE="${UI_REPLACE_SECONDARY} ${UI_CUSTOM_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.pull ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1 error_validate - MESSAGE="Validating Settings on ${CUSTOM_DNS}" - 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 + validate_custom_permissions fi fi } @@ -169,40 +82,35 @@ function pull_gs_cname { backup_local_cname backup_remote_cname - MESSAGE="Pulling ${CNAME_CONF} from ${REMOTE_HOST}" + MESSAGE="${UI_PULL_PRIMARY} ${UI_CNAME_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull" create_rsynccmd - MESSAGE="Replacing ${CNAME_CONF} on $HOSTNAME" + MESSAGE="${UI_REPLACE_SECONDARY} ${UI_CNAME_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.pull ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 error_validate - MESSAGE="Validating Settings on ${CNAME_CONF}" - echo_stat - validate_cname_permissions - - echo_good fi fi } ## Pull Reload function pull_gs_reload { - MESSAGE="Isolating Regeneration Pathways" + MESSAGE="${UI_PULL_RELOAD_WAIT}" echo_info sleep 1 - MESSAGE="Updating FTLDNS Configuration" + MESSAGE="${UI_FTLDNS_CONFIG_UPDATE}" echo_stat ${PH_EXEC} restartdns reloadlists >/dev/null 2>&1 error_validate - MESSAGE="Reloading FTLDNS Services" + MESSAGE="${UI_FTLDNS_CONFIG_RELOAD}" echo_stat ${PH_EXEC} restartdns >/dev/null 2>&1 error_validate diff --git a/includes/gs-purge.sh b/includes/gs-purge.sh index eace19d..35910dd 100644 --- a/includes/gs-purge.sh +++ b/includes/gs-purge.sh @@ -7,51 +7,39 @@ ## Purge Task function task_purge { TASKTYPE="THE-PURGE" - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good - MESSAGE="THIS WILL RESET YOUR ENTIRE GRAVITY SYNC INSTALLATION" - echo_warn - MESSAGE="This will remove:" - echo_warn - MESSAGE="- All backups files." - echo_warn - MESSAGE="- Your ${CONFIG_FILE} file." - echo_warn - + echo_lines + echo -e "THIS WILL RESET YOUR ENTIRE GRAVITY SYNC INSTALLATION" + echo -e "This will remove:" + echo -e "- All backups files." + echo -e "- Your ${CONFIG_FILE} file." + if [ -f "${LOCAL_FOLDR}/dev" ] then - MESSAGE="- Your development branch updater." + echo -e "- Your development branch updater." elif [ -f "${LOCAL_FOLDR}/beta" ] then - MESSAGE="- Your beta branch updater." + echo -e "- Your beta branch updater." fi - echo_warn - - MESSAGE="- All cronjob/automation tasks." - echo_warn - MESSAGE="- All job history/logs." - echo_warn - MESSAGE="- Associated SSH id_rsa keys." - echo_warn - MESSAGE="This function cannot be undone!" - echo_warn - - MESSAGE="YOU WILL NEED TO REBUILD GRAVITY SYNC AFTER EXECUTION" - echo_warn - - 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 - + + echo -e "- All cronjob/automation tasks." + echo -e "- All job history/logs." + echo -e "- Associated SSH id_rsa keys." + echo -e "" + echo -e "This function cannot be undone!" + echo -e "" + echo -e "YOU WILL NEED TO REBUILD GRAVITY SYNC AFTER EXECUTION" + echo -e "Pi-hole binaries, configuration and services ARE NOT impacted!" + 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," + echo -e "until you reconfigure Gravity Sync on this device." + echo_lines + intent_validate - MESSAGE="Cleaning Gravity Sync Directory" + MESSAGE="${UI_PURGE_CLEANING_DIR}" echo_stat git clean -f -X -d >/dev/null 2>&1 @@ -59,20 +47,20 @@ function task_purge { clear_cron - MESSAGE="Deleting SSH Key-files" + MESSAGE="${UI_PURGE_DELETE_SSH_KEYS}" echo_stat rm -f $HOME/${SSH_PKIF} >/dev/null 2>&1 rm -f $HOME/${SSH_PKIF}.pub >/dev/null 2>&1 error_validate - MESSAGE="Realigning Dilithium Matrix" - echo_stat + MESSAGE="${UI_PURGE_MATRIX_ALIGNMENT}" + echo_info sleep 1 - MESSAGE="Realigning Dilithium Matrix" - echo_good + # MESSAGE="Realigning Dilithium Matrix" + # echo_good update_gs } \ No newline at end of file diff --git a/includes/gs-push.sh b/includes/gs-push.sh index e4dbc4f..2ff4762 100644 --- a/includes/gs-push.sh +++ b/includes/gs-push.sh @@ -7,7 +7,7 @@ ## Push Task function task_push { TASKTYPE='PUSH' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_target @@ -31,31 +31,31 @@ function push_gs_grav { backup_remote_gravity backup_local_gravity - MESSAGE="Copying ${GRAVITY_FI} from ${REMOTE_HOST}" + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_GRAVITY_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${GRAVITY_FI}.push" create_rsynccmd - MESSAGE="Pushing ${GRAVITY_FI} to ${REMOTE_HOST}" + MESSAGE="${UI_PUSH_SECONDARY} ${UI_GRAVITY_NAME}" echo_stat RSYNC_REPATH="sudo rsync" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${GRAVITY_FI}.backup" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${GRAVITY_FI}" create_rsynccmd - MESSAGE="Setting Permissions on ${GRAVITY_FI}" - echo_stat - CMD_TIMEOUT='15' - CMD_REQUESTED="sudo chmod 664 ${RIHOLE_DIR}/${GRAVITY_FI}" - create_sshcmd - - MESSAGE="Setting Ownership on ${GRAVITY_FI}" + MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_GRAVITY_NAME}" echo_stat CMD_TIMEOUT='15' CMD_REQUESTED="sudo chown ${RILE_OWNER} ${RIHOLE_DIR}/${GRAVITY_FI}" 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 @@ -67,31 +67,31 @@ function push_gs_cust { backup_remote_custom backup_local_custom - MESSAGE="Copying ${CUSTOM_DNS} from ${REMOTE_HOST}" + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CUSTOM_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CUSTOM_DNS}.push" create_rsynccmd - MESSAGE="Pushing ${CUSTOM_DNS} to ${REMOTE_HOST}" + MESSAGE="${UI_PUSH_SECONDARY} ${UI_CUSTOM_NAME}" echo_stat RSYNC_REPATH="sudo rsync" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CUSTOM_DNS}.backup" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/${CUSTOM_DNS}" create_rsynccmd - MESSAGE="Setting Permissions on ${CUSTOM_DNS}" - echo_stat - CMD_TIMEOUT='15' - CMD_REQUESTED="sudo chmod 644 ${RIHOLE_DIR}/${CUSTOM_DNS}" - create_sshcmd - - MESSAGE="Setting Ownership on ${CUSTOM_DNS}" + MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CUSTOM_NAME}" echo_stat CMD_TIMEOUT='15' CMD_REQUESTED="sudo chown root:root ${RIHOLE_DIR}/${CUSTOM_DNS}" 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 } @@ -105,48 +105,49 @@ function push_gs_cname { backup_remote_cname backup_local_cname - MESSAGE="Copying ${CNAME_CONF} from ${REMOTE_HOST}" + MESSAGE="${UI_BACKUP_PRIMARY} ${UI_CNAME_NAME}" echo_stat RSYNC_REPATH="rsync" RSYNC_SOURCE="${REMOTE_USER}@${REMOTE_HOST}:${RIHOLE_DIR}/dnsmasq.d-${CNAME_CONF}.backup" RSYNC_TARGET="${LOCAL_FOLDR}/${BACKUP_FOLD}/${CNAME_CONF}.push" create_rsynccmd - MESSAGE="Pushing ${CNAME_CONF} to ${REMOTE_HOST}" + MESSAGE="${UI_PUSH_SECONDARY} ${UI_CNAME_NAME}" echo_stat RSYNC_REPATH="sudo rsync" RSYNC_SOURCE="${LOCAL_FOLDR}/${BACKUP_FOLD}/${BACKUPTIMESTAMP}-${CNAME_CONF}.backup" RSYNC_TARGET="${REMOTE_USER}@${REMOTE_HOST}:${RNSMAQ_DIR}/${CNAME_CONF}" create_rsynccmd - MESSAGE="Setting Permissions on ${CNAME_CONF}" - echo_stat - CMD_TIMEOUT='15' - CMD_REQUESTED="sudo chmod 644 ${RNSMAQ_DIR}/${CNAME_CONF}" - create_sshcmd - - MESSAGE="Setting Ownership on ${CNAME_CONF}" + MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CNAME_NAME}" echo_stat CMD_TIMEOUT='15' CMD_REQUESTED="sudo chown root:root ${RNSMAQ_DIR}/${CNAME_CONF}" 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 } ## Push Reload function push_gs_reload { - MESSAGE="Inverting Tachyon Pulses" + MESSAGE="${UI_PUSH_RELOAD_WAIT}" echo_info sleep 1 - MESSAGE="Updating Remote FTLDNS Configuration" + MESSAGE="${UI_FTLDNS_CONFIG_PUSH_UPDATE}" echo_stat CMD_TIMEOUT='15' CMD_REQUESTED="${RH_EXEC} restartdns reloadlists" create_sshcmd - MESSAGE="Reloading Remote FTLDNS Services" + MESSAGE="${UI_FTLDNS_CONFIG_PUSH_RELOAD}" echo_stat CMD_TIMEOUT='15' CMD_REQUESTED="${RH_EXEC} restartdns" diff --git a/includes/gs-restore.sh b/includes/gs-restore.sh index 3a69f5a..f99ac54 100644 --- a/includes/gs-restore.sh +++ b/includes/gs-restore.sh @@ -7,7 +7,7 @@ ## Restore Task function task_restore { TASKTYPE='RESTORE' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_target @@ -27,14 +27,14 @@ function task_restore { ## Restore Gravity function restore_gs { - MESSAGE="This will restore your settings on $HOSTNAME with a previous version!" + MESSAGE="" echo_warn GRAVITY_DATE_LIST=$(ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${GRAVITY_FI} | colrm 18) if [ "${GRAVITY_DATE_LIST}" != "" ] then - MESSAGE="Previous ${GRAVITY_FI} Versions Available to Restore" + MESSAGE="${UI_RESTORE_WARNING}" echo_info echo_lines @@ -42,22 +42,22 @@ function restore_gs { echo -e "IGNORE-GRAVITY" echo_lines - MESSAGE="Select backup date to restore ${GRAVITY_FI} from" + MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_GRAVITY_NAME}" echo_need read INPUT_BACKUP_DATE if [ "$INPUT_BACKUP_DATE" == "IGNORE-GRAVITY" ] then - MESSAGE="Skipping Gravity" + MESSAGE="${UI_RESTORE_SKIPPING} ${UI_GRAVITY_NAME}" echo_warn elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${GRAVITY_FI}.backup ] then - MESSAGE="Backup Selected" + MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_BACKUP_SELECTED}" echo_good DO_GRAVITY_RESTORE='1' else - MESSAGE="Invalid Request" + MESSAGE="${UI_RESTORE_INVALID}" echo_info exit_nochange @@ -72,36 +72,36 @@ function restore_gs { if [ "${CUSTOM_DATE_LIST}" != "" ] then - MESSAGE="Previous ${CUSTOM_DNS} Versions Available to Restore" - echo_info + # MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CUSTOM_NAME}" + # echo_info echo_lines ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CUSTOM_DNS} | colrm 18 echo -e "IGNORE-CUSTOM" echo_lines - MESSAGE="Select backup date to restore ${CUSTOM_DNS} from" + MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CUSTOM_NAME}" echo_need read INPUT_DNSBACKUP_DATE if [ "$INPUT_DNSBACKUP_DATE" == "IGNORE-CUSTOM" ] then - MESSAGE="Skipping DNS" + MESSAGE="${UI_RESTORE_SKIPPING} ${UI_CUSTOM_NAME}" echo_warn elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ] then - MESSAGE="Backup Selected" + MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_SELECTED}" echo_good DO_CUSTOM_RESTORE='1' else - MESSAGE="Invalid Request" + MESSAGE="${UI_RESTORE_INVALID}" echo_fail exit_nochange fi else - MESSAGE="No ${CUSTOM_DNS} Backups" + MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}" echo_info fi fi @@ -115,36 +115,36 @@ function restore_gs { if [ "${CNAME_DATE_LIST}" != "" ] then - MESSAGE="Previous ${CNAME_CONF} Versions Available to Restore" - echo_info + # MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CNAME_NAME}" + # echo_info echo_lines ls ${LOCAL_FOLDR}/${BACKUP_FOLD} | grep $(date +%Y) | grep ${CNAME_CONF} | colrm 18 echo -e "IGNORE-CNAME" echo_lines - MESSAGE="Select backup date to restore ${CNAME_CONF} from" + MESSAGE="${UI_RESTORE_SELECT_DATE} ${UI_CNAME_NAME}" echo_need read INPUT_CNAMEBACKUP_DATE if [ "$INPUT_CNAMEBACKUP_DATE" == "IGNORE-CNAME" ] then - MESSAGE="Skipping CNAME" + MESSAGE="${UI_RESTORE_SKIPPING} ${UI_CNAME_NAME}" echo_warn elif [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ] then - MESSAGE="Backup Selected" + MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_SELECTED}" echo_good DO_CNAME_RESTORE='1' else - MESSAGE="Invalid Request" + MESSAGE="${UI_RESTORE_INVALID}" echo_fail exit_nochange fi else - MESSAGE="No ${CNAME_CONF} Backups" + MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}" echo_info fi fi @@ -152,134 +152,62 @@ function restore_gs { if [ "$DO_GRAVITY_RESTORE" == "1" ] then - MESSAGE="${GRAVITY_FI} from ${INPUT_BACKUP_DATE} Selected" + MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_FROM} ${INPUT_BACKUP_DATE}" echo_info else - MESSAGE="${GRAVITY_FI} Restore Unavailable" + MESSAGE="${UI_GRAVITY_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}" echo_info fi if [ "$DO_CUSTOM_RESTORE" == "1" ] then - MESSAGE="${CUSTOM_DNS} from ${INPUT_DNSBACKUP_DATE} Selected" + MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_FROM} ${INPUT_DNSBACKUP_DATE}" echo_info else - MESSAGE="${CUSTOM_DNS} Restore Unavailable" + MESSAGE="${UI_CUSTOM_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}" echo_info fi if [ "$DO_CNAME_RESTORE" == "1" ] then - MESSAGE="${CNAME_CONF} from ${INPUT_CNAMEBACKUP_DATE} Selected" + MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_FROM} ${INPUT_CNAMEBACKUP_DATE}" echo_info else - MESSAGE="${CNAME_CONF} Restore Unavailable" + MESSAGE="${UI_CNAME_NAME} ${UI_RESTORE_BACKUP_UNAVAILABLE}" echo_info fi intent_validate - MESSAGE="Making Time Warp Calculations" + MESSAGE="${UI_RESTORE_TIME_TRAVEL}" echo_info - MESSAGE="Stopping Pi-hole Services" - echo_stat + # MESSAGE="Stopping FTLDNS services on $HOSTNAME" + # echo_stat - ${PH_EXEC} stop >/dev/null 2>&1 - error_validate + # ${PH_EXEC} stop >/dev/null 2>&1 + # error_validate - if [ "$DO_CUSTOM_RESTORE" == "1" ] + if [ "$DO_GRAVITY_RESTORE" == "1" ] then - MESSAGE="Restoring ${GRAVITY_FI} on $HOSTNAME" + MESSAGE="${UI_RESTORE_SECONDARY} ${UI_GRAVITY_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_BACKUP_DATE}-${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 '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 + validate_gravity_permissions fi if [ "$DO_CUSTOM_RESTORE" == '1' ] then if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ] then - MESSAGE="Restoring ${CUSTOM_DNS} on $HOSTNAME" + MESSAGE="${UI_RESTORE_SECONDARY} ${UI_CUSTOM_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_DNSBACKUP_DATE}-${CUSTOM_DNS}.backup ${PIHOLE_DIR}/${CUSTOM_DNS} >/dev/null 2>&1 error_validate - MESSAGE="Validating Ownership on ${CUSTOM_DNS}" - 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 + validate_custom_permissions fi fi @@ -287,21 +215,18 @@ function restore_gs { then if [ -f ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ] then - MESSAGE="Restoring ${CNAME_CONF} on $HOSTNAME" + MESSAGE="${UI_RESTORE_SECONDARY} ${UI_CNAME_NAME}" echo_stat sudo cp ${LOCAL_FOLDR}/${BACKUP_FOLD}/${INPUT_CNAMEBACKUP_DATE}-${CNAME_CONF}.backup ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 error_validate - MESSAGE="Validating Ownership on ${CNAME_CONF}" - echo_stat - validate_cname_permissions fi fi 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 read PUSH_TO_PRIMARY @@ -310,10 +235,13 @@ function restore_gs { push_gs elif [ "${PUSH_TO_PRIMARY}" == "No" ] || [ "${PUSH_TO_PRIMARY}" == "no" ] || [ "${PUSH_TO_PRIMARY}" == "N" ] || [ "${PUSH_TO_PRIMARY}" == "n" ] then + MESSAGE="${UI_RESTORE_PUSH_NOPUSH}" + echo_info + logs_export exit_withchange else - MESSAGE="Invalid Selection - Defaulting No" + MESSAGE="${UI_INVALID_SELECTION} - ${UI_RESTORE_PUSH_NOPUSH}" echo_warn logs_export diff --git a/includes/gs-root.sh b/includes/gs-root.sh index 5a02329..342dbd0 100644 --- a/includes/gs-root.sh +++ b/includes/gs-root.sh @@ -7,17 +7,17 @@ ## Sudo Creation Task function task_sudo { TASKTYPE='SUDO' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good - MESSAGE="Creating Sudoer.d Template" + MESSAGE="Creating sudoers.d template file" echo_stat NEW_SUDO_USER=$(whoami) echo -e "${NEW_SUDO_USER} ALL=(ALL) NOPASSWD: ALL" > ${LOCAL_FOLDR}/templates/gs-nopasswd.sudo error_validate - MESSAGE="Installing Sudoer.d File" + MESSAGE="Installing sudoers.d file on $HOSTNAME" echo_stat 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}" echo_fail - MESSAGE="${PROGRAM} Should Not Run As 'root'" + MESSAGE="${PROGRAM} should not run as 'root'" echo_warn exit_nochange @@ -63,7 +63,7 @@ function new_root_check { MESSAGE="${MESSAGE} ${TASKTYPE}" echo_fail - MESSAGE="Insufficent User Rights" + MESSAGE="${CURRENTUSER} has insufficent user rights for ${PROGRAM}" echo_warn exit_nochange diff --git a/includes/gs-smart.sh b/includes/gs-smart.sh index aa3fe9a..b0dd02f 100644 --- a/includes/gs-smart.sh +++ b/includes/gs-smart.sh @@ -7,7 +7,7 @@ ## Smart Task function task_smart { TASKTYPE='SMART' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_target diff --git a/includes/gs-ssh.sh b/includes/gs-ssh.sh index 95b9787..35e7dac 100644 --- a/includes/gs-ssh.sh +++ b/includes/gs-ssh.sh @@ -36,15 +36,15 @@ function create_rsynccmd { ## Detect SSH-KEYGEN function detect_sshkeygen { - MESSAGE="Validating SSH-KEYGEN install on $HOSTNAME" + MESSAGE="Validating SSH-KEYGEN install" echo_stat if hash ssh-keygen >/dev/null 2>&1 then - echo_good + echo_sameline else echo_fail - MESSAGE="SSH-KEYGEN is Required" + MESSAGE="SSH-KEYGEN is required on $HOSTNAME" echo_info exit_nochange @@ -56,18 +56,18 @@ function generate_sshkey { then if [ -f $HOME/${SSH_PKIF} ] then - MESSAGE="Using Existing ~/${SSH_PKIF}" + MESSAGE="Using existing ~/${SSH_PKIF} file" echo_info else if hash ssh-keygen >/dev/null 2>&1 then - MESSAGE="Generating ~/${SSH_PKIF} (SSH-KEYGEN)" + MESSAGE="Generating ~/${SSH_PKIF} file" echo_stat ssh-keygen -q -P "" -t rsa -f $HOME/${SSH_PKIF} >/dev/null 2>&1 error_validate else - MESSAGE="No SSH Key Generator Located" + MESSAGE="No SSH-KEYGEN available" echo_warn exit_nochange fi @@ -80,12 +80,12 @@ function export_sshkey { then if [ -f $HOME/${SSH_PKIF} ] then - MESSAGE="Registering Key-Pair on ${REMOTE_HOST}" + MESSAGE="Registering key-pair to ${REMOTE_HOST}" echo_info ssh-copy-id -f -p ${SSH_PORT} -i $HOME/${SSH_PKIF}.pub ${REMOTE_USER}@${REMOTE_HOST} else - MESSAGE="Error Registering Key-Pair" + MESSAGE="Error registering key-pair to ${REMOTE_HOST}" echo_warn fi fi @@ -93,59 +93,62 @@ function export_sshkey { ## Detect SSH & RSYNC function detect_ssh { - MESSAGE="Validating SSH Client on $HOSTNAME" + MESSAGE="Validating OpenSSH client" echo_stat if hash ssh 2>/dev/null then MESSAGE="${MESSAGE} (OpenSSH)" - echo_good + echo_sameline SSH_CMD='ssh' elif hash dbclient 2>/dev/null then MESSAGE="${MESSAGE} (Dropbear)" echo_fail - MESSAGE="Dropbear not supported in GS ${VERSION}" - echo_info + MESSAGE="Dropbear is not supported in ${PROGRAM} ${VERSION}" + echo_warn exit_nochange else echo_fail + exit_nochange - MESSAGE="Attempting to Compensate" - echo_warn - MESSAGE="Installing SSH Client with ${PKG_MANAGER}" - echo_stat + # MESSAGE="Attempting to Compensate" + # echo_warn + # MESSAGE="Installing SSH Client with ${PKG_MANAGER}" + # echo_stat - ${PKG_INSTALL} ssh-client >/dev/null 2>&1 - error_validate + # ${PKG_INSTALL} ssh-client >/dev/null 2>&1 + # error_validate fi - MESSAGE="Validating RSYNC Installed on $HOSTNAME" + MESSAGE="Validating RSYNC client" echo_stat if hash rsync 2>/dev/null then - echo_good + echo_sameline else echo_fail - MESSAGE="RSYNC is Required" + + MESSAGE="RSYNC client install is required" echo_warn + exit_nochange - distro_check + # distro_check - MESSAGE="Attempting to Compensate" - echo_warn + # MESSAGE="Attempting to Compensate" + # echo_warn - MESSAGE="Installing RSYNC with ${PKG_MANAGER}" - echo_stat - ${PKG_INSTALL} rsync >/dev/null 2>&1 - error_validate + # MESSAGE="Installing RSYNC with ${PKG_MANAGER}" + # echo_stat + # ${PKG_INSTALL} rsync >/dev/null 2>&1 + # error_validate fi } function detect_remotersync { - MESSAGE="Creating Test File on ${REMOTE_HOST}" + MESSAGE="Creating test file on ${REMOTE_HOST}" echo_stat CMD_TIMEOUT='15' @@ -155,7 +158,7 @@ function detect_remotersync { MESSAGE="If pull test fails ensure RSYNC is installed on ${REMOTE_HOST}" echo_warn - MESSAGE="Pulling Test File to $HOSTNAME" + MESSAGE="Pulling test file to $HOSTNAME" echo_stat RSYNC_REPATH="rsync" @@ -163,13 +166,13 @@ function detect_remotersync { RSYNC_TARGET="${LOCAL_FOLDR}/gs.test" create_rsynccmd - MESSAGE="Cleaning Up Local Test File" + MESSAGE="Cleaning up local test file" echo_stat rm ${LOCAL_FOLDR}/gs.test error_validate - MESSAGE="Cleaning Up Remote Test File" + MESSAGE="Cleaning up remote test file" echo_stat CMD_TIMEOUT='15' @@ -178,7 +181,7 @@ function detect_remotersync { } function show_target { - MESSAGE="Targeting ${REMOTE_USER}@${REMOTE_HOST}" + MESSAGE="Remote Pi-hole: ${REMOTE_USER}@${REMOTE_HOST}" echo_info detect_ssh diff --git a/includes/gs-ui.sh b/includes/gs-ui.sh new file mode 100644 index 0000000..6996618 --- /dev/null +++ b/includes/gs-ui.sh @@ -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' diff --git a/includes/gs-update.sh b/includes/gs-update.sh index 19e5d94..0c78e93 100644 --- a/includes/gs-update.sh +++ b/includes/gs-update.sh @@ -22,15 +22,15 @@ function update_gs { GIT_CHECK=$(git status | awk '{print $1}') if [ "$GIT_CHECK" == "fatal:" ] then - MESSAGE="Requires GitHub Installation" + MESSAGE="Updater usage requires GitHub installation" echo_warn exit_nochange else - MESSAGE="Updating Cache" + MESSAGE="Downloading updates via GitHub" echo_stat git fetch --all >/dev/null 2>&1 error_validate - MESSAGE="Applying Update" + MESSAGE="Deploying the latest ${PROGRAM} code" echo_stat git reset --hard ${BRANCH} >/dev/null 2>&1 error_validate @@ -40,7 +40,7 @@ function update_gs { ## Show Version function show_version { echo_lines - MESSAGE="${BOLD}${PROGRAM}${NC} by ${CYAN}@vmstan${NC}" + MESSAGE="${PURPLE}${PROGRAM}${NC} for Pi-hole" echo_info MESSAGE="${BLUE}https://github.com/vmstan/gravity-sync${NC}" @@ -56,19 +56,19 @@ function show_version { DEVVERSION="" fi - MESSAGE="Running Version: ${GREEN}${VERSION}${NC} ${DEVVERSION}" + MESSAGE="Running version: ${GREEN}${VERSION}${NC} ${DEVVERSION}" echo_info GITVERSION=$(curl -sf https://raw.githubusercontent.com/vmstan/gravity-sync/master/VERSION) if [ -z "$GITVERSION" ] then - MESSAGE="Latest Version: ${RED}Unknown${NC}" + MESSAGE="Latest version: ${RED}Unknown${NC}" else if [ "$GITVERSION" != "$VERSION" ] then - MESSAGE="Update Available: ${PURPLE}${GITVERSION}${NC}" + MESSAGE="Update available: ${RED}${GITVERSION}${NC}" else - MESSAGE="Latest Version: ${GREEN}${GITVERSION}${NC}" + MESSAGE="Latest version: ${GREEN}${GITVERSION}${NC}" fi fi echo_info @@ -76,7 +76,6 @@ function show_version { } function show_info() { - if [ -f ${LOCAL_FOLDR}/dev ] then DEVVERSION="-dev" @@ -89,7 +88,7 @@ function show_info() { echo_lines 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}" if [ "${PH_IN_TYPE}" == "default" ] then @@ -222,7 +221,7 @@ function show_info() { ## Devmode Task function task_devmode { TASKTYPE='DEV' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good if [ -f ${LOCAL_FOLDR}/dev ] @@ -248,14 +247,14 @@ function task_devmode { touch ${LOCAL_FOLDR}/dev error_validate - MESSAGE="Updating Cache" + MESSAGE="Checking available branches" echo_stat git fetch --all >/dev/null 2>&1 error_validate git branch -r - MESSAGE="Select Branch to Update Against" + MESSAGE="Select GitHub branch to update against" echo_need read INPUT_BRANCH @@ -270,7 +269,7 @@ function task_devmode { ## Update Task function task_update { TASKTYPE='UPDATE' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good dbclient_warning @@ -283,7 +282,7 @@ function task_update { ## Version Task function task_version { TASKTYPE='VERSION' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_version @@ -294,7 +293,7 @@ function task_version { function task_info() { TASKTYPE='INFO' - MESSAGE="${MESSAGE}: ${TASKTYPE} Requested" + MESSAGE="${MESSAGE}: ${TASKTYPE}" echo_good show_info diff --git a/includes/gs-validate.sh b/includes/gs-validate.sh index 61d8a3e..2355320 100644 --- a/includes/gs-validate.sh +++ b/includes/gs-validate.sh @@ -6,34 +6,29 @@ ## Validate GS Folders function validate_gs_folders { - MESSAGE="Validating ${PROGRAM} Folders on $HOSTNAME" + MESSAGE="${UI_VAL_GS_FOLDERS}" echo_stat - if [ ! -d ${LOCAL_FOLDR} ] + + if [ ! -d ${LOCAL_FOLDR} ] || [ ! -d ${LOCAL_FOLDR}/${BACKUP_FOLD} ] || [ ! -d ${LOCAL_FOLDR}/settings ] || [ ! -d ${LOG_PATH} ] then - MESSAGE="Unable to Validate ${PROGRAM} Folders on $HOSTNAME" + MESSAGE="${UI_VAL_GS_FOLDERS_FAIL}" echo_fail exit_nochange fi - if [ ! -d ${LOCAL_FOLDR}/${BACKUP_FOLD} ] - then - MESSAGE="Unable to Validate ${PROGRAM} Backup Folder on $HOSTNAME" - echo_fail - exit_nochange - fi - echo_good + echo_sameline } ## Validate Pi-hole Folders function validate_ph_folders { - MESSAGE="Validating Pi-hole Configuration" + MESSAGE="${UI_VALIDATING} ${UI_CORE_APP}" echo_stat if [ "$PH_IN_TYPE" == "default" ] then if [ ! -f ${PIHOLE_BIN} ] then - MESSAGE="Unable to Validate that Pi-Hole is Installed" + MESSAGE="${UI_VALIDATING_FAIL_BINARY} ${UI_CORE_APP}" echo_fail exit_nochange fi @@ -42,7 +37,7 @@ function validate_ph_folders { FTLCHECK=$(sudo docker container ls | grep "${CONTAIMAGE}") if [ "$FTLCHECK" == "" ] then - MESSAGE="Unable to Validate that Pi-Hole is Installed" + MESSAGE="${UI_VALIDATING_FAIL_CONTAINER} ${UI_CORE_APP}" echo_fail exit_nochange fi @@ -51,7 +46,7 @@ function validate_ph_folders { FTLCHECK=$(sudo podman container ls | grep "${CONTAIMAGE}") if [ "$FTLCHECK" == "" ] then - MESSAGE="Unable to Validate that Pi-Hole is Installed" + MESSAGE="${UI_VALIDATING_FAIL_CONTAINER} ${UI_CORE_APP}" echo_fail exit_nochange fi @@ -59,87 +54,56 @@ function validate_ph_folders { if [ ! -d ${PIHOLE_DIR} ] then - MESSAGE="Unable to Validate Pi-Hole Configuration Directory" + MESSAGE="${UI_VALIDATING_FAIL_FOLDER} ${UI_CORE_APP}" echo_fail exit_nochange fi - echo_good + + echo_sameline } ## Validate DNSMASQ Folders function validate_dns_folders { - MESSAGE="Validating DNSMASQ Configuration" + MESSAGE="${UI_VALIDATING} ${UI_CORE_APP_DNS}" echo_stat if [ ! -d ${DNSMAQ_DIR} ] then - MESSAGE="Unable to Validate DNSMASQ Configuration Directory" + MESSAGE="${UI_VALIDATING_FAIL_FOLDER} ${UI_CORE_APP_DNS}" echo_fail exit_nochange fi - echo_good + echo_sameline } ## Validate SQLite3 function validate_sqlite3 { - MESSAGE="Validating SQLITE Installed on $HOSTNAME" + MESSAGE="${UI_VALIDATING} ${UI_CORE_APP_SQL}" echo_stat if hash sqlite3 2>/dev/null then # MESSAGE="SQLITE3 Utility Detected" - echo_good + echo_sameline else - MESSAGE="Unable to Validate SQLITE Install on $HOSTNAME" + MESSAGE="${UI_VALIDATING_FAIL_BINARY} ${UI_CORE_APP_SQL}" echo_warn - MESSAGE="Installing SQLLITE3 with ${PKG_MANAGER}" - echo_stat + #MESSAGE="Installing SQLLITE3 with ${PKG_MANAGER}" + #echo_stat - ${PKG_INSTALL} sqllite3 >/dev/null 2>&1 - error_validate + #${PKG_INSTALL} sqllite3 >/dev/null 2>&1 + #error_validate fi } ## Validate SSHPASS function validate_os_sshpass { - # SSHPASSWORD='' - - # 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}" + MESSAGE="Connecting to ${REMOTE_HOST}" echo_stat CMD_TIMEOUT='5' CMD_REQUESTED="exit" create_sshcmd - } ## Detect Package Manager @@ -177,14 +141,99 @@ function dbclient_warning { then NOEMPTYBASHIF="1" else - MESSAGE="Dropbear support has been deprecated - please convert to OpenSSH" + MESSAGE="${UI_DROPBEAR_DEP}" echo_warn fi fi } -## Validate CNAME Permissions -function validate_cname_permissions { +## Validate Domain Database 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}') if [ "$CNAMELS_OWN" == "rootroot" ] then @@ -192,16 +241,16 @@ function validate_cname_permissions { else echo_fail - MESSAGE="Attempting to Compensate" + MESSAGE="${UI_COMPENSATE}" echo_warn - MESSAGE="Setting Ownership on ${CNAME_CONF}" + MESSAGE="${UI_SET_FILE_OWNERSHIP} ${UI_CNAME_NAME}" echo_stat sudo chown root:root ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 error_validate fi - MESSAGE="Validating Permissions on ${CNAME_CONF}" + MESSAGE="${UI_VAL_FILE_PERMISSION} ${UI_CNAME_NAME}" echo_stat 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 echo_fail - MESSAGE="Attempting to Compensate" + MESSAGE="${UI_COMPENSATE}" echo_warn - MESSAGE="Setting Ownership on ${CNAME_CONF}" + MESSAGE="${UI_SET_FILE_PERMISSION} ${UI_CNAME_NAME}" echo_stat sudo chmod 644 ${DNSMAQ_DIR}/${CNAME_CONF} >/dev/null 2>&1 error_validate fi -} \ No newline at end of file +} +