mirror of
				https://github.com/vmstan/gravity-sync.git
				synced 2025-10-31 00:47:01 -04:00 
			
		
		
		
	* Begin work on Docker support * rewrite permission detection * wrong else * Change pihole detection based on sudo results * Write out to devnull * nosodo handle * AND then * scanning * nosudo more * clearer wording on failures * headers * handle nosudo on docker detection better * SUDO sudo * AND THEN * status report rewrite * link * alert on no local install detected * yellow headers like the rest of GS * semi critical issues * purple instead of red * clean up output of sudo detection * give me space * Auto run config script * added logo * center logo * move intro * trying dev/tty * advanced config generate * != * logic is hard * new logo * image * fonts * svg image * remove h1 * use rihole variable * New root check * better method of checking sudo * remove messages * rihole * attempting realpath * GS_FILEPATH * remove $HOME call * remove config requirement for updates * no config for updates * all the variables * all kinds of variable replacements * double quotes * it’s like I’ve forgotten how to write this stuff * removals * updated requirements * variable rearrangement * validation check for docker * riholes * placeholder * more riholes * even more riholes * docker examples * docker rewrite * docker docker docker * docker custom checks * update from anywhere * correct validation error * check for current owner only if local install * give me space * stuff * more stuff * bash alias creation * cleanup installer * fix .sh * config errors, remove sshpass validation * skip directories if done * limit config script * fix for changes when both targets have changed * RIHOLE * cleanup warning messages * stop sign * big red * documenting new variables * master Co-authored-by: Michael Stanclift <vmstan@sovereign.vmstan.net> Co-authored-by: Michael Stanclift <vmstan@sovereign.local>
		
			
				
	
	
		
			351 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
			
		
		
	
	
			351 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| # GRAVITY SYNC BY VMSTAN #####################
 | |
| # gs-config.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!
 | |
| 
 | |
| ## Configure Task
 | |
| function task_configure {				
 | |
| 	TASKTYPE='CONFIGURE'
 | |
| 	MESSAGE="${MESSAGE}: ${TASKTYPE} Requested"
 | |
| 	echo_good
 | |
| 	
 | |
| 	if [ -f ${LOCAL_FOLDR}/${CONFIG_FILE} ]
 | |
| 	then		
 | |
| 		config_delete
 | |
| 	else
 | |
| 		config_generate
 | |
| 	fi
 | |
| 
 | |
| 	# backup_settime
 | |
| 	# backup_local_gravity
 | |
| 	# backup_local_custom
 | |
| 	# backup_cleanup
 | |
| 	
 | |
| 	create_alias
 | |
| 	
 | |
| 	exit_withchange
 | |
| }
 | |
| 
 | |
| ## Generate New Configuration
 | |
