From 28ef8068c84cecec9c3a1d4f18bc179b151af654 Mon Sep 17 00:00:00 2001 From: Jakob Ackermann Date: Wed, 5 Oct 2016 01:20:30 +0200 Subject: [PATCH 01/88] add mimetype for .svg Chrome does not display .svg-images without the correct mimetype --- advanced/lighttpd.conf.fedora | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/advanced/lighttpd.conf.fedora b/advanced/lighttpd.conf.fedora index 30784b1a..8b8e0692 100644 --- a/advanced/lighttpd.conf.fedora +++ b/advanced/lighttpd.conf.fedora @@ -46,7 +46,8 @@ mimetype.assign = ( ".png" => "image/png", ".css" => "text/css; charset=utf-8", ".js" => "application/javascript", ".json" => "application/json", - ".txt" => "text/plain" ) + ".txt" => "text/plain", + ".svg" => "image/svg+xml" ) # default listening port for IPv6 falls back to the IPv4 port #include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port From 5382b4fa3785b1f2f16201436826a3ea1cd8c725 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 09:42:15 -0700 Subject: [PATCH 02/88] Change installScripts to use install Use the install program instead of copying files and directories in installScripts function. --- automated install/basic-install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4d8c602a..63ce926f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -526,11 +526,8 @@ installScripts() { # Install the scripts from /etc/.pihole to their various locations ${SUDO} echo ":::" ${SUDO} echo -n "::: Installing scripts to /opt/pihole..." - if [ ! -d /opt/pihole ]; then - ${SUDO} mkdir /opt/pihole - ${SUDO} chown "$USER":root /opt/pihole - ${SUDO} chmod u+srwx /opt/pihole - fi + ${SUDO} install -o ${USER} -m755 -d /opt/pihole + ${SUDO} cp /etc/.pihole/gravity.sh /opt/pihole/gravity.sh ${SUDO} cp /etc/.pihole/advanced/Scripts/chronometer.sh /opt/pihole/chronometer.sh ${SUDO} cp /etc/.pihole/advanced/Scripts/whitelist.sh /opt/pihole/whitelist.sh From 36987cb1cca0169adc9c655c9c951c04df2c9ded Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 09:57:48 -0700 Subject: [PATCH 03/88] Continue migration to `install` --- automated install/basic-install.sh | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 63ce926f..ed9fa7e7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -526,13 +526,11 @@ installScripts() { # Install the scripts from /etc/.pihole to their various locations ${SUDO} echo ":::" ${SUDO} echo -n "::: Installing scripts to /opt/pihole..." - ${SUDO} install -o ${USER} -m755 -d /opt/pihole - - ${SUDO} cp /etc/.pihole/gravity.sh /opt/pihole/gravity.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/chronometer.sh /opt/pihole/chronometer.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/whitelist.sh /opt/pihole/whitelist.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/blacklist.sh /opt/pihole/blacklist.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/piholeDebug.sh /opt/pihole/piholeDebug.sh + ${SUDO} install -o "${USER}" -m755 -d /opt/pihole + + cd /etc/.pihole/ + + ${SUDO} install cp "${USER}" -m755 -d /opt/pihole/ gravity.sh chronometer.sh whitelist.sh blacklist.sh piholeDebug.sh ${SUDO} cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /opt/pihole/piholeLogFlush.sh ${SUDO} cp /etc/.pihole/automated\ install/uninstall.sh /opt/pihole/uninstall.sh ${SUDO} cp /etc/.pihole/advanced/Scripts/setupLCD.sh /opt/pihole/setupLCD.sh From e8bb4a7e363c4316e2832af5377bcce3620466ad Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 10:14:36 -0700 Subject: [PATCH 04/88] Continue migration to `install` --- automated install/basic-install.sh | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ed9fa7e7..12fccfa0 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -530,12 +530,8 @@ installScripts() { cd /etc/.pihole/ - ${SUDO} install cp "${USER}" -m755 -d /opt/pihole/ gravity.sh chronometer.sh whitelist.sh blacklist.sh piholeDebug.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /opt/pihole/piholeLogFlush.sh - ${SUDO} cp /etc/.pihole/automated\ install/uninstall.sh /opt/pihole/uninstall.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/setupLCD.sh /opt/pihole/setupLCD.sh - ${SUDO} cp /etc/.pihole/advanced/Scripts/version.sh /opt/pihole/version.sh - ${SUDO} chmod 755 /opt/pihole/gravity.sh /opt/pihole/chronometer.sh /opt/pihole/whitelist.sh /opt/pihole/blacklist.sh /opt/pihole/piholeLogFlush.sh /opt/pihole/uninstall.sh /opt/pihole/setupLCD.sh /opt/pihole/version.sh + ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh + ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh ${SUDO} cp /etc/.pihole/pihole /usr/local/bin/pihole ${SUDO} chmod 755 /usr/local/bin/pihole ${SUDO} cp /etc/.pihole/advanced/bash-completion/pihole /etc/bash_completion.d/pihole From 3600fd277e0385496bd496e350f5ed6d23f84a0a Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 10:16:56 -0700 Subject: [PATCH 05/88] Don't need `sudo` to echo to term. --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 12fccfa0..56b9934e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -524,8 +524,8 @@ versionCheckDNSmasq(){ installScripts() { # Install the scripts from /etc/.pihole to their various locations - ${SUDO} echo ":::" - ${SUDO} echo -n "::: Installing scripts to /opt/pihole..." + echo ":::" + echo -n "::: Installing scripts to /opt/pihole..." ${SUDO} install -o "${USER}" -m755 -d /opt/pihole cd /etc/.pihole/ @@ -545,7 +545,7 @@ installScripts() { fi done - ${SUDO} echo " done." + echo " done." } installConfigs() { From 3bbac9a5f219cc07831a1e5425d1266a2e650135 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 10:19:47 -0700 Subject: [PATCH 06/88] `install` pihole --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 56b9934e..6308a0ed 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -532,8 +532,8 @@ installScripts() { ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh - ${SUDO} cp /etc/.pihole/pihole /usr/local/bin/pihole - ${SUDO} chmod 755 /usr/local/bin/pihole + ${SUDO} install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole + ${SUDO} cp /etc/.pihole/advanced/bash-completion/pihole /etc/bash_completion.d/pihole . /etc/bash_completion.d/pihole From 50d16d8215f2a7016d9cf3650a61e44814c1b8ba Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 10:45:17 -0700 Subject: [PATCH 07/88] Finish `install` conversion for installScripts() --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6308a0ed..84ef9788 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -534,7 +534,7 @@ installScripts() { ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh ${SUDO} install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole - ${SUDO} cp /etc/.pihole/advanced/bash-completion/pihole /etc/bash_completion.d/pihole + ${SUDO} install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole . /etc/bash_completion.d/pihole #Tidy up /usr/local/bin directory if installing over previous install. From 8c151c62ce3ab311d561d5048a53685e75d9b037 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 5 Oct 2016 10:46:10 -0700 Subject: [PATCH 08/88] echo's don't need sudo --- automated install/basic-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 84ef9788..72b28d22 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -550,8 +550,8 @@ installScripts() { installConfigs() { # Install the configs from /etc/.pihole to their various locations - ${SUDO} echo ":::" - ${SUDO} echo "::: Installing configs..." + echo ":::" + echo "::: Installing configs..." versionCheckDNSmasq if [ ! -d "/etc/lighttpd" ]; then ${SUDO} mkdir /etc/lighttpd @@ -567,15 +567,15 @@ installConfigs() { stopServices() { # Stop dnsmasq and lighttpd - ${SUDO} echo ":::" - ${SUDO} echo -n "::: Stopping services..." + echo ":::" + echo -n "::: Stopping services..." #$SUDO service dnsmasq stop & spinner $! || true if [ -x "$(command -v systemctl)" ]; then ${SUDO} systemctl stop lighttpd & spinner $! || true else ${SUDO} service lighttpd stop & spinner $! || true fi - ${SUDO} echo " done." + echo " done." } installerDependencies() { From c39324d11f17b93d59c2daa4d35e20a96d9b84a5 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Fri, 7 Oct 2016 00:24:25 -0700 Subject: [PATCH 09/88] Remove bare php package from dependencies `php5` package can trigger install of Apache2. Without this package in deps, PHP is still installed and operational. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4d8c602a..ae27e593 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -74,7 +74,7 @@ if [ -x "$(command -v apt-get)" ];then PKG_INSTALL="$PKG_MANAGER --yes --quiet install" PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi ${phpVer} git curl unzip wget sudo netcat cron iproute2 ) + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" From d1a7fe2d4409ceff36776c78b50d300678bf76c9 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Fri, 7 Oct 2016 03:36:34 -0700 Subject: [PATCH 10/88] fix/bashConditional --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4d8c602a..e65a0bba 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -926,7 +926,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [ $1 = "--i_do_not_follow_recommendations" ]; then +if [[ $1 = "--i_do_not_follow_recommendations" ]]; then echo "::: ----i_do_not_follow_recommendations passed to script" echo "::: skipping free disk space verification!" else From 6a28070017c83c273e76d40aeac889647d92ce17 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 7 Oct 2016 13:09:27 +0100 Subject: [PATCH 11/88] Too many `-`s --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ba098109..72c94da8 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -918,7 +918,7 @@ fi # Start the installer # Verify there is enough disk space for the install if [[ $1 = "--i_do_not_follow_recommendations" ]]; then - echo "::: ----i_do_not_follow_recommendations passed to script" + echo "::: --i_do_not_follow_recommendations passed to script" echo "::: skipping free disk space verification!" else verifyFreeDiskSpace From 9354799a26b856f9902ff2eff4fe476c62da42bb Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sat, 8 Oct 2016 12:06:23 -0400 Subject: [PATCH 12/88] Move contributer file This will make it more visible to a user and fixes the link in the PR template. --- .github/CONTRIBUTING.md => CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/CONTRIBUTING.md => CONTRIBUTING.md (100%) diff --git a/.github/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 100% rename from .github/CONTRIBUTING.md rename to CONTRIBUTING.md From 44170207ac37896e1990c87649f33b559482ae57 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 8 Oct 2016 12:17:04 -0700 Subject: [PATCH 13/88] Add `main` function and fire script from `main` call. Prevents script from running before it is entirely downloaded. --- automated install/basic-install.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4dab9355..85e93d00 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -903,7 +903,7 @@ updateDialogs(){ } -######## SCRIPT ############ +main() { if [[ -f ${setupVars} ]];then . ${setupVars} @@ -979,3 +979,6 @@ fi echo ":::" echo "::: The install log is located at: /etc/pihole/install.log" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" +} + +main "$@" \ No newline at end of file From d20df92e9f855f99900a5dcf2ed13c411828cf3e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 8 Oct 2016 12:56:26 -0700 Subject: [PATCH 14/88] Script will now run as root, removed `sudo` from function calls. --- automated install/basic-install.sh | 232 +++++++++++++++-------------- 1 file changed, 118 insertions(+), 114 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 85e93d00..c6f409fb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -45,11 +45,15 @@ echo ":::" if [[ $EUID -eq 0 ]];then echo "::: You are root." else - echo "::: sudo will be used for the install." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete + echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures" + echo "::: system networking, it requires elevated rights. Please check the contents of the script for" + echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source." + echo ":::" + echo "::: Detecting the presence of the sudo utility for continuation of this install..." if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" + echo "::: Utility sudo located." + exec sudo bash "$0" "$@" + exit $? else echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed." exit 1 @@ -62,7 +66,7 @@ if [ -x "$(command -v apt-get)" ];then #Debian Family #Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS) phpVer="php" - ${SUDO} apt-get install --dry-run php5 > /dev/null 2>&1 + apt-get install --dry-run php5 > /dev/null 2>&1 if [ $? == 0 ]; then phpVer="php5" fi @@ -317,7 +321,7 @@ setDHCPCD() { echo "## interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw - static domain_name_servers=$IPv4gw" | ${SUDO} tee -a /etc/dhcpcd.conf >/dev/null + static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null } setStaticIPv4() { @@ -327,7 +331,7 @@ setStaticIPv4() { echo "::: Static IP already configured" else setDHCPCD - ${SUDO} ip addr replace dev "$piholeInterface" "$IPv4addr" + ip addr replace dev "$piholeInterface" "$IPv4addr" echo ":::" echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." echo ":::" @@ -343,20 +347,20 @@ setStaticIPv4() { # Backup existing interface configuration: cp ${IFCFG_FILE} ${IFCFG_FILE}.backup-$(date +%Y-%m-%d-%H%M%S) # Build Interface configuration file: - ${SUDO} echo "# Configured via Pi-Hole installer" > ${IFCFG_FILE} - ${SUDO} echo "DEVICE=$piholeInterface" >> ${IFCFG_FILE} - ${SUDO} echo "BOOTPROTO=none" >> ${IFCFG_FILE} - ${SUDO} echo "ONBOOT=yes" >> ${IFCFG_FILE} - ${SUDO} echo "IPADDR=$IPADDR" >> ${IFCFG_FILE} - ${SUDO} echo "PREFIX=$CIDR" >> ${IFCFG_FILE} - ${SUDO} echo "GATEWAY=$IPv4gw" >> ${IFCFG_FILE} - ${SUDO} echo "DNS1=$piholeDNS1" >> ${IFCFG_FILE} - ${SUDO} echo "DNS2=$piholeDNS2" >> ${IFCFG_FILE} - ${SUDO} echo "USERCTL=no" >> ${IFCFG_FILE} - ${SUDO} ip addr replace dev "$piholeInterface" "$IPv4addr" + echo "# Configured via Pi-Hole installer" > ${IFCFG_FILE} + echo "DEVICE=$piholeInterface" >> ${IFCFG_FILE} + echo "BOOTPROTO=none" >> ${IFCFG_FILE} + echo "ONBOOT=yes" >> ${IFCFG_FILE} + echo "IPADDR=$IPADDR" >> ${IFCFG_FILE} + echo "PREFIX=$CIDR" >> ${IFCFG_FILE} + echo "GATEWAY=$IPv4gw" >> ${IFCFG_FILE} + echo "DNS1=$piholeDNS1" >> ${IFCFG_FILE} + echo "DNS2=$piholeDNS2" >> ${IFCFG_FILE} + echo "USERCTL=no" >> ${IFCFG_FILE} + ip addr replace dev "$piholeInterface" "$IPv4addr" if [ -x "$(command -v nmcli)" ];then # Tell NetworkManager to read our new sysconfig file - ${SUDO} nmcli con load ${IFCFG_FILE} > /dev/null + nmcli con load ${IFCFG_FILE} > /dev/null fi echo ":::" echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." @@ -491,57 +495,57 @@ versionCheckDNSmasq(){ if grep -q ${dnsSearch} ${dnsFile1}; then echo " it is from a previous pi-hole install." echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..." - ${SUDO} mv -f ${dnsFile1} ${dnsFile2} + mv -f ${dnsFile1} ${dnsFile2} echo " done." echo -n "::: Restoring default dnsmasq.conf..." - ${SUDO} cp ${defaultFile} ${dnsFile1} + cp ${defaultFile} ${dnsFile1} echo " done." else echo " it is not a pi-hole file, leaving alone!" fi else echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..." - ${SUDO} cp ${defaultFile} ${dnsFile1} + cp ${defaultFile} ${dnsFile1} echo " done." fi echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..." - ${SUDO} cp ${newFileToInstall} ${newFileFinalLocation} + cp ${newFileToInstall} ${newFileFinalLocation} echo " done." - ${SUDO} sed -i "s/@INT@/$piholeInterface/" ${newFileFinalLocation} + sed -i "s/@INT@/$piholeInterface/" ${newFileFinalLocation} if [[ "$piholeDNS1" != "" ]]; then - ${SUDO} sed -i "s/@DNS1@/$piholeDNS1/" ${newFileFinalLocation} + sed -i "s/@DNS1@/$piholeDNS1/" ${newFileFinalLocation} else - ${SUDO} sed -i '/^server=@DNS1@/d' ${newFileFinalLocation} + sed -i '/^server=@DNS1@/d' ${newFileFinalLocation} fi if [[ "$piholeDNS2" != "" ]]; then - ${SUDO} sed -i "s/@DNS2@/$piholeDNS2/" ${newFileFinalLocation} + sed -i "s/@DNS2@/$piholeDNS2/" ${newFileFinalLocation} else - ${SUDO} sed -i '/^server=@DNS2@/d' ${newFileFinalLocation} + sed -i '/^server=@DNS2@/d' ${newFileFinalLocation} fi - ${SUDO} sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1} + sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1} } installScripts() { # Install the scripts from /etc/.pihole to their various locations echo ":::" echo -n "::: Installing scripts to /opt/pihole..." - ${SUDO} install -o "${USER}" -m755 -d /opt/pihole + install -o "${USER}" -m755 -d /opt/pihole cd /etc/.pihole/ - ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh - ${SUDO} install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh - ${SUDO} install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole + install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh + install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh + install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole - ${SUDO} install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole + install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole . /etc/bash_completion.d/pihole #Tidy up /usr/local/bin directory if installing over previous install. oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug) for i in "${oldFiles[@]}"; do if [ -f "/usr/local/bin/$i.sh" ]; then - ${SUDO} rm /usr/local/bin/"$i".sh + rm /usr/local/bin/"$i".sh fi done @@ -554,15 +558,15 @@ installConfigs() { echo "::: Installing configs..." versionCheckDNSmasq if [ ! -d "/etc/lighttpd" ]; then - ${SUDO} mkdir /etc/lighttpd - ${SUDO} chown "$USER":root /etc/lighttpd - ${SUDO} mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig + mkdir /etc/lighttpd + chown "$USER":root /etc/lighttpd + mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig fi - ${SUDO} cp /etc/.pihole/advanced/${LIGHTTPD_CFG} /etc/lighttpd/lighttpd.conf - ${SUDO} mkdir -p /var/run/lighttpd - ${SUDO} chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/run/lighttpd - ${SUDO} mkdir -p /var/cache/lighttpd/compress - ${SUDO} chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/cache/lighttpd/compress + cp /etc/.pihole/advanced/${LIGHTTPD_CFG} /etc/lighttpd/lighttpd.conf + mkdir -p /var/run/lighttpd + chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/run/lighttpd + mkdir -p /var/cache/lighttpd/compress + chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/cache/lighttpd/compress } stopServices() { @@ -571,9 +575,9 @@ stopServices() { echo -n "::: Stopping services..." #$SUDO service dnsmasq stop & spinner $! || true if [ -x "$(command -v systemctl)" ]; then - ${SUDO} systemctl stop lighttpd & spinner $! || true + systemctl stop lighttpd & spinner $! || true else - ${SUDO} service lighttpd stop & spinner $! || true + service lighttpd stop & spinner $! || true fi echo " done." } @@ -593,12 +597,12 @@ installerDependencies() { #update package lists echo ":::" echo -n "::: $PKG_MANAGER update has not been run today. Running now..." - ${SUDO} ${UPDATE_PKG_CACHE} > /dev/null 2>&1 + ${UPDATE_PKG_CACHE} > /dev/null 2>&1 echo " done!" fi echo ":::" echo -n "::: Checking $PKG_MANAGER for upgraded packages...." - updatesToInstall=$(eval "${SUDO} ${PKG_COUNT}") + updatesToInstall=$(eval "${PKG_COUNT}") echo " done!" echo ":::" if [[ ${updatesToInstall} -eq "0" ]]; then @@ -615,7 +619,7 @@ installerDependencies() { package_check ${i} > /dev/null if ! [ $? -eq 0 ]; then echo -n " Not found! Installing...." - ${SUDO} ${PKG_INSTALL} "$i" > /dev/null 2>&1 + ${PKG_INSTALL} "$i" > /dev/null 2>&1 echo " done!" else echo " already installed!" @@ -632,7 +636,7 @@ checkForDependencies() { package_check ${i} > /dev/null if ! [ $? -eq 0 ]; then echo -n " Not found! Installing...." - ${SUDO} ${PKG_INSTALL} "$i" > /dev/null & spinner $! + ${PKG_INSTALL} "$i" > /dev/null & spinner $! echo " done!" else echo " already installed!" @@ -673,8 +677,8 @@ is_repo() { make_repo() { # Remove the non-repod interface and clone the interface echo -n "::: Cloning $2 into $1..." - ${SUDO} rm -rf "$1" - ${SUDO} git clone -q "$2" "$1" > /dev/null & spinner $! + rm -rf "$1" + git clone -q "$2" "$1" > /dev/null & spinner $! echo " done!" } @@ -682,7 +686,7 @@ update_repo() { # Pull the latest commits echo -n "::: Updating repo in $1..." cd "$1" || exit - ${SUDO} git pull -q > /dev/null & spinner $! + git pull -q > /dev/null & spinner $! echo " done!" } @@ -690,59 +694,59 @@ update_repo() { CreateLogFile() { # Create logfiles if necessary echo ":::" - ${SUDO} echo -n "::: Creating log file and changing owner to dnsmasq..." + echo -n "::: Creating log file and changing owner to dnsmasq..." if [ ! -f /var/log/pihole.log ]; then - ${SUDO} touch /var/log/pihole.log - ${SUDO} chmod 644 /var/log/pihole.log - ${SUDO} chown dnsmasq:root /var/log/pihole.log - ${SUDO} echo " done!" + touch /var/log/pihole.log + chmod 644 /var/log/pihole.log + chown dnsmasq:root /var/log/pihole.log + echo " done!" else - ${SUDO} echo " already exists!" + echo " already exists!" fi } installPiholeWeb() { # Install the web interface - ${SUDO} echo ":::" - ${SUDO} echo -n "::: Installing pihole custom index page..." + echo ":::" + echo -n "::: Installing pihole custom index page..." if [ -d "/var/www/html/pihole" ]; then - ${SUDO} echo " Existing page detected, not overwriting" + echo " Existing page detected, not overwriting" else - ${SUDO} mkdir /var/www/html/pihole + mkdir /var/www/html/pihole if [ -f /var/www/html/index.lighttpd.html ]; then - ${SUDO} mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig + mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig else printf "\n:::\tNo default index.lighttpd.html file found... not backing up" fi - ${SUDO} cp /etc/.pihole/advanced/index.* /var/www/html/pihole/. - ${SUDO} echo " done!" + cp /etc/.pihole/advanced/index.* /var/www/html/pihole/. + echo " done!" fi # Install Sudoer file echo -n "::: Installing sudoer file..." - ${SUDO} mkdir -p /etc/sudoers.d/ - ${SUDO} cp /etc/.pihole/advanced/pihole.sudo /etc/sudoers.d/pihole - ${SUDO} chmod 0440 /etc/sudoers.d/pihole + mkdir -p /etc/sudoers.d/ + cp /etc/.pihole/advanced/pihole.sudo /etc/sudoers.d/pihole + chmod 0440 /etc/sudoers.d/pihole echo " done!" } installCron() { # Install the cron job - ${SUDO} echo ":::" - ${SUDO} echo -n "::: Installing latest Cron script..." - ${SUDO} cp /etc/.pihole/advanced/pihole.cron /etc/cron.d/pihole - ${SUDO} echo " done!" + echo ":::" + echo -n "::: Installing latest Cron script..." + cp /etc/.pihole/advanced/pihole.cron /etc/cron.d/pihole + echo " done!" } runGravity() { # Rub gravity.sh to build blacklists - ${SUDO} echo ":::" - ${SUDO} echo "::: Preparing to run gravity.sh to refresh hosts..." + echo ":::" + echo "::: Preparing to run gravity.sh to refresh hosts..." if ls /etc/pihole/list* 1> /dev/null 2>&1; then echo "::: Cleaning up previous install (preserving whitelist/blacklist)" - ${SUDO} rm /etc/pihole/list.* + rm /etc/pihole/list.* fi echo "::: Running gravity.sh" - ${SUDO} /opt/pihole/gravity.sh + /opt/pihole/gravity.sh } setUser(){ @@ -752,41 +756,41 @@ setUser(){ echo "::: User 'pihole' already exists" else echo "::: User 'pihole' doesn't exist. Creating..." - ${SUDO} useradd -r -s /usr/sbin/nologin pihole + useradd -r -s /usr/sbin/nologin pihole fi } configureFirewall() { # Allow HTTP and DNS traffic if [ -x "$(command -v firewall-cmd)" ]; then - ${SUDO} firewall-cmd --state > /dev/null + firewall-cmd --state > /dev/null if [[ $? -eq 0 ]]; then - ${SUDO} echo "::: Configuring firewalld for httpd and dnsmasq.." - ${SUDO} firewall-cmd --permanent --add-port=80/tcp - ${SUDO} firewall-cmd --permanent --add-port=53/tcp - ${SUDO} firewall-cmd --permanent --add-port=53/udp - ${SUDO} firewall-cmd --reload + echo "::: Configuring firewalld for httpd and dnsmasq.." + firewall-cmd --permanent --add-port=80/tcp + firewall-cmd --permanent --add-port=53/tcp + firewall-cmd --permanent --add-port=53/udp + firewall-cmd --reload fi elif [ -x "$(command -v iptables)" ]; then - ${SUDO} echo "::: Configuring iptables for httpd and dnsmasq.." - ${SUDO} iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT - ${SUDO} iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT - ${SUDO} iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT + echo "::: Configuring iptables for httpd and dnsmasq.." + iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT + iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT + iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT else - ${SUDO} echo "::: No firewall detected.. skipping firewall configuration." + echo "::: No firewall detected.. skipping firewall configuration." fi } finalExports() { #If it already exists, lets overwrite it with the new values. if [[ -f ${setupVars} ]];then - ${SUDO} rm ${setupVars} + rm ${setupVars} fi - ${SUDO} echo "piholeInterface=${piholeInterface}" >> ${setupVars} - ${SUDO} echo "IPv4addr=${IPv4addr}" >> ${setupVars} - ${SUDO} echo "piholeIPv6=${piholeIPv6}" >> ${setupVars} - ${SUDO} echo "piholeDNS1=${piholeDNS1}" >> ${setupVars} - ${SUDO} echo "piholeDNS2=${piholeDNS2}" >> ${setupVars} + echo "piholeInterface=${piholeInterface}" >> ${setupVars} + echo "IPv4addr=${IPv4addr}" >> ${setupVars} + echo "piholeIPv6=${piholeIPv6}" >> ${setupVars} + echo "piholeDNS1=${piholeDNS1}" >> ${setupVars} + echo "piholeDNS2=${piholeDNS2}" >> ${setupVars} } @@ -796,13 +800,13 @@ installPihole() { stopServices setUser if [ ! -d "/var/www/html" ]; then - ${SUDO} mkdir -p /var/www/html + mkdir -p /var/www/html fi - ${SUDO} chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html - ${SUDO} chmod 775 /var/www/html - ${SUDO} usermod -a -G ${LIGHTTPD_GROUP} pihole + chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html + chmod 775 /var/www/html + usermod -a -G ${LIGHTTPD_GROUP} pihole if [ -x "$(command -v lighty-enable-mod)" ]; then - ${SUDO} lighty-enable-mod fastcgi fastcgi-php > /dev/null + lighty-enable-mod fastcgi fastcgi-php > /dev/null else printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" fi @@ -841,22 +845,22 @@ configureSelinux() { package_check "selinux-policy-devel" > /dev/null if ! [ $? -eq 0 ]; then echo -n " Not found! Installing...." - ${SUDO} ${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $! + ${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $! echo " done!" else echo " already installed!" fi printf "::: Enabling httpd server side includes (SSI).. " - ${SUDO} setsebool -P httpd_ssi_exec on + setsebool -P httpd_ssi_exec on if [ $? -eq 0 ]; then echo -n "Success" fi printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" - ${SUDO} checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te - ${SUDO} semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod - ${SUDO} semodule -i /etc/pihole/pihole.pp - ${SUDO} rm -f /etc/pihole/pihole.mod - ${SUDO} semodule -l | grep pihole > /dev/null + checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te + semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod + semodule -i /etc/pihole/pihole.pp + rm -f /etc/pihole/pihole.mod + semodule -l | grep pihole > /dev/null if [ $? -eq 0 ]; then printf "::: Successfully installed Pi-Hole SELinux policy\n" else @@ -929,7 +933,7 @@ installerDependencies if [[ ${useUpdateVars} == false ]]; then welcomeDialogs - ${SUDO} mkdir -p /etc/pihole/ + mkdir -p /etc/pihole/ # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one @@ -945,7 +949,7 @@ else fi # Move the log file into /etc/pihole for storage -${SUDO} mv ${tmpLog} ${instalLogLoc} +mv ${tmpLog} ${instalLogLoc} if [[ ${useUpdateVars} == false ]]; then displayFinalMessage @@ -954,13 +958,13 @@ fi echo -n "::: Restarting services..." # Start services if [ -x "$(command -v systemctl)" ]; then - ${SUDO} systemctl enable dnsmasq - ${SUDO} systemctl restart dnsmasq - ${SUDO} systemctl enable lighttpd - ${SUDO} systemctl start lighttpd + systemctl enable dnsmasq + systemctl restart dnsmasq + systemctl enable lighttpd + systemctl start lighttpd else - ${SUDO} service dnsmasq restart - ${SUDO} service lighttpd start + service dnsmasq restart + service lighttpd start fi echo " done." From 10e1a03c7667488a658e0b2380a442cf711ccfc5 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 8 Oct 2016 12:58:42 -0700 Subject: [PATCH 15/88] `runGravity` is called after `finalExports` in the Debian install side. --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index c6f409fb..15aa3dcb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -818,9 +818,9 @@ installPihole() { configureSelinux installPiholeWeb installCron - runGravity configureFirewall finalExports + runGravity } updatePihole() { @@ -834,8 +834,8 @@ updatePihole() { configureSelinux installPiholeWeb installCron - runGravity configureFirewall + runGravity } configureSelinux() { From b157bc5cd7b36be5ef77229a75753bca837d7283 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 8 Oct 2016 13:47:35 -0700 Subject: [PATCH 16/88] Fixes #768 Check the staleness of the package index instead of the package cache. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4dab9355..01fa3824 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -68,7 +68,7 @@ if [ -x "$(command -v apt-get)" ];then fi ############################################# PKG_MANAGER="apt-get" - PKG_CACHE="/var/cache/apt" + PKG_CACHE="/var/lib/apt/lists/" UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" PKG_UPDATE="$PKG_MANAGER upgrade" PKG_INSTALL="$PKG_MANAGER --yes --quiet install" From 6772603c15a4b6bf46196347e3fc59ff291bcae3 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 12:34:53 -0700 Subject: [PATCH 17/88] Relocate cache check to its own function --- automated install/basic-install.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 964d6b26..a06de223 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -73,9 +73,9 @@ if [ -x "$(command -v apt-get)" ];then ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" - UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" + UPDATE_PKG_CACHE="$PKG_MANAGER update" PKG_UPDATE="$PKG_MANAGER upgrade" - PKG_INSTALL="$PKG_MANAGER --yes --quiet install" + PKG_INSTALL="$PKG_MANAGER --yes install" PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) @@ -83,7 +83,7 @@ if [ -x "$(command -v apt-get)" ];then LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" package_check() { - dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" + dpkg-query -W -f='${Status}' "$1" | grep -c "ok installed" } elif [ -x "$(command -v rpm)" ];then # Fedora Family @@ -582,11 +582,12 @@ stopServices() { echo " done." } -installerDependencies() { +check_cache_freshness() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) #We'll change the logic up here, to check to see if there are any updates availible and # if so, advise the user to run apt-get update/upgrade at their own discretion + #Check to see if apt-get update has already been run today # it needs to have been run at least once on new installs! timestamp=$(stat -c %Y ${PKG_CACHE}) @@ -612,12 +613,14 @@ installerDependencies() { echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo ":::" fi +} + +installerDependencies() { echo ":::" echo "::: Checking installer dependencies..." for i in "${INSTALLER_DEPS[@]}"; do echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then + if ! package_check ${i} &>/dev/null; then echo -n " Not found! Installing...." ${PKG_INSTALL} "$i" > /dev/null 2>&1 echo " done!" @@ -928,6 +931,9 @@ else verifyFreeDiskSpace fi +# Check the package cache and update if necessary +check_cache_freshness + # Install packages used by this installation script installerDependencies From f5be8b2a5e96f7039d4681655d3f5899d3109ea1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 13:43:01 -0700 Subject: [PATCH 18/88] Single dependency package check function, will exit if any errors with message to update cache. --- automated install/basic-install.sh | 43 +++++++++++++----------------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a06de223..8da5f8b8 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -615,38 +615,28 @@ check_cache_freshness() { fi } -installerDependencies() { - echo ":::" - echo "::: Checking installer dependencies..." - for i in "${INSTALLER_DEPS[@]}"; do +dependency_package_install() { + # Install and verify package installation, exit out if any errors are detected + # Takes array as argument then iterates over array + declare -a argArray1=("${!1}") + + for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." if ! package_check ${i} &>/dev/null; then echo -n " Not found! Installing...." ${PKG_INSTALL} "$i" > /dev/null 2>&1 - echo " done!" + if ! package_check ${i} &>/dev/null; then + echo "::: ERROR, package ${i} has not been installed, please run ${UPDATE_PKG_CACHE} and try install again." + exit 1 + else + echo " done!" + fi else echo " already installed!" fi done } -checkForDependencies() { - # Install dependencies for Pi-Hole - echo "::: Checking Pi-Hole dependencies:" - - for i in "${PIHOLE_DEPS[@]}"; do - echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "$i" > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi - done -} - getGitFiles() { # Setup git repos for base files and web admin echo ":::" @@ -799,7 +789,8 @@ finalExports() { installPihole() { # Install base files and web interface - checkForDependencies # done + echo "Checking for Pi-hole dependencies" + dependency_package_install PIHOLE_DEPS[@] # done stopServices setUser if [ ! -d "/var/www/html" ]; then @@ -828,7 +819,8 @@ installPihole() { updatePihole() { # Install base files and web interface - checkForDependencies # done + echo "Checking for Pi-hole dependencies" + dependency_package_install PIHOLE_DEPS[@] # done stopServices getGitFiles installScripts @@ -935,7 +927,8 @@ fi check_cache_freshness # Install packages used by this installation script -installerDependencies +echo "::: Checking for installer dependencies..." +dependency_package_install INSTALLER_DEPS[@] if [[ ${useUpdateVars} == false ]]; then welcomeDialogs From 293c60fb9cadc8d1479c8dff3a1f7a48d749e772 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 13:52:36 -0700 Subject: [PATCH 19/88] Exit script on failure to install dependent package. --- automated install/basic-install.sh | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 8da5f8b8..65812cc5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -790,7 +790,9 @@ finalExports() { installPihole() { # Install base files and web interface echo "Checking for Pi-hole dependencies" - dependency_package_install PIHOLE_DEPS[@] # done + if ! dependency_package_install PIHOLE_DEPS[@]; then + exit 1 + fi stopServices setUser if [ ! -d "/var/www/html" ]; then @@ -820,7 +822,9 @@ installPihole() { updatePihole() { # Install base files and web interface echo "Checking for Pi-hole dependencies" - dependency_package_install PIHOLE_DEPS[@] # done + if ! dependency_package_install PIHOLE_DEPS[@]; then + exit 1 + fi stopServices getGitFiles installScripts @@ -928,7 +932,9 @@ check_cache_freshness # Install packages used by this installation script echo "::: Checking for installer dependencies..." -dependency_package_install INSTALLER_DEPS[@] +if ! dependency_package_install INSTALLER_DEPS[@]; then + exit 1 +fi if [[ ${useUpdateVars} == false ]]; then welcomeDialogs From 7e0afffca8f196d21a0333c1a660ed1d6a756c15 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 19:41:32 -0700 Subject: [PATCH 20/88] Revert inadvertent commits --- automated install/basic-install.sh | 67 ++++++++++++++---------------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 65812cc5..cbd1c9b0 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -73,9 +73,9 @@ if [ -x "$(command -v apt-get)" ];then ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" - UPDATE_PKG_CACHE="$PKG_MANAGER update" + UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" PKG_UPDATE="$PKG_MANAGER upgrade" - PKG_INSTALL="$PKG_MANAGER --yes install" + PKG_INSTALL="$PKG_MANAGER --yes --quiet install" PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) @@ -83,7 +83,7 @@ if [ -x "$(command -v apt-get)" ];then LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" package_check() { - dpkg-query -W -f='${Status}' "$1" | grep -c "ok installed" + dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" } elif [ -x "$(command -v rpm)" ];then # Fedora Family @@ -582,12 +582,11 @@ stopServices() { echo " done." } -check_cache_freshness() { +installerDependencies() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) #We'll change the logic up here, to check to see if there are any updates availible and # if so, advise the user to run apt-get update/upgrade at their own discretion - #Check to see if apt-get update has already been run today # it needs to have been run at least once on new installs! timestamp=$(stat -c %Y ${PKG_CACHE}) @@ -613,30 +612,38 @@ check_cache_freshness() { echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo ":::" fi -} - -dependency_package_install() { - # Install and verify package installation, exit out if any errors are detected - # Takes array as argument then iterates over array - declare -a argArray1=("${!1}") - - for i in "${argArray1[@]}"; do + echo ":::" + echo "::: Checking installer dependencies..." + for i in "${INSTALLER_DEPS[@]}"; do echo -n "::: Checking for $i..." - if ! package_check ${i} &>/dev/null; then + package_check ${i} > /dev/null + if ! [ $? -eq 0 ]; then echo -n " Not found! Installing...." ${PKG_INSTALL} "$i" > /dev/null 2>&1 - if ! package_check ${i} &>/dev/null; then - echo "::: ERROR, package ${i} has not been installed, please run ${UPDATE_PKG_CACHE} and try install again." - exit 1 - else - echo " done!" - fi + echo " done!" else echo " already installed!" fi done } +checkForDependencies() { + # Install dependencies for Pi-Hole + echo "::: Checking Pi-Hole dependencies:" + + for i in "${PIHOLE_DEPS[@]}"; do + echo -n "::: Checking for $i..." + package_check ${i} > /dev/null + if ! [ $? -eq 0 ]; then + echo -n " Not found! Installing...." + ${PKG_INSTALL} "$i" > /dev/null & spinner $! + echo " done!" + else + echo " already installed!" + fi + done +} + getGitFiles() { # Setup git repos for base files and web admin echo ":::" @@ -789,10 +796,7 @@ finalExports() { installPihole() { # Install base files and web interface - echo "Checking for Pi-hole dependencies" - if ! dependency_package_install PIHOLE_DEPS[@]; then - exit 1 - fi + checkForDependencies # done stopServices setUser if [ ! -d "/var/www/html" ]; then @@ -821,10 +825,7 @@ installPihole() { updatePihole() { # Install base files and web interface - echo "Checking for Pi-hole dependencies" - if ! dependency_package_install PIHOLE_DEPS[@]; then - exit 1 - fi + checkForDependencies # done stopServices getGitFiles installScripts @@ -927,14 +928,8 @@ else verifyFreeDiskSpace fi -# Check the package cache and update if necessary -check_cache_freshness - # Install packages used by this installation script -echo "::: Checking for installer dependencies..." -if ! dependency_package_install INSTALLER_DEPS[@]; then - exit 1 -fi +installerDependencies if [[ ${useUpdateVars} == false ]]; then welcomeDialogs @@ -990,4 +985,4 @@ echo "::: The install log is located at: /etc/pihole/install.log" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" } -main "$@" \ No newline at end of file +main "$@" From a30f78c1c8524293ebf3e2994b010a97fa2416bf Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 21:31:36 -0700 Subject: [PATCH 21/88] Oneliner php version check, passes `set -e` check. --- automated install/basic-install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index cbd1c9b0..341588cb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -65,11 +65,8 @@ fi if [ -x "$(command -v apt-get)" ];then #Debian Family #Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS) - phpVer="php" - apt-get install --dry-run php5 > /dev/null 2>&1 - if [ $? == 0 ]; then - phpVer="php5" - fi + phpVer="php5" + apt-get install --dry-run php5 > /dev/null 2>&1 || phpVer="php" ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" From 7131ff27c39f6e615b8e46b4c225fd6312a87d5e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 21:32:25 -0700 Subject: [PATCH 22/88] Attempt to `set -e` --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 341588cb..d5a79564 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -16,7 +16,7 @@ # # curl -L install.pi-hole.net | bash - +set -e ######## VARIABLES ######### From d4bf85b67cc9a6582d7ded308cf01ba49496b863 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 21:44:45 -0700 Subject: [PATCH 23/88] Self contain `package_check` into `package_check_install`. Passes `set -e` test. --- automated install/basic-install.sh | 43 +++++++++--------------------- 1 file changed, 12 insertions(+), 31 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index d5a79564..231f2d70 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -79,8 +79,8 @@ if [ -x "$(command -v apt-get)" ];then LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" - package_check() { - dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" + package_check_install() { + dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" } elif [ -x "$(command -v rpm)" ];then # Fedora Family @@ -99,7 +99,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" - package_check() { + package_check_install() { rpm -qa | grep ^$1- > /dev/null } else @@ -613,32 +613,19 @@ installerDependencies() { echo "::: Checking installer dependencies..." for i in "${INSTALLER_DEPS[@]}"; do echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "$i" > /dev/null 2>&1 - echo " done!" - else - echo " already installed!" - fi + package_check_install ${i} > /dev/null + echo " installed!" done } checkForDependencies() { # Install dependencies for Pi-Hole - echo "::: Checking Pi-Hole dependencies:" - - for i in "${PIHOLE_DEPS[@]}"; do + echo "::: Checking Pi-Hole dependencies:" + for i in "${PIHOLE_DEPS[@]}"; do echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "$i" > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi - done + package_check_install ${i} > /dev/null + echo " installed!" + done } getGitFiles() { @@ -839,14 +826,8 @@ configureSelinux() { if [ -x "$(command -v getenforce)" ]; then printf "\n::: SELinux Detected\n" printf ":::\tChecking for SELinux policy development packages..." - package_check "selinux-policy-devel" > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi + package_check_install "selinux-policy-devel" > /dev/null + echo " installed!" printf "::: Enabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on if [ $? -eq 0 ]; then From 1fecdf42ca1409770a3a591c25ba6c49688bdbfc Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:00:23 -0700 Subject: [PATCH 24/88] Move `git` to installer deps, refactor some functions. --- automated install/basic-install.sh | 35 ++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 231f2d70..50adbc4a 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -74,8 +74,8 @@ if [ -x "$(command -v apt-get)" ];then PKG_UPDATE="$PKG_MANAGER upgrade" PKG_INSTALL="$PKG_MANAGER --yes --quiet install" PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" - INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" @@ -94,8 +94,8 @@ elif [ -x "$(command -v rpm)" ];then PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" - INSTALLER_DEPS=( iproute net-tools procps-ng newt ) - PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php git curl unzip wget findutils cronie sudo nmap-ncat ) + INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) + PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" @@ -578,14 +578,12 @@ stopServices() { fi echo " done." } - -installerDependencies() { +update_pacakge_cache() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) - #We'll change the logic up here, to check to see if there are any updates availible and - # if so, advise the user to run apt-get update/upgrade at their own discretion + #Check to see if apt-get update has already been run today - # it needs to have been run at least once on new installs! + #it needs to have been run at least once on new installs! timestamp=$(stat -c %Y ${PKG_CACHE}) timestampAsDate=$(date -d @"$timestamp" "+%b %e") today=$(date "+%b %e") @@ -597,18 +595,26 @@ installerDependencies() { ${UPDATE_PKG_CACHE} > /dev/null 2>&1 echo " done!" fi +} + +notify_package_updates_available(){ + # Let user know if they have outdated packages on their system and + # advise them to run a package update at soonest possible. echo ":::" echo -n "::: Checking $PKG_MANAGER for upgraded packages...." updatesToInstall=$(eval "${PKG_COUNT}") echo " done!" echo ":::" if [[ ${updatesToInstall} -eq "0" ]]; then - echo "::: Your pi is up to date! Continuing with pi-hole installation..." + echo "::: Your system is up to date! Continuing with Pi-hole installation..." else - echo "::: There are $updatesToInstall updates availible for your pi!" + echo "::: There are $updatesToInstall updates available for your system!" echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo ":::" fi +} +installerDependencies() { + echo ":::" echo "::: Checking installer dependencies..." for i in "${INSTALLER_DEPS[@]}"; do @@ -906,12 +912,19 @@ else verifyFreeDiskSpace fi +# Update package cache +update_pacakge_cache + +# Notify user of package availability +notify_package_updates_available + # Install packages used by this installation script installerDependencies if [[ ${useUpdateVars} == false ]]; then welcomeDialogs mkdir -p /etc/pihole/ + # # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one From d9e28a7422f9949e3d4c70f1b4b9f5701e3b65c8 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:05:06 -0700 Subject: [PATCH 25/88] factor out `installer_dependencies` --- automated install/basic-install.sh | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 50adbc4a..ef578f03 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -578,6 +578,7 @@ stopServices() { fi echo " done." } + update_pacakge_cache() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) @@ -613,13 +614,13 @@ notify_package_updates_available(){ echo ":::" fi } -installerDependencies() { - echo ":::" - echo "::: Checking installer dependencies..." - for i in "${INSTALLER_DEPS[@]}"; do +install_dependent_packages(){ + declare -a argArray1=("${!1}") + + for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." - package_check_install ${i} > /dev/null + package_check ${i} > /dev/null echo " installed!" done } @@ -919,7 +920,7 @@ update_pacakge_cache notify_package_updates_available # Install packages used by this installation script -installerDependencies +install_dependent_packages INSTALLER_DEPS[@] if [[ ${useUpdateVars} == false ]]; then welcomeDialogs From 9d048b2fdff7ad7318027a1a38cdcff2a4df8bc8 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:24:13 -0700 Subject: [PATCH 26/88] Move Pi-hole dependency checks to `main()` and out of duplicated `install` and `update` functions. Bring them up a level in the subshells. --- automated install/basic-install.sh | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ef578f03..d8cc88db 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -616,25 +616,16 @@ notify_package_updates_available(){ } install_dependent_packages(){ + # Install packages passed in via argument array declare -a argArray1=("${!1}") for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." - package_check ${i} > /dev/null + package_check_install ${i} > /dev/null echo " installed!" done } -checkForDependencies() { - # Install dependencies for Pi-Hole - echo "::: Checking Pi-Hole dependencies:" - for i in "${PIHOLE_DEPS[@]}"; do - echo -n "::: Checking for $i..." - package_check_install ${i} > /dev/null - echo " installed!" - done -} - getGitFiles() { # Setup git repos for base files and web admin echo ":::" @@ -787,7 +778,6 @@ finalExports() { installPihole() { # Install base files and web interface - checkForDependencies # done stopServices setUser if [ ! -d "/var/www/html" ]; then @@ -816,7 +806,6 @@ installPihole() { updatePihole() { # Install base files and web interface - checkForDependencies # done stopServices getGitFiles installScripts @@ -934,6 +923,8 @@ if [[ ${useUpdateVars} == false ]]; then use4andor6 # Decide what upstream DNS Servers to use setDNS + # Install packages used by the Pi-hole + install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else From 61b02bf6d32e72b0e16bf4a1c52ce2d5a91fbbaf Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:27:37 -0700 Subject: [PATCH 27/88] Add OR TRUE to PKG_COUNT so that a 0 package to update doesn't grep -c to an exit value of 1. --- automated install/basic-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index d8cc88db..32da07d2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -73,7 +73,8 @@ if [ -x "$(command -v apt-get)" ];then UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" PKG_UPDATE="$PKG_MANAGER upgrade" PKG_INSTALL="$PKG_MANAGER --yes --quiet install" - PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" + # grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE + PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true" INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) LIGHTTPD_USER="www-data" From 54a1c5b63ab7c75ac49a95e93fe13c5a57a6e441 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:35:14 -0700 Subject: [PATCH 28/88] Revert inadvertent commits IDLE keeps committing direct to development. --- automated install/basic-install.sh | 100 +++++++++++++++++------------ 1 file changed, 58 insertions(+), 42 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 32da07d2..cbd1c9b0 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -16,7 +16,7 @@ # # curl -L install.pi-hole.net | bash -set -e + ######## VARIABLES ######### @@ -65,23 +65,25 @@ fi if [ -x "$(command -v apt-get)" ];then #Debian Family #Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS) - phpVer="php5" - apt-get install --dry-run php5 > /dev/null 2>&1 || phpVer="php" + phpVer="php" + apt-get install --dry-run php5 > /dev/null 2>&1 + if [ $? == 0 ]; then + phpVer="php5" + fi ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" PKG_UPDATE="$PKG_MANAGER upgrade" PKG_INSTALL="$PKG_MANAGER --yes --quiet install" - # grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE - PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true" - INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) + PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" + INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" - package_check_install() { - dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" + package_check() { + dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" } elif [ -x "$(command -v rpm)" ];then # Fedora Family @@ -95,12 +97,12 @@ elif [ -x "$(command -v rpm)" ];then PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" - INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) - PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) + INSTALLER_DEPS=( iproute net-tools procps-ng newt ) + PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php git curl unzip wget findutils cronie sudo nmap-ncat ) LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" - package_check_install() { + package_check() { rpm -qa | grep ^$1- > /dev/null } else @@ -580,12 +582,13 @@ stopServices() { echo " done." } -update_pacakge_cache() { +installerDependencies() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) - + #We'll change the logic up here, to check to see if there are any updates availible and + # if so, advise the user to run apt-get update/upgrade at their own discretion #Check to see if apt-get update has already been run today - #it needs to have been run at least once on new installs! + # it needs to have been run at least once on new installs! timestamp=$(stat -c %Y ${PKG_CACHE}) timestampAsDate=$(date -d @"$timestamp" "+%b %e") today=$(date "+%b %e") @@ -597,34 +600,48 @@ update_pacakge_cache() { ${UPDATE_PKG_CACHE} > /dev/null 2>&1 echo " done!" fi -} - -notify_package_updates_available(){ - # Let user know if they have outdated packages on their system and - # advise them to run a package update at soonest possible. echo ":::" echo -n "::: Checking $PKG_MANAGER for upgraded packages...." updatesToInstall=$(eval "${PKG_COUNT}") echo " done!" echo ":::" if [[ ${updatesToInstall} -eq "0" ]]; then - echo "::: Your system is up to date! Continuing with Pi-hole installation..." + echo "::: Your pi is up to date! Continuing with pi-hole installation..." else - echo "::: There are $updatesToInstall updates available for your system!" + echo "::: There are $updatesToInstall updates availible for your pi!" echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo ":::" fi + echo ":::" + echo "::: Checking installer dependencies..." + for i in "${INSTALLER_DEPS[@]}"; do + echo -n "::: Checking for $i..." + package_check ${i} > /dev/null + if ! [ $? -eq 0 ]; then + echo -n " Not found! Installing...." + ${PKG_INSTALL} "$i" > /dev/null 2>&1 + echo " done!" + else + echo " already installed!" + fi + done } -install_dependent_packages(){ - # Install packages passed in via argument array - declare -a argArray1=("${!1}") +checkForDependencies() { + # Install dependencies for Pi-Hole + echo "::: Checking Pi-Hole dependencies:" - for i in "${argArray1[@]}"; do - echo -n "::: Checking for $i..." - package_check_install ${i} > /dev/null - echo " installed!" - done + for i in "${PIHOLE_DEPS[@]}"; do + echo -n "::: Checking for $i..." + package_check ${i} > /dev/null + if ! [ $? -eq 0 ]; then + echo -n " Not found! Installing...." + ${PKG_INSTALL} "$i" > /dev/null & spinner $! + echo " done!" + else + echo " already installed!" + fi + done } getGitFiles() { @@ -779,6 +796,7 @@ finalExports() { installPihole() { # Install base files and web interface + checkForDependencies # done stopServices setUser if [ ! -d "/var/www/html" ]; then @@ -807,6 +825,7 @@ installPihole() { updatePihole() { # Install base files and web interface + checkForDependencies # done stopServices getGitFiles installScripts @@ -823,8 +842,14 @@ configureSelinux() { if [ -x "$(command -v getenforce)" ]; then printf "\n::: SELinux Detected\n" printf ":::\tChecking for SELinux policy development packages..." - package_check_install "selinux-policy-devel" > /dev/null - echo " installed!" + package_check "selinux-policy-devel" > /dev/null + if ! [ $? -eq 0 ]; then + echo -n " Not found! Installing...." + ${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $! + echo " done!" + else + echo " already installed!" + fi printf "::: Enabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on if [ $? -eq 0 ]; then @@ -903,19 +928,12 @@ else verifyFreeDiskSpace fi -# Update package cache -update_pacakge_cache - -# Notify user of package availability -notify_package_updates_available - # Install packages used by this installation script -install_dependent_packages INSTALLER_DEPS[@] +installerDependencies if [[ ${useUpdateVars} == false ]]; then welcomeDialogs mkdir -p /etc/pihole/ - # # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one @@ -924,8 +942,6 @@ if [[ ${useUpdateVars} == false ]]; then use4andor6 # Decide what upstream DNS Servers to use setDNS - # Install packages used by the Pi-hole - install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else From dac2b8942e8924ac58bb1db1ccb0d2742f015905 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 22:38:00 -0700 Subject: [PATCH 29/88] Typo fix to generate commit. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 32da07d2..859e54c1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -721,7 +721,7 @@ installCron() { } runGravity() { - # Rub gravity.sh to build blacklists + # Run gravity.sh to build blacklists echo ":::" echo "::: Preparing to run gravity.sh to refresh hosts..." if ls /etc/pihole/list* 1> /dev/null 2>&1; then From 8a15fd44d5dfeb2c63478fe8fc7d7bd3ea8dcdd1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 23:53:18 -0700 Subject: [PATCH 30/88] Update `is_repo()` to use `git status` for validity checks. --- automated install/basic-install.sh | 34 ++++++++++++------------------ 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 859e54c1..887e695e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -632,36 +632,31 @@ getGitFiles() { echo ":::" echo "::: Checking for existing base files..." if is_repo ${piholeFilesDir}; then - make_repo ${piholeFilesDir} ${piholeGitUrl} + update_repo ${piholeFilesDir} else - update_repo ${piholeFilesDir} - fi + make_repo ${piholeFilesDir} ${piholeGitUrl} + fi - echo ":::" - echo "::: Checking for existing web interface..." - if is_repo ${webInterfaceDir}; then - make_repo ${webInterfaceDir} ${webInterfaceGitUrl} - else - update_repo ${webInterfaceDir} - fi + #echo ":::" + #echo "::: Checking for existing web interface..." + #if is_repo ${webInterfaceDir}; then +# make_repo ${webInterfaceDir} ${webInterfaceGitUrl} + #else +# update_repo ${webInterfaceDir} +# fi } is_repo() { - # If the directory does not have a .git folder it is not a repo echo -n "::: Checking $1 is a repo..." - if [ -d "$1/.git" ]; then - echo " OK!" - return 1 - fi - echo " not found!!" - return 0 + cd $1 || return 1 + git status && echo " OK!"; return 0 || echo " not found!"; return 1 } make_repo() { # Remove the non-repod interface and clone the interface echo -n "::: Cloning $2 into $1..." rm -rf "$1" - git clone -q "$2" "$1" > /dev/null & spinner $! + git clone -q --depth 1 "$2" "$1" > /dev/null & spinner $! echo " done!" } @@ -788,11 +783,10 @@ installPihole() { chmod 775 /var/www/html usermod -a -G ${LIGHTTPD_GROUP} pihole if [ -x "$(command -v lighty-enable-mod)" ]; then - lighty-enable-mod fastcgi fastcgi-php > /dev/null + lighty-enable-mod fastcgi fastcgi-php > /dev/null || true else printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" fi - getGitFiles installScripts installConfigs From ca59b808d8127eef2002b55f5c553aa3db01e410 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 00:02:50 -0700 Subject: [PATCH 31/88] Git clone/update now occurs right after installer dependency checks. Allows for inclusion of installer source files in the repo. Passes `set -e` --- automated install/basic-install.sh | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 887e695e..6cc2d431 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -628,22 +628,15 @@ install_dependent_packages(){ } getGitFiles() { - # Setup git repos for base files and web admin + # Setup git repos for directory and repository passed + # as arguments 1 and 2 echo ":::" echo "::: Checking for existing base files..." - if is_repo ${piholeFilesDir}; then - update_repo ${piholeFilesDir} + if is_repo ${1}; then + update_repo ${1} else - make_repo ${piholeFilesDir} ${piholeGitUrl} + make_repo ${1} ${2} fi - - #echo ":::" - #echo "::: Checking for existing web interface..." - #if is_repo ${webInterfaceDir}; then -# make_repo ${webInterfaceDir} ${webInterfaceGitUrl} - #else -# update_repo ${webInterfaceDir} -# fi } is_repo() { @@ -787,7 +780,6 @@ installPihole() { else printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" fi - getGitFiles installScripts installConfigs CreateLogFile @@ -802,7 +794,6 @@ installPihole() { updatePihole() { # Install base files and web interface stopServices - getGitFiles installScripts installConfigs CreateLogFile @@ -907,9 +898,13 @@ notify_package_updates_available install_dependent_packages INSTALLER_DEPS[@] if [[ ${useUpdateVars} == false ]]; then + # Display welcome dialogs welcomeDialogs + # Create directory for Pi-hole storage mkdir -p /etc/pihole/ - # + # Get Git files for Core and Admin + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one From e60eb662836a36792d531cc24a93bfd95f4a34d0 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:04:03 -0700 Subject: [PATCH 32/88] UpdateDialogs are now a Whiptail Menu, self-explanatory. --- automated install/basic-install.sh | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6cc2d431..b8250836 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -631,32 +631,33 @@ getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 echo ":::" - echo "::: Checking for existing base files..." - if is_repo ${1}; then - update_repo ${1} + echo "::: Checking for existing repository..." + if is_repo "${1}"; then + update_repo "${1}" else - make_repo ${1} ${2} + make_repo "${1}" "${2}" fi } is_repo() { + # Use git to check if directory is currently under VCS echo -n "::: Checking $1 is a repo..." - cd $1 || return 1 - git status && echo " OK!"; return 0 || echo " not found!"; return 1 + cd "${1}" || return 1 + git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1 } make_repo() { # Remove the non-repod interface and clone the interface echo -n "::: Cloning $2 into $1..." - rm -rf "$1" - git clone -q --depth 1 "$2" "$1" > /dev/null & spinner $! + rm -rf "${1}" + git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! echo " done!" } update_repo() { # Pull the latest commits echo -n "::: Updating repo in $1..." - cd "$1" || exit + cd "${1}" || exit 1 git pull -q > /dev/null & spinner $! echo " done!" } @@ -844,13 +845,12 @@ View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" $ updateDialogs(){ - UpdateCmd=(whiptail --separate-output --radiolist "We have detected an existing install.\n\n Selecting Update will retain settings from the existing install.\n\n Selecting Install will allow you to enter new settings.\n\n(Highlight desired option, and press space to select!)" ${r} ${c} 2) - UpdateChoices=(Update "" on - Install "" off) - UpdateChoice=$("${UpdateCmd[@]}" "${UpdateChoices[@]}" 2>&1 >/dev/tty) + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "We have detected an existing install.\n\n Please chose from the following options:" ${r} ${c} 2 \ + "Update" "Update install will retain existing settings." \ + "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) if [[ $? = 0 ]];then - case ${UpdateChoice} in + case ${UpdateCmd} in Update) echo "::: Updating existing install" useUpdateVars=true From 43e2aaebf012272ea79cedde01eab8609023ab43 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:04:59 -0700 Subject: [PATCH 33/88] rename `updateDialogs` to `update_dialogs` --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b8250836..225c04c3 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -843,7 +843,7 @@ The install log is in /etc/pihole. View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" ${r} ${c} } -updateDialogs(){ +update_dialogs(){ UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "We have detected an existing install.\n\n Please chose from the following options:" ${r} ${c} 2 \ "Update" "Update install will retain existing settings." \ @@ -874,7 +874,7 @@ if [[ -f ${setupVars} ]];then if [ "$1" == "pihole" ]; then useUpdateVars=true else - updateDialogs + update_dialogs fi fi From 5287ea85377bf150cad0fe5afd600073d2729d8b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:25:11 -0700 Subject: [PATCH 34/88] Refactor `stopServices` into `stop_service` and accept arguments for service to stop. Quiet output from a few other functions. --- automated install/basic-install.sh | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 225c04c3..05073d00 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -567,15 +567,15 @@ installConfigs() { chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/cache/lighttpd/compress } -stopServices() { - # Stop dnsmasq and lighttpd +stop_service() { + # Stop service passed in as argument. + # Can softfail, as process may not be installed when this is called echo ":::" - echo -n "::: Stopping services..." - #$SUDO service dnsmasq stop & spinner $! || true + echo -n "::: Stopping ${1} service..." if [ -x "$(command -v systemctl)" ]; then - systemctl stop lighttpd & spinner $! || true + systemctl stop "${1}" &> /dev/null & spinner $! || true else - service lighttpd stop & spinner $! || true + service "${1}" &> /dev/null stop & spinner $! || true fi echo " done." } @@ -642,7 +642,7 @@ getGitFiles() { is_repo() { # Use git to check if directory is currently under VCS echo -n "::: Checking $1 is a repo..." - cd "${1}" || return 1 + cd "${1}" &> /dev/null || return 1 git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1 } @@ -768,7 +768,6 @@ finalExports() { installPihole() { # Install base files and web interface - stopServices setUser if [ ! -d "/var/www/html" ]; then mkdir -p /var/www/html @@ -794,7 +793,6 @@ installPihole() { updatePihole() { # Install base files and web interface - stopServices installScripts installConfigs CreateLogFile @@ -905,6 +903,9 @@ if [[ ${useUpdateVars} == false ]]; then # Get Git files for Core and Admin getGitFiles ${piholeFilesDir} ${piholeGitUrl} getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} + # Stop resolver and webserver while installing proceses + stop_service dnsmasq + stop_service lighttpd # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one From 7f179f9a584f3e212ef0a6a93c4fa98f329248d8 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:40:56 -0700 Subject: [PATCH 35/88] Remove sourcing bash completion, would fall off as soon as the subshell terminated. --- automated install/basic-install.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 05073d00..f3e51a63 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -537,7 +537,6 @@ installScripts() { install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole - . /etc/bash_completion.d/pihole #Tidy up /usr/local/bin directory if installing over previous install. oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug) From 25cbf4cb35d5f977ca00f942567da4c8b4f59bde Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:43:10 -0700 Subject: [PATCH 36/88] Factor out legacy location script removal. --- automated install/basic-install.sh | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f3e51a63..d8ec764c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -524,6 +524,16 @@ versionCheckDNSmasq(){ sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1} } +remove_legacy_scripts(){ + #Tidy up /usr/local/bin directory if installing over previous install. + oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug) + for i in "${oldFiles[@]}"; do + if [ -f "/usr/local/bin/$i.sh" ]; then + rm /usr/local/bin/"$i".sh + fi + done +} + installScripts() { # Install the scripts from /etc/.pihole to their various locations echo ":::" @@ -537,15 +547,6 @@ installScripts() { install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole - - #Tidy up /usr/local/bin directory if installing over previous install. - oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug) - for i in "${oldFiles[@]}"; do - if [ -f "/usr/local/bin/$i.sh" ]; then - rm /usr/local/bin/"$i".sh - fi - done - echo " done." } @@ -899,6 +900,8 @@ if [[ ${useUpdateVars} == false ]]; then welcomeDialogs # Create directory for Pi-hole storage mkdir -p /etc/pihole/ + # Remove legacy scripts from previous storage location + remove_legacy_scripts # Get Git files for Core and Admin getGitFiles ${piholeFilesDir} ${piholeGitUrl} getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} From bad7a088042079845b3dbd707a64dd6c878b6638 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 01:51:19 -0700 Subject: [PATCH 37/88] Refactor and rename `create_pihole_user`. Now to actually use the user created... --- automated install/basic-install.sh | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index d8ec764c..dc34810e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -721,15 +721,10 @@ runGravity() { /opt/pihole/gravity.sh } -setUser(){ +create_pihole_user(){ # Check if user pihole exists and create if not echo "::: Checking if user 'pihole' exists..." - if id -u pihole > /dev/null 2>&1; then - echo "::: User 'pihole' already exists" - else - echo "::: User 'pihole' doesn't exist. Creating..." - useradd -r -s /usr/sbin/nologin pihole - fi + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..."; useradd -r -s /usr/sbin/nologin pihole } configureFirewall() { @@ -768,7 +763,7 @@ finalExports() { installPihole() { # Install base files and web interface - setUser + create_pihole_user if [ ! -d "/var/www/html" ]; then mkdir -p /var/www/html fi From e6c0f38a7c287e1f6ba4c06b54446f0aed4eee29 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 02:24:03 -0700 Subject: [PATCH 38/88] Monolithic changes in one commit again. --- automated install/basic-install.sh | 97 +++++++++++++----------------- 1 file changed, 41 insertions(+), 56 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index bb6fba63..dc34810e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -16,7 +16,7 @@ # # curl -L install.pi-hole.net | bash - +set -e ######## VARIABLES ######### @@ -65,25 +65,23 @@ fi if [ -x "$(command -v apt-get)" ];then #Debian Family #Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS) - phpVer="php" - apt-get install --dry-run php5 > /dev/null 2>&1 - if [ $? == 0 ]; then - phpVer="php5" - fi + phpVer="php5" + apt-get install --dry-run php5 > /dev/null 2>&1 || phpVer="php" ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" PKG_UPDATE="$PKG_MANAGER upgrade" PKG_INSTALL="$PKG_MANAGER --yes --quiet install" - PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" - INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) + # grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE + PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true" + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" - package_check() { - dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" + package_check_install() { + dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" } elif [ -x "$(command -v rpm)" ];then # Fedora Family @@ -97,12 +95,12 @@ elif [ -x "$(command -v rpm)" ];then PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" - INSTALLER_DEPS=( iproute net-tools procps-ng newt ) - PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php git curl unzip wget findutils cronie sudo nmap-ncat ) + INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) + PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" - package_check() { + package_check_install() { rpm -qa | grep ^$1- > /dev/null } else @@ -582,13 +580,12 @@ stop_service() { echo " done." } -installerDependencies() { +update_pacakge_cache() { #Running apt-get update/upgrade with minimal output can cause some issues with #requiring user input (e.g password for phpmyadmin see #218) - #We'll change the logic up here, to check to see if there are any updates availible and - # if so, advise the user to run apt-get update/upgrade at their own discretion + #Check to see if apt-get update has already been run today - # it needs to have been run at least once on new installs! + #it needs to have been run at least once on new installs! timestamp=$(stat -c %Y ${PKG_CACHE}) timestampAsDate=$(date -d @"$timestamp" "+%b %e") today=$(date "+%b %e") @@ -600,48 +597,34 @@ installerDependencies() { ${UPDATE_PKG_CACHE} > /dev/null 2>&1 echo " done!" fi +} + +notify_package_updates_available(){ + # Let user know if they have outdated packages on their system and + # advise them to run a package update at soonest possible. echo ":::" echo -n "::: Checking $PKG_MANAGER for upgraded packages...." updatesToInstall=$(eval "${PKG_COUNT}") echo " done!" echo ":::" if [[ ${updatesToInstall} -eq "0" ]]; then - echo "::: Your pi is up to date! Continuing with pi-hole installation..." + echo "::: Your system is up to date! Continuing with Pi-hole installation..." else - echo "::: There are $updatesToInstall updates availible for your pi!" + echo "::: There are $updatesToInstall updates available for your system!" echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo ":::" fi - echo ":::" - echo "::: Checking installer dependencies..." - for i in "${INSTALLER_DEPS[@]}"; do - echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "$i" > /dev/null 2>&1 - echo " done!" - else - echo " already installed!" - fi - done } -checkForDependencies() { - # Install dependencies for Pi-Hole - echo "::: Checking Pi-Hole dependencies:" +install_dependent_packages(){ + # Install packages passed in via argument array + declare -a argArray1=("${!1}") - for i in "${PIHOLE_DEPS[@]}"; do - echo -n "::: Checking for $i..." - package_check ${i} > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "$i" > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi - done + for i in "${argArray1[@]}"; do + echo -n "::: Checking for $i..." + package_check_install ${i} > /dev/null + echo " installed!" + done } getGitFiles() { @@ -819,14 +802,8 @@ configureSelinux() { if [ -x "$(command -v getenforce)" ]; then printf "\n::: SELinux Detected\n" printf ":::\tChecking for SELinux policy development packages..." - package_check "selinux-policy-devel" > /dev/null - if ! [ $? -eq 0 ]; then - echo -n " Not found! Installing...." - ${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $! - echo " done!" - else - echo " already installed!" - fi + package_check_install "selinux-policy-devel" > /dev/null + echo " installed!" printf "::: Enabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on if [ $? -eq 0 ]; then @@ -904,8 +881,14 @@ else verifyFreeDiskSpace fi +# Update package cache +update_pacakge_cache + +# Notify user of package availability +notify_package_updates_available + # Install packages used by this installation script -installerDependencies +install_dependent_packages INSTALLER_DEPS[@] if [[ ${useUpdateVars} == false ]]; then # Display welcome dialogs @@ -928,6 +911,8 @@ if [[ ${useUpdateVars} == false ]]; then use4andor6 # Decide what upstream DNS Servers to use setDNS + # Install packages used by the Pi-hole + install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else From 93a591d487603da88a2e11d962825c63e2238f3a Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 02:57:04 -0700 Subject: [PATCH 39/88] Linting from ShellCheck --- automated install/basic-install.sh | 48 ++++++++++++++++-------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index dc34810e..6b85d74d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -101,7 +101,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" package_check_install() { - rpm -qa | grep ^$1- > /dev/null + rpm -qa | grep ^"$1"- > /dev/null } else echo "OS distribution not supported" @@ -337,28 +337,30 @@ setStaticIPv4() { elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then # Fedora Family IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface} - if grep -q "$IPv4addr" ${IFCFG_FILE}; then + if grep -q "$IPv4addr" "${IFCFG_FILE}"; then echo "::: Static IP already configured" else - IPADDR=$(echo ${IPv4addr} | cut -f1 -d/) - CIDR=$(echo ${IPv4addr} | cut -f2 -d/) + IPADDR=$(echo "${IPv4addr}" | cut -f1 -d/) + CIDR=$(echo "${IPv4addr}" | cut -f2 -d/) # Backup existing interface configuration: - cp ${IFCFG_FILE} ${IFCFG_FILE}.backup-$(date +%Y-%m-%d-%H%M%S) + cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" # Build Interface configuration file: - echo "# Configured via Pi-Hole installer" > ${IFCFG_FILE} - echo "DEVICE=$piholeInterface" >> ${IFCFG_FILE} - echo "BOOTPROTO=none" >> ${IFCFG_FILE} - echo "ONBOOT=yes" >> ${IFCFG_FILE} - echo "IPADDR=$IPADDR" >> ${IFCFG_FILE} - echo "PREFIX=$CIDR" >> ${IFCFG_FILE} - echo "GATEWAY=$IPv4gw" >> ${IFCFG_FILE} - echo "DNS1=$piholeDNS1" >> ${IFCFG_FILE} - echo "DNS2=$piholeDNS2" >> ${IFCFG_FILE} - echo "USERCTL=no" >> ${IFCFG_FILE} + { + echo "# Configured via Pi-Hole installer" + echo "DEVICE=$piholeInterface" + echo "BOOTPROTO=none" + echo "ONBOOT=yes" + echo "IPADDR=$IPADDR" + echo "PREFIX=$CIDR" + echo "GATEWAY=$IPv4gw" + echo "DNS1=$piholeDNS1" + echo "DNS2=$piholeDNS2" + echo "USERCTL=no" + }>> "${IFCFG_FILE}" ip addr replace dev "$piholeInterface" "$IPv4addr" if [ -x "$(command -v nmcli)" ];then # Tell NetworkManager to read our new sysconfig file - nmcli con load ${IFCFG_FILE} > /dev/null + nmcli con load "${IFCFG_FILE}" > /dev/null fi echo ":::" echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." @@ -622,7 +624,7 @@ install_dependent_packages(){ for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." - package_check_install ${i} > /dev/null + package_check_install "${i}" > /dev/null echo " installed!" done } @@ -753,11 +755,13 @@ finalExports() { if [[ -f ${setupVars} ]];then rm ${setupVars} fi - echo "piholeInterface=${piholeInterface}" >> ${setupVars} - echo "IPv4addr=${IPv4addr}" >> ${setupVars} - echo "piholeIPv6=${piholeIPv6}" >> ${setupVars} - echo "piholeDNS1=${piholeDNS1}" >> ${setupVars} - echo "piholeDNS2=${piholeDNS2}" >> ${setupVars} + { + echo "piholeInterface=${piholeInterface}" + echo "IPv4addr=${IPv4addr}" + echo "piholeIPv6=${piholeIPv6}" + echo "piholeDNS1=${piholeDNS1}" + echo "piholeDNS2=${piholeDNS2}" + }>> "${setupVars}" } From 84b8953352f42058c004f20ac0d485ee30be911d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 02:58:38 -0700 Subject: [PATCH 40/88] Remove quiet flags from package managment variables. Set quiets in functions by redirecting output. --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6b85d74d..5e8e763f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -70,9 +70,9 @@ if [ -x "$(command -v apt-get)" ];then ############################################# PKG_MANAGER="apt-get" PKG_CACHE="/var/lib/apt/lists/" - UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" + UPDATE_PKG_CACHE="$PKG_MANAGER update" PKG_UPDATE="$PKG_MANAGER upgrade" - PKG_INSTALL="$PKG_MANAGER --yes --quiet install" + PKG_INSTALL="$PKG_MANAGER --yes --fix-missing install" # grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true" INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) @@ -91,7 +91,7 @@ elif [ -x "$(command -v rpm)" ];then PKG_MANAGER="yum" fi PKG_CACHE="/var/cache/$PKG_MANAGER" - UPDATE_PKG_CACHE="$PKG_MANAGER check-update -q" + UPDATE_PKG_CACHE="$PKG_MANAGER check-update" PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" From b055f190f5c41a1bc28a7b0d5f0e8a6099d5d073 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 03:16:22 -0700 Subject: [PATCH 41/88] Factor out interfaces detection. --- automated install/basic-install.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 5e8e763f..25d62163 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -129,9 +129,12 @@ findIPRoute() { IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}') IPv4addr=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') - availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1) } +get_available_interfaces() { + # Get available interfaces. Consider only getting UP interfaces in the future, and leaving DOWN interfaces out of list. + availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1) +} welcomeDialogs() { # Display the welcome dialog @@ -907,6 +910,8 @@ if [[ ${useUpdateVars} == false ]]; then # Stop resolver and webserver while installing proceses stop_service dnsmasq stop_service lighttpd + # Determine available interfaces + get_available_interfaces # Find IP used to route to outside world findIPRoute # Find interfaces and let the user choose one From 5ab5b1a1900ddf7e229366c233bdcd7b2f868989 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 03:23:52 -0700 Subject: [PATCH 42/88] Overhaul dnsmasq version 3 way handshake configuration files. --- automated install/basic-install.sh | 42 +++++++++++++++--------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 25d62163..e6d11a2c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -484,49 +484,49 @@ setDNS(){ fi } -versionCheckDNSmasq(){ +version_check_dnsmasq(){ # Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory - dnsFile1="/etc/dnsmasq.conf" - dnsFile2="/etc/dnsmasq.conf.orig" - dnsSearch="addn-hosts=/etc/pihole/gravity.list" - defaultFile="/etc/.pihole/advanced/dnsmasq.conf.original" - newFileToInstall="/etc/.pihole/advanced/01-pihole.conf" - newFileFinalLocation="/etc/dnsmasq.d/01-pihole.conf" - - if [ -f ${dnsFile1} ]; then + local dnsmasq_conf="/etc/dnsmasq.conf" + local dnsmasq_conf_orig="/etc/dnsmasq.conf.orig" + local dnsmasq_pihole_id_string="addn-hosts=/etc/pihole/gravity.list" + local dnsmasq_original_config="/etc/.pihole/advanced/dnsmasq.conf.original" + local dnsmasq_pihole_01_snippet="/etc/.pihole/advanced/01-pihole.conf" + local dnsmasq_pihole_01_location="/etc/dnsmasq.d/01-pihole.conf" + + if [ -f ${dnsmasq_conf} ]; then echo -n "::: Existing dnsmasq.conf found..." - if grep -q ${dnsSearch} ${dnsFile1}; then + if grep -q ${dnsmasq_pihole_id_string} ${dnsmasq_conf}; then echo " it is from a previous pi-hole install." echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..." - mv -f ${dnsFile1} ${dnsFile2} + mv -f ${dnsmasq_conf} ${dnsmasq_conf_orig} echo " done." echo -n "::: Restoring default dnsmasq.conf..." - cp ${defaultFile} ${dnsFile1} + cp ${dnsmasq_original_config} ${dnsmasq_conf} echo " done." else echo " it is not a pi-hole file, leaving alone!" fi else echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..." - cp ${defaultFile} ${dnsFile1} + cp ${dnsmasq_original_config} ${dnsmasq_conf} echo " done." fi echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..." - cp ${newFileToInstall} ${newFileFinalLocation} + cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location} echo " done." - sed -i "s/@INT@/$piholeInterface/" ${newFileFinalLocation} + sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location} if [[ "$piholeDNS1" != "" ]]; then - sed -i "s/@DNS1@/$piholeDNS1/" ${newFileFinalLocation} + sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location} else - sed -i '/^server=@DNS1@/d' ${newFileFinalLocation} + sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location} fi if [[ "$piholeDNS2" != "" ]]; then - sed -i "s/@DNS2@/$piholeDNS2/" ${newFileFinalLocation} + sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location} else - sed -i '/^server=@DNS2@/d' ${newFileFinalLocation} + sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location} fi - sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1} + sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf} } remove_legacy_scripts(){ @@ -559,7 +559,7 @@ installConfigs() { # Install the configs from /etc/.pihole to their various locations echo ":::" echo "::: Installing configs..." - versionCheckDNSmasq + version_check_dnsmasq if [ ! -d "/etc/lighttpd" ]; then mkdir /etc/lighttpd chown "$USER":root /etc/lighttpd From bc14074d2ab78a4cc65d0ae46d1cb9186ea62166 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 03:39:32 -0700 Subject: [PATCH 43/88] Tighten up Update Whiptail appearance. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index e6d11a2c..1b2fd61d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -845,7 +845,7 @@ View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" $ update_dialogs(){ - UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "We have detected an existing install.\n\n Please chose from the following options:" ${r} ${c} 2 \ + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease chose from the following options:" ${r} ${c} 2 \ "Update" "Update install will retain existing settings." \ "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) From 47aad254d85c4f6713df906c02679426c01e0d7b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 03:56:03 -0700 Subject: [PATCH 44/88] localized some more variables --- automated install/basic-install.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 1b2fd61d..896ca741 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -185,8 +185,15 @@ verifyFreeDiskSpace() { chooseInterface() { # Turn the available interfaces into an array so it can be used with a whiptail dialog - interfacesArray=() - firstLoop=1 + local interfacesArray=() + # Number of available interfaces + local interfaceCount + # Whiptail variable storage + local chooseInterfaceCmd + # Temporary Whiptail options storage + local chooseInterfaceOptions + # Loop sentinel variable + local firstLoop=1 while read -r line do From 72b95e192e421f33ab2e1eaa5245ed4b24b3b0c9 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 05:45:37 -0700 Subject: [PATCH 45/88] Fix logic bug in `setup_user`, update how setupVars are sourced so they will only be used if the user selects `update` and not if they select `install`. --- automated install/basic-install.sh | 117 ++++++++++++++--------------- 1 file changed, 55 insertions(+), 62 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 896ca741..db04786c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -31,6 +31,9 @@ piholeFilesDir="/etc/.pihole" useUpdateVars=false +IPv4_address="Not Used" +IPv6_address="Not Used" + # Find the rows and columns rows=$(tput lines) columns=$(tput cols) @@ -124,10 +127,10 @@ spinner() printf " \b\b\b\b" } -findIPRoute() { +find_IPv4_information() { # Find IP used to route to outside world IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}') - IPv4addr=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') + IPv4_address=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') } @@ -138,13 +141,13 @@ get_available_interfaces() { welcomeDialogs() { # Display the welcome dialog - whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" ${r} ${c} + whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "\n\nThis installer will transform your device into a network-wide ad blocker!" ${r} ${c} # Support for a part-time dev - whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" ${r} ${c} + whiptail --msgbox --backtitle "Plea" --title "Free and open source" "\n\nThe Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" ${r} ${c} # Explain the need for a static address - whiptail --msgbox --backtitle "Initiating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. + whiptail --msgbox --backtitle "Initiating network interface" --title "Static IP Needed" "\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." ${r} ${c} } @@ -219,10 +222,18 @@ chooseInterface() { echo "::: Cancel selected, exiting...." exit 1 fi +} +useIPv6dialog() { + # Show the IPv6 address used for blocking + IPv6_address=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') + whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$IPv6_address will be used to block ads." ${r} ${c} } + use4andor6() { + local useIPv4 + local useIPv6 # Let use select IPv4 and/or IPv6 cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" ${r} ${c} 2) options=(IPv4 "Block ads over IPv4" on @@ -236,47 +247,31 @@ use4andor6() { IPv6 ) useIPv6=true;; esac done - - if [ ${useIPv4} ] && [ ! ${useIPv6} ]; then - getStaticIPv4Settings - setStaticIPv4 - echo "::: Using IPv4 on $IPv4addr" - echo "::: IPv6 will NOT be used." - fi - if [ ! ${useIPv4} ] && [ ${useIPv6} ]; then - useIPv6dialog - echo "::: IPv4 will NOT be used." - echo "::: Using IPv6 on $piholeIPv6" - fi - if [ ${useIPv4} ] && [ ${useIPv6} ]; then - getStaticIPv4Settings - setStaticIPv4 - useIPv6dialog - echo "::: Using IPv4 on $IPv4addr" - echo "::: Using IPv6 on $piholeIPv6" + if [[ ${useIPv4} ]]; then + find_IPv4_information + getStaticIPv4Settings + setStaticIPv4 fi + if [[ ${useIPv6} ]]; then + useIPv6dialog + fi + echo "::: IPv4 address: ${IPv4_address}" + echo "::: IPv6 address: ${IPv6_address}" if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then echo "::: Cannot continue, neither IPv4 or IPv6 selected" echo "::: Exiting" exit 1 fi - else echo "::: Cancel selected. Exiting..." exit 1 fi } -useIPv6dialog() { - # Show the IPv6 address used for blocking - piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') - whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." ${r} ${c} -} - getStaticIPv4Settings() { # Ask if the user wants to use DHCP settings as their static IP if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? - IP address: $IPv4addr + IP address: $IPv4_address Gateway: $IPv4gw" ${r} ${c}); then # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. @@ -290,16 +285,16 @@ It is also possible to use a DHCP reservation, but if you are going to do that, until [[ ${ipSettingsCorrect} = True ]] do # Ask for the IPv4 address - IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4addr" 3>&1 1>&2 2>&3) + IPv4_address=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4_address" 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then - echo "::: Your static IPv4 address: $IPv4addr" + echo "::: Your static IPv4 address: $IPv4_address" # Ask for the gateway IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" ${r} ${c} "$IPv4gw" 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "::: Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct? - IP address: $IPv4addr + IP address: $IPv4_address Gateway: $IPv4gw" ${r} ${c}); then # After that's done, the loop ends and we move on ipSettingsCorrect=True @@ -327,7 +322,7 @@ It is also possible to use a DHCP reservation, but if you are going to do that, setDHCPCD() { # Append these lines to dhcpcd.conf to enable a static IP echo "## interface $piholeInterface - static ip_address=$IPv4addr + static ip_address=$IPv4_address static routers=$IPv4gw static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null } @@ -335,23 +330,23 @@ setDHCPCD() { setStaticIPv4() { if [[ -f /etc/dhcpcd.conf ]];then # Debian Family - if grep -q "$IPv4addr" /etc/dhcpcd.conf; then + if grep -q "$IPv4_address" /etc/dhcpcd.conf; then echo "::: Static IP already configured" else setDHCPCD - ip addr replace dev "$piholeInterface" "$IPv4addr" + ip addr replace dev "$piholeInterface" "$IPv4_address" echo ":::" - echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." + echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete." echo ":::" fi elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then # Fedora Family IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface} - if grep -q "$IPv4addr" "${IFCFG_FILE}"; then + if grep -q "$IPv4_address" "${IFCFG_FILE}"; then echo "::: Static IP already configured" else - IPADDR=$(echo "${IPv4addr}" | cut -f1 -d/) - CIDR=$(echo "${IPv4addr}" | cut -f2 -d/) + IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) + CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) # Backup existing interface configuration: cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" # Build Interface configuration file: @@ -367,13 +362,13 @@ setStaticIPv4() { echo "DNS2=$piholeDNS2" echo "USERCTL=no" }>> "${IFCFG_FILE}" - ip addr replace dev "$piholeInterface" "$IPv4addr" + ip addr replace dev "$piholeInterface" "$IPv4_address" if [ -x "$(command -v nmcli)" ];then # Tell NetworkManager to read our new sysconfig file nmcli con load "${IFCFG_FILE}" > /dev/null fi echo ":::" - echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." + echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete." echo ":::" fi @@ -736,7 +731,7 @@ runGravity() { create_pihole_user(){ # Check if user pihole exists and create if not echo "::: Checking if user 'pihole' exists..." - id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..."; useradd -r -s /usr/sbin/nologin pihole + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. && Creating..." useradd -r -s /usr/sbin/nologin pihole } configureFirewall() { @@ -767,11 +762,11 @@ finalExports() { fi { echo "piholeInterface=${piholeInterface}" - echo "IPv4addr=${IPv4addr}" - echo "piholeIPv6=${piholeIPv6}" + echo "IPv4_address=${IPv4_address}" + echo "IPv6_address=${IPv6_address}" echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS2=${piholeDNS2}" - }>> "${setupVars}" + }>> "${setupVars}" } @@ -841,13 +836,13 @@ displayFinalMessage() { # Final completion message to user whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using: -IPv4: ${IPv4addr%/*} -IPv6: $piholeIPv6 +IPv4: ${IPv4_address%/*} +IPv6: $IPv6_address If you set a new IP address, you should restart the Pi. The install log is in /etc/pihole. -View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" ${r} ${c} +View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" ${r} ${c} } update_dialogs(){ @@ -860,6 +855,7 @@ update_dialogs(){ case ${UpdateCmd} in Update) echo "::: Updating existing install" + . ${setupVars} useUpdateVars=true ;; Install) @@ -876,14 +872,11 @@ update_dialogs(){ main() { if [[ -f ${setupVars} ]];then - . ${setupVars} - - if [ "$1" == "pihole" ]; then - useUpdateVars=true - else - update_dialogs - fi - + if [ "$1" == "pihole" ]; then + useUpdateVars=true + else + update_dialogs + fi fi # Start the installer @@ -920,7 +913,7 @@ if [[ ${useUpdateVars} == false ]]; then # Determine available interfaces get_available_interfaces # Find IP used to route to outside world - findIPRoute + #find_IPv4_information # Find interfaces and let the user choose one chooseInterface # Let the user decide if they want to block ads over IPv4 and/or IPv6 @@ -959,8 +952,8 @@ echo " done." echo ":::" if [[ ${useUpdateVars} == false ]]; then echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:" - echo "::: ${IPv4addr%/*}" - echo "::: $piholeIPv6" + echo "::: ${IPv4_address%/*}" + echo "::: $IPv6_address" echo ":::" echo "::: If you set a new IP address, you should restart the Pi." else @@ -969,7 +962,7 @@ fi echo ":::" echo "::: The install log is located at: /etc/pihole/install.log" -echo "::: View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" +echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" } main "$@" From 2feec01e10bd8c0183ea59e0dd5c0917abc03287 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 06:06:34 -0700 Subject: [PATCH 46/88] Add `start_service` and `enable_service` functions to handle restating services and setting services to start on reboot. --- automated install/basic-install.sh | 43 +++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 13 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index db04786c..37c68d23 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -582,7 +582,32 @@ stop_service() { if [ -x "$(command -v systemctl)" ]; then systemctl stop "${1}" &> /dev/null & spinner $! || true else - service "${1}" &> /dev/null stop & spinner $! || true + service "${1}" stop &> /dev/null & spinner $! || true + fi + echo " done." +} + +start_service() { + # Start/Restart service passed in as argument + # This should not fail, it's an error if it does + echo ":::" + echo -n "::: Starting ${1} service..." + if [ -x "$(command -v systemctl)" ]; then + systemctl restart "${1}" &> /dev/null & spinner $! + else + service "${1}" restart &> /dev/null & spinner $! + fi + echo " done." +} + +enable_service() { + # Enable service so that it will start with next reboot + echo ":::" + echo -n "::: Enabling ${1} service to start on reboot..." + if [ -x "$(command -v systemctl)" ]; then + systemctl enable "${1}" &> /dev/null & spinner $! + else + update-rc.d "${1}" defaults &> /dev/null & spinner $! fi echo " done." } @@ -912,8 +937,6 @@ if [[ ${useUpdateVars} == false ]]; then stop_service lighttpd # Determine available interfaces get_available_interfaces - # Find IP used to route to outside world - #find_IPv4_information # Find interfaces and let the user choose one chooseInterface # Let the user decide if they want to block ads over IPv4 and/or IPv6 @@ -937,16 +960,10 @@ fi echo -n "::: Restarting services..." # Start services -if [ -x "$(command -v systemctl)" ]; then - systemctl enable dnsmasq - systemctl restart dnsmasq - systemctl enable lighttpd - systemctl start lighttpd -else - service dnsmasq restart - service lighttpd start -fi - +start_service dnsmasq +enable_service dnsmasq +start_service lighttpd +enable_service lighttpd echo " done." echo ":::" From 4f98c1bebbed4539751aaa01b6790159432c8980 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 06:16:00 -0700 Subject: [PATCH 47/88] Boolean operators inside quotes don't work well... --- automated install/basic-install.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 37c68d23..6371d0f6 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -694,7 +694,6 @@ update_repo() { echo " done!" } - CreateLogFile() { # Create logfiles if necessary echo ":::" @@ -756,7 +755,7 @@ runGravity() { create_pihole_user(){ # Check if user pihole exists and create if not echo "::: Checking if user 'pihole' exists..." - id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. && Creating..." useradd -r -s /usr/sbin/nologin pihole + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole } configureFirewall() { From 7ae2fc37c05c41f946ee24f30ebfddbfcca0c8fa Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 06:23:17 -0700 Subject: [PATCH 48/88] Match up descriptive variable names with `setupVars.conf`. Rectifies Ubuntu 16.04 `gravity.list` bug. --- gravity.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 05354c43..33ad92b4 100755 --- a/gravity.sh +++ b/gravity.sh @@ -48,7 +48,7 @@ blacklistScript=/opt/pihole/blacklist.sh #Source the setupVars from install script for the IP . /etc/pihole/setupVars.conf #Remove the /* from the end of the IPv4addr. -IPv4addr=${IPv4addr%/*} +IPv4_address=${IPv4addr%/*} # Variables for various stages of downloading and formatting the list basename=pihole @@ -254,7 +254,7 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n ${piholeIPv6} ]];then + if [[ -n ${IPV6_address} ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) echo -e "$IPv4addr $hostname\n$piholeIPv6 $hostname\n$IPv4addr pi.hole\n$piholeIPv6 pi.hole" > ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} From 07b7e8a1a694f40dbbd0e5f7d887c9499a9d1985 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 06:33:56 -0700 Subject: [PATCH 49/88] Track down a couple more variable name changes. --- gravity.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gravity.sh b/gravity.sh index 33ad92b4..c78af899 100755 --- a/gravity.sh +++ b/gravity.sh @@ -48,7 +48,7 @@ blacklistScript=/opt/pihole/blacklist.sh #Source the setupVars from install script for the IP . /etc/pihole/setupVars.conf #Remove the /* from the end of the IPv4addr. -IPv4_address=${IPv4addr%/*} +IPv4addr=${IPv4_address%/*} # Variables for various stages of downloading and formatting the list basename=pihole @@ -254,10 +254,10 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n ${IPV6_address} ]];then + if [[ -n ${IPv6_address} ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) - echo -e "$IPv4addr $hostname\n$piholeIPv6 $hostname\n$IPv4addr pi.hole\n$piholeIPv6 pi.hole" > ${piholeDir}/${accretionDisc} - cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} + echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} + cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} else # Otherwise, just create gravity.list as normal using IPv4 # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) From b79059ebdb22b102eb700f3b99ed23b13f09579f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 06:46:30 -0700 Subject: [PATCH 50/88] Start to add the spinner back in! --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6371d0f6..e9ac1cf2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -654,7 +654,7 @@ install_dependent_packages(){ for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." - package_check_install "${i}" > /dev/null + package_check_install "${i}" &> /dev/null & spinner $! echo " installed!" done } From 94f6354c94725fddada92fe1ffdf0bfb418c67c4 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 07:25:43 -0700 Subject: [PATCH 51/88] Spinner blocks `set -e` trying to get it in functions that won't crash out... --- automated install/basic-install.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index e9ac1cf2..fbc17174 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -626,7 +626,7 @@ update_pacakge_cache() { #update package lists echo ":::" echo -n "::: $PKG_MANAGER update has not been run today. Running now..." - ${UPDATE_PKG_CACHE} > /dev/null 2>&1 + ${UPDATE_PKG_CACHE} &> /dev/null & spinner $! echo " done!" fi } @@ -650,11 +650,12 @@ notify_package_updates_available(){ install_dependent_packages(){ # Install packages passed in via argument array + # No spinner - conflicts with set -e declare -a argArray1=("${!1}") for i in "${argArray1[@]}"; do echo -n "::: Checking for $i..." - package_check_install "${i}" &> /dev/null & spinner $! + package_check_install "${i}" &> /dev/null echo " installed!" done } From 87e71213323f008bed79a9abb278421361dc4498 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 07:32:16 -0700 Subject: [PATCH 52/88] Gravity.sh checks for null value for variables, obliging that expectation. --- automated install/basic-install.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index fbc17174..7067ecda 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -18,8 +18,6 @@ set -e ######## VARIABLES ######### - - tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log setupVars=/etc/pihole/setupVars.conf @@ -31,8 +29,8 @@ piholeFilesDir="/etc/.pihole" useUpdateVars=false -IPv4_address="Not Used" -IPv6_address="Not Used" +IPv4_address="" +IPv6_address="" # Find the rows and columns rows=$(tput lines) From d71b799e751f794024e46c37de1fa37ea08ade0b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 08:23:14 -0700 Subject: [PATCH 53/88] More cleanups, localize variables, clean formatting. --- automated install/basic-install.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7067ecda..b7db4a7c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -326,6 +326,9 @@ setDHCPCD() { } setStaticIPv4() { + local IFCFG_FILE + local IPADDR + local CIDR if [[ -f /etc/dhcpcd.conf ]];then # Debian Family if grep -q "$IPv4_address" /etc/dhcpcd.conf; then @@ -366,9 +369,8 @@ setStaticIPv4() { nmcli con load "${IFCFG_FILE}" > /dev/null fi echo ":::" - echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete." + echo "::: Setting IP to ${IPv4_address}. You may need to restart after the install is complete." echo ":::" - fi else echo "::: Warning: Unable to locate configuration file to set static IPv4 address!" From e42b6dcc8e15a83354334b72ec607f2eaf1cc3db Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 09:21:28 -0700 Subject: [PATCH 54/88] create_pihole_user update @diginc. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b7db4a7c..99a5cc99 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -756,7 +756,7 @@ runGravity() { create_pihole_user(){ # Check if user pihole exists and create if not echo "::: Checking if user 'pihole' exists..." - id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole) } configureFirewall() { From 74524e024d477903fc7c3d2362aba898392b0932 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 10:36:19 -0700 Subject: [PATCH 55/88] Always check PIHOLE_dependencies. --- automated install/basic-install.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 99a5cc99..6875cf2f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -102,7 +102,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" package_check_install() { - rpm -qa | grep ^"$1"- > /dev/null + rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1" } else echo "OS distribution not supported" @@ -922,6 +922,9 @@ notify_package_updates_available # Install packages used by this installation script install_dependent_packages INSTALLER_DEPS[@] +# Install packages used by the Pi-hole +install_dependent_packages PIHOLE_DEPS[@] + if [[ ${useUpdateVars} == false ]]; then # Display welcome dialogs welcomeDialogs @@ -943,8 +946,6 @@ if [[ ${useUpdateVars} == false ]]; then use4andor6 # Decide what upstream DNS Servers to use setDNS - # Install packages used by the Pi-hole - install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else From 94dd5b1ebe74c673fc56ed27d3c890dc3b7496dd Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:05:29 -0700 Subject: [PATCH 56/88] More CentOS fixes. --- automated install/basic-install.sh | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6875cf2f..ae04af57 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -81,6 +81,7 @@ if [ -x "$(command -v apt-get)" ];then LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" + DNSMASQ_USER="dnsmasq" package_check_install() { dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" } @@ -101,6 +102,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" + DNSMASQ_USER="nobody" package_check_install() { rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1" } @@ -702,7 +704,7 @@ CreateLogFile() { if [ ! -f /var/log/pihole.log ]; then touch /var/log/pihole.log chmod 644 /var/log/pihole.log - chown dnsmasq:root /var/log/pihole.log + chown "${DNSMASQ_USER}":root /var/log/pihole.log echo " done!" else echo " already exists!" @@ -839,21 +841,13 @@ configureSelinux() { package_check_install "selinux-policy-devel" > /dev/null echo " installed!" printf "::: Enabling httpd server side includes (SSI).. " - setsebool -P httpd_ssi_exec on - if [ $? -eq 0 ]; then - echo -n "Success" - fi + setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod semodule -i /etc/pihole/pihole.pp rm -f /etc/pihole/pihole.mod - semodule -l | grep pihole > /dev/null - if [ $? -eq 0 ]; then - printf "::: Successfully installed Pi-Hole SELinux policy\n" - else - printf "::: Warning: Pi-Hole SELinux policy did not install correctly!\n" - fi + semodule -l | grep pihole &> /dev/null && echo "::: Installed Pi-Hole SELinux policy" || echo "::: Warning: Pi-Hole SELinux policy did not install." fi } From 570611fc099a54615cacd322ee27fe551f7571f1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:30:15 -0700 Subject: [PATCH 57/88] CentOS Firewall fix --- automated install/basic-install.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ae04af57..13b6cafd 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -764,14 +764,8 @@ create_pihole_user(){ configureFirewall() { # Allow HTTP and DNS traffic if [ -x "$(command -v firewall-cmd)" ]; then - firewall-cmd --state > /dev/null - if [[ $? -eq 0 ]]; then - echo "::: Configuring firewalld for httpd and dnsmasq.." - firewall-cmd --permanent --add-port=80/tcp - firewall-cmd --permanent --add-port=53/tcp - firewall-cmd --permanent --add-port=53/udp - firewall-cmd --reload - fi + firewall-cmd --state &> /dev/null && ( echo "::: Configuring firewalld for httpd and dnsmasq.." && firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --permanent --add-port=53/tcp \ + && firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload) || echo "::: FirewallD not enabled" elif [ -x "$(command -v iptables)" ]; then echo "::: Configuring iptables for httpd and dnsmasq.." iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT From 4418ca9e9f9cfdc2ce55c9fd1253918b25f31c5d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:41:29 -0700 Subject: [PATCH 58/88] Missing quote replacement. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c78af899..604778e3 100755 --- a/gravity.sh +++ b/gravity.sh @@ -254,7 +254,7 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n ${IPv6_address} ]];then + if [[ -n $"{IPv6_address}" ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} From 4f35aac6dd967c2c2f1edb8713f581f3c90c6c86 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 10 Oct 2016 22:32:30 +0100 Subject: [PATCH 59/88] transpose `$` and `"` --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 604778e3..bcfcc9ee 100755 --- a/gravity.sh +++ b/gravity.sh @@ -254,7 +254,7 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n $"{IPv6_address}" ]];then + if [[ -n "${IPv6_address}" ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} From aa23fb1d56adf297be2491b8448809ada108b7b1 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 10 Oct 2016 22:34:12 +0100 Subject: [PATCH 60/88] choose* --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 13b6cafd..945fa1e1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -398,14 +398,14 @@ function valid_ip() } setDNS(){ - DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6) + DNSChooseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6) DNSChooseOptions=(Google "" on OpenDNS "" off Level3 "" off Norton "" off Comodo "" off Custom "" off) - DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) + DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) if [[ $? = 0 ]];then case ${DNSchoices} in Google) @@ -860,7 +860,7 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi update_dialogs(){ - UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease chose from the following options:" ${r} ${c} 2 \ + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options:" ${r} ${c} 2 \ "Update" "Update install will retain existing settings." \ "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) From fbe35471296856638b4f929c872fef72c67b01ab Mon Sep 17 00:00:00 2001 From: bcambl Date: Tue, 11 Oct 2016 00:01:11 -0600 Subject: [PATCH 61/88] EPEL is not required on Fedora epel-release installs the EPEL package repository (Extra Packages for Enterprise Linux) Dependencies from this repository should available by default on Fedora --- automated install/basic-install.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..5c713030 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -99,6 +99,10 @@ elif [ -x "$(command -v rpm)" ];then PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) + if grep -q 'Fedora' /etc/redhat-release; then + remove_deps=(epel-release); + PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} ); + fi LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" From e5ede16749e71b57587952c742493f6029a5f036 Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:04:20 -0600 Subject: [PATCH 62/88] update yum/dnf package count grepfu see pull #774 --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 5c713030..7ca12943 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -96,7 +96,7 @@ elif [ -x "$(command -v rpm)" ];then UPDATE_PKG_CACHE="$PKG_MANAGER check-update" PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" - PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" + PKG_COUNT="$PKG_MANAGER check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l" INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) if grep -q 'Fedora' /etc/redhat-release; then From f4f8b967885dbe25b928c317fda630a11061bf92 Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:08:22 -0600 Subject: [PATCH 63/88] remove systemd selinux rules on init systems fixes the failing SELinux policy compile on init based systems --- automated install/basic-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7ca12943..2021cc9e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -841,6 +841,9 @@ configureSelinux() { printf "::: Enabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" + if ! [ -x "$(command -v systemctl)" ]; then + sed -i.bak '/systemd/d' /etc/.pihole/advanced/selinux/pihole.te + fi checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod semodule -i /etc/pihole/pihole.pp From 26202014a28bbfa58cf2bc15b87cad4d98c1095a Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:23:12 -0600 Subject: [PATCH 64/88] stdout formatting --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2021cc9e..752a0a1a 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -838,7 +838,7 @@ configureSelinux() { printf ":::\tChecking for SELinux policy development packages..." package_check_install "selinux-policy-devel" > /dev/null echo " installed!" - printf "::: Enabling httpd server side includes (SSI).. " + printf ":::\tEnabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" if ! [ -x "$(command -v systemctl)" ]; then @@ -954,13 +954,13 @@ if [[ ${useUpdateVars} == false ]]; then displayFinalMessage fi -echo -n "::: Restarting services..." +echo "::: Restarting services..." # Start services start_service dnsmasq enable_service dnsmasq start_service lighttpd enable_service lighttpd -echo " done." +echo "::: done." echo ":::" if [[ ${useUpdateVars} == false ]]; then From 99878ae7d6206cd09914a678452011d9b7ca8703 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 15:40:12 +0100 Subject: [PATCH 65/88] reflect name change of some of the variables in setupVars --- automated install/basic-install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..88a6f364 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -817,6 +817,11 @@ installPihole() { } updatePihole() { + # Refactoring of install script has changed the name of a couple of variables. Sort them out here. + sed -i 's/IPv4addr/IPv4_address/g' ${setupVars} + sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} + # Source ${setupVars} for use in the rest of the functions. + . ${setupVars} # Install base files and web interface installScripts installConfigs @@ -868,7 +873,6 @@ update_dialogs(){ case ${UpdateCmd} in Update) echo "::: Updating existing install" - . ${setupVars} useUpdateVars=true ;; Install) From a6fa60868b011d9aa04031e5d1127288d176edad Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 15:41:48 +0100 Subject: [PATCH 66/88] spacing --- automated install/basic-install.sh | 62 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 88a6f364..d7d9ca08 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -792,28 +792,28 @@ finalExports() { installPihole() { - # Install base files and web interface - create_pihole_user - if [ ! -d "/var/www/html" ]; then - mkdir -p /var/www/html - fi - chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html - chmod 775 /var/www/html - usermod -a -G ${LIGHTTPD_GROUP} pihole - if [ -x "$(command -v lighty-enable-mod)" ]; then - lighty-enable-mod fastcgi fastcgi-php > /dev/null || true - else - printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" - fi - installScripts - installConfigs - CreateLogFile - configureSelinux - installPiholeWeb - installCron - configureFirewall - finalExports - runGravity + # Install base files and web interface + create_pihole_user + if [ ! -d "/var/www/html" ]; then + mkdir -p /var/www/html + fi + chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html + chmod 775 /var/www/html + usermod -a -G ${LIGHTTPD_GROUP} pihole + if [ -x "$(command -v lighty-enable-mod)" ]; then + lighty-enable-mod fastcgi fastcgi-php > /dev/null || true + else + printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" + fi + installScripts + installConfigs + CreateLogFile + configureSelinux + installPiholeWeb + installCron + configureFirewall + finalExports + runGravity } updatePihole() { @@ -822,15 +822,15 @@ updatePihole() { sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} # Source ${setupVars} for use in the rest of the functions. . ${setupVars} - # Install base files and web interface - installScripts - installConfigs - CreateLogFile - configureSelinux - installPiholeWeb - installCron - configureFirewall - runGravity + # Install base files and web interface + installScripts + installConfigs + CreateLogFile + configureSelinux + installPiholeWeb + installCron + configureFirewall + runGravity } configureSelinux() { From 5ea08a2120bbe2e771085e9a6f49aba66e25c7c9 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:07:08 +0100 Subject: [PATCH 67/88] add -r to reconfigure pihole (basically runs basic-install.sh from /etc/.pihole) --- pihole | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pihole b/pihole index e0d1715a..b96df225 100755 --- a/pihole +++ b/pihole @@ -116,6 +116,11 @@ function updatePiholeFunc { exit 1 } +function reconfigurePiholeFunc { + ${SUDO} /etc/.pihole/automated\ install/basic-install.sh + exit 1; +} + function updateGravityFunc { ${SUDO} /opt/pihole/gravity.sh "$@" exit 1 @@ -190,6 +195,7 @@ case "$1" in "-d" | "debug" ) debugFunc;; "-f" | "flush" ) flushFunc;; "-up" | "updatePihole" ) updatePiholeFunc;; +"-r" | "reconfigure" ) reconfigurePiholeFunc;; "-g" | "updateGravity" ) updateGravityFunc "$@";; "-s" | "setupLCD" ) setupLCDFunction;; "-c" | "chronometer" ) chronometerFunc "$@";; @@ -198,4 +204,4 @@ case "$1" in "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; * ) helpFunc;; -esac +esac \ No newline at end of file From 5e883239f98eb5ff2f017c6370c9bd37dc686255 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:15:59 +0100 Subject: [PATCH 68/88] remove calls for ${SUDO} as per basic-install.sh. --- pihole | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/pihole b/pihole index b96df225..e1e18898 100755 --- a/pihole +++ b/pihole @@ -12,38 +12,35 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then - #echo "::: You are root." -#else - #echo "::: Sudo will be used for this tool." - # Check if it is actually installed - # If it isn't, exit because the pihole cannot be invoked without privileges. - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this as root." - exit 1 - fi + if [ -x "$(command -v sudo)" ];then + echo "::: Elevating to root with sudo" + exec sudo bash "$0" "$@" + exit $? + else + echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." + exit 1 + fi fi function whitelistFunc { shift - ${SUDO} /opt/pihole/whitelist.sh "$@" + /opt/pihole/whitelist.sh "$@" exit 1 } function blacklistFunc { shift - ${SUDO} /opt/pihole/blacklist.sh "$@" + /opt/pihole/blacklist.sh "$@" exit 1 } function debugFunc { - ${SUDO} /opt/pihole/piholeDebug.sh + /opt/pihole/piholeDebug.sh exit 1 } function flushFunc { - ${SUDO} /opt/pihole/piholeLogFlush.sh + /opt/pihole/piholeLogFlush.sh exit 1 } @@ -86,7 +83,7 @@ function updatePiholeFunc { echo ":::" echo "::: Fetching latest changes from GitHub..." cd /var/www/html/admin - ${SUDO} git pull origin master + git pull origin master echo ":::" echo "::: Pi-hole Web Admin has been updated to ${webVersion}" echo "::: See https://changes.pi-hole.net for details" @@ -101,8 +98,8 @@ function updatePiholeFunc { echo "::: Fetching latest changes from GitHub..." cd /etc/.pihole - ${SUDO} git pull origin master - ${SUDO} /etc/.pihole/automated\ install/basic-install.sh pihole + git pull origin master + /etc/.pihole/automated\ install/basic-install.sh pihole echo ":::" echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" @@ -117,17 +114,17 @@ function updatePiholeFunc { } function reconfigurePiholeFunc { - ${SUDO} /etc/.pihole/automated\ install/basic-install.sh + /etc/.pihole/automated\ install/basic-install.sh exit 1; } function updateGravityFunc { - ${SUDO} /opt/pihole/gravity.sh "$@" + /opt/pihole/gravity.sh "$@" exit 1 } function setupLCDFunction { - ${SUDO} /opt/pihole/setupLCD.sh + /opt/pihole/setupLCD.sh exit 1 } @@ -147,18 +144,18 @@ function queryFunc { function chronometerFunc { shift - ${SUDO} /opt/pihole/chronometer.sh "$@" + /opt/pihole/chronometer.sh "$@" exit 1 } function uninstallFunc { - ${SUDO} /opt/pihole/uninstall.sh + /opt/pihole/uninstall.sh exit 1 } function versionFunc { - ${SUDO} /opt/pihole/version.sh + /opt/pihole/version.sh exit 1 } From 9352ba6e4a76a721cd6ad9d82bca54fc93f26913 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:16:44 +0100 Subject: [PATCH 69/88] about time we exit 0'd --- pihole | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pihole b/pihole index e1e18898..0406d19c 100755 --- a/pihole +++ b/pihole @@ -25,23 +25,23 @@ fi function whitelistFunc { shift /opt/pihole/whitelist.sh "$@" - exit 1 + exit 0 } function blacklistFunc { shift /opt/pihole/blacklist.sh "$@" - exit 1 + exit 0 } function debugFunc { /opt/pihole/piholeDebug.sh - exit 1 + exit 0 } function flushFunc { /opt/pihole/piholeLogFlush.sh - exit 1 + exit 0 } @@ -110,22 +110,22 @@ function updatePiholeFunc { echo "::: See https://changes.pi-hole.net for details" fi - exit 1 + exit 0 } function reconfigurePiholeFunc { /etc/.pihole/automated\ install/basic-install.sh - exit 1; + exit 0; } function updateGravityFunc { /opt/pihole/gravity.sh "$@" - exit 1 + exit 0 } function setupLCDFunction { /opt/pihole/setupLCD.sh - exit 1 + exit 0 } function queryFunc { @@ -139,24 +139,24 @@ function queryFunc { fi echo "" done - exit 1 + exit 0 } function chronometerFunc { shift /opt/pihole/chronometer.sh "$@" - exit 1 + exit 0 } function uninstallFunc { /opt/pihole/uninstall.sh - exit 1 + exit 0 } function versionFunc { /opt/pihole/version.sh - exit 1 + exit 0 } function helpFunc { @@ -178,7 +178,7 @@ function helpFunc { echo "::: -v, version Show current versions" echo "::: -q, query Query the adlists for a specific domain" echo "::: uninstall Uninstall Pi-Hole from your system :(!" - exit 1 + exit 0 } if [[ $# = 0 ]]; then From 461de48625739d36c1113df978b21a4533760cf2 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:25:17 +0100 Subject: [PATCH 70/88] function declarations as per basic-install.sh --- pihole | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pihole b/pihole index 0406d19c..dd50481a 100755 --- a/pihole +++ b/pihole @@ -22,30 +22,30 @@ if [[ ! $EUID -eq 0 ]];then fi fi -function whitelistFunc { +whitelistFunc() { shift /opt/pihole/whitelist.sh "$@" exit 0 } -function blacklistFunc { +blacklistFunc() { shift /opt/pihole/blacklist.sh "$@" exit 0 } -function debugFunc { +debugFunc() { /opt/pihole/piholeDebug.sh exit 0 } -function flushFunc { +flushFunc() { /opt/pihole/piholeLogFlush.sh exit 0 } -function updatePiholeFunc { +updatePiholeFunc() { if [ ! -d "/etc/.pihole" ]; then #This is unlikely echo "::: Critical Error: Pi-Hole repo missing from system!" @@ -113,22 +113,22 @@ function updatePiholeFunc { exit 0 } -function reconfigurePiholeFunc { +reconfigurePiholeFunc() { /etc/.pihole/automated\ install/basic-install.sh exit 0; } -function updateGravityFunc { +updateGravityFunc() { /opt/pihole/gravity.sh "$@" exit 0 } -function setupLCDFunction { +setupLCDFunction() { /opt/pihole/setupLCD.sh exit 0 } -function queryFunc { +queryFunc() { domain=$2 for list in /etc/pihole/list.* do @@ -142,24 +142,24 @@ function queryFunc { exit 0 } -function chronometerFunc { +chronometerFunc() { shift /opt/pihole/chronometer.sh "$@" exit 0 } -function uninstallFunc { +uninstallFunc() { /opt/pihole/uninstall.sh exit 0 } -function versionFunc { +versionFunc() { /opt/pihole/version.sh exit 0 } -function helpFunc { +helpFunc() { echo "::: Control all PiHole specific functions!" echo ":::" echo "::: Usage: pihole [options]" @@ -201,4 +201,4 @@ case "$1" in "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; * ) helpFunc;; -esac \ No newline at end of file +esac From 090fbd04afea455c0fcdfffc20e85d698cb099d4 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:54:04 +0100 Subject: [PATCH 71/88] Remove ${SUDO} usages and root checks from scripts called by `pihole` command as they should not be called directly. --- advanced/Scripts/blacklist.sh | 35 ++++++++------------------- advanced/Scripts/chronometer.sh | 16 ++++++------ advanced/Scripts/setupLCD.sh | 43 +++++++++++---------------------- advanced/Scripts/whitelist.sh | 36 +++++++++------------------ pihole | 16 ++++++------ 5 files changed, 51 insertions(+), 95 deletions(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index a289a9a5..feeca9da 100755 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -10,22 +10,7 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -#rootcheck -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi - -function helpFunc() +helpFunc() { echo "::: Immediately blacklists one or more domains in the hosts file" echo ":::" @@ -86,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') fi -function HandleOther(){ +HandleOther(){ #check validity of domain validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') if [ -z "$validDomain" ]; then @@ -96,7 +81,7 @@ function HandleOther(){ fi } -function PopBlacklistFile(){ +PopBlacklistFile(){ #check blacklist file exists, and if not, create it if [[ ! -f ${blacklist} ]];then touch ${blacklist} @@ -110,7 +95,7 @@ function PopBlacklistFile(){ done } -function AddDomain(){ +AddDomain(){ #| sed 's/\./\\./g' bool=false grep -Ex -q "$1" ${blacklist} || bool=true @@ -129,7 +114,7 @@ function AddDomain(){ fi } -function RemoveDomain(){ +RemoveDomain(){ bool=false grep -Ex -q "$1" ${blacklist} || bool=true @@ -148,7 +133,7 @@ function RemoveDomain(){ fi } -function ModifyHostFile(){ +ModifyHostFile(){ if ${addmode}; then #add domains to the hosts file if [[ -r ${blacklist} ]];then @@ -178,7 +163,7 @@ function ModifyHostFile(){ fi } -function Reload() { +Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." @@ -187,15 +172,15 @@ function Reload() { if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } -function DisplayBlist() { +DisplayBlist() { verbose=false echo -e " Displaying Gravity Affected Domains \n" count=1 diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index eae7cf1c..c03b4649 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -17,7 +17,7 @@ gravity="/etc/pihole/gravity.list" today=$(date "+%b %e") -function CalcBlockedDomains(){ +CalcBlockedDomains(){ CheckIPv6 if [ -e "$gravity" ]; then #Are we IPV6 or IPV4? @@ -33,7 +33,7 @@ function CalcBlockedDomains(){ fi } -function CalcQueriesToday(){ +CalcQueriesToday(){ if [ -e "$piLog" ];then queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l) else @@ -41,7 +41,7 @@ function CalcQueriesToday(){ fi } -function CalcblockedToday(){ +CalcblockedToday(){ if [ -e "$piLog" ] && [ -e "$gravity" ];then blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l) else @@ -49,7 +49,7 @@ function CalcblockedToday(){ fi } -function CalcPercentBlockedToday(){ +CalcPercentBlockedToday(){ if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :) #scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros @@ -61,7 +61,7 @@ function CalcPercentBlockedToday(){ fi } -function CheckIPv6(){ +CheckIPv6(){ piholeIPv6file="/etc/pihole/.useIPv6" if [[ -f ${piholeIPv6file} ]];then # If the file exists, then the user previously chose to use IPv6 in the automated installer @@ -69,7 +69,7 @@ function CheckIPv6(){ fi } -function outputJSON(){ +outputJSON(){ CalcQueriesToday CalcblockedToday CalcPercentBlockedToday @@ -79,7 +79,7 @@ function outputJSON(){ printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday" } -function normalChrono(){ +normalChrono(){ for (( ; ; )) do clear @@ -121,7 +121,7 @@ function normalChrono(){ done } -function displayHelp(){ +displayHelp(){ echo "::: Displays stats about your piHole!" echo ":::" echo "::: Usage: sudo pihole -c [optional:-j]" diff --git a/advanced/Scripts/setupLCD.sh b/advanced/Scripts/setupLCD.sh index c77f1f4a..5ef324fe 100755 --- a/advanced/Scripts/setupLCD.sh +++ b/advanced/Scripts/setupLCD.sh @@ -11,21 +11,6 @@ # (at your option) any later version. ############ FUNCTIONS ########### -# Run this script as root or under sudo -echo ":::" -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi # Borrowed from adafruit-pitft-helper < borrowed from raspi-config # https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334 @@ -45,11 +30,11 @@ getInitSys() { autoLoginPiToConsole() { if [ -e /etc/init.d/lightdm ]; then if [ ${SYSTEMD} -eq 1 ]; then - ${SUDO} systemctl set-default multi-user.target - ${SUDO} ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service + systemctl set-default multi-user.target + ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service else - ${SUDO} update-rc.d lightdm disable 2 - ${SUDO} sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/" + update-rc.d lightdm disable 2 + sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/" fi fi } @@ -66,23 +51,23 @@ echo /usr/local/bin/chronometer.sh >> /home/pi/.bashrc # Set up the LCD screen based on Adafruits instuctions: # https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install -curl -SLs https://apt.adafruit.com/add-pin | ${SUDO} bash -${SUDO} apt-get -y install raspberrypi-bootloader -${SUDO} apt-get -y install adafruit-pitft-helper -${SUDO} adafruit-pitft-helper -t 28r +curl -SLs https://apt.adafruit.com/add-pin | bash +apt-get -y install raspberrypi-bootloader +apt-get -y install adafruit-pitft-helper +adafruit-pitft-helper -t 28r # Download the cmdline.txt file that prevents the screen from going blank after a period of time -${SUDO} mv /boot/cmdline.txt /boot/cmdline.orig -${SUDO} curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt +mv /boot/cmdline.txt /boot/cmdline.orig +curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt # Back up the original file and download the new one -${SUDO} mv /etc/default/console-setup /etc/default/console-setup.orig -${SUDO} curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup +mv /etc/default/console-setup /etc/default/console-setup.orig +curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup # Instantly apply the font change to the LCD screen -${SUDO} setupcon +setupcon -${SUDO} reboot +reboot # Start showing the stats on the screen by running the command on another tty: # http://unix.stackexchange.com/questions/170063/start-a-process-on-a-different-tty diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index 75d62173..d6a09b35 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -10,22 +10,8 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -#rootcheck -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi -function helpFunc() +helpFunc() { echo "::: Immediately whitelists one or more domains in the hosts file" echo ":::" @@ -85,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') fi -function HandleOther(){ +HandleOther(){ #check validity of domain validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') if [ -z "$validDomain" ]; then @@ -95,7 +81,7 @@ function HandleOther(){ fi } -function PopWhitelistFile(){ +PopWhitelistFile(){ #check whitelist file exists, and if not, create it if [[ ! -f ${whitelist} ]];then touch ${whitelist} @@ -110,7 +96,7 @@ function PopWhitelistFile(){ done } -function AddDomain(){ +AddDomain(){ #| sed 's/\./\\./g' bool=false @@ -132,7 +118,7 @@ function AddDomain(){ fi } -function RemoveDomain(){ +RemoveDomain(){ bool=false grep -Ex -q "$1" ${whitelist} || bool=true @@ -151,7 +137,7 @@ function RemoveDomain(){ fi } -function ModifyHostFile(){ +ModifyHostFile(){ if ${addmode}; then #remove domains in from hosts file if [[ -r ${whitelist} ]];then @@ -195,7 +181,7 @@ function ModifyHostFile(){ fi } -function Reload() { +Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." @@ -203,15 +189,15 @@ function Reload() { if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } -function DisplayWlist() { +DisplayWlist() { verbose=false echo -e " Displaying Gravity Resistant Domains \n" count=1 @@ -251,4 +237,4 @@ fi if ${reload}; then Reload -fi +fi \ No newline at end of file diff --git a/pihole b/pihole index dd50481a..30b13403 100755 --- a/pihole +++ b/pihole @@ -12,14 +12,14 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then - if [ -x "$(command -v sudo)" ];then - echo "::: Elevating to root with sudo" - exec sudo bash "$0" "$@" - exit $? - else - echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." - exit 1 - fi + if [ -x "$(command -v sudo)" ];then + echo "::: Elevating to root with sudo" + exec sudo bash "$0" "$@" + exit $? + else + echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." + exit 1 + fi fi whitelistFunc() { From 4c42f00a8636acc8d30b65aff05c826f8a68def4 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 18:42:53 +0100 Subject: [PATCH 72/88] remove uses of ${SUDO} and root check from gravity. As this is handled by `pihole` command. --- gravity.sh | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/gravity.sh b/gravity.sh index bcfcc9ee..94360b70 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,20 +13,6 @@ # Run this script as root or under sudo echo ":::" -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi - function helpFunc() { echo "::: Pull in domains from adlists" @@ -105,13 +91,13 @@ function gravity_collapse() { # Temporary hack to allow non-root access to pihole directory # Will update later, needed for existing installs, new installs should # create this directory as non-root - ${SUDO} chmod 777 ${piholeDir} + chmod 777 ${piholeDir} echo ":::" echo "::: Existing pihole directory found" else echo "::: Creating pihole directory..." mkdir ${piholeDir} - ${SUDO} chmod 777 ${piholeDir} + chmod 777 ${piholeDir} fi } @@ -305,7 +291,7 @@ function gravity_reload() { #Clear no longer needed files... echo ":::" echo -n "::: Cleaning up un-needed files..." - ${SUDO} rm ${piholeDir}/pihole.*.txt + rm ${piholeDir}/pihole.*.txt echo " done!" # Reload hosts file @@ -316,17 +302,17 @@ function gravity_reload() { #First escape forward slashes in the path: adList=${adList//\//\\\/} #Now replace the line in dnsmasq file - ${SUDO} sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf + sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf dnsmasqPid=$(pidof dnsmasq) - find "$piholeDir" -type f -exec ${SUDO} chmod 666 {} \; + find "$piholeDir" -type f -exec chmod 666 {} \; if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } @@ -342,12 +328,12 @@ done if [[ ${forceGrav} == true ]]; then echo -n "::: Deleting exising list cache..." - ${SUDO} rm /etc/pihole/list.* + rm /etc/pihole/list.* echo " done!" fi #Overwrite adlists.default from /etc/.pihole in case any changes have been made. Changes should be saved in /etc/adlists.list -${SUDO} cp /etc/.pihole/adlists.default /etc/pihole/adlists.default +cp /etc/.pihole/adlists.default /etc/pihole/adlists.default gravity_collapse gravity_spinup gravity_Schwarzchild From fc4fe5409989d059f9c11096f07bc5a7191c266a Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:02:57 +0100 Subject: [PATCH 73/88] standardise function naming --- gravity.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/gravity.sh b/gravity.sh index 94360b70..0aaf2b88 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,7 +13,7 @@ # Run this script as root or under sudo echo ":::" -function helpFunc() +helpFunc() { echo "::: Pull in domains from adlists" echo ":::" @@ -54,7 +54,7 @@ fi ########################### # collapse - begin formation of pihole -function gravity_collapse() { +gravity_collapse() { echo "::: Neutrino emissions detected..." echo ":::" #Decide if we're using a custom ad block list, or defaults. @@ -102,7 +102,7 @@ function gravity_collapse() { } # patternCheck - check to see if curl downloaded any new files. -function gravity_patternCheck() { +gravity_patternCheck() { patternBuffer=$1 # check if the patternbuffer is a non-zero length file if [[ -s "$patternBuffer" ]];then @@ -118,7 +118,7 @@ function gravity_patternCheck() { } # transport - curl the specified url with any needed command extentions -function gravity_transport() { +gravity_transport() { url=$1 cmd_ext=$2 agent=$3 @@ -140,7 +140,7 @@ function gravity_transport() { } # spinup - main gravity function -function gravity_spinup() { +gravity_spinup() { echo ":::" # Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines for ((i = 0; i < "${#sources[@]}"; i++)) @@ -177,7 +177,7 @@ function gravity_spinup() { } # Schwarzchild - aggregate domains to one list and add blacklisted domains -function gravity_Schwarzchild() { +gravity_Schwarzchild() { echo "::: " # Find all active domains and compile them into one file and remove CRs echo -n "::: Aggregating list of domains..." @@ -189,7 +189,7 @@ function gravity_Schwarzchild() { echo " done!" } -function gravity_Blacklist(){ +gravity_Blacklist(){ # Append blacklist entries if they exist echo -n "::: Running blacklist script to update HOSTS file...." ${blacklistScript} -f -nr -q > /dev/null @@ -199,7 +199,7 @@ function gravity_Blacklist(){ echo " $numBlacklisted domain${plural} blacklisted!" } -function gravity_Whitelist() { +gravity_Whitelist() { echo ":::" # Prevent our sources from being pulled into the hole plural=; [[ "${sources[@]}" != "1" ]] && plural=s @@ -220,7 +220,7 @@ function gravity_Whitelist() { echo " $numWhitelisted domain${plural} whitelisted!" } -function gravity_unique() { +gravity_unique() { # Sort and remove duplicates echo -n "::: Removing duplicate domains...." sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon} @@ -229,7 +229,7 @@ function gravity_unique() { echo "::: $numberOf unique domains trapped in the event horizon." } -function gravity_hostFormat() { +gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "::: Formatting domains into a HOSTS file..." if [[ -f /etc/hostname ]]; then @@ -256,7 +256,7 @@ function gravity_hostFormat() { } # blackbody - remove any remnant files from script processes -function gravity_blackbody() { +gravity_blackbody() { # Loop through list files for file in ${piholeDir}/*.${justDomainsExtension} do @@ -269,7 +269,7 @@ function gravity_blackbody() { done } -function gravity_advanced() { +gravity_advanced() { # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read @@ -287,7 +287,7 @@ function gravity_advanced() { gravity_unique } -function gravity_reload() { +gravity_reload() { #Clear no longer needed files... echo ":::" echo -n "::: Cleaning up un-needed files..." From 51c4c51d9e1ca21c8454fb999d3691c0eea598a0 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:03:33 +0100 Subject: [PATCH 74/88] Add trap to check existence of setupVars --- gravity.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 0aaf2b88..4ef440a5 100755 --- a/gravity.sh +++ b/gravity.sh @@ -32,7 +32,15 @@ whitelistScript=/opt/pihole/whitelist.sh blacklistScript=/opt/pihole/blacklist.sh #Source the setupVars from install script for the IP -. /etc/pihole/setupVars.conf +setupVars=/etc/pihole/setupVars.conf +if [[ -f ${setupVars} ]];then + . /etc/pihole/setupVars.conf +else + echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." + echo "::: Please run 'pihole -r', and choose the 'install' option to reconfigure." + exit 1 +fi + #Remove the /* from the end of the IPv4addr. IPv4addr=${IPv4_address%/*} From 7ee1110351fe5bffc6cc9de7c29fd24b440c7213 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:09:38 +0100 Subject: [PATCH 75/88] ugh. pihole.conf. --- gravity.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gravity.sh b/gravity.sh index 4ef440a5..5f0606b4 100755 --- a/gravity.sh +++ b/gravity.sh @@ -54,10 +54,9 @@ supernova=${basename}.1.supernova.txt eventHorizon=${basename}.2.eventHorizon.txt accretionDisc=${basename}.3.accretionDisc.txt -# After setting defaults, check if there's local overrides +# Warn users still using pihole.conf that it no longer has any effect (I imagine about 2 people use it) if [[ -r ${piholeDir}/pihole.conf ]];then - echo "::: Local calibration requested..." - . ${piholeDir}/pihole.conf + echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored." fi ########################### From 7e10dcdcf05034416920a8f0c5a3a16557951d34 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:12:16 +0100 Subject: [PATCH 76/88] update pihole bash-completion --- advanced/bash-completion/pihole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/bash-completion/pihole b/advanced/bash-completion/pihole index 2d6aafae..1fae988d 100644 --- a/advanced/bash-completion/pihole +++ b/advanced/bash-completion/pihole @@ -4,7 +4,7 @@ _pihole() COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="blacklist chronometer debug flush help query setupLCD uninstall updateDashboard updateGravity updatePihole version whitelist" + opts="blacklist chronometer debug flush help query reconfigure setupLCD uninstall updateGravity updatePihole version whitelist" COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 From a43577fa26c4c2c9852f4ec9a330101463073025 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:43:03 +0100 Subject: [PATCH 77/88] add reconfigure flag to -r command --- automated install/basic-install.sh | 19 +++++++++++++++++-- pihole | 4 ++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..ccb84667 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -40,6 +40,11 @@ columns=$(tput cols) r=$(( rows / 2 )) c=$(( columns / 2 )) +######## Flags. Shhh ######## +skipSpaceCheck=false +skipRepoUpdate=false +runUnattended=false + ######## FIRST CHECK ######## # Must be root to install echo ":::" @@ -884,8 +889,18 @@ update_dialogs(){ } main() { + +for var in "$@" +do + case "$var" in + "--reconfigure" ) skipRepoUpdate=true;; + "--i_do_not_follow_recommendations" ) skipSpaceCheck=false;; + "--unattended" ) runUnattended=true;; + esac +done + if [[ -f ${setupVars} ]];then - if [ "$1" == "pihole" ]; then + if [ "$runUnattended" = true ]; then useUpdateVars=true else update_dialogs @@ -894,7 +909,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ $1 = "--i_do_not_follow_recommendations" ]]; then +if [[ "$skipSpaceCheck" = true ]]; then echo "::: --i_do_not_follow_recommendations passed to script" echo "::: skipping free disk space verification!" else diff --git a/pihole b/pihole index 30b13403..4ed446be 100755 --- a/pihole +++ b/pihole @@ -99,7 +99,7 @@ updatePiholeFunc() { echo "::: Fetching latest changes from GitHub..." cd /etc/.pihole git pull origin master - /etc/.pihole/automated\ install/basic-install.sh pihole + /etc/.pihole/automated\ install/basic-install.sh --unattended echo ":::" echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" @@ -114,7 +114,7 @@ updatePiholeFunc() { } reconfigurePiholeFunc() { - /etc/.pihole/automated\ install/basic-install.sh + /etc/.pihole/automated\ install/basic-install.sh --reconfigure exit 0; } From e612003293a5b4e217ad61beec386ffeaa6f7510 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:52:20 +0100 Subject: [PATCH 78/88] handle arguments better, convert to flags, echo when they're set to true. --- automated install/basic-install.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ccb84667..9e9a7367 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -40,7 +40,7 @@ columns=$(tput cols) r=$(( rows / 2 )) c=$(( columns / 2 )) -######## Flags. Shhh ######## +######## Undocumented Flags. Shhh ######## skipSpaceCheck=false skipRepoUpdate=false runUnattended=false @@ -890,6 +890,7 @@ update_dialogs(){ main() { +# Check arguments for the undocumented flags for var in "$@" do case "$var" in @@ -901,6 +902,7 @@ done if [[ -f ${setupVars} ]];then if [ "$runUnattended" = true ]; then + echo "::: --unattended passed to install script, no whiptail dialogs will be displayed" useUpdateVars=true else update_dialogs @@ -910,8 +912,7 @@ fi # Start the installer # Verify there is enough disk space for the install if [[ "$skipSpaceCheck" = true ]]; then - echo "::: --i_do_not_follow_recommendations passed to script" - echo "::: skipping free disk space verification!" + echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace fi @@ -928,6 +929,14 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] +if [[ "$skipRepoUpdate" = true ]]; then + echo "::: --reconfigure passed to install script. Not downloading/updating local repos" +else + # Get Git files for Core and Admin + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} +fi + if [[ ${useUpdateVars} == false ]]; then # Display welcome dialogs welcomeDialogs @@ -935,9 +944,6 @@ if [[ ${useUpdateVars} == false ]]; then mkdir -p /etc/pihole/ # Remove legacy scripts from previous storage location remove_legacy_scripts - # Get Git files for Core and Admin - getGitFiles ${piholeFilesDir} ${piholeGitUrl} - getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} # Stop resolver and webserver while installing proceses stop_service dnsmasq stop_service lighttpd From 3a9b39b842086799b2fb3b3a6ff959f33a5088fd Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:12:13 +0100 Subject: [PATCH 79/88] adjust text in update_dialogs() whiptail --- automated install/basic-install.sh | 39 +++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9e9a7367..a5de9863 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -42,7 +42,7 @@ c=$(( columns / 2 )) ######## Undocumented Flags. Shhh ######## skipSpaceCheck=false -skipRepoUpdate=false +reconfigure=false runUnattended=false ######## FIRST CHECK ######## @@ -864,13 +864,25 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi } update_dialogs(){ + # reconfigure + if [ "$reconfigure" = true ]; then + opt1a="Refresh" + opt1b="Refresh will retain existing settings" + strAdd="You will remain on the same version" + else + opt1a="Update" + opt1b="Update will retain existing settings." + strAdd="You will be updated to the latest version." + fi + opt2a="Reconfigure" + opt2b="Reconfigure will allow you to enter new settings" - UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options:" ${r} ${c} 2 \ - "Update" "Update install will retain existing settings." \ - "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \ + "$opt1a" "$opt1b" \ + "$opt2a" "$opt2b" 3>&2 2>&1 1>&3) - if [[ $? = 0 ]];then - case ${UpdateCmd} in + if [[ $? = 0 ]];then + case ${UpdateCmd} in Update) echo "::: Updating existing install" . ${setupVars} @@ -880,21 +892,20 @@ update_dialogs(){ echo "::: Running complete install script" useUpdateVars=false ;; - esac - else - echo "::: Cancel selected. Exiting..." - exit 1 - fi + esac + else + echo "::: Cancel selected. Exiting..." + exit 1 + fi } main() { - # Check arguments for the undocumented flags for var in "$@" do case "$var" in - "--reconfigure" ) skipRepoUpdate=true;; + "--reconfigure" ) reconfigure=true;; "--i_do_not_follow_recommendations" ) skipSpaceCheck=false;; "--unattended" ) runUnattended=true;; esac @@ -929,7 +940,7 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] -if [[ "$skipRepoUpdate" = true ]]; then +if [[ "$reconfigure" = true ]]; then echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else # Get Git files for Core and Admin From 05dadad2e1568ac5f5c383be526f9501197514dc Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:22:46 +0100 Subject: [PATCH 80/88] repair sounds better than refresh --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a5de9863..82ef1a53 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -866,8 +866,8 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi update_dialogs(){ # reconfigure if [ "$reconfigure" = true ]; then - opt1a="Refresh" - opt1b="Refresh will retain existing settings" + opt1a="Repair" + opt1b="Repair will retain existing settings" strAdd="You will remain on the same version" else opt1a="Update" From a65b784907e3d845ffd78f661930916205f0c75b Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:26:41 +0100 Subject: [PATCH 81/88] repeat after me: repetition is a bit repetitive. --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 82ef1a53..00acf333 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -867,15 +867,15 @@ update_dialogs(){ # reconfigure if [ "$reconfigure" = true ]; then opt1a="Repair" - opt1b="Repair will retain existing settings" + opt1b="This will retain existing settings" strAdd="You will remain on the same version" else opt1a="Update" - opt1b="Update will retain existing settings." + opt1b="This will retain existing settings." strAdd="You will be updated to the latest version." fi opt2a="Reconfigure" - opt2b="Reconfigure will allow you to enter new settings" + opt2b="This will allow you to enter new settings" UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \ "$opt1a" "$opt1b" \ From a84c3adeabb95ce2dba9f73ed9db32f84eff5361 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 23:19:26 +0100 Subject: [PATCH 82/88] if uniformity then dan = happy --- automated install/basic-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 00acf333..c4d7c01d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -912,7 +912,7 @@ do done if [[ -f ${setupVars} ]];then - if [ "$runUnattended" = true ]; then + if [[ "${runUnattended}" == true ]]; then echo "::: --unattended passed to install script, no whiptail dialogs will be displayed" useUpdateVars=true else @@ -922,7 +922,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ "$skipSpaceCheck" = true ]]; then +if [[ "${skipSpaceCheck}" ==true ]]; then echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace @@ -940,7 +940,7 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] -if [[ "$reconfigure" = true ]]; then +if [[ "${reconfigure}" == true ]]; then echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else # Get Git files for Core and Admin @@ -975,7 +975,7 @@ fi # Move the log file into /etc/pihole for storage mv ${tmpLog} ${instalLogLoc} -if [[ ${useUpdateVars} == false ]]; then +if [[ "${useUpdateVars}" == false ]]; then displayFinalMessage fi @@ -988,7 +988,7 @@ enable_service lighttpd echo " done." echo ":::" -if [[ ${useUpdateVars} == false ]]; then +if [[ "${useUpdateVars}" == false ]]; then echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:" echo "::: ${IPv4_address%/*}" echo "::: $IPv6_address" From 3884b01503d86f747424d8e96379bfd27b13acc0 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 23:21:13 +0100 Subject: [PATCH 83/88] Forgot a ` ` --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index c4d7c01d..a423f795 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -922,7 +922,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ "${skipSpaceCheck}" ==true ]]; then +if [[ "${skipSpaceCheck}" == true ]]; then echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace From 8c0f860601ac0e906d7871690e7cec49c8448275 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:16:59 +0100 Subject: [PATCH 84/88] Use systemctl/service calls instead of killall to restart/reload dnsmasq --- advanced/Scripts/blacklist.sh | 18 +++++++++++++----- advanced/Scripts/whitelist.sh | 18 +++++++++++++----- gravity.sh | 21 ++++++++++++++------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index feeca9da..8bcf22bf 100755 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -168,14 +168,22 @@ Reload() { echo ":::" echo -n "::: Refresh lists in dnsmasq..." - dnsmasqPid=$(pidof dnsmasq) + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi echo " done!" } diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index d6a09b35..f715a2fd 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -185,14 +185,22 @@ Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." - dnsmasqPid=$(pidof dnsmasq) + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi echo " done!" } diff --git a/gravity.sh b/gravity.sh index 5f0606b4..46be515c 100755 --- a/gravity.sh +++ b/gravity.sh @@ -310,18 +310,25 @@ gravity_reload() { adList=${adList//\//\\\/} #Now replace the line in dnsmasq file sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf - dnsmasqPid=$(pidof dnsmasq) + find "$piholeDir" -type f -exec chmod 666 {} \; - find "$piholeDir" -type f -exec chmod 666 {} \; + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi - echo " done!" } From 42c93917ef112378e78f4bbd1a69ea25ebc923d3 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:19:44 +0100 Subject: [PATCH 85/88] bug I forgot to fix before piholeUpdate was merged to development --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 26f66e0a..361fb089 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -895,11 +895,11 @@ update_dialogs(){ if [[ $? = 0 ]];then case ${UpdateCmd} in - Update) + ${opt1a}) echo "::: Updating existing install" useUpdateVars=true ;; - Install) + ${opt2a}) echo "::: Running complete install script" useUpdateVars=false ;; From 5792fc0befda7117667b9aab9c34cafa4e59e3d5 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:23:26 +0100 Subject: [PATCH 86/88] change wording depending on choice --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 361fb089..0d6ea97b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -896,11 +896,11 @@ update_dialogs(){ if [[ $? = 0 ]];then case ${UpdateCmd} in ${opt1a}) - echo "::: Updating existing install" + echo "::: $opt1a option selected." useUpdateVars=true ;; ${opt2a}) - echo "::: Running complete install script" + echo "::: $opt2a option selected" useUpdateVars=false ;; esac From ee114b307590a94b1c24d983b9e694fca412580b Mon Sep 17 00:00:00 2001 From: bcambl Date: Sun, 16 Oct 2016 13:28:14 -0600 Subject: [PATCH 87/88] use an excluded extension for ifcfg backup --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 0d6ea97b..bfa4eee2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -360,7 +360,7 @@ setStaticIPv4() { IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) # Backup existing interface configuration: - cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" + cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig" # Build Interface configuration file: { echo "# Configured via Pi-Hole installer" From fb9664b6361687676b0f7dc35cd81ddbdb7ee55e Mon Sep 17 00:00:00 2001 From: bcambl Date: Sun, 16 Oct 2016 15:11:47 -0600 Subject: [PATCH 88/88] fix typo --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index bfa4eee2..1fb1a49f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -360,7 +360,7 @@ setStaticIPv4() { IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) # Backup existing interface configuration: - cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig" + cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig # Build Interface configuration file: { echo "# Configured via Pi-Hole installer"