From 9354799a26b856f9902ff2eff4fe476c62da42bb Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Sat, 8 Oct 2016 12:06:23 -0400 Subject: [PATCH 01/82] Move contributer file This will make it more visible to a user and fixes the link in the PR template. --- .github/CONTRIBUTING.md => CONTRIBUTING.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .github/CONTRIBUTING.md => CONTRIBUTING.md (100%) diff --git a/.github/CONTRIBUTING.md b/CONTRIBUTING.md similarity index 100% rename from .github/CONTRIBUTING.md rename to CONTRIBUTING.md From a30f78c1c8524293ebf3e2994b010a97fa2416bf Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 9 Oct 2016 21:31:36 -0700 Subject: [PATCH 02/82] 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 03/82] 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 04/82] 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 05/82] 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 06/82] 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 07/82] 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 08/82] 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 09/82] 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 10/82] 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 11/82] 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 12/82] 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 13/82] 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 14/82] 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 15/82] 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 16/82] 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 17/82] 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 18/82] 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 19/82] 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 20/82] 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 21/82] 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 22/82] 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 23/82] 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 24/82] 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 25/82] 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 26/82] 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 27/82] 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 28/82] 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 29/82] 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 30/82] 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 31/82] 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 32/82] 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 33/82] 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 34/82] 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 35/82] create_pihole_user update @diginc. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b7db4a7c..99a5cc99 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -756,7 +756,7 @@ runGravity() { create_pihole_user(){ # Check if user pihole exists and create if not echo "::: Checking if user 'pihole' exists..." - id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole) } configureFirewall() { From 74524e024d477903fc7c3d2362aba898392b0932 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 10:36:19 -0700 Subject: [PATCH 36/82] Always check PIHOLE_dependencies. --- automated install/basic-install.sh | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 99a5cc99..6875cf2f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -102,7 +102,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" package_check_install() { - rpm -qa | grep ^"$1"- > /dev/null + rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1" } else echo "OS distribution not supported" @@ -922,6 +922,9 @@ notify_package_updates_available # Install packages used by this installation script install_dependent_packages INSTALLER_DEPS[@] +# Install packages used by the Pi-hole +install_dependent_packages PIHOLE_DEPS[@] + if [[ ${useUpdateVars} == false ]]; then # Display welcome dialogs welcomeDialogs @@ -943,8 +946,6 @@ if [[ ${useUpdateVars} == false ]]; then use4andor6 # Decide what upstream DNS Servers to use setDNS - # Install packages used by the Pi-hole - install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else From 94dd5b1ebe74c673fc56ed27d3c890dc3b7496dd Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:05:29 -0700 Subject: [PATCH 37/82] More CentOS fixes. --- automated install/basic-install.sh | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6875cf2f..ae04af57 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -81,6 +81,7 @@ if [ -x "$(command -v apt-get)" ];then LIGHTTPD_USER="www-data" LIGHTTPD_GROUP="www-data" LIGHTTPD_CFG="lighttpd.conf.debian" + DNSMASQ_USER="dnsmasq" package_check_install() { dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" } @@ -101,6 +102,7 @@ elif [ -x "$(command -v rpm)" ];then LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" + DNSMASQ_USER="nobody" package_check_install() { rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1" } @@ -702,7 +704,7 @@ CreateLogFile() { if [ ! -f /var/log/pihole.log ]; then touch /var/log/pihole.log chmod 644 /var/log/pihole.log - chown dnsmasq:root /var/log/pihole.log + chown "${DNSMASQ_USER}":root /var/log/pihole.log echo " done!" else echo " already exists!" @@ -839,21 +841,13 @@ configureSelinux() { package_check_install "selinux-policy-devel" > /dev/null echo " installed!" printf "::: Enabling httpd server side includes (SSI).. " - setsebool -P httpd_ssi_exec on - if [ $? -eq 0 ]; then - echo -n "Success" - fi + setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod semodule -i /etc/pihole/pihole.pp rm -f /etc/pihole/pihole.mod - semodule -l | grep pihole > /dev/null - if [ $? -eq 0 ]; then - printf "::: Successfully installed Pi-Hole SELinux policy\n" - else - printf "::: Warning: Pi-Hole SELinux policy did not install correctly!\n" - fi + semodule -l | grep pihole &> /dev/null && echo "::: Installed Pi-Hole SELinux policy" || echo "::: Warning: Pi-Hole SELinux policy did not install." fi } From 570611fc099a54615cacd322ee27fe551f7571f1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:30:15 -0700 Subject: [PATCH 38/82] CentOS Firewall fix --- automated install/basic-install.sh | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ae04af57..13b6cafd 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -764,14 +764,8 @@ create_pihole_user(){ configureFirewall() { # Allow HTTP and DNS traffic if [ -x "$(command -v firewall-cmd)" ]; then - firewall-cmd --state > /dev/null - if [[ $? -eq 0 ]]; then - echo "::: Configuring firewalld for httpd and dnsmasq.." - firewall-cmd --permanent --add-port=80/tcp - firewall-cmd --permanent --add-port=53/tcp - firewall-cmd --permanent --add-port=53/udp - firewall-cmd --reload - fi + firewall-cmd --state &> /dev/null && ( echo "::: Configuring firewalld for httpd and dnsmasq.." && firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --permanent --add-port=53/tcp \ + && firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload) || echo "::: FirewallD not enabled" elif [ -x "$(command -v iptables)" ]; then echo "::: Configuring iptables for httpd and dnsmasq.." iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT From 4418ca9e9f9cfdc2ce55c9fd1253918b25f31c5d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 10 Oct 2016 11:41:29 -0700 Subject: [PATCH 39/82] Missing quote replacement. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c78af899..604778e3 100755 --- a/gravity.sh +++ b/gravity.sh @@ -254,7 +254,7 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n ${IPv6_address} ]];then + if [[ -n $"{IPv6_address}" ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} From 4f35aac6dd967c2c2f1edb8713f581f3c90c6c86 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 10 Oct 2016 22:32:30 +0100 Subject: [PATCH 40/82] transpose `$` and `"` --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 604778e3..bcfcc9ee 100755 --- a/gravity.sh +++ b/gravity.sh @@ -254,7 +254,7 @@ function gravity_hostFormat() { echo "::: Error: Unable to determine fully qualified domain name of host" fi # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols - if [[ -n $"{IPv6_address}" ]];then + if [[ -n "${IPv6_address}" ]];then # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} From aa23fb1d56adf297be2491b8448809ada108b7b1 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 10 Oct 2016 22:34:12 +0100 Subject: [PATCH 41/82] choose* --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 13b6cafd..945fa1e1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -398,14 +398,14 @@ function valid_ip() } setDNS(){ - DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6) + DNSChooseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6) DNSChooseOptions=(Google "" on OpenDNS "" off Level3 "" off Norton "" off Comodo "" off Custom "" off) - DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) + DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) if [[ $? = 0 ]];then case ${DNSchoices} in Google) @@ -860,7 +860,7 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi update_dialogs(){ - UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease chose from the following options:" ${r} ${c} 2 \ + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options:" ${r} ${c} 2 \ "Update" "Update install will retain existing settings." \ "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) From fbe35471296856638b4f929c872fef72c67b01ab Mon Sep 17 00:00:00 2001 From: bcambl Date: Tue, 11 Oct 2016 00:01:11 -0600 Subject: [PATCH 42/82] EPEL is not required on Fedora epel-release installs the EPEL package repository (Extra Packages for Enterprise Linux) Dependencies from this repository should available by default on Fedora --- automated install/basic-install.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..5c713030 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -99,6 +99,10 @@ elif [ -x "$(command -v rpm)" ];then PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) + if grep -q 'Fedora' /etc/redhat-release; then + remove_deps=(epel-release); + PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} ); + fi LIGHTTPD_USER="lighttpd" LIGHTTPD_GROUP="lighttpd" LIGHTTPD_CFG="lighttpd.conf.fedora" From e5ede16749e71b57587952c742493f6029a5f036 Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:04:20 -0600 Subject: [PATCH 43/82] update yum/dnf package count grepfu see pull #774 --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 5c713030..7ca12943 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -96,7 +96,7 @@ elif [ -x "$(command -v rpm)" ];then UPDATE_PKG_CACHE="$PKG_MANAGER check-update" PKG_UPDATE="$PKG_MANAGER update -y" PKG_INSTALL="$PKG_MANAGER install -y" - PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" + PKG_COUNT="$PKG_MANAGER check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l" INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) if grep -q 'Fedora' /etc/redhat-release; then From f4f8b967885dbe25b928c317fda630a11061bf92 Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:08:22 -0600 Subject: [PATCH 44/82] remove systemd selinux rules on init systems fixes the failing SELinux policy compile on init based systems --- automated install/basic-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7ca12943..2021cc9e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -841,6 +841,9 @@ configureSelinux() { printf "::: Enabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" + if ! [ -x "$(command -v systemctl)" ]; then + sed -i.bak '/systemd/d' /etc/.pihole/advanced/selinux/pihole.te + fi checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod semodule -i /etc/pihole/pihole.pp From 26202014a28bbfa58cf2bc15b87cad4d98c1095a Mon Sep 17 00:00:00 2001 From: bcambl Date: Wed, 12 Oct 2016 20:23:12 -0600 Subject: [PATCH 45/82] stdout formatting --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2021cc9e..752a0a1a 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -838,7 +838,7 @@ configureSelinux() { printf ":::\tChecking for SELinux policy development packages..." package_check_install "selinux-policy-devel" > /dev/null echo " installed!" - printf "::: Enabling httpd server side includes (SSI).. " + printf ":::\tEnabling httpd server side includes (SSI).. " setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" if ! [ -x "$(command -v systemctl)" ]; then @@ -954,13 +954,13 @@ if [[ ${useUpdateVars} == false ]]; then displayFinalMessage fi -echo -n "::: Restarting services..." +echo "::: Restarting services..." # Start services start_service dnsmasq enable_service dnsmasq start_service lighttpd enable_service lighttpd -echo " done." +echo "::: done." echo ":::" if [[ ${useUpdateVars} == false ]]; then From 99878ae7d6206cd09914a678452011d9b7ca8703 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 15:40:12 +0100 Subject: [PATCH 46/82] reflect name change of some of the variables in setupVars --- automated install/basic-install.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..88a6f364 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -817,6 +817,11 @@ installPihole() { } updatePihole() { + # Refactoring of install script has changed the name of a couple of variables. Sort them out here. + sed -i 's/IPv4addr/IPv4_address/g' ${setupVars} + sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} + # Source ${setupVars} for use in the rest of the functions. + . ${setupVars} # Install base files and web interface installScripts installConfigs @@ -868,7 +873,6 @@ update_dialogs(){ case ${UpdateCmd} in Update) echo "::: Updating existing install" - . ${setupVars} useUpdateVars=true ;; Install) From a6fa60868b011d9aa04031e5d1127288d176edad Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 15:41:48 +0100 Subject: [PATCH 47/82] spacing --- automated install/basic-install.sh | 62 +++++++++++++++--------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 88a6f364..d7d9ca08 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -792,28 +792,28 @@ finalExports() { installPihole() { - # Install base files and web interface - create_pihole_user - if [ ! -d "/var/www/html" ]; then - mkdir -p /var/www/html - fi - chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html - chmod 775 /var/www/html - usermod -a -G ${LIGHTTPD_GROUP} pihole - if [ -x "$(command -v lighty-enable-mod)" ]; then - lighty-enable-mod fastcgi fastcgi-php > /dev/null || true - else - printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" - fi - installScripts - installConfigs - CreateLogFile - configureSelinux - installPiholeWeb - installCron - configureFirewall - finalExports - runGravity + # Install base files and web interface + create_pihole_user + if [ ! -d "/var/www/html" ]; then + mkdir -p /var/www/html + fi + chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html + chmod 775 /var/www/html + usermod -a -G ${LIGHTTPD_GROUP} pihole + if [ -x "$(command -v lighty-enable-mod)" ]; then + lighty-enable-mod fastcgi fastcgi-php > /dev/null || true + else + printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" + fi + installScripts + installConfigs + CreateLogFile + configureSelinux + installPiholeWeb + installCron + configureFirewall + finalExports + runGravity } updatePihole() { @@ -822,15 +822,15 @@ updatePihole() { sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} # Source ${setupVars} for use in the rest of the functions. . ${setupVars} - # Install base files and web interface - installScripts - installConfigs - CreateLogFile - configureSelinux - installPiholeWeb - installCron - configureFirewall - runGravity + # Install base files and web interface + installScripts + installConfigs + CreateLogFile + configureSelinux + installPiholeWeb + installCron + configureFirewall + runGravity } configureSelinux() { From 5ea08a2120bbe2e771085e9a6f49aba66e25c7c9 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:07:08 +0100 Subject: [PATCH 48/82] add -r to reconfigure pihole (basically runs basic-install.sh from /etc/.pihole) --- pihole | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pihole b/pihole index e0d1715a..b96df225 100755 --- a/pihole +++ b/pihole @@ -116,6 +116,11 @@ function updatePiholeFunc { exit 1 } +function reconfigurePiholeFunc { + ${SUDO} /etc/.pihole/automated\ install/basic-install.sh + exit 1; +} + function updateGravityFunc { ${SUDO} /opt/pihole/gravity.sh "$@" exit 1 @@ -190,6 +195,7 @@ case "$1" in "-d" | "debug" ) debugFunc;; "-f" | "flush" ) flushFunc;; "-up" | "updatePihole" ) updatePiholeFunc;; +"-r" | "reconfigure" ) reconfigurePiholeFunc;; "-g" | "updateGravity" ) updateGravityFunc "$@";; "-s" | "setupLCD" ) setupLCDFunction;; "-c" | "chronometer" ) chronometerFunc "$@";; @@ -198,4 +204,4 @@ case "$1" in "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; * ) helpFunc;; -esac +esac \ No newline at end of file From 5e883239f98eb5ff2f017c6370c9bd37dc686255 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:15:59 +0100 Subject: [PATCH 49/82] remove calls for ${SUDO} as per basic-install.sh. --- pihole | 45 +++++++++++++++++++++------------------------ 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/pihole b/pihole index b96df225..e1e18898 100755 --- a/pihole +++ b/pihole @@ -12,38 +12,35 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then - #echo "::: You are root." -#else - #echo "::: Sudo will be used for this tool." - # Check if it is actually installed - # If it isn't, exit because the pihole cannot be invoked without privileges. - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this as root." - exit 1 - fi + if [ -x "$(command -v sudo)" ];then + echo "::: Elevating to root with sudo" + exec sudo bash "$0" "$@" + exit $? + else + echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." + exit 1 + fi fi function whitelistFunc { shift - ${SUDO} /opt/pihole/whitelist.sh "$@" + /opt/pihole/whitelist.sh "$@" exit 1 } function blacklistFunc { shift - ${SUDO} /opt/pihole/blacklist.sh "$@" + /opt/pihole/blacklist.sh "$@" exit 1 } function debugFunc { - ${SUDO} /opt/pihole/piholeDebug.sh + /opt/pihole/piholeDebug.sh exit 1 } function flushFunc { - ${SUDO} /opt/pihole/piholeLogFlush.sh + /opt/pihole/piholeLogFlush.sh exit 1 } @@ -86,7 +83,7 @@ function updatePiholeFunc { echo ":::" echo "::: Fetching latest changes from GitHub..." cd /var/www/html/admin - ${SUDO} git pull origin master + git pull origin master echo ":::" echo "::: Pi-hole Web Admin has been updated to ${webVersion}" echo "::: See https://changes.pi-hole.net for details" @@ -101,8 +98,8 @@ function updatePiholeFunc { echo "::: Fetching latest changes from GitHub..." cd /etc/.pihole - ${SUDO} git pull origin master - ${SUDO} /etc/.pihole/automated\ install/basic-install.sh pihole + git pull origin master + /etc/.pihole/automated\ install/basic-install.sh pihole echo ":::" echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" @@ -117,17 +114,17 @@ function updatePiholeFunc { } function reconfigurePiholeFunc { - ${SUDO} /etc/.pihole/automated\ install/basic-install.sh + /etc/.pihole/automated\ install/basic-install.sh exit 1; } function updateGravityFunc { - ${SUDO} /opt/pihole/gravity.sh "$@" + /opt/pihole/gravity.sh "$@" exit 1 } function setupLCDFunction { - ${SUDO} /opt/pihole/setupLCD.sh + /opt/pihole/setupLCD.sh exit 1 } @@ -147,18 +144,18 @@ function queryFunc { function chronometerFunc { shift - ${SUDO} /opt/pihole/chronometer.sh "$@" + /opt/pihole/chronometer.sh "$@" exit 1 } function uninstallFunc { - ${SUDO} /opt/pihole/uninstall.sh + /opt/pihole/uninstall.sh exit 1 } function versionFunc { - ${SUDO} /opt/pihole/version.sh + /opt/pihole/version.sh exit 1 } From 9352ba6e4a76a721cd6ad9d82bca54fc93f26913 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:16:44 +0100 Subject: [PATCH 50/82] about time we exit 0'd --- pihole | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pihole b/pihole index e1e18898..0406d19c 100755 --- a/pihole +++ b/pihole @@ -25,23 +25,23 @@ fi function whitelistFunc { shift /opt/pihole/whitelist.sh "$@" - exit 1 + exit 0 } function blacklistFunc { shift /opt/pihole/blacklist.sh "$@" - exit 1 + exit 0 } function debugFunc { /opt/pihole/piholeDebug.sh - exit 1 + exit 0 } function flushFunc { /opt/pihole/piholeLogFlush.sh - exit 1 + exit 0 } @@ -110,22 +110,22 @@ function updatePiholeFunc { echo "::: See https://changes.pi-hole.net for details" fi - exit 1 + exit 0 } function reconfigurePiholeFunc { /etc/.pihole/automated\ install/basic-install.sh - exit 1; + exit 0; } function updateGravityFunc { /opt/pihole/gravity.sh "$@" - exit 1 + exit 0 } function setupLCDFunction { /opt/pihole/setupLCD.sh - exit 1 + exit 0 } function queryFunc { @@ -139,24 +139,24 @@ function queryFunc { fi echo "" done - exit 1 + exit 0 } function chronometerFunc { shift /opt/pihole/chronometer.sh "$@" - exit 1 + exit 0 } function uninstallFunc { /opt/pihole/uninstall.sh - exit 1 + exit 0 } function versionFunc { /opt/pihole/version.sh - exit 1 + exit 0 } function helpFunc { @@ -178,7 +178,7 @@ function helpFunc { echo "::: -v, version Show current versions" echo "::: -q, query Query the adlists for a specific domain" echo "::: uninstall Uninstall Pi-Hole from your system :(!" - exit 1 + exit 0 } if [[ $# = 0 ]]; then From 461de48625739d36c1113df978b21a4533760cf2 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:25:17 +0100 Subject: [PATCH 51/82] function declarations as per basic-install.sh --- pihole | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/pihole b/pihole index 0406d19c..dd50481a 100755 --- a/pihole +++ b/pihole @@ -22,30 +22,30 @@ if [[ ! $EUID -eq 0 ]];then fi fi -function whitelistFunc { +whitelistFunc() { shift /opt/pihole/whitelist.sh "$@" exit 0 } -function blacklistFunc { +blacklistFunc() { shift /opt/pihole/blacklist.sh "$@" exit 0 } -function debugFunc { +debugFunc() { /opt/pihole/piholeDebug.sh exit 0 } -function flushFunc { +flushFunc() { /opt/pihole/piholeLogFlush.sh exit 0 } -function updatePiholeFunc { +updatePiholeFunc() { if [ ! -d "/etc/.pihole" ]; then #This is unlikely echo "::: Critical Error: Pi-Hole repo missing from system!" @@ -113,22 +113,22 @@ function updatePiholeFunc { exit 0 } -function reconfigurePiholeFunc { +reconfigurePiholeFunc() { /etc/.pihole/automated\ install/basic-install.sh exit 0; } -function updateGravityFunc { +updateGravityFunc() { /opt/pihole/gravity.sh "$@" exit 0 } -function setupLCDFunction { +setupLCDFunction() { /opt/pihole/setupLCD.sh exit 0 } -function queryFunc { +queryFunc() { domain=$2 for list in /etc/pihole/list.* do @@ -142,24 +142,24 @@ function queryFunc { exit 0 } -function chronometerFunc { +chronometerFunc() { shift /opt/pihole/chronometer.sh "$@" exit 0 } -function uninstallFunc { +uninstallFunc() { /opt/pihole/uninstall.sh exit 0 } -function versionFunc { +versionFunc() { /opt/pihole/version.sh exit 0 } -function helpFunc { +helpFunc() { echo "::: Control all PiHole specific functions!" echo ":::" echo "::: Usage: pihole [options]" @@ -201,4 +201,4 @@ case "$1" in "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; * ) helpFunc;; -esac \ No newline at end of file +esac From 090fbd04afea455c0fcdfffc20e85d698cb099d4 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 17:54:04 +0100 Subject: [PATCH 52/82] Remove ${SUDO} usages and root checks from scripts called by `pihole` command as they should not be called directly. --- advanced/Scripts/blacklist.sh | 35 ++++++++------------------- advanced/Scripts/chronometer.sh | 16 ++++++------ advanced/Scripts/setupLCD.sh | 43 +++++++++++---------------------- advanced/Scripts/whitelist.sh | 36 +++++++++------------------ pihole | 16 ++++++------ 5 files changed, 51 insertions(+), 95 deletions(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index a289a9a5..feeca9da 100755 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -10,22 +10,7 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -#rootcheck -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi - -function helpFunc() +helpFunc() { echo "::: Immediately blacklists one or more domains in the hosts file" echo ":::" @@ -86,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') fi -function HandleOther(){ +HandleOther(){ #check validity of domain validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') if [ -z "$validDomain" ]; then @@ -96,7 +81,7 @@ function HandleOther(){ fi } -function PopBlacklistFile(){ +PopBlacklistFile(){ #check blacklist file exists, and if not, create it if [[ ! -f ${blacklist} ]];then touch ${blacklist} @@ -110,7 +95,7 @@ function PopBlacklistFile(){ done } -function AddDomain(){ +AddDomain(){ #| sed 's/\./\\./g' bool=false grep -Ex -q "$1" ${blacklist} || bool=true @@ -129,7 +114,7 @@ function AddDomain(){ fi } -function RemoveDomain(){ +RemoveDomain(){ bool=false grep -Ex -q "$1" ${blacklist} || bool=true @@ -148,7 +133,7 @@ function RemoveDomain(){ fi } -function ModifyHostFile(){ +ModifyHostFile(){ if ${addmode}; then #add domains to the hosts file if [[ -r ${blacklist} ]];then @@ -178,7 +163,7 @@ function ModifyHostFile(){ fi } -function Reload() { +Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." @@ -187,15 +172,15 @@ function Reload() { if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } -function DisplayBlist() { +DisplayBlist() { verbose=false echo -e " Displaying Gravity Affected Domains \n" count=1 diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index eae7cf1c..c03b4649 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -17,7 +17,7 @@ gravity="/etc/pihole/gravity.list" today=$(date "+%b %e") -function CalcBlockedDomains(){ +CalcBlockedDomains(){ CheckIPv6 if [ -e "$gravity" ]; then #Are we IPV6 or IPV4? @@ -33,7 +33,7 @@ function CalcBlockedDomains(){ fi } -function CalcQueriesToday(){ +CalcQueriesToday(){ if [ -e "$piLog" ];then queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l) else @@ -41,7 +41,7 @@ function CalcQueriesToday(){ fi } -function CalcblockedToday(){ +CalcblockedToday(){ if [ -e "$piLog" ] && [ -e "$gravity" ];then blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l) else @@ -49,7 +49,7 @@ function CalcblockedToday(){ fi } -function CalcPercentBlockedToday(){ +CalcPercentBlockedToday(){ if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :) #scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros @@ -61,7 +61,7 @@ function CalcPercentBlockedToday(){ fi } -function CheckIPv6(){ +CheckIPv6(){ piholeIPv6file="/etc/pihole/.useIPv6" if [[ -f ${piholeIPv6file} ]];then # If the file exists, then the user previously chose to use IPv6 in the automated installer @@ -69,7 +69,7 @@ function CheckIPv6(){ fi } -function outputJSON(){ +outputJSON(){ CalcQueriesToday CalcblockedToday CalcPercentBlockedToday @@ -79,7 +79,7 @@ function outputJSON(){ printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday" } -function normalChrono(){ +normalChrono(){ for (( ; ; )) do clear @@ -121,7 +121,7 @@ function normalChrono(){ done } -function displayHelp(){ +displayHelp(){ echo "::: Displays stats about your piHole!" echo ":::" echo "::: Usage: sudo pihole -c [optional:-j]" diff --git a/advanced/Scripts/setupLCD.sh b/advanced/Scripts/setupLCD.sh index c77f1f4a..5ef324fe 100755 --- a/advanced/Scripts/setupLCD.sh +++ b/advanced/Scripts/setupLCD.sh @@ -11,21 +11,6 @@ # (at your option) any later version. ############ FUNCTIONS ########### -# Run this script as root or under sudo -echo ":::" -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi # Borrowed from adafruit-pitft-helper < borrowed from raspi-config # https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334 @@ -45,11 +30,11 @@ getInitSys() { autoLoginPiToConsole() { if [ -e /etc/init.d/lightdm ]; then if [ ${SYSTEMD} -eq 1 ]; then - ${SUDO} systemctl set-default multi-user.target - ${SUDO} ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service + systemctl set-default multi-user.target + ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service else - ${SUDO} update-rc.d lightdm disable 2 - ${SUDO} sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/" + update-rc.d lightdm disable 2 + sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/" fi fi } @@ -66,23 +51,23 @@ echo /usr/local/bin/chronometer.sh >> /home/pi/.bashrc # Set up the LCD screen based on Adafruits instuctions: # https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install -curl -SLs https://apt.adafruit.com/add-pin | ${SUDO} bash -${SUDO} apt-get -y install raspberrypi-bootloader -${SUDO} apt-get -y install adafruit-pitft-helper -${SUDO} adafruit-pitft-helper -t 28r +curl -SLs https://apt.adafruit.com/add-pin | bash +apt-get -y install raspberrypi-bootloader +apt-get -y install adafruit-pitft-helper +adafruit-pitft-helper -t 28r # Download the cmdline.txt file that prevents the screen from going blank after a period of time -${SUDO} mv /boot/cmdline.txt /boot/cmdline.orig -${SUDO} curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt +mv /boot/cmdline.txt /boot/cmdline.orig +curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt # Back up the original file and download the new one -${SUDO} mv /etc/default/console-setup /etc/default/console-setup.orig -${SUDO} curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup +mv /etc/default/console-setup /etc/default/console-setup.orig +curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup # Instantly apply the font change to the LCD screen -${SUDO} setupcon +setupcon -${SUDO} reboot +reboot # Start showing the stats on the screen by running the command on another tty: # http://unix.stackexchange.com/questions/170063/start-a-process-on-a-different-tty diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index 75d62173..d6a09b35 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -10,22 +10,8 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -#rootcheck -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi -function helpFunc() +helpFunc() { echo "::: Immediately whitelists one or more domains in the hosts file" echo ":::" @@ -85,7 +71,7 @@ if [[ -f ${piholeIPv6file} ]];then piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') fi -function HandleOther(){ +HandleOther(){ #check validity of domain validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') if [ -z "$validDomain" ]; then @@ -95,7 +81,7 @@ function HandleOther(){ fi } -function PopWhitelistFile(){ +PopWhitelistFile(){ #check whitelist file exists, and if not, create it if [[ ! -f ${whitelist} ]];then touch ${whitelist} @@ -110,7 +96,7 @@ function PopWhitelistFile(){ done } -function AddDomain(){ +AddDomain(){ #| sed 's/\./\\./g' bool=false @@ -132,7 +118,7 @@ function AddDomain(){ fi } -function RemoveDomain(){ +RemoveDomain(){ bool=false grep -Ex -q "$1" ${whitelist} || bool=true @@ -151,7 +137,7 @@ function RemoveDomain(){ fi } -function ModifyHostFile(){ +ModifyHostFile(){ if ${addmode}; then #remove domains in from hosts file if [[ -r ${whitelist} ]];then @@ -195,7 +181,7 @@ function ModifyHostFile(){ fi } -function Reload() { +Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." @@ -203,15 +189,15 @@ function Reload() { if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } -function DisplayWlist() { +DisplayWlist() { verbose=false echo -e " Displaying Gravity Resistant Domains \n" count=1 @@ -251,4 +237,4 @@ fi if ${reload}; then Reload -fi +fi \ No newline at end of file diff --git a/pihole b/pihole index dd50481a..30b13403 100755 --- a/pihole +++ b/pihole @@ -12,14 +12,14 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then - if [ -x "$(command -v sudo)" ];then - echo "::: Elevating to root with sudo" - exec sudo bash "$0" "$@" - exit $? - else - echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." - exit 1 - fi + if [ -x "$(command -v sudo)" ];then + echo "::: Elevating to root with sudo" + exec sudo bash "$0" "$@" + exit $? + else + echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." + exit 1 + fi fi whitelistFunc() { From 4c42f00a8636acc8d30b65aff05c826f8a68def4 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 18:42:53 +0100 Subject: [PATCH 53/82] remove uses of ${SUDO} and root check from gravity. As this is handled by `pihole` command. --- gravity.sh | 32 +++++++++----------------------- 1 file changed, 9 insertions(+), 23 deletions(-) diff --git a/gravity.sh b/gravity.sh index bcfcc9ee..94360b70 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,20 +13,6 @@ # Run this script as root or under sudo echo ":::" -if [[ $EUID -eq 0 ]];then - echo "::: You are root." -else - echo "::: sudo will be used." - # Check if it is actually installed - # If it isn't, exit because the install cannot complete - if [ -x "$(command -v sudo)" ];then - export SUDO="sudo" - else - echo "::: Please install sudo or run this script as root." - exit 1 - fi -fi - function helpFunc() { echo "::: Pull in domains from adlists" @@ -105,13 +91,13 @@ function gravity_collapse() { # Temporary hack to allow non-root access to pihole directory # Will update later, needed for existing installs, new installs should # create this directory as non-root - ${SUDO} chmod 777 ${piholeDir} + chmod 777 ${piholeDir} echo ":::" echo "::: Existing pihole directory found" else echo "::: Creating pihole directory..." mkdir ${piholeDir} - ${SUDO} chmod 777 ${piholeDir} + chmod 777 ${piholeDir} fi } @@ -305,7 +291,7 @@ function gravity_reload() { #Clear no longer needed files... echo ":::" echo -n "::: Cleaning up un-needed files..." - ${SUDO} rm ${piholeDir}/pihole.*.txt + rm ${piholeDir}/pihole.*.txt echo " done!" # Reload hosts file @@ -316,17 +302,17 @@ function gravity_reload() { #First escape forward slashes in the path: adList=${adList//\//\\\/} #Now replace the line in dnsmasq file - ${SUDO} sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf + sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf dnsmasqPid=$(pidof dnsmasq) - find "$piholeDir" -type f -exec ${SUDO} chmod 666 {} \; + find "$piholeDir" -type f -exec chmod 666 {} \; if [[ ${dnsmasqPid} ]]; then # service already running - reload config - ${SUDO} killall -s HUP dnsmasq + killall -s HUP dnsmasq else # service not running, start it up - ${SUDO} service dnsmasq start + service dnsmasq start fi echo " done!" } @@ -342,12 +328,12 @@ done if [[ ${forceGrav} == true ]]; then echo -n "::: Deleting exising list cache..." - ${SUDO} rm /etc/pihole/list.* + rm /etc/pihole/list.* echo " done!" fi #Overwrite adlists.default from /etc/.pihole in case any changes have been made. Changes should be saved in /etc/adlists.list -${SUDO} cp /etc/.pihole/adlists.default /etc/pihole/adlists.default +cp /etc/.pihole/adlists.default /etc/pihole/adlists.default gravity_collapse gravity_spinup gravity_Schwarzchild From fc4fe5409989d059f9c11096f07bc5a7191c266a Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:02:57 +0100 Subject: [PATCH 54/82] standardise function naming --- gravity.sh | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/gravity.sh b/gravity.sh index 94360b70..0aaf2b88 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,7 +13,7 @@ # Run this script as root or under sudo echo ":::" -function helpFunc() +helpFunc() { echo "::: Pull in domains from adlists" echo ":::" @@ -54,7 +54,7 @@ fi ########################### # collapse - begin formation of pihole -function gravity_collapse() { +gravity_collapse() { echo "::: Neutrino emissions detected..." echo ":::" #Decide if we're using a custom ad block list, or defaults. @@ -102,7 +102,7 @@ function gravity_collapse() { } # patternCheck - check to see if curl downloaded any new files. -function gravity_patternCheck() { +gravity_patternCheck() { patternBuffer=$1 # check if the patternbuffer is a non-zero length file if [[ -s "$patternBuffer" ]];then @@ -118,7 +118,7 @@ function gravity_patternCheck() { } # transport - curl the specified url with any needed command extentions -function gravity_transport() { +gravity_transport() { url=$1 cmd_ext=$2 agent=$3 @@ -140,7 +140,7 @@ function gravity_transport() { } # spinup - main gravity function -function gravity_spinup() { +gravity_spinup() { echo ":::" # Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines for ((i = 0; i < "${#sources[@]}"; i++)) @@ -177,7 +177,7 @@ function gravity_spinup() { } # Schwarzchild - aggregate domains to one list and add blacklisted domains -function gravity_Schwarzchild() { +gravity_Schwarzchild() { echo "::: " # Find all active domains and compile them into one file and remove CRs echo -n "::: Aggregating list of domains..." @@ -189,7 +189,7 @@ function gravity_Schwarzchild() { echo " done!" } -function gravity_Blacklist(){ +gravity_Blacklist(){ # Append blacklist entries if they exist echo -n "::: Running blacklist script to update HOSTS file...." ${blacklistScript} -f -nr -q > /dev/null @@ -199,7 +199,7 @@ function gravity_Blacklist(){ echo " $numBlacklisted domain${plural} blacklisted!" } -function gravity_Whitelist() { +gravity_Whitelist() { echo ":::" # Prevent our sources from being pulled into the hole plural=; [[ "${sources[@]}" != "1" ]] && plural=s @@ -220,7 +220,7 @@ function gravity_Whitelist() { echo " $numWhitelisted domain${plural} whitelisted!" } -function gravity_unique() { +gravity_unique() { # Sort and remove duplicates echo -n "::: Removing duplicate domains...." sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon} @@ -229,7 +229,7 @@ function gravity_unique() { echo "::: $numberOf unique domains trapped in the event horizon." } -function gravity_hostFormat() { +gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "::: Formatting domains into a HOSTS file..." if [[ -f /etc/hostname ]]; then @@ -256,7 +256,7 @@ function gravity_hostFormat() { } # blackbody - remove any remnant files from script processes -function gravity_blackbody() { +gravity_blackbody() { # Loop through list files for file in ${piholeDir}/*.${justDomainsExtension} do @@ -269,7 +269,7 @@ function gravity_blackbody() { done } -function gravity_advanced() { +gravity_advanced() { # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read @@ -287,7 +287,7 @@ function gravity_advanced() { gravity_unique } -function gravity_reload() { +gravity_reload() { #Clear no longer needed files... echo ":::" echo -n "::: Cleaning up un-needed files..." From 51c4c51d9e1ca21c8454fb999d3691c0eea598a0 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:03:33 +0100 Subject: [PATCH 55/82] Add trap to check existence of setupVars --- gravity.sh | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 0aaf2b88..4ef440a5 100755 --- a/gravity.sh +++ b/gravity.sh @@ -32,7 +32,15 @@ whitelistScript=/opt/pihole/whitelist.sh blacklistScript=/opt/pihole/blacklist.sh #Source the setupVars from install script for the IP -. /etc/pihole/setupVars.conf +setupVars=/etc/pihole/setupVars.conf +if [[ -f ${setupVars} ]];then + . /etc/pihole/setupVars.conf +else + echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." + echo "::: Please run 'pihole -r', and choose the 'install' option to reconfigure." + exit 1 +fi + #Remove the /* from the end of the IPv4addr. IPv4addr=${IPv4_address%/*} From 7ee1110351fe5bffc6cc9de7c29fd24b440c7213 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:09:38 +0100 Subject: [PATCH 56/82] ugh. pihole.conf. --- gravity.sh | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gravity.sh b/gravity.sh index 4ef440a5..5f0606b4 100755 --- a/gravity.sh +++ b/gravity.sh @@ -54,10 +54,9 @@ supernova=${basename}.1.supernova.txt eventHorizon=${basename}.2.eventHorizon.txt accretionDisc=${basename}.3.accretionDisc.txt -# After setting defaults, check if there's local overrides +# Warn users still using pihole.conf that it no longer has any effect (I imagine about 2 people use it) if [[ -r ${piholeDir}/pihole.conf ]];then - echo "::: Local calibration requested..." - . ${piholeDir}/pihole.conf + echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored." fi ########################### From 7e10dcdcf05034416920a8f0c5a3a16557951d34 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:12:16 +0100 Subject: [PATCH 57/82] update pihole bash-completion --- advanced/bash-completion/pihole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/bash-completion/pihole b/advanced/bash-completion/pihole index 2d6aafae..1fae988d 100644 --- a/advanced/bash-completion/pihole +++ b/advanced/bash-completion/pihole @@ -4,7 +4,7 @@ _pihole() COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" - opts="blacklist chronometer debug flush help query setupLCD uninstall updateDashboard updateGravity updatePihole version whitelist" + opts="blacklist chronometer debug flush help query reconfigure setupLCD uninstall updateGravity updatePihole version whitelist" COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 From a43577fa26c4c2c9852f4ec9a330101463073025 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:43:03 +0100 Subject: [PATCH 58/82] add reconfigure flag to -r command --- automated install/basic-install.sh | 19 +++++++++++++++++-- pihole | 4 ++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..ccb84667 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -40,6 +40,11 @@ columns=$(tput cols) r=$(( rows / 2 )) c=$(( columns / 2 )) +######## Flags. Shhh ######## +skipSpaceCheck=false +skipRepoUpdate=false +runUnattended=false + ######## FIRST CHECK ######## # Must be root to install echo ":::" @@ -884,8 +889,18 @@ update_dialogs(){ } main() { + +for var in "$@" +do + case "$var" in + "--reconfigure" ) skipRepoUpdate=true;; + "--i_do_not_follow_recommendations" ) skipSpaceCheck=false;; + "--unattended" ) runUnattended=true;; + esac +done + if [[ -f ${setupVars} ]];then - if [ "$1" == "pihole" ]; then + if [ "$runUnattended" = true ]; then useUpdateVars=true else update_dialogs @@ -894,7 +909,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ $1 = "--i_do_not_follow_recommendations" ]]; then +if [[ "$skipSpaceCheck" = true ]]; then echo "::: --i_do_not_follow_recommendations passed to script" echo "::: skipping free disk space verification!" else diff --git a/pihole b/pihole index 30b13403..4ed446be 100755 --- a/pihole +++ b/pihole @@ -99,7 +99,7 @@ updatePiholeFunc() { echo "::: Fetching latest changes from GitHub..." cd /etc/.pihole git pull origin master - /etc/.pihole/automated\ install/basic-install.sh pihole + /etc/.pihole/automated\ install/basic-install.sh --unattended echo ":::" echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" @@ -114,7 +114,7 @@ updatePiholeFunc() { } reconfigurePiholeFunc() { - /etc/.pihole/automated\ install/basic-install.sh + /etc/.pihole/automated\ install/basic-install.sh --reconfigure exit 0; } From e612003293a5b4e217ad61beec386ffeaa6f7510 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 20:52:20 +0100 Subject: [PATCH 59/82] handle arguments better, convert to flags, echo when they're set to true. --- automated install/basic-install.sh | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ccb84667..9e9a7367 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -40,7 +40,7 @@ columns=$(tput cols) r=$(( rows / 2 )) c=$(( columns / 2 )) -######## Flags. Shhh ######## +######## Undocumented Flags. Shhh ######## skipSpaceCheck=false skipRepoUpdate=false runUnattended=false @@ -890,6 +890,7 @@ update_dialogs(){ main() { +# Check arguments for the undocumented flags for var in "$@" do case "$var" in @@ -901,6 +902,7 @@ done if [[ -f ${setupVars} ]];then if [ "$runUnattended" = true ]; then + echo "::: --unattended passed to install script, no whiptail dialogs will be displayed" useUpdateVars=true else update_dialogs @@ -910,8 +912,7 @@ fi # Start the installer # Verify there is enough disk space for the install if [[ "$skipSpaceCheck" = true ]]; then - echo "::: --i_do_not_follow_recommendations passed to script" - echo "::: skipping free disk space verification!" + echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace fi @@ -928,6 +929,14 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] +if [[ "$skipRepoUpdate" = true ]]; then + echo "::: --reconfigure passed to install script. Not downloading/updating local repos" +else + # Get Git files for Core and Admin + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} +fi + if [[ ${useUpdateVars} == false ]]; then # Display welcome dialogs welcomeDialogs @@ -935,9 +944,6 @@ if [[ ${useUpdateVars} == false ]]; then mkdir -p /etc/pihole/ # Remove legacy scripts from previous storage location remove_legacy_scripts - # Get Git files for Core and Admin - getGitFiles ${piholeFilesDir} ${piholeGitUrl} - getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} # Stop resolver and webserver while installing proceses stop_service dnsmasq stop_service lighttpd From 3a9b39b842086799b2fb3b3a6ff959f33a5088fd Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:12:13 +0100 Subject: [PATCH 60/82] adjust text in update_dialogs() whiptail --- automated install/basic-install.sh | 39 +++++++++++++++++++----------- 1 file changed, 25 insertions(+), 14 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9e9a7367..a5de9863 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -42,7 +42,7 @@ c=$(( columns / 2 )) ######## Undocumented Flags. Shhh ######## skipSpaceCheck=false -skipRepoUpdate=false +reconfigure=false runUnattended=false ######## FIRST CHECK ######## @@ -864,13 +864,25 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi } update_dialogs(){ + # reconfigure + if [ "$reconfigure" = true ]; then + opt1a="Refresh" + opt1b="Refresh will retain existing settings" + strAdd="You will remain on the same version" + else + opt1a="Update" + opt1b="Update will retain existing settings." + strAdd="You will be updated to the latest version." + fi + opt2a="Reconfigure" + opt2b="Reconfigure will allow you to enter new settings" - UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options:" ${r} ${c} 2 \ - "Update" "Update install will retain existing settings." \ - "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) + UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \ + "$opt1a" "$opt1b" \ + "$opt2a" "$opt2b" 3>&2 2>&1 1>&3) - if [[ $? = 0 ]];then - case ${UpdateCmd} in + if [[ $? = 0 ]];then + case ${UpdateCmd} in Update) echo "::: Updating existing install" . ${setupVars} @@ -880,21 +892,20 @@ update_dialogs(){ echo "::: Running complete install script" useUpdateVars=false ;; - esac - else - echo "::: Cancel selected. Exiting..." - exit 1 - fi + esac + else + echo "::: Cancel selected. Exiting..." + exit 1 + fi } main() { - # Check arguments for the undocumented flags for var in "$@" do case "$var" in - "--reconfigure" ) skipRepoUpdate=true;; + "--reconfigure" ) reconfigure=true;; "--i_do_not_follow_recommendations" ) skipSpaceCheck=false;; "--unattended" ) runUnattended=true;; esac @@ -929,7 +940,7 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] -if [[ "$skipRepoUpdate" = true ]]; then +if [[ "$reconfigure" = true ]]; then echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else # Get Git files for Core and Admin From 05dadad2e1568ac5f5c383be526f9501197514dc Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:22:46 +0100 Subject: [PATCH 61/82] repair sounds better than refresh --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a5de9863..82ef1a53 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -866,8 +866,8 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi update_dialogs(){ # reconfigure if [ "$reconfigure" = true ]; then - opt1a="Refresh" - opt1b="Refresh will retain existing settings" + opt1a="Repair" + opt1b="Repair will retain existing settings" strAdd="You will remain on the same version" else opt1a="Update" From a65b784907e3d845ffd78f661930916205f0c75b Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 21:26:41 +0100 Subject: [PATCH 62/82] repeat after me: repetition is a bit repetitive. --- automated install/basic-install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 82ef1a53..00acf333 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -867,15 +867,15 @@ update_dialogs(){ # reconfigure if [ "$reconfigure" = true ]; then opt1a="Repair" - opt1b="Repair will retain existing settings" + opt1b="This will retain existing settings" strAdd="You will remain on the same version" else opt1a="Update" - opt1b="Update will retain existing settings." + opt1b="This will retain existing settings." strAdd="You will be updated to the latest version." fi opt2a="Reconfigure" - opt2b="Reconfigure will allow you to enter new settings" + opt2b="This will allow you to enter new settings" UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \ "$opt1a" "$opt1b" \ From a84c3adeabb95ce2dba9f73ed9db32f84eff5361 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 23:19:26 +0100 Subject: [PATCH 63/82] if uniformity then dan = happy --- automated install/basic-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 00acf333..c4d7c01d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -912,7 +912,7 @@ do done if [[ -f ${setupVars} ]];then - if [ "$runUnattended" = true ]; then + if [[ "${runUnattended}" == true ]]; then echo "::: --unattended passed to install script, no whiptail dialogs will be displayed" useUpdateVars=true else @@ -922,7 +922,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ "$skipSpaceCheck" = true ]]; then +if [[ "${skipSpaceCheck}" ==true ]]; then echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace @@ -940,7 +940,7 @@ install_dependent_packages INSTALLER_DEPS[@] # Install packages used by the Pi-hole install_dependent_packages PIHOLE_DEPS[@] -if [[ "$reconfigure" = true ]]; then +if [[ "${reconfigure}" == true ]]; then echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else # Get Git files for Core and Admin @@ -975,7 +975,7 @@ fi # Move the log file into /etc/pihole for storage mv ${tmpLog} ${instalLogLoc} -if [[ ${useUpdateVars} == false ]]; then +if [[ "${useUpdateVars}" == false ]]; then displayFinalMessage fi @@ -988,7 +988,7 @@ enable_service lighttpd echo " done." echo ":::" -if [[ ${useUpdateVars} == false ]]; then +if [[ "${useUpdateVars}" == false ]]; then echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:" echo "::: ${IPv4_address%/*}" echo "::: $IPv6_address" From 3884b01503d86f747424d8e96379bfd27b13acc0 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 15 Oct 2016 23:21:13 +0100 Subject: [PATCH 64/82] Forgot a ` ` --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index c4d7c01d..a423f795 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -922,7 +922,7 @@ fi # Start the installer # Verify there is enough disk space for the install -if [[ "${skipSpaceCheck}" ==true ]]; then +if [[ "${skipSpaceCheck}" == true ]]; then echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" else verifyFreeDiskSpace From 8c0f860601ac0e906d7871690e7cec49c8448275 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:16:59 +0100 Subject: [PATCH 65/82] Use systemctl/service calls instead of killall to restart/reload dnsmasq --- advanced/Scripts/blacklist.sh | 18 +++++++++++++----- advanced/Scripts/whitelist.sh | 18 +++++++++++++----- gravity.sh | 21 ++++++++++++++------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index feeca9da..8bcf22bf 100755 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -168,14 +168,22 @@ Reload() { echo ":::" echo -n "::: Refresh lists in dnsmasq..." - dnsmasqPid=$(pidof dnsmasq) + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi echo " done!" } diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index d6a09b35..f715a2fd 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -185,14 +185,22 @@ Reload() { # Reload hosts file echo ":::" echo -n "::: Refresh lists in dnsmasq..." - dnsmasqPid=$(pidof dnsmasq) + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi echo " done!" } diff --git a/gravity.sh b/gravity.sh index 5f0606b4..46be515c 100755 --- a/gravity.sh +++ b/gravity.sh @@ -310,18 +310,25 @@ gravity_reload() { adList=${adList//\//\\\/} #Now replace the line in dnsmasq file sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf - dnsmasqPid=$(pidof dnsmasq) + find "$piholeDir" -type f -exec chmod 666 {} \; - find "$piholeDir" -type f -exec chmod 666 {} \; + dnsmasqPid=$(pidof dnsmasq) if [[ ${dnsmasqPid} ]]; then - # service already running - reload config - killall -s HUP dnsmasq + # service already running - reload config + if [ -x "$(command -v systemctl)" ]; then + systemctl restart dnsmasq + else + service dnsmasq restart + fi else - # service not running, start it up - service dnsmasq start + # service not running, start it up + if [ -x "$(command -v systemctl)" ]; then + systemctl start dnsmasq + else + service dnsmasq start + fi fi - echo " done!" } From 42c93917ef112378e78f4bbd1a69ea25ebc923d3 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:19:44 +0100 Subject: [PATCH 66/82] bug I forgot to fix before piholeUpdate was merged to development --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 26f66e0a..361fb089 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -895,11 +895,11 @@ update_dialogs(){ if [[ $? = 0 ]];then case ${UpdateCmd} in - Update) + ${opt1a}) echo "::: Updating existing install" useUpdateVars=true ;; - Install) + ${opt2a}) echo "::: Running complete install script" useUpdateVars=false ;; From 5792fc0befda7117667b9aab9c34cafa4e59e3d5 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 16 Oct 2016 17:23:26 +0100 Subject: [PATCH 67/82] change wording depending on choice --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 361fb089..0d6ea97b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -896,11 +896,11 @@ update_dialogs(){ if [[ $? = 0 ]];then case ${UpdateCmd} in ${opt1a}) - echo "::: Updating existing install" + echo "::: $opt1a option selected." useUpdateVars=true ;; ${opt2a}) - echo "::: Running complete install script" + echo "::: $opt2a option selected" useUpdateVars=false ;; esac From ee114b307590a94b1c24d983b9e694fca412580b Mon Sep 17 00:00:00 2001 From: bcambl Date: Sun, 16 Oct 2016 13:28:14 -0600 Subject: [PATCH 68/82] use an excluded extension for ifcfg backup --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 0d6ea97b..bfa4eee2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -360,7 +360,7 @@ setStaticIPv4() { IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) # Backup existing interface configuration: - cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" + cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig" # Build Interface configuration file: { echo "# Configured via Pi-Hole installer" From fb9664b6361687676b0f7dc35cd81ddbdb7ee55e Mon Sep 17 00:00:00 2001 From: bcambl Date: Sun, 16 Oct 2016 15:11:47 -0600 Subject: [PATCH 69/82] fix typo --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index bfa4eee2..1fb1a49f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -360,7 +360,7 @@ setStaticIPv4() { IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) CIDR=$(echo "${IPv4_address}" | cut -f2 -d/) # Backup existing interface configuration: - cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig" + cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig # Build Interface configuration file: { echo "# Configured via Pi-Hole installer" From 49f48e2aaa5ea4082b56535140949fbd055c31cb Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 17 Oct 2016 22:24:59 +0100 Subject: [PATCH 70/82] wrong word. #admincrimes --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 46be515c..3d9c05c4 100755 --- a/gravity.sh +++ b/gravity.sh @@ -37,7 +37,7 @@ if [[ -f ${setupVars} ]];then . /etc/pihole/setupVars.conf else echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." - echo "::: Please run 'pihole -r', and choose the 'install' option to reconfigure." + echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure." exit 1 fi From 2220d2dab83cfac2dccac02fd98f94e22d3a3394 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 17 Oct 2016 18:28:38 -0700 Subject: [PATCH 71/82] Create .gitattributes --- .gitattributes | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..459b62dd --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +* text=auto +*.sh text +*.py text From 0ad704e5324cf76495f60338e04bb28a374d23c6 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 17 Oct 2016 18:31:06 -0700 Subject: [PATCH 72/82] Update .gitattributes --- .gitattributes | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/.gitattributes b/.gitattributes index 459b62dd..57faaa8b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,38 @@ +# FROM https://github.com/libgit2/libgit2sharp +# Text files that should be normalized to LF in odb. +*.cs text diff=csharp +*.config text + +*.sln text +*.csproj text + +*.md text +*.sh text +*.ps1 text +*.cmd text +*.bat text +*.markdown text +*.msbuild text + +Lib/* binary +GitHub.Tests.Integration/Resources/* binary + + +# Binary files that should not be normalized or diffed +*.png binary +*.jpg binary +*.gif binary + +*.pfx binary +*.snk binary +*.dll binary +*.exe binary +*.lib binary +*.exp binary +*.pdb binary +*.sdf binary +*.7z binary + + +# Catch all for anything we forgot. Add rules if you get CRLF -> LF warnings. * text=auto -*.sh text -*.py text From ef3c13fe2b08396f23f9563dcf872ed338a19ea7 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 17 Oct 2016 19:22:56 -0700 Subject: [PATCH 73/82] Refire with curl --- 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 1fb1a49f..7c26019e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -58,7 +58,7 @@ else echo "::: Detecting the presence of the sudo utility for continuation of this install..." if [ -x "$(command -v sudo)" ];then echo "::: Utility sudo located." - exec sudo bash "$0" "$@" + exec curl -sSL https://install.pi-hole.net | sudo bash "$@" 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." From 77808223dc3d4730c3053b14300b98fe996b8377 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 10:05:10 +0100 Subject: [PATCH 74/82] remove stock comments from 01-pihole.conf and add warning to the top --- advanced/01-pihole.conf | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/advanced/01-pihole.conf b/advanced/01-pihole.conf index 339bbf90..e7e627a4 100644 --- a/advanced/01-pihole.conf +++ b/advanced/01-pihole.conf @@ -9,53 +9,31 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -# If you want dnsmasq to read another file, as well as /etc/hosts, use -# this. +############################################################################### +# FILE AUTOMATICALLY POPULATED BY PI-HOLE INSTALL/UPDATE PROCEDURE. # +# ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE # +############################################################################### + addn-hosts=/etc/pihole/gravity.list -# The following two options make you a better netizen, since they -# tell dnsmasq to filter out queries which the public DNS cannot -# answer, and which load the servers (especially the root servers) -# unnecessarily. If you have a dial-on-demand link they also stop -# these requests from bringing up the link unnecessarily. - -# Never forward plain names (without a dot or domain part) domain-needed -# Never forward addresses in the non-routed address spaces. + bogus-priv -# If you don't want dnsmasq to read /etc/resolv.conf or any other -# file, getting its servers from this file instead (see below), then -# uncomment this. no-resolv -# Add other name servers here, with domain specs if they are for -# non-public domains. server=@DNS1@ server=@DNS2@ -# If you want dnsmasq to listen for DHCP and DNS requests only on -# specified interfaces (and the loopback) give the name of the -# interface (eg eth0) here. interface=@INT@ -# Or which to listen on by address (remember to include 127.0.0.1 if -# you use this.) + listen-address=127.0.0.1 -# Set the cachesize here. cache-size=10000 -# For debugging purposes, log each DNS query as it passes through -# dnsmasq. log-queries log-facility=/var/log/pihole.log -# Normally responses which come from /etc/hosts and the DHCP lease -# file have Time-To-Live set as zero, which conventionally means -# do not cache further. If you are happy to trade lower load on the -# server for potentially stale date, you can set a time-to-live (in -# seconds) here. local-ttl=300 -# This allows it to continue functioning without being blocked by syslog, and allows syslog to use dnsmasq for DNS queries without risking deadlock log-async From 97a013b2b7de5f09c88fc0d35881feb00706f710 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 10:34:05 +0100 Subject: [PATCH 75/82] Add direction to change upstream servers in setupVars.conf --- advanced/01-pihole.conf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/advanced/01-pihole.conf b/advanced/01-pihole.conf index e7e627a4..fd8e27f2 100644 --- a/advanced/01-pihole.conf +++ b/advanced/01-pihole.conf @@ -12,6 +12,12 @@ ############################################################################### # FILE AUTOMATICALLY POPULATED BY PI-HOLE INSTALL/UPDATE PROCEDURE. # # ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE # +# # +# IF YOU WISH TO CHANGE THE UPSTREAM SERVERS, CHANGE THEM IN: # +# /etc/pihole/setupVars.conf # +# # +# ANY OTHER CHANGES SHOULD BE MADE IN A SEPERATE CONFIG FILE # +# OR IN /etc/dnsmasq.conf # ############################################################################### addn-hosts=/etc/pihole/gravity.list From 29ad2496b63a0a838e11873eaa4e089d232d3de7 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 12:05:48 +0100 Subject: [PATCH 76/82] don't output "elevating with sudo" in pihole script, just do it. --- advanced/Scripts/update.sh | 12 +++++++++ advanced/Scripts/version.sh | 17 +++++++++++- pihole | 52 ++++++++++++++++++++++++++++++++----- 3 files changed, 73 insertions(+), 8 deletions(-) create mode 100644 advanced/Scripts/update.sh diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh new file mode 100644 index 00000000..bdd6ab88 --- /dev/null +++ b/advanced/Scripts/update.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +# Pi-hole: A black hole for Internet advertisements +# (c) 2015, 2016 by Jacob Salmela +# Network-wide ad blocking via your Raspberry Pi +# http://pi-hole.net +# Whitelists domains +# +# Pi-hole is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index e7e7c782..521fa26c 100644 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -10,6 +10,10 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. + + + +normalOutput(){ piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) @@ -17,4 +21,15 @@ piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/relea webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" -echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" \ No newline at end of file +echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" + +} + +for var in "$@" +do + case "$var" in + "-j" | "--json" ) outputJSON;; + "-h" | "--help" ) displayHelp;; + * ) normalOutput;; + esac +done \ No newline at end of file diff --git a/pihole b/pihole index 4ed446be..25a03864 100755 --- a/pihole +++ b/pihole @@ -13,7 +13,6 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then if [ -x "$(command -v sudo)" ];then - echo "::: Elevating to root with sudo" exec sudo bash "$0" "$@" exit $? else @@ -44,9 +43,48 @@ flushFunc() { exit 0 } +getGitFiles() { + # Setup git repos for directory and repository passed + # as arguments 1 and 2 + echo ":::" + echo "::: Checking for existing repository..." + if is_repo "${1}"; then + update_repo "${1}" + else + 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}" &> /dev/null || 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 $! + echo " done!" +} + +update_repo() { + # Pull the latest commits + echo -n "::: Updating repo in $1..." + cd "${1}" || exit 1 + git pull -q > /dev/null & spinner $! + echo " done!" +} updatePiholeFunc() { + webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git" + webInterfaceDir="/var/www/html/admin" + piholeGitUrl="https://github.com/pi-hole/pi-hole.git" + piholeFilesDir="/etc/.pihole" + if [ ! -d "/etc/.pihole" ]; then #This is unlikely echo "::: Critical Error: Pi-Hole repo missing from system!" echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" @@ -75,17 +113,17 @@ updatePiholeFunc() { echo ":::" if [[ ${webVersion} == ${webVersionLatest} ]] ; then - echo "::: Web Admin files are already up to date!" + echo "::: Web Admin files are already up to date! Version: ${webVersionLatest}" echo "::: No need to update!" echo ":::" else echo "::: An Update is available for the Web Admin!" echo ":::" echo "::: Fetching latest changes from GitHub..." - cd /var/www/html/admin - git pull origin master + # Update Git files for Core + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} echo ":::" - echo "::: Pi-hole Web Admin has been updated to ${webVersion}" + echo "::: Pi-hole Web Admin has been updated to ${webVersionLatest}" echo "::: See https://changes.pi-hole.net for details" fi else @@ -97,8 +135,8 @@ updatePiholeFunc() { fi echo "::: Fetching latest changes from GitHub..." - cd /etc/.pihole - git pull origin master + # Update Git files for Core + getGitFiles ${piholeFilesDir} ${piholeGitUrl} /etc/.pihole/automated\ install/basic-install.sh --unattended echo ":::" From 013d77488af0375cd485540cae8f487b4e784318 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 12:07:11 +0100 Subject: [PATCH 77/82] complete overhaul of version script. Now with optional arguments! --- advanced/Scripts/version.sh | 91 ++++++++++++++++++++++++++++++++----- 1 file changed, 79 insertions(+), 12 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 521fa26c..e77fdfc2 100644 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -10,26 +10,93 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. - - +# Flags: +latest=false +current=false normalOutput(){ -piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) -webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) + piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) + webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) -piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') -webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') - -echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" -echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" + piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" + echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" } +webOutput(){ + for var in "$@" + do + case "$var" in + "-l" | "--latest" ) latest=true;; + "-c" | "--current" ) current=true;; + * ) echo "::: Invalid Option!"; exit 1; + esac + done + + if [[ "${latest}" == true && "${current}" == false ]]; then + webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + echo ${webVersionLatest} + elif [[ "${latest}" == false && "${current}" == true ]]; then + webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) + echo ${webVersion} + else + webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) + webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + fi +} + +coreOutput(){ + for var in "$@" + do + case "$var" in + "-l" | "--latest" ) latest=true;; + "-c" | "--current" ) current=true;; + * ) echo "::: Invalid Option!"; exit 1; + esac + done + + if [[ "${latest}" == true && "${current}" == false ]]; then + piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + echo ${piholeVersionLatest} + elif [[ "${latest}" == false && "${current}" == true ]]; then + piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) + echo ${piholeVersion} + else + piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) + piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" + fi +} + +helpFunc() +{ + echo ":::" + echo "::: Show Pi-hole/Web Admin versions" + echo ":::" + echo "::: Usage: pihole -v [ -a | -p ] [ -l | -c ]" + echo ":::" + echo "::: Options:" + echo "::: -a, --admin Show both current and latest versions of web admin" + echo "::: -p, --pihole Show both current and latest versions of Pi-hole core files" + echo "::: -l, --latest (Only after -a | -p) Return only latest version" + echo "::: -c, --current (Only after -a | -p) Return only current version" + echo "::: -h, --help Show this help dialog" + echo ":::" + exit 0 +} + +if [[ $# = 0 ]]; then + normalOutput +fi + for var in "$@" do case "$var" in - "-j" | "--json" ) outputJSON;; - "-h" | "--help" ) displayHelp;; - * ) normalOutput;; + "-a" | "--admin" ) shift; webOutput "$@";; + "-p" | "--pihole" ) shift; coreOutput "$@" ;; + "-h" | "--help" ) helpFunc;; + * ) helpFunc;; esac done \ No newline at end of file From 77e8be09a1c33445cd2046ec23d8df5a430723b9 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 12:07:42 +0100 Subject: [PATCH 78/82] handle passing arguments to version script --- pihole | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pihole b/pihole index 25a03864..c4faad57 100755 --- a/pihole +++ b/pihole @@ -193,7 +193,8 @@ uninstallFunc() { } versionFunc() { - /opt/pihole/version.sh + shift + /opt/pihole/version.sh "$@" exit 0 } @@ -235,7 +236,7 @@ case "$1" in "-s" | "setupLCD" ) setupLCDFunction;; "-c" | "chronometer" ) chronometerFunc "$@";; "-h" | "help" ) helpFunc;; -"-v" | "version" ) versionFunc;; +"-v" | "version" ) versionFunc "$@";; "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; * ) helpFunc;; From ce46c4dec47940e74d93082a55b27f66bb907e6b Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 12:11:02 +0100 Subject: [PATCH 79/82] remove prematurely added code --- advanced/Scripts/update.sh | 70 +++++++++++++++++++++++++++ pihole | 96 +------------------------------------- 2 files changed, 72 insertions(+), 94 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index bdd6ab88..e471ab39 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -10,3 +10,73 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. +# Variables +webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git" +webInterfaceDir="/var/www/html/admin" +piholeGitUrl="https://github.com/pi-hole/pi-hole.git" +piholeFilesDir="/etc/.pihole" + + if [ ! -d "/etc/.pihole" ]; then #This is unlikely + echo "::: Critical Error: Pi-Hole repo missing from system!" + echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" + exit 1; + fi + if [ ! -d "/var/www/html/admin" ]; then #This is unlikely + echo "::: Critical Error: Pi-Hole repo missing from system!" + echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" + exit 1; + fi + + echo "::: Checking for updates..." + piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) + piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + + webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) + webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + + echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" + echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)" + echo ":::" + + if [[ ${piholeVersion} == ${piholeVersionLatest} ]] ; then + echo "::: Pi-hole Base files are already up to date! Version: ${piholeVersionLatest}" + echo "::: No need to update!" + echo ":::" + + if [[ ${webVersion} == ${webVersionLatest} ]] ; then + echo "::: Web Admin files are already up to date! Version: ${webVersionLatest}" + echo "::: No need to update!" + echo ":::" + else + echo "::: An Update is available for the Web Admin!" + echo ":::" + echo "::: Fetching latest changes from GitHub..." + # Update Git files for Core + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} + echo ":::" + echo "::: Pi-hole Web Admin has been updated to ${webVersionLatest}" + echo "::: See https://changes.pi-hole.net for details" + fi + else + echo -n "::: An update is available for " + if [[ ${webVersion} == ${webVersionLatest} ]] ; then + echo " Pi-Hole!" + else + echo " Pi-Hole base files and the Web Admin. Both will be updated!" + fi + + echo "::: Fetching latest changes from GitHub..." + # Update Git files for Core + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + /etc/.pihole/automated\ install/basic-install.sh --unattended + + echo ":::" + echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" + if [[ ${webVersion} != ${webVersionLatest} ]] ; then + echo "::: Web Admin has been updated to version ${webVersionLatest}" + fi + echo ":::" + echo "::: See https://changes.pi-hole.net for details" + fi + + exit 0 \ No newline at end of file diff --git a/pihole b/pihole index c4faad57..0e29b23e 100755 --- a/pihole +++ b/pihole @@ -55,100 +55,8 @@ getGitFiles() { fi } -is_repo() { - # Use git to check if directory is currently under VCS - echo -n "::: Checking $1 is a repo..." - cd "${1}" &> /dev/null || 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 $! - echo " done!" -} - -update_repo() { - # Pull the latest commits - echo -n "::: Updating repo in $1..." - cd "${1}" || exit 1 - git pull -q > /dev/null & spinner $! - echo " done!" -} - updatePiholeFunc() { - - webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git" - webInterfaceDir="/var/www/html/admin" - piholeGitUrl="https://github.com/pi-hole/pi-hole.git" - piholeFilesDir="/etc/.pihole" - - if [ ! -d "/etc/.pihole" ]; then #This is unlikely - echo "::: Critical Error: Pi-Hole repo missing from system!" - echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" - exit 1; - fi - if [ ! -d "/var/www/html/admin" ]; then #This is unlikely - echo "::: Critical Error: Pi-Hole repo missing from system!" - echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" - exit 1; - fi - - echo "::: Checking for updates..." - piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) - piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') - - webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) - webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') - - echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" - echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)" - echo ":::" - - if [[ ${piholeVersion} == ${piholeVersionLatest} ]] ; then - echo "::: Pi-hole Base files are already up to date! Version: ${piholeVersionLatest}" - echo "::: No need to update!" - echo ":::" - - if [[ ${webVersion} == ${webVersionLatest} ]] ; then - echo "::: Web Admin files are already up to date! Version: ${webVersionLatest}" - echo "::: No need to update!" - echo ":::" - else - echo "::: An Update is available for the Web Admin!" - echo ":::" - echo "::: Fetching latest changes from GitHub..." - # Update Git files for Core - getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} - echo ":::" - echo "::: Pi-hole Web Admin has been updated to ${webVersionLatest}" - echo "::: See https://changes.pi-hole.net for details" - fi - else - echo -n "::: An update is available for " - if [[ ${webVersion} == ${webVersionLatest} ]] ; then - echo " Pi-Hole!" - else - echo " Pi-Hole base files and the Web Admin. Both will be updated!" - fi - - echo "::: Fetching latest changes from GitHub..." - # Update Git files for Core - getGitFiles ${piholeFilesDir} ${piholeGitUrl} - /etc/.pihole/automated\ install/basic-install.sh --unattended - - echo ":::" - echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" - if [[ ${webVersion} != ${webVersionLatest} ]] ; then - echo "::: Web Admin has been updated to version ${webVersionLatest}" - fi - echo ":::" - echo "::: See https://changes.pi-hole.net for details" - fi - - exit 0 + echo "Not Implemented" } reconfigurePiholeFunc() { @@ -202,7 +110,7 @@ helpFunc() { echo "::: Control all PiHole specific functions!" echo ":::" echo "::: Usage: pihole [options]" - echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer) for more information on usage" + echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer), or -v (version) for more information on usage" echo ":::" echo "::: Options:" echo "::: -w, whitelist Whitelist domains" From ff5d5b97c33d1ec1e1a2d47cd0b81acf9cd1d303 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 13:54:09 +0100 Subject: [PATCH 80/82] stash any changes in local repo --- automated install/basic-install.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7c26019e..8072f79a 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -702,6 +702,7 @@ update_repo() { # Pull the latest commits echo -n "::: Updating repo in $1..." cd "${1}" || exit 1 + git stash -q > /dev/null & spinner $! git pull -q > /dev/null & spinner $! echo " done!" } From 27d6e5d8cf4a47f4eb030cbaf1f729d5eaa5b751 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 14:19:25 +0100 Subject: [PATCH 81/82] Complete overhaul of update logic. Moved to seperate script --- advanced/Scripts/update.sh | 179 +++++++++++++++++++++++++------------ 1 file changed, 121 insertions(+), 58 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index e471ab39..34c12cfd 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -11,72 +11,135 @@ # (at your option) any later version. # Variables + webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git" webInterfaceDir="/var/www/html/admin" piholeGitUrl="https://github.com/pi-hole/pi-hole.git" piholeFilesDir="/etc/.pihole" - if [ ! -d "/etc/.pihole" ]; then #This is unlikely - echo "::: Critical Error: Pi-Hole repo missing from system!" - echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" - exit 1; - fi - if [ ! -d "/var/www/html/admin" ]; then #This is unlikely - echo "::: Critical Error: Pi-Hole repo missing from system!" - echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" - exit 1; - fi +spinner() +{ + local pid=$1 + local delay=0.50 + local spinstr='/-\|' + while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do + local temp=${spinstr#?} + printf " [%c] " "$spinstr" + local spinstr=${temp}${spinstr%"$temp"} + sleep ${delay} + printf "\b\b\b\b\b\b" + done + printf " \b\b\b\b" +} - echo "::: Checking for updates..." - piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) - piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') +getGitFiles() { + # Setup git repos for directory and repository passed + # as arguments 1 and 2 + echo ":::" + echo "::: Checking for existing repository..." + if is_repo "${1}"; then + update_repo "${1}" + else + make_repo "${1}" "${2}" + fi +} - webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) - webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') +is_repo() { + # Use git to check if directory is currently under VCS + echo -n "::: Checking $1 is a repo..." + cd "${1}" &> /dev/null || return 1 + git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1 +} - echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" - echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)" +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 $! + echo " done!" +} + +update_repo() { + # Pull the latest commits + echo -n "::: Updating repo in $1..." + cd "${1}" || exit 1 + git stash -q > /dev/null & spinner $! + git pull -q > /dev/null & spinner $! + echo " done!" +} + +if [ ! -d "/etc/.pihole" ]; then #This is unlikely + echo "::: Critical Error: Pi-Hole repo missing from system!" + echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" + exit 1; +fi +if [ ! -d "/var/www/html/admin" ]; then #This is unlikely + echo "::: Critical Error: Pi-Hole repo missing from system!" + echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" + exit 1; +fi + +echo "::: Checking for updates..." +piholeVersion=$(pihole -v -p -c) +piholeVersionLatest=$(pihole -v -p -l) + +webVersion=$(pihole -v -a -c) +webVersionLatest=$(pihole -v -a -l) + +echo ":::" +echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" +echo "::: Web Admin version is $webVersion (Latest version is $webVersionLatest)" +echo ":::" + +# Logic +# If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!): +# Update anyway +# If Core up to date AND web up to date: +# Do nothing +# If Core up to date AND web NOT up to date: +# Pull web repo +# If Core NOT up to date AND web up to date: +# pull pihole repo, run install --unattended -- reconfigure +# if Core NOT up to date AND web NOT up to date: +# pull pihole repo run install --unattended + + + +if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then + echo "::: Everything is up to date!" + echo "" + exit 0 + +elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then + echo "::: Pi-hole Web Admin files out of date" + getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} echo ":::" + webVersion=$(pihole -v -a -c) + echo "::: Web Admin version is now at ${webVersion}" + echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'" + echo "" - if [[ ${piholeVersion} == ${piholeVersionLatest} ]] ; then - echo "::: Pi-hole Base files are already up to date! Version: ${piholeVersionLatest}" - echo "::: No need to update!" - echo ":::" +elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then + echo "::: Pi-hole core files out of date" + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended + echo ":::" + piholeVersion=$(pihole -v -p -c) + echo "::: Pi-hole version is now at ${piholeVersion}" + echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" + echo "" - if [[ ${webVersion} == ${webVersionLatest} ]] ; then - echo "::: Web Admin files are already up to date! Version: ${webVersionLatest}" - echo "::: No need to update!" - echo ":::" - else - echo "::: An Update is available for the Web Admin!" - echo ":::" - echo "::: Fetching latest changes from GitHub..." - # Update Git files for Core - getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} - echo ":::" - echo "::: Pi-hole Web Admin has been updated to ${webVersionLatest}" - echo "::: See https://changes.pi-hole.net for details" - fi - else - echo -n "::: An update is available for " - if [[ ${webVersion} == ${webVersionLatest} ]] ; then - echo " Pi-Hole!" - else - echo " Pi-Hole base files and the Web Admin. Both will be updated!" - fi - - echo "::: Fetching latest changes from GitHub..." - # Update Git files for Core - getGitFiles ${piholeFilesDir} ${piholeGitUrl} - /etc/.pihole/automated\ install/basic-install.sh --unattended - - echo ":::" - echo "::: Pi-hole has been updated to version ${piholeVersionLatest}" - if [[ ${webVersion} != ${webVersionLatest} ]] ; then - echo "::: Web Admin has been updated to version ${webVersionLatest}" - fi - echo ":::" - echo "::: See https://changes.pi-hole.net for details" - fi - - exit 0 \ No newline at end of file +elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then + echo "::: Updating Everything" + getGitFiles ${piholeFilesDir} ${piholeGitUrl} + /etc/.pihole/automated\ install/basic-install.sh --unattended + webVersion=$(pihole -v -a -c) + piholeVersion=$(pihole -v -p -c) + echo ":::" + echo "::: Pi-hole version is now at ${piholeVersion}" + echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" + echo ":::" + echo "::: Pi-hole version is now at ${piholeVersion}" + echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" + echo "" +fi \ No newline at end of file From b66f23cfd0778d57eb13baa209b4632726ada32f Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 18 Oct 2016 14:19:44 +0100 Subject: [PATCH 82/82] account for new update script --- advanced/Scripts/version.sh | 4 ++-- pihole | 16 +++------------- 2 files changed, 5 insertions(+), 15 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index e77fdfc2..61ff7502 100644 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -3,7 +3,7 @@ # (c) 2015, 2016 by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net -# Whitelists domains +# shows version numbers # # Pi-hole is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -44,6 +44,7 @@ webOutput(){ else webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') + echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" fi } @@ -97,6 +98,5 @@ do "-a" | "--admin" ) shift; webOutput "$@";; "-p" | "--pihole" ) shift; coreOutput "$@" ;; "-h" | "--help" ) helpFunc;; - * ) helpFunc;; esac done \ No newline at end of file diff --git a/pihole b/pihole index 0e29b23e..6be32acf 100755 --- a/pihole +++ b/pihole @@ -43,20 +43,10 @@ flushFunc() { exit 0 } -getGitFiles() { - # Setup git repos for directory and repository passed - # as arguments 1 and 2 - echo ":::" - echo "::: Checking for existing repository..." - if is_repo "${1}"; then - update_repo "${1}" - else - make_repo "${1}" "${2}" - fi -} updatePiholeFunc() { - echo "Not Implemented" + /opt/pihole/update.sh + exit 0 } reconfigurePiholeFunc() { @@ -110,7 +100,7 @@ helpFunc() { echo "::: Control all PiHole specific functions!" echo ":::" echo "::: Usage: pihole [options]" - echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer), or -v (version) for more information on usage" + echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer) for more information on usage" echo ":::" echo "::: Options:" echo "::: -w, whitelist Whitelist domains"