| function config_generate {
 | |
| 	# detect_ssh
 | |
| 	
 | |
| 	MESSAGE="Creating New ${CONFIG_FILE} from Template"
 | |
| 	echo_stat
 | |
| 	cp ${LOCAL_FOLDR}/${CONFIG_FILE}.example ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	error_validate
 | |
| 	
 | |
| 	docker_detect
 | |
| 	if [ "${DOCKERREADY}" == "1" ]
 | |
| 	then
 | |
| 		MESSAGE="Advanced Configuration Required"
 | |
| 		echo_info
 | |
| 		advanced_config_generate
 | |
| 	else
 | |
| 		MESSAGE="Use Advanced Installation Options? (Leave blank for default 'No')"
 | |
| 		echo_need
 | |
| 		read INPUT_ADVANCED_INSTALL
 | |
| 		INPUT_ADVANCED_INSTALL="${INPUT_ADVANCED_INSTALL:-N}"
 | |
| 	
 | |
| 		if [ "${INPUT_ADVANCED_INSTALL}" != "N" ]
 | |
| 		then
 | |
| 			MESSAGE="Advanced Configuration Selected"
 | |
| 			echo_info
 | |
| 		
 | |
| 			advanced_config_generate
 | |
| 		fi
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Standard Settings"
 | |
| 	echo_info
 | |
| 
 | |
| 	MESSAGE="Primary Pi-hole Address (IP or DNS)"
 | |
| 	echo_need
 | |
| 	read INPUT_REMOTE_HOST
 | |
| 
 | |
| 	if [ "${PING_AVOID}" != "1" ]
 | |
| 	then
 | |
| 		MESSAGE="Testing Network Connection (ICMP)"
 | |
| 		echo_stat
 | |
| 		ping -c 3 ${INPUT_REMOTE_HOST} >/dev/null 2>&1
 | |
| 			error_validate
 | |
| 	else
 | |
| 		MESSAGE="Bypassing Network Testing (ICMP)"
 | |
| 		echo_warn
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="SSH User for ${INPUT_REMOTE_HOST}"
 | |
| 	echo_need
 | |
| 	read INPUT_REMOTE_USER
 | |
| 	
 | |
| 	MESSAGE="Saving Host to ${CONFIG_FILE}"
 | |
| 	echo_stat
 | |
| 	sed -i "/REMOTE_HOST='192.168.1.10'/c\REMOTE_HOST='${INPUT_REMOTE_HOST}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	error_validate
 | |
| 	
 | |
| 	MESSAGE="Saving User to ${CONFIG_FILE}"
 | |
| 	echo_stat
 | |
| 	sed -i "/REMOTE_USER='pi'/c\REMOTE_USER='${INPUT_REMOTE_USER}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	error_validate
 | |
| 
 | |
| 	generate_sshkey
 | |
| 	
 | |
| 	MESSAGE="Importing New ${CONFIG_FILE}"
 | |
| 	echo_stat
 | |
| 	source ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	error_validate
 | |
| 
 | |
| 	export_sshkey	
 | |
| 	
 | |
| 	# MESSAGE="Testing Configuration"
 | |
| 	# echo_info
 | |
| 
 | |
| 	# validate_os_sshpass
 | |
| 	# validate_sqlite3
 | |
| 
 | |
| 	# detect_remotersync
 | |
| }
 | |
| 
 | |
| ## Advanced Configuration Options
 | |
