From c39324d11f17b93d59c2daa4d35e20a96d9b84a5 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Fri, 7 Oct 2016 00:24:25 -0700 Subject: [PATCH 01/45] 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 02/45] 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 03/45] 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 44170207ac37896e1990c87649f33b559482ae57 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 8 Oct 2016 12:17:04 -0700 Subject: [PATCH 04/45] 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 05/45] 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 06/45] `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 07/45] 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 08/45] 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 09/45] 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 10/45] 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 11/45] 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 12/45] 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 13/45] 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 14/45] 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 15/45] 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 16/45] 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 17/45] 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 18/45] 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 19/45] 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 20/45] 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 21/45] 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 22/45] 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 23/45] 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 24/45] 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 25/45] 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 26/45] 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 27/45] 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 28/45] 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 29/45] 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 30/45] 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 31/45] 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 32/45] 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 33/45] Overhaul dnsmasq version 3 way handshake configuration files. --- automated install/basic-install.sh | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 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" + 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 ${dnsFile1} ]; then + 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 34/45] 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 35/45] 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 36/45] 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 | 119 ++++++++++++++--------------- 1 file changed, 56 insertions(+), 63 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 37/45] 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 38/45] 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 39/45] 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 40/45] 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 41/45] 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 42/45] 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 43/45] 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 44/45] 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 45/45] 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() {