| function advanced_config_generate {
 | |
| 	MESSAGE="Local Pi-hole in Docker Container? (Leave blank for default 'No')"
 | |
| 	echo_need
 | |
| 	read INPUT_PH_IN_TYPE
 | |
| 	INPUT_PH_IN_TYPE="${INPUT_PH_IN_TYPE:-N}"
 | |
| 	
 | |
| 	if [ "${INPUT_PH_IN_TYPE}" != "N" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Local Docker Setting to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# PH_IN_TYPE=''/c\PH_IN_TYPE='docker'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 		
 | |
| 		MESSAGE="Local Docker Container Name? (Leave blank for default 'pihole')"
 | |
| 		echo_need
 | |
| 		read INPUT_DOCKER_CON
 | |
| 		INPUT_DOCKER_CON="${INPUT_DOCKER_CON:-pihole}"
 | |
| 		
 | |
| 		if [ "${INPUT_DOCKER_CON}" != "pihole" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Local Container Name to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# DOCKER_CON=''/c\DOCKER_CON='${INPUT_DOCKER_CON}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 		fi
 | |
| 		
 | |
| 		MESSAGE="Local Pi-hole 'etc' Volume Path? (Required, no trailing slash)"
 | |
| 		echo_need
 | |
| 		read INPUT_PIHOLE_DIR
 | |
| 		
 | |
| 		if [ "${INPUT_PIHOLE_DIR}" != "" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Local Pi-hole Volume to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# PIHOLE_DIR=''/c\PIHOLE_DIR='${INPUT_PIHOLE_DIR}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 			SKIP_PIHOLE_DIR="1"
 | |
| 		else
 | |
| 			MESSAGE="This setting is required!"
 | |
| 			echo_warn
 | |
| 			exit_withchanges
 | |
| 		fi
 | |
| 		
 | |
| 		MESSAGE="Saving Local Volume Ownership to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# FILE_OWNER=''/c\FILE_OWNER='named:docker'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Remote Pi-hole in Docker Container? (Leave blank for default 'No')"
 | |
| 	echo_need
 | |
| 	read INPUT_RH_IN_TYPE
 | |
| 	INPUT_RH_IN_TYPE="${INPUT_RH_IN_TYPE:-N}"
 | |
| 	
 | |
| 	if [ "${INPUT_RH_IN_TYPE}" != "N" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Remote Docker Setting to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# RH_IN_TYPE=''/c\RH_IN_TYPE='docker'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 		
 | |
| 		MESSAGE="Remote Docker Container Name? (Leave blank for default 'pihole')"
 | |
| 		echo_need
 | |
| 		read INPUT_ROCKER_CON
 | |
| 		INPUT_ROCKER_CON="${INPUT_ROCKER_CON:-pihole}"
 | |
| 		
 | |
| 		if [ "${INPUT_ROCKER_CON}" != "pihole" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Remote Container Name to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# ROCKER_CON=''/c\ROCKER_CON='${INPUT_ROCKER_CON}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 		fi
 | |
| 		
 | |
| 		MESSAGE="Remote Pi-hole 'etc' Volume Path? (Required, no trailing slash)"
 | |
| 		echo_need
 | |
| 		read INPUT_RIHOLE_DIR
 | |
| 		
 | |
| 		if [ "${INPUT_RIHOLE_DIR}" != "" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Remote Pi-hole Volume to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# RIHOLE_DIR=''/c\RIHOLE_DIR='${INPUT_RIHOLE_DIR}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 			SKIP_RIHOLE_DIR="1"
 | |
| 		else
 | |
| 			MESSAGE="This setting is required!"
 | |
| 			echo_warn
 | |
| 			exit_withchanges
 | |
| 		fi
 | |
| 		
 | |
| 		MESSAGE="Saving Remote Volume Ownership to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# RILE_OWNER=''/c\RILE_OWNER='named:docker'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| 	
 | |
| 		
 | |
| 	if [ $SKIP_PIHOLE_DIR != "1" ]
 | |
| 	then
 | |
| 		MESSAGE="Local Pi-hole Settings Directory Path? (Leave blank for default '/etc/pihole')"
 | |
| 		echo_need
 | |
| 		read INPUT_PIHOLE_DIR
 | |
| 		INPUT_PIHOLE_DIR="${INPUT_PIHOLE_DIR:-/etc/pihole}"
 | |
| 		
 | |
| 		if [ "${INPUT_PIHOLE_DIR}" != "/etc/pihole" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Local Pi-hole Settings Directory Path to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# PIHOLE_DIR=''/c\PIHOLE_DIR='${INPUT_PIHOLE_DIR}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 		fi
 | |
| 	fi
 | |
| 	
 | |
| 	if [ "$SKIP_RIHOLE_DIR" != "1" ]
 | |
| 	then
 | |
| 		MESSAGE="Remote Pi-hole Settings Directory Path? (Leave blank for default '/etc/pihole')"
 | |
| 		echo_need
 | |
| 		read INPUT_RIHOLE_DIR
 | |
| 		INPUT_RIHOLE_DIR="${INPUT_RIHOLE_DIR:-/etc/pihole}"
 | |
| 		
 | |
| 		if [ "${INPUT_RIHOLE_DIR}" != "/etc/pihole" ]
 | |
| 		then
 | |
| 			MESSAGE="Saving Remote Pi-hole Settings Directory Path to ${CONFIG_FILE}"
 | |
| 			echo_stat
 | |
| 			sed -i "/# RIHOLE_DIR=''/c\RIHOLE_DIR='${INPUT_RIHOLE_DIR}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 			error_validate
 | |
| 		fi
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Use Custom SSH Port? (Leave blank for default '22')"
 | |
| 	echo_need
 | |
| 	read INPUT_SSH_PORT
 | |
| 	INPUT_SSH_PORT="${INPUT_SSH_PORT:-22}"
 | |
| 	SSH_PORT="${INPUT_SSH_PORT}"
 | |
| 	
 | |
| 	if [ "${INPUT_SSH_PORT}" != "22" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Custom SSH Port to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# SSH_PORT=''/c\SSH_PORT='${INPUT_SSH_PORT}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Enable ICMP Check? (Leave blank for default 'Yes')"
 | |
| 	echo_need
 | |
| 	read INPUT_PING_AVOID
 | |
| 	INPUT_PING_AVOID="${INPUT_PING_AVOID:-Y}"
 | |
| 	
 | |
| 	if [ "${INPUT_PING_AVOID}" != "Y" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving ICMP Avoidance to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# PING_AVOID=''/c\PING_AVOID='1'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 		PING_AVOID=1
 | |
| 	fi
 | |
| 		
 | |
| 	MESSAGE="Use Custom SSH PKIF Location? (Leave blank for default '.ssh/id_rsa')"
 | |
| 	echo_need
 | |
| 	read INPUT_CUSTOM_PKIF
 | |
| 	INPUT_CUSTOM_PKIF="${INPUT_CUSTOM_PKIF:-.ssh/id_rsa}"
 | |
| 		
 | |
| 	if [ "${INPUT_CUSTOM_PKIF}" != ".ssh/id_rsa" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Custom PKIF to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# SSH_PKIF=''/c\SSH_PKIF='${INPUT_CUSTOM_PKIF}'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Enable Replicate 'Local DNS Records' Feature? (Leave blank for default 'Yes')"
 | |
| 	echo_need
 | |
| 	read INPUT_SKIP_CUSTOM
 | |
| 	INPUT_SKIP_CUSTOM="${INPUT_SKIP_CUSTOM:-Y}"
 | |
| 	
 | |
| 	if [ "${INPUT_SKIP_CUSTOM}" != "Y" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Local DNS Preference to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# SKIP_CUSTOM=''/c\SKIP_CUSTOM='1'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| 	
 | |
| 	MESSAGE="Change Backup Retention in Days? (Leave blank for default '7')"
 | |
| 	echo_need
 | |
| 	read INPUT_BACKUP_RETAIN
 | |
| 	INPUT_BACKUP_RETAIN="${INPUT_BACKUP_RETAIN:-7}"
 | |
| 	
 | |
| 	if [ "${INPUT_BACKUP_RETAIN}" != "7" ]
 | |
| 	then
 | |
| 		MESSAGE="Saving Backup Retention to ${CONFIG_FILE}"
 | |
| 		echo_stat
 | |
| 		sed -i "/# BACKUP_RETAIN=''/c\BACKUP_RETAIN='1'" ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| ## Delete Existing Configuration
 | |
| function config_delete {
 | |
| 	source ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	MESSAGE="Configuration File Exists"
 | |
| 	echo_warn
 | |
| 	
 | |
| 	echo -e "========================================================"
 | |
| 	cat ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 	echo -e "========================================================"
 | |
| 	
 | |
| 	MESSAGE="Are you sure you want to erase this configuration?"
 | |
| 	echo_warn
 | |
| 
 | |
| 	intent_validate
 | |
| 
 | |
| 	MESSAGE="Erasing Existing Configuration"
 | |
| 	echo_stat
 | |
| 	rm -f ${LOCAL_FOLDR}/${CONFIG_FILE}
 | |
| 		error_validate
 | |
| 
 | |
| 	config_generate
 | |
| }
 | |
| 
 | |
| ## Detect Docker
 | |
| function docker_detect {
 | |
| 	if hash docker 2>/dev/null
 | |
| 	then
 | |
| 		FTLCHECK=$(sudo docker container ls | grep 'pihole/pihole')
 | |
| 		if [ "$FTLCHECK" != "" ]
 | |
| 		then
 | |
| 			DOCKERREADY="1"
 | |
| 		fi
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| ## Create Bash Alias
 | |
| function create_alias {
 | |
| 	MESSAGE="Creating Bash Alias"
 | |
| 	echo_stat
 | |
| 	
 | |
| 	echo -e "alias gravity-sync='${GS_FILEPATH}'" | sudo tee -a /etc/bash.bashrc > /dev/null
 | |
| 		error_validate
 | |
| } |