From 74b912a0b71c1fd2027f4cc0c194fdf636d07dbb Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 12 Jul 2017 22:02:07 +0100 Subject: [PATCH 01/16] Check if FTL is already installed, do not download if it is detected, and the sha1sum matches the remote This will probably break some tests. I'll work that out in a bit Signed-off-by: Adam Warner Signed-off-by: Adam Warner --- automated install/basic-install.sh | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 74e2a61d..8c026442 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1761,7 +1761,7 @@ FTLinstall() { local binary="${1}" local latesttag local orig_dir - local str="Installing FTL" + local str="Downloading and Installing FTL" echo -ne " ${INFO} ${str}..." # Get the current working directory @@ -1774,6 +1774,7 @@ FTLinstall() { echo -e " ${COL_LIGHT_RED}Error: Unable to get latest release location from GitHub${COL_NC}" return 1 fi + # If the download worked, if curl -sSL --fail "https://github.com/pi-hole/FTL/releases/download/${latesttag%$'\r'}/${binary}" -o "/tmp/${binary}"; then # get sha1 of the binary we just downloaded for verification. @@ -1879,9 +1880,26 @@ FTLdetect() { binary="pihole-FTL-linux-x86_32" fi - # Install FTL - FTLinstall "${binary}" || return 1 - + #In the next section we check to see if FTL is already installed (in case of pihole -r). + #If the installed version matches the latest version, then check the installed sha1sum of the binary vs the remote sha1sum. If they do not match, then download + local FTLversion=$(/usr/bin/pihole-FTL tag) + local FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') + + if [[ "${FTLversion}" != "${FTLlatesttag}" ]]; then + # Install FTL + FTLinstall "${binary}" || return 1 + else + local remoteSha1=$(curl -sSL --fail "https://github.com/pi-hole/FTL/releases/download/${FTLversion%$'\r'}/${binary}.sha1" | cut -d ' ' -f 1) + local localSha1=$(sha1sum "$(which pihole-FTL)" | cut -d ' ' -f 1) + + echo -e " ${INFO} Existing FTL Binary detected. Checking sha1sum..." + if [[ "${remoteSha1}" != "${localSha1}" ]]; then + echo -e " ${INFO} Corruption detected..." + FTLinstall "${binary}" || return 1 + else + echo -e " ${INFO} sha1sums match. No need to download!" + fi + fi } main() { From bf70c2c6605e15caf433bf5830a7e6a474b22f3a Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 12 Jul 2017 22:52:03 +0100 Subject: [PATCH 02/16] initial changes to tests to take into account changes to strings Signed-off-by: Adam Warner --- automated install/basic-install.sh | 2 +- test/test_automated_install.py | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 8c026442..3a53fca5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1817,7 +1817,7 @@ FTLinstall() { # Detect suitable FTL binary platform FTLdetect() { echo "" - echo -e " ${INFO} Downloading latest version of FTL..." + echo -e " ${INFO} FTL Checks..." # Local, named variables local machine diff --git a/test/test_automated_install.py b/test/test_automated_install.py index 60b9dbb8..4a4f72aa 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -319,11 +319,11 @@ def test_FTL_detect_aarch64_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLdetect ''') - expected_stdout = info_box + ' Downloading latest version of FTL...' + expected_stdout = info_box + ' FTL Checks...' assert expected_stdout in detectPlatform.stdout expected_stdout = tick_box + ' Detected ARM-aarch64 architecture' assert expected_stdout in detectPlatform.stdout - expected_stdout = tick_box + ' Installing FTL' + expected_stdout = tick_box + ' Downloading and Installing FTL' assert expected_stdout in detectPlatform.stdout def test_FTL_detect_armv6l_no_errors(Pihole): @@ -336,11 +336,11 @@ def test_FTL_detect_armv6l_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLdetect ''') - expected_stdout = info_box + ' Downloading latest version of FTL...' + expected_stdout = info_box + ' FTL Checks...' assert expected_stdout in detectPlatform.stdout expected_stdout = tick_box + ' Detected ARM-hf architecture (armv6 or lower)' assert expected_stdout in detectPlatform.stdout - expected_stdout = tick_box + ' Installing FTL' + expected_stdout = tick_box + ' Downloading and Installing FTL' assert expected_stdout in detectPlatform.stdout def test_FTL_detect_armv7l_no_errors(Pihole): @@ -353,11 +353,11 @@ def test_FTL_detect_armv7l_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLdetect ''') - expected_stdout = info_box + ' Downloading latest version of FTL...' + expected_stdout = info_box + ' FTL Checks...' assert expected_stdout in detectPlatform.stdout expected_stdout = tick_box + ' Detected ARM-hf architecture (armv7+)' assert expected_stdout in detectPlatform.stdout - expected_stdout = tick_box + ' Installing FTL' + expected_stdout = tick_box + ' Downloading and Installing FTL' assert expected_stdout in detectPlatform.stdout def test_FTL_detect_x86_64_no_errors(Pihole): @@ -366,11 +366,11 @@ def test_FTL_detect_x86_64_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLdetect ''') - expected_stdout = info_box + ' Downloading latest version of FTL...' + expected_stdout = info_box + ' FTL Checks...' assert expected_stdout in detectPlatform.stdout expected_stdout = tick_box + ' Detected x86_64 architecture' assert expected_stdout in detectPlatform.stdout - expected_stdout = tick_box + ' Installing FTL' + expected_stdout = tick_box + ' Downloading and Installing FTL' assert expected_stdout in detectPlatform.stdout def test_FTL_detect_unknown_no_errors(Pihole): @@ -391,7 +391,7 @@ def test_FTL_download_aarch64_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLinstall pihole-FTL-aarch64-linux-gnu ''') - expected_stdout = tick_box + ' Installing FTL' + expected_stdout = tick_box + ' Downloading and Installing FTL' assert expected_stdout in download_binary.stdout error = 'Error: Download of binary from Github failed' assert error not in download_binary.stdout @@ -405,7 +405,7 @@ def test_FTL_download_unknown_fails_no_errors(Pihole): source /opt/pihole/basic-install.sh FTLinstall pihole-FTL-mips ''') - expected_stdout = cross_box + ' Installing FTL' + expected_stdout = cross_box + ' Downloading and Installing FTL' assert expected_stdout in download_binary.stdout error = 'Error: URL not found' assert error in download_binary.stdout From 9464b71a6e37a4067932362fd57f367ef7872d2b Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Mon, 26 Jun 2017 09:51:21 -0400 Subject: [PATCH 03/16] Remove /* from IPv6 as well as IPv4 Fixes Discourse issue: https://discourse.pi-hole.net/t/ipv6-aaaa-dns-issue/3830 Signed-off-by: Adam Warner # Conflicts: # gravity.sh --- gravity.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 285ce5c3..41e3c68a 100755 --- a/gravity.sh +++ b/gravity.sh @@ -46,9 +46,9 @@ else exit 1 fi -#Remove the /* from the end of the IPv4addr. +#Remove the /* from the end of the IP addresses IPV4_ADDRESS=${IPV4_ADDRESS%/*} -IPV6_ADDRESS=${IPV6_ADDRESS} +IPV6_ADDRESS=${IPV6_ADDRESS%/*} # Variables for various stages of downloading and formatting the list basename=pihole From edb594461d3ac683934eb9b256d93946f92823ad Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 28 Jun 2017 22:54:02 +0100 Subject: [PATCH 04/16] Remove CIDR from IPv6 address when detecting it in the install script Signed-off-by: Adam Warner # Conflicts: # automated install/basic-install.sh --- 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 053e04ba..2cf2c61d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -344,8 +344,8 @@ useIPv6dialog() { # Determine type of found IPv6 addresses for i in "${IPV6_ADDRESSES[@]}"; do result=$(testIPv6 "$i") - [[ "${result}" == "ULA" ]] && ULA_ADDRESS="$i" - [[ "${result}" == "GUA" ]] && GUA_ADDRESS="$i" + [[ "${result}" == "ULA" ]] && ULA_ADDRESS="${i%/*}" + [[ "${result}" == "GUA" ]] && GUA_ADDRESS="${i%/*}" done # Determine which address to be used: Prefer ULA over GUA or don't use any if none found @@ -1510,10 +1510,9 @@ main() { else echo "::: Update complete!" fi - if [[ ${INSTALL_WEB} == true ]]; then if (( ${#pw} > 0 )) ; then - echo ":::" + echo ":::" echo "::: Note: As security measure a password has been installed for your web interface" echo "::: The currently set password is" echo "::: ${pw}" @@ -1524,7 +1523,8 @@ main() { fi echo ":::" - echo "::: The install log is located at: /etc/pihole/install.log" + echo "::: The install log is located at: /etc/pihole/install.log + " } if [[ "${PH_TEST}" != true ]] ; then From 9101916719a86ab9478496bf18e4e0baa42ab3ab Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 24 Jun 2017 15:49:16 -0700 Subject: [PATCH 05/16] Test exclusion for sourced files SC1090. Signed-off-by: Dan Schaper --- test/test_shellcheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_shellcheck.py b/test/test_shellcheck.py index fa342027..9c4f141b 100644 --- a/test/test_shellcheck.py +++ b/test/test_shellcheck.py @@ -7,7 +7,7 @@ run_local = testinfra.get_backend( def test_scripts_pass_shellcheck(): ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' - shellcheck = "find . -type f \( -name 'update.sh' -o -name 'piholeDebug.sh' \) | while read file; do shellcheck \"$file\"; done;" + shellcheck = "find . -type f \( -name 'update.sh' -o -name 'piholeDebug.sh' \) | while read file; do shellcheck \"$file\" -e SC1090; done;" results = run_local(shellcheck) print results.stdout assert '' == results.stdout From 66f32b7601d52266e7f244cda3f9334f06d5e6ce Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 25 Jun 2017 12:26:16 -0700 Subject: [PATCH 06/16] Remove testing for `debug` as this is getting a re-write by Jacob. Signed-off-by: Dan Schaper --- test/test_shellcheck.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_shellcheck.py b/test/test_shellcheck.py index 9c4f141b..1b6b35a7 100644 --- a/test/test_shellcheck.py +++ b/test/test_shellcheck.py @@ -7,7 +7,7 @@ run_local = testinfra.get_backend( def test_scripts_pass_shellcheck(): ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' - shellcheck = "find . -type f \( -name 'update.sh' -o -name 'piholeDebug.sh' \) | while read file; do shellcheck \"$file\" -e SC1090; done;" + shellcheck = "find . -type f -name 'update.sh' | while read file; do shellcheck \"$file\" -e SC1090; done;" results = run_local(shellcheck) print results.stdout assert '' == results.stdout From 05c8687041be34065724fd2e33783a47feae10ff Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 25 Jun 2017 14:21:41 -0700 Subject: [PATCH 07/16] Integrate DL's update.sh fixes. `shellcheck -x` for following files. Do not test for included files SC1091 Signed-off-by: Dan Schaper Signed-off-by: Adam Warner # Conflicts: # advanced/Scripts/update.sh --- advanced/Scripts/update.sh | 23 ++++++++++++++++------- test/test_shellcheck.py | 2 +- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 6aef183b..e3a7f8fd 100755 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -19,8 +19,14 @@ readonly ADMIN_INTERFACE_DIR="/var/www/html/admin" readonly PI_HOLE_GIT_URL="https://github.com/pi-hole/pi-hole.git" readonly PI_HOLE_FILES_DIR="/etc/.pihole" +# shellcheck disable=SC2034 PH_TEST=true -source ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh + +# Have to ignore the following rule as spaces in paths are not supported by ShellCheck +#shellcheck disable=SC1090 +source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh" + +source "/opt/pihole/COL_TABLE" # is_repo() sourced from basic-install.sh # make_repo() sourced from basic-install.sh @@ -30,14 +36,14 @@ source ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh GitCheckUpdateAvail() { local directory="${1}" curdir=$PWD - cd "${directory}" + cd "${directory}" || return # Fetch latest changes in this repo git fetch --quiet origin # @ alone is a shortcut for HEAD. Older versions of git # need @{0} - LOCAL="$(git rev-parse @{0})" + LOCAL="$("git rev-parse @{0}")" # The suffix @{upstream} to a branchname # (short form @{u}) refers @@ -46,7 +52,7 @@ GitCheckUpdateAvail() { # (configured with branch..remote and # branch..merge). A missing branchname # defaults to the current one. - REMOTE="$(git rev-parse @{upstream})" + REMOTE="$("git rev-parse @{upstream}")" if [[ ${#LOCAL} == 0 ]]; then echo "::: Error: Local revision could not be obtained, ask Pi-hole support." @@ -62,7 +68,7 @@ GitCheckUpdateAvail() { fi # Change back to original directory - cd "${curdir}" + cd "${curdir}" || exit if [[ "${LOCAL}" != "${REMOTE}" ]]; then # Local branch is behind remote branch -> Update @@ -77,8 +83,10 @@ GitCheckUpdateAvail() { FTLcheckUpdate() { - local FTLversion=$(/usr/bin/pihole-FTL tag) - local FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') + local FTLversion + FTLversion=$(/usr/bin/pihole-FTL tag) + local FTLlatesttag + FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') if [[ "${FTLversion}" != "${FTLlatesttag}" ]]; then return 0 @@ -90,6 +98,7 @@ FTLcheckUpdate() { main() { local pihole_version_current local web_version_current + #shellcheck disable=1090,2154 source "${setupVars}" #This is unlikely diff --git a/test/test_shellcheck.py b/test/test_shellcheck.py index 1b6b35a7..5b1a8961 100644 --- a/test/test_shellcheck.py +++ b/test/test_shellcheck.py @@ -7,7 +7,7 @@ run_local = testinfra.get_backend( def test_scripts_pass_shellcheck(): ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' - shellcheck = "find . -type f -name 'update.sh' | while read file; do shellcheck \"$file\" -e SC1090; done;" + shellcheck = "find . -type f -name 'update.sh' | while read file; do shellcheck -x \"$file\" -e SC1090,SC1091; done;" results = run_local(shellcheck) print results.stdout assert '' == results.stdout From 70fb733fea71858494f441d429513d6a77674b21 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 17 Jul 2017 10:53:49 +0100 Subject: [PATCH 08/16] col_table does not exist yet, will break the install if pushed as hotfix. Not sure why these additional "'s were put in, they break the update command, too. Signed-off-by: Adam Warner --- advanced/Scripts/update.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index e3a7f8fd..2ef136a9 100755 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -26,8 +26,6 @@ PH_TEST=true #shellcheck disable=SC1090 source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh" -source "/opt/pihole/COL_TABLE" - # is_repo() sourced from basic-install.sh # make_repo() sourced from basic-install.sh # update_repo() source from basic-install.sh @@ -43,7 +41,7 @@ GitCheckUpdateAvail() { # @ alone is a shortcut for HEAD. Older versions of git # need @{0} - LOCAL="$("git rev-parse @{0}")" + LOCAL="$(git rev-parse @{0})" # The suffix @{upstream} to a branchname # (short form @{u}) refers @@ -52,7 +50,7 @@ GitCheckUpdateAvail() { # (configured with branch..remote and # branch..merge). A missing branchname # defaults to the current one. - REMOTE="$("git rev-parse @{upstream}")" + REMOTE="$(git rev-parse @{upstream})" if [[ ${#LOCAL} == 0 ]]; then echo "::: Error: Local revision could not be obtained, ask Pi-hole support." From 83592a5e70a627ea1ba5ab1fce6c99112e9e8f6b Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 17 Jul 2017 11:14:02 +0100 Subject: [PATCH 09/16] Put '"'s in the right place Signed-off-by: Adam Warner --- advanced/Scripts/update.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 2ef136a9..4281d69f 100755 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -41,7 +41,7 @@ GitCheckUpdateAvail() { # @ alone is a shortcut for HEAD. Older versions of git # need @{0} - LOCAL="$(git rev-parse @{0})" + LOCAL="$(git rev-parse "@{0}")" # The suffix @{upstream} to a branchname # (short form @{u}) refers @@ -50,7 +50,7 @@ GitCheckUpdateAvail() { # (configured with branch..remote and # branch..merge). A missing branchname # defaults to the current one. - REMOTE="$(git rev-parse @{upstream})" + REMOTE="$(git rev-parse "@{upstream}")" if [[ ${#LOCAL} == 0 ]]; then echo "::: Error: Local revision could not be obtained, ask Pi-hole support." From 1c93868ae1b1bc673f26ae4c5a9d235897ca99aa Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 24 Jul 2017 23:22:04 +0100 Subject: [PATCH 10/16] Adjust wording of echos Signed-off-by: Adam Warner --- 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 3a53fca5..f0d6018f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1882,6 +1882,7 @@ FTLdetect() { #In the next section we check to see if FTL is already installed (in case of pihole -r). #If the installed version matches the latest version, then check the installed sha1sum of the binary vs the remote sha1sum. If they do not match, then download + echo -e " ${INFO} Checking for existing FTL binary..." local FTLversion=$(/usr/bin/pihole-FTL tag) local FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') @@ -1889,15 +1890,16 @@ FTLdetect() { # Install FTL FTLinstall "${binary}" || return 1 else + echo -e " ${INFO} Latest FTL Binary already installed (${FTLlatesttag}). Confirming Checksum..." + local remoteSha1=$(curl -sSL --fail "https://github.com/pi-hole/FTL/releases/download/${FTLversion%$'\r'}/${binary}.sha1" | cut -d ' ' -f 1) local localSha1=$(sha1sum "$(which pihole-FTL)" | cut -d ' ' -f 1) - echo -e " ${INFO} Existing FTL Binary detected. Checking sha1sum..." if [[ "${remoteSha1}" != "${localSha1}" ]]; then echo -e " ${INFO} Corruption detected..." FTLinstall "${binary}" || return 1 else - echo -e " ${INFO} sha1sums match. No need to download!" + echo -e " ${INFO} Checksum correct. No need to download!" fi fi } From a293b5a3718f3381f9f9fd2cc955127d062e1a99 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 25 Jul 2017 22:49:06 +0100 Subject: [PATCH 11/16] prevent `./automated install/basic-install.sh: line 1886: /usr/bin/pihole-FTL: No such file or directory` on new install, or if pihole-FTL is missing for whatever reason. Signed-off-by: Adam Warner --- automated install/basic-install.sh | 38 +++++++++++++++++++----------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f0d6018f..170754f2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1883,25 +1883,35 @@ FTLdetect() { #In the next section we check to see if FTL is already installed (in case of pihole -r). #If the installed version matches the latest version, then check the installed sha1sum of the binary vs the remote sha1sum. If they do not match, then download echo -e " ${INFO} Checking for existing FTL binary..." - local FTLversion=$(/usr/bin/pihole-FTL tag) - local FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') - if [[ "${FTLversion}" != "${FTLlatesttag}" ]]; then - # Install FTL - FTLinstall "${binary}" || return 1 - else - echo -e " ${INFO} Latest FTL Binary already installed (${FTLlatesttag}). Confirming Checksum..." + local ftlLoc=$(which pihole-FTL) - local remoteSha1=$(curl -sSL --fail "https://github.com/pi-hole/FTL/releases/download/${FTLversion%$'\r'}/${binary}.sha1" | cut -d ' ' -f 1) - local localSha1=$(sha1sum "$(which pihole-FTL)" | cut -d ' ' -f 1) + if [[ ${ftlLoc} ]]; then + local FTLversion=$(/usr/bin/pihole-FTL tag) + local FTLlatesttag=$(curl -sI https://github.com/pi-hole/FTL/releases/latest | grep 'Location' | awk -F '/' '{print $NF}' | tr -d '\r\n') - if [[ "${remoteSha1}" != "${localSha1}" ]]; then - echo -e " ${INFO} Corruption detected..." - FTLinstall "${binary}" || return 1 + if [[ "${FTLversion}" != "${FTLlatesttag}" ]]; then + # Install FTL + FTLinstall "${binary}" || return 1 else - echo -e " ${INFO} Checksum correct. No need to download!" + echo -e " ${INFO} Latest FTL Binary already installed (${FTLlatesttag}). Confirming Checksum..." + + local remoteSha1=$(curl -sSL --fail "https://github.com/pi-hole/FTL/releases/download/${FTLversion%$'\r'}/${binary}.sha1" | cut -d ' ' -f 1) + local localSha1=$(sha1sum "$(which pihole-FTL)" | cut -d ' ' -f 1) + + if [[ "${remoteSha1}" != "${localSha1}" ]]; then + echo -e " ${INFO} Corruption detected..." + FTLinstall "${binary}" || return 1 + else + echo -e " ${INFO} Checksum correct. No need to download!" + fi fi - fi + else + # Install FTL + FTLinstall "${binary}" || return 1 + fi + + } main() { From 714fd93292880e999706419480f4c59a0defb77f Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Wed, 26 Jul 2017 08:03:23 +1000 Subject: [PATCH 12/16] Provide correct FTL stats (#1619) * Provide correct FTL stats * Use the correct lines in the array when displaying FTL stats * Treat ads_blocked_today/dns_queries_today as currency, like domains_being_blocked is on large screens * Chronometer Shellcheck validation * Remove unnecessary \ from CPU usage readout --- advanced/Scripts/chronometer.sh | 42 ++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index d9b01fc0..a9ccf900 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -1,4 +1,5 @@ #!/usr/bin/env bash +# shellcheck disable=SC1090,SC1091 # Pi-hole: A black hole for Internet advertisements # (c) 2017 Pi-hole, LLC (https://pi-hole.net) # Network-wide ad blocking via your own hardware. @@ -91,10 +92,10 @@ printFunc() { printf "%s%s$spc" "$title" "$text_main" if [[ -n "$text_addn" ]]; then - printf "%s(%s)%s\n" "$COL_NC$COL_DARK_GRAY" "$text_addn" "$COL_NC" + printf "%s(%s)%s\\n" "$COL_NC$COL_DARK_GRAY" "$text_addn" "$COL_NC" else # Do not print trailing newline on final line - [[ -z "$text_last" ]] && printf "%s\n" "$COL_NC" + [[ -z "$text_last" ]] && printf "%s\\n" "$COL_NC" fi } @@ -126,7 +127,7 @@ get_init_stats() { mins=$(( ($1%3600)/60 )); secs=$(( $1%60 )) [[ "$day" -ge "2" ]] && plu="s" [[ "$day" -ge "1" ]] && days="$day day${plu}, " || days="" - printf "%s%02d:%02d:%02d\n" "$days" "$hrs" "$mins" "$secs" + printf "%s%02d:%02d:%02d\\n" "$days" "$hrs" "$mins" "$secs" } # Set Colour Codes @@ -285,6 +286,7 @@ get_sys_stats() { sys_loadavg=$(cut -d " " -f1,2,3 /proc/loadavg) # Get CPU usage, only counting processes over 1% as active + # shellcheck disable=SC2009 cpu_raw=$(ps -eo pcpu,rss --no-headers | grep -E -v " 0") cpu_tasks=$(wc -l <<< "$cpu_raw") cpu_taskact=$(sed -r "/(^ 0.)/d" <<< "$cpu_raw" | wc -l) @@ -306,7 +308,7 @@ get_sys_stats() { # Determine colour for temperature if [[ -n "$temp_file" ]]; then if [[ "$temp_unit" == "C" ]]; then - cpu_temp=$(printf "%.0fc\n" "$(calcFunc "$(< $temp_file) / 1000")") + cpu_temp=$(printf "%.0fc\\n" "$(calcFunc "$(< $temp_file) / 1000")") case "${cpu_temp::-1}" in -*|[0-9]|[1-3][0-9]) cpu_col="$COL_LIGHT_BLUE";; @@ -320,7 +322,7 @@ get_sys_stats() { cpu_temp_str=" @ $cpu_col$cpu_temp$COL_NC$COL_DARK_GRAY" elif [[ "$temp_unit" == "F" ]]; then - cpu_temp=$(printf "%.0ff\n" "$(calcFunc "($(< $temp_file) / 1000) * 9 / 5 + 32")") + cpu_temp=$(printf "%.0ff\\n" "$(calcFunc "($(< $temp_file) / 1000) * 9 / 5 + 32")") case "${cpu_temp::-1}" in -*|[0-9]|[0-9][0-9]) cpu_col="$COL_LIGHT_BLUE";; @@ -333,7 +335,7 @@ get_sys_stats() { cpu_temp_str=" @ $cpu_col$cpu_temp$COL_NC$COL_DARK_GRAY" else - cpu_temp_str=$(printf " @ %.0fk\n" "$(calcFunc "($(< $temp_file) / 1000) + 273.15")") + cpu_temp_str=$(printf " @ %.0fk\\n" "$(calcFunc "($(< $temp_file) / 1000) + 273.15")") fi else cpu_temp_str="" @@ -365,12 +367,12 @@ get_ftl_stats() { local stats_raw mapfile -t stats_raw < <(pihole-FTL "stats") - domains_being_blocked_raw="${stats_raw[1]#* }" - dns_queries_today_raw="${stats_raw[3]#* }" - ads_blocked_today_raw="${stats_raw[5]#* }" - ads_percentage_today_raw="${stats_raw[7]#* }" - queries_forwarded_raw="${stats_raw[11]#* }" - queries_cached_raw="${stats_raw[13]#* }" + domains_being_blocked_raw="${stats_raw[0]#* }" + dns_queries_today_raw="${stats_raw[1]#* }" + ads_blocked_today_raw="${stats_raw[2]#* }" + ads_percentage_today_raw="${stats_raw[3]#* }" + queries_forwarded_raw="${stats_raw[5]#* }" + queries_cached_raw="${stats_raw[6]#* }" # Only retrieve these stats when not called from jsonFunc if [[ -z "$1" ]]; then @@ -378,11 +380,11 @@ get_ftl_stats() { local top_domain_raw local top_client_raw - domains_being_blocked=$(printf "%.0f\n" "${domains_being_blocked_raw}") - dns_queries_today=$(printf "%.0f\n" "${dns_queries_today_raw}") - ads_blocked_today=$(printf "%.0f\n" "${ads_blocked_today_raw}") - ads_percentage_today=$(printf "%'.0f\n" "${ads_percentage_today_raw}") - queries_cached_percentage=$(printf "%.0f\n" "$(calcFunc "$queries_cached_raw * 100 / ( $queries_forwarded_raw + $queries_cached_raw )")") + domains_being_blocked=$(printf "%.0f\\n" "${domains_being_blocked_raw}") + dns_queries_today=$(printf "%.0f\\n" "${dns_queries_today_raw}") + ads_blocked_today=$(printf "%.0f\\n" "${ads_blocked_today_raw}") + ads_percentage_today=$(printf "%'.0f\\n" "${ads_percentage_today_raw}") + queries_cached_percentage=$(printf "%.0f\\n" "$(calcFunc "$queries_cached_raw * 100 / ( $queries_forwarded_raw + $queries_cached_raw )")") recent_blocked=$(pihole-FTL recentBlocked) read -r -a top_ad_raw <<< "$(pihole-FTL "top-ads (1)")" read -r -a top_domain_raw <<< "$(pihole-FTL "top-domains (1)")" @@ -412,6 +414,8 @@ get_strings() { used_str="Used: " leased_str="Leased: " domains_being_blocked=$(printf "%'.0f" "$domains_being_blocked") + ads_blocked_today=$(printf "%'.0f" "$ads_blocked_today") + dns_queries_today=$(printf "%'.0f" "$dns_queries_today") ph_info="Blocking: $domains_being_blocked sites" total_str="Total: " else @@ -473,8 +477,8 @@ chronoFunc() { ${COL_DARK_GRAY}$scr_line_str${COL_NC}" else echo -e "|¯¯¯(¯)_|¯|_ ___|¯|___$phc_ver_str -| ¯_/¯|_| ' \/ _ \ / -_)$lte_ver_str -|_| |_| |_||_\___/_\___|$ftl_ver_str +| ¯_/¯|_| ' \\/ _ \\ / -_)$lte_ver_str +|_| |_| |_||_\\___/_\\___|$ftl_ver_str ${COL_DARK_GRAY}$scr_line_str${COL_NC}" fi From e0eb5eb2b1bb5fc5772aac479f71d4dfb77237ac Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Wed, 26 Jul 2017 08:07:06 +1000 Subject: [PATCH 13/16] Fix queryFunc if adlists URLs have been removed (#1618) * Fix queryFunc if adlists URLs have been removed * Allow for -adlists command line switch (where the "s" is a typo) * Add error message when unable to find associated adlists URL * Provide PR fix on current dev version * Add blResult variable for white/black match * Supporting Block Page queryFunc fixes * Re-add unmerged lines --- pihole | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/pihole b/pihole index 8da911d8..61ed6cd6 100755 --- a/pihole +++ b/pihole @@ -149,7 +149,7 @@ Options: fi # Strip valid options, leaving only the domain and invalid options - options=$(sed 's/ \?-\(exact\|adlist\|bp\|all\) \?//g' <<< "$options") + options=$(sed 's/ \?-\(exact\|adlist\(s\)\?\|bp\|all\) \?//g' <<< "$options") # Handle errors if [[ "${options}" == *" "* ]]; then @@ -181,13 +181,14 @@ Options: results=($(scanList "${query}" "${lists}" "${method}")) if [[ -n "${results[*]}" ]]; then + blResult=true # Loop through each scanList line to print appropriate title for result in "${results[@]}"; do filename="${result/:*/}" if [[ -n "$exact" ]]; then printf " Exact result in %s\n" "${filename}" elif [[ -n "$blockpage" ]]; then - printf " [i] %s\n" "${filename}" + printf "π %s\n" "${filename}" else domain="${result/*:/}" if [[ ! "${filename}" == "${filename_prev:-}" ]]; then @@ -216,7 +217,7 @@ Options: fi if [[ -n "${blockpage}" ]]; then - echo " ${INFO} ${match}" + echo "π ${wildcardlist/*\/}" else echo " *.${match}" fi @@ -287,12 +288,18 @@ Options: filenum=("${filename/list./}") filenum=("${filenum/.*/}") filename="${adlists[$filenum]}" + + # If gravity has generated associated .domains files + # but adlists.list has been modified since + if [[ -z "${filename}" ]]; then + filename="${COL_LIGHT_RED}Error: no associated adlists URL found${COL_NC}" + fi fi if [[ -n "${exact}" ]]; then printf " %s\n" "${filename}" elif [[ -n "${blockpage}" ]]; then - printf " [%s] %s\n" "${filenum}" "${filename}" + printf "%s %s\n" "${filenum}" "${filename}" else # Standard query output # Print filename heading once per file, not for every match From c02a24cf7176f73c8ec8d1abf28a807e69611c17 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 26 Jul 2017 14:34:40 +0100 Subject: [PATCH 14/16] Fix/unbreak development (#1635) * Always process DNS and DHCP settings in installer * change where finalExports is called and where LIGHTTPD_ENABLED is set. Signed-off-by: Adam Warner * this may or may not work. If it does, can be functionised to reduce code duping Signed-off-by: Adam Warner * This will fix the tests, but break the patch Signed-off-by: Adam Warner --- automated install/basic-install.sh | 43 +++++++++++++++++------------- 1 file changed, 25 insertions(+), 18 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 4330637d..e37282a7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1499,22 +1499,20 @@ finalExports() { echo "LIGHTTPD_ENABLED=${LIGHTTPD_ENABLED}" }>> "${setupVars}" - # Look for DNS server settings which would have to be reapplied + # Bring in the current settings and the functions to manipulate them source "${setupVars}" - # source "${PI_HOLE_LOCAL_REPO}/advanced/Scripts/webpage.sh" - # if [[ "${DNS_FQDN_REQUIRED}" != "" ]] ; then - # + # Look for DNS server settings which would have to be reapplied ProcessDNSSettings fi - # if [[ "${DHCP_ACTIVE}" != "" ]] ; then - # + # Look for DHCP server settings which would have to be reapplied ProcessDHCPSettings fi + } # Install the logrotate script @@ -1585,6 +1583,9 @@ installPihole() { FTLdetect || echo -e " ${CROSS} FTL Engine not installed." # Configure the firewall configureFirewall + + #update setupvars.conf with any variables that may or may not have been changed during the install + finalExports } # At some point in the future this list can be pruned, for now we'll need it to ensure updates don't break. @@ -1619,6 +1620,8 @@ updatePihole() { # Detect if FTL is installed FTLdetect || echo -e " ${CROSS} FTL Engine not installed." + #update setupvars.conf with any variables that may or may not have been changed during the install + finalExports } @@ -2034,6 +2037,13 @@ main() { fi install_dependent_packages DEPS[@] + if [[ -x "$(command -v systemctl)" ]]; then + # Value will either be 1, if true, or 0 + LIGHTTPD_ENABLED=$(systemctl is-enabled lighttpd | grep -c 'enabled' || true) + else + # Value will either be 1, if true, or 0 + LIGHTTPD_ENABLED=$(service lighttpd status | awk '/Loaded:/ {print $0}' | grep -c 'enabled' || true) + fi # Install and log everything to a file installPihole | tee ${tmpLog} @@ -2055,6 +2065,14 @@ main() { fi install_dependent_packages DEPS[@] + if [[ -x "$(command -v systemctl)" ]]; then + # Value will either be 1, if true, or 0 + LIGHTTPD_ENABLED=$(systemctl is-enabled lighttpd | grep -c 'enabled' || true) + else + # Value will either be 1, if true, or 0 + LIGHTTPD_ENABLED=$(service lighttpd status | awk '/Loaded:/ {print $0}' | grep -c 'enabled' || true) + fi + updatePihole | tee ${tmpLog} fi @@ -2080,16 +2098,6 @@ main() { # If the Web server was installed, if [[ "${INSTALL_WEB}" == true ]]; then - # Check to see if lighttpd was already set to run on reboot - if [[ "${useUpdateVars}" == true ]]; then - if [[ -x "$(command -v systemctl)" ]]; then - # Value will either be 1, if true, or 0 - LIGHTTPD_ENABLED=$(systemctl is-enabled lighttpd | grep -c 'enabled' || true) - else - # Value will either be 1, if true, or 0 - LIGHTTPD_ENABLED=$(service lighttpd status | awk '/Loaded:/ {print $0}' | grep -c 'enabled' || true) - fi - fi if [[ "${LIGHTTPD_ENABLED}" == "1" ]]; then start_service lighttpd @@ -2144,8 +2152,7 @@ main() { # Display where the log file is echo -e "\n ${INFO} The install log is located at: /etc/pihole/install.log ${COL_LIGHT_GREEN}${INSTALL_TYPE} Complete! ${COL_NC}" - #update setupvars.conf with any variables that may or may not have been changed during the install - finalExports + } # From b09c660833b322eec21a1f84e1044557c274478a Mon Sep 17 00:00:00 2001 From: Mcat12 Date: Wed, 26 Jul 2017 12:15:23 -0400 Subject: [PATCH 15/16] Always process DNS and DHCP settings in installer (#1630) * Always process DNS and DHCP settings in installer * Make sure dnsmasq config exists before modifying it Signed-off-by: Mcat12 * Make sure the dnsmasq config directory exists Signed-off-by: Mcat12 * Only remove the DHCP config if it exists (fixes tests, hopefully) Signed-off-by: Mcat12 --- advanced/Scripts/webpage.sh | 4 +++- automated install/basic-install.sh | 11 +++-------- test/test_automated_install.py | 2 ++ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/advanced/Scripts/webpage.sh b/advanced/Scripts/webpage.sh index 42272122..b887a2b8 100755 --- a/advanced/Scripts/webpage.sh +++ b/advanced/Scripts/webpage.sh @@ -292,7 +292,9 @@ ra-param=*,0,0 fi else - rm "${dhcpconfig}" &> /dev/null + if [[ -f "${dhcpconfig}" ]]; then + rm "${dhcpconfig}" &> /dev/null + fi fi } diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index e37282a7..9d264846 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1503,16 +1503,11 @@ finalExports() { source "${setupVars}" source "${PI_HOLE_LOCAL_REPO}/advanced/Scripts/webpage.sh" - if [[ "${DNS_FQDN_REQUIRED}" != "" ]] ; then # Look for DNS server settings which would have to be reapplied - ProcessDNSSettings - fi - - if [[ "${DHCP_ACTIVE}" != "" ]] ; then - # Look for DHCP server settings which would have to be reapplied - ProcessDHCPSettings - fi + ProcessDNSSettings + # Look for DHCP server settings which would have to be reapplied + ProcessDHCPSettings } # Install the logrotate script diff --git a/test/test_automated_install.py b/test/test_automated_install.py index 4a4f72aa..9129c314 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -59,6 +59,8 @@ def test_setupVars_saved_to_file(Pihole): TERM=xterm source /opt/pihole/basic-install.sh {} + mkdir -p /etc/dnsmasq.d + version_check_dnsmasq finalExports cat /etc/pihole/setupVars.conf '''.format(set_setup_vars)) From fdf2649f2fef8981176735fb856997e4856fc13b Mon Sep 17 00:00:00 2001 From: WaLLy3K Date: Thu, 27 Jul 2017 03:00:08 +1000 Subject: [PATCH 16/16] Clean up known remaining colour output issues (#1613) * Print newline on error message * Output last three lines of error if update fails * Consistent error messages & housekeeping * Add shellcheck directive to ignore COL_TABLE * Quoted and braced variables for codebase consistency * Escaped newlines correctly * Made error messages consistent (indenting and wording) * Removed consecutive echos * Conditional formatting consistency * Braced, quoted and used [[ on conditionals * Fix specific ShellCheck issues * Fixed issues that could be safely changed without extensive testing * Update SELinux whiptail behaviour & more * Colourised some strings * Fixed multiple line string indenting * Made output consistent with existing codebase * Removed sequential echos * Make SELinux whiptail use "--defaultno", and change text wording * Add help text for hostrecord, and colourise output * this should fix the tests... Signed-off-by: Adam Warner * revert changes to `update_package_cache()` to prove tests Signed-off-by: Adam Warner --- advanced/Scripts/update.sh | 76 ++++---- advanced/Scripts/webpage.sh | 20 +- automated install/basic-install.sh | 283 ++++++++++++++--------------- test/test_automated_install.py | 6 +- 4 files changed, 194 insertions(+), 191 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 71b7cecd..a4ada4c8 100755 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -19,10 +19,9 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole" # shellcheck disable=SC2034 PH_TEST=true -# Have to ignore the following rule as spaces in paths are not supported by ShellCheck -#shellcheck disable=SC1090 +# shellcheck disable=SC1090 source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh" - +# shellcheck disable=SC1091 source "/opt/pihole/COL_TABLE" # is_repo() sourced from basic-install.sh @@ -51,15 +50,15 @@ GitCheckUpdateAvail() { # defaults to the current one. REMOTE="$(git rev-parse "@{upstream}")" - if [[ ${#LOCAL} == 0 ]]; then - echo -e " ${COL_LIGHT_RED}Error: Local revision could not be obtained, ask Pi-hole support." - echo -e " Additional debugging output:${COL_NC}" + if [[ "${#LOCAL}" == 0 ]]; then + echo -e "\\n ${COL_LIGHT_RED}Error: Local revision could not be obtained, please contact Pi-hole Support + Additional debugging output:${COL_NC}" git status exit fi - if [[ ${#REMOTE} == 0 ]]; then - echo -e " ${COL_LIGHT_RED}Error: Remote revision could not be obtained, ask Pi-hole support." - echo -e " Additional debugging output:${COL_NC}" + if [[ "${#REMOTE}" == 0 ]]; then + echo -e "\\n ${COL_LIGHT_RED}Error: Remote revision could not be obtained, please contact Pi-hole Support + Additional debugging output:${COL_NC}" git status exit fi @@ -94,13 +93,15 @@ FTLcheckUpdate() { main() { local pihole_version_current local web_version_current - #shellcheck disable=1090,2154 + local basicError="\\n ${COL_LIGHT_RED}Unable to complete update, please contact Pi-hole Support${COL_NC}" + + # shellcheck disable=1090,2154 source "${setupVars}" - #This is unlikely + # This is unlikely if ! is_repo "${PI_HOLE_FILES_DIR}" ; then - echo -e " ${COL_LIGHT_RED}Critical Error: Core Pi-hole repo is missing from system!" - echo -e " Please re-run install script from https://github.com/pi-hole/pi-hole${COL_NC}" + echo -e "\\n ${COL_LIGHT_RED}Error: Core Pi-hole repo is missing from system! + Please re-run install script from https://pi-hole.net${COL_NC}" exit 1; fi @@ -108,18 +109,18 @@ main() { if GitCheckUpdateAvail "${PI_HOLE_FILES_DIR}" ; then core_update=true - echo -e " ${INFO} Pi-hole Core:\t${COL_YELLOW}update available${COL_NC}" + echo -e " ${INFO} Pi-hole Core:\\t${COL_YELLOW}update available${COL_NC}" else core_update=false - echo -e " ${INFO} Pi-hole Core:\t${COL_LIGHT_GREEN}up to date${COL_NC}" + echo -e " ${INFO} Pi-hole Core:\\t${COL_LIGHT_GREEN}up to date${COL_NC}" fi if FTLcheckUpdate ; then FTL_update=true - echo -e " ${INFO} FTL:\t\t${COL_YELLOW}update available${COL_NC}" + echo -e " ${INFO} FTL:\\t\\t${COL_YELLOW}update available${COL_NC}" else FTL_update=false - echo -e " ${INFO} FTL:\t\t${COL_LIGHT_GREEN}up to date${COL_NC}" + echo -e " ${INFO} FTL:\\t\\t${COL_LIGHT_GREEN}up to date${COL_NC}" fi # Logic: Don't update FTL when there is a core update available @@ -132,19 +133,19 @@ main() { echo "" fi - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then if ! is_repo "${ADMIN_INTERFACE_DIR}" ; then - echo -e " ${COL_LIGHT_RED}Critical Error: Web Admin repo is missing from system!" - echo -e " Please re-run install script from https://github.com/pi-hole/pi-hole${COL_NC}" + echo -e "\\n ${COL_LIGHT_RED}Error: Web Admin repo is missing from system! + Please re-run install script from https://pi-hole.net${COL_NC}" exit 1; fi if GitCheckUpdateAvail "${ADMIN_INTERFACE_DIR}" ; then web_update=true - echo -e " ${INFO} Web Interface:\t${COL_YELLOW}update available${COL_NC}" + echo -e " ${INFO} Web Interface:\\t${COL_YELLOW}update available${COL_NC}" else web_update=false - echo -e " ${INFO} Web Interface:\t${COL_LIGHT_GREEN}up to date${COL_NC}" + echo -e " ${INFO} Web Interface:\\t${COL_LIGHT_GREEN}up to date${COL_NC}" fi # Logic @@ -163,25 +164,24 @@ main() { echo -e " ${TICK} Everything is up to date!" exit 0 fi - elif ! ${core_update} && ${web_update} ; then echo "" echo -e " ${INFO} Pi-hole Web Admin files out of date" getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" - elif ${core_update} && ! ${web_update} ; then echo "" echo -e " ${INFO} Pi-hole core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --reconfigure --unattended || echo -e " ${COL_LIGHT_RED}Unable to complete update, contact Pi-hole${COL_NC}" && exit 1 - + ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --reconfigure --unattended || \ + echo -e "${basicError}" && exit 1 elif ${core_update} && ${web_update} ; then echo "" echo -e " ${INFO} Updating Pi-hole core and web admin files" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --unattended || echo -e " ${COL_LIGHT_RED}Unable to complete update, contact Pi-hole${COL_NC}" && exit 1 + ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --unattended || \ + echo -e "${basicError}" && exit 1 else - echo -e " ${COL_LIGHT_RED}Update script has malfunctioned, fallthrough reached. Please contact support${COL_NC}" + echo -e " ${COL_LIGHT_RED}Update script has malfunctioned, please contact Pi-hole Support${COL_NC}" exit 1 fi else # Web Admin not installed, so only verify if core is up to date @@ -193,38 +193,36 @@ main() { fi else echo "" - echo -e " ${INFO} Pi-hole core files out of date" + echo -e " ${INFO} Pi-hole Core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --reconfigure --unattended || echo -e " ${COL_LIGHT_RED}Unable to complete update, contact Pi-hole${COL_NC}" && exit 1 + ${PI_HOLE_FILES_DIR}/automated\ install/basic-install.sh --reconfigure --unattended || \ + echo -e "${basicError}" && exit 1 fi fi if [[ "${web_update}" == true ]]; then web_version_current="$(/usr/local/bin/pihole version --admin --current)" echo "" - echo -e " ${INFO} Web Admin version is now at ${web_version_current/* v/v}" - echo -e " ${INFO} If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'" + echo -e " ${INFO} Web Admin version is now at ${web_version_current/* v/v} + ${INFO} If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'" fi if [[ "${core_update}" == true ]]; then pihole_version_current="$(/usr/local/bin/pihole version --pihole --current)" echo "" - echo -e " ${INFO} Pi-hole version is now at ${pihole_version_current/* v/v}" - echo -e " ${INFO} If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" + echo -e " ${INFO} Pi-hole version is now at ${pihole_version_current/* v/v} + ${INFO} If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" fi - if [[ ${FTL_update} == true ]]; then + if [[ "${FTL_update}" == true ]]; then FTL_version_current="$(/usr/bin/pihole-FTL tag)" - echo "" - echo -e " ${INFO} FTL version is now at ${FTL_version_current/* v/v}" + echo -e "\\n ${INFO} FTL version is now at ${FTL_version_current/* v/v}" start_service pihole-FTL enable_service pihole-FTL fi - echo "" exit 0 - } main diff --git a/advanced/Scripts/webpage.sh b/advanced/Scripts/webpage.sh index b887a2b8..9d101482 100755 --- a/advanced/Scripts/webpage.sh +++ b/advanced/Scripts/webpage.sh @@ -29,6 +29,7 @@ Options: -c, celsius Set Celsius as preferred temperature unit -f, fahrenheit Set Fahrenheit as preferred temperature unit -k, kelvin Set Kelvin as preferred temperature unit + -r, hostrecord Add a name to the DNS associated to an IPv4/IPv6 address -h, --help Show this help dialog -i, interface Specify dnsmasq's interface listening behavior Add '-h' for more info on interface usage" @@ -392,12 +393,23 @@ RemoveDHCPStaticAddress() { } SetHostRecord() { - if [ -n "${args[3]}" ]; then + if [[ "${1}" == "-h" ]] || [[ "${1}" == "--help" ]]; then + echo "Usage: pihole -a hostrecord [IPv4-address],[IPv6-address] +Example: 'pihole -a hostrecord home.domain.com 192.168.1.1,2001:db8:a0b:12f0::1' +Add a name to the DNS associated to an IPv4/IPv6 address + +Options: + \"\" Empty: Remove host record + -h, --help Show this help dialog" + exit 0 + fi + + if [[ -n "${args[3]}" ]]; then change_setting "HOSTRECORD" "${args[2]},${args[3]}" - echo "Setting host record for ${args[2]} -> ${args[3]}" + echo -e " ${TICK} Setting host record for ${args[2]} to ${args[3]}" else change_setting "HOSTRECORD" "" - echo "Removing host record" + echo -e " ${TICK} Removing host record" fi ProcessDNSSettings @@ -474,7 +486,7 @@ main() { "resolve" ) ResolutionSettings;; "addstaticdhcp" ) AddDHCPStaticAddress;; "removestaticdhcp" ) RemoveDHCPStaticAddress;; - "hostrecord" ) SetHostRecord;; + "-r" | "hostrecord" ) SetHostRecord "$3";; "-i" | "interface" ) SetListeningMode "$@";; "-t" | "teleporter" ) Teleporter;; "adlist" ) CustomizeAdLists;; diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9d264846..4047502b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,22 +1,21 @@ #!/usr/bin/env bash +# shellcheck disable=SC1090 + # Pi-hole: A black hole for Internet advertisements # (c) 2017 Pi-hole, LLC (https://pi-hole.net) # Network-wide ad blocking via your own hardware. # -# Installs Pi-hole +# Installs and Updates Pi-hole # # This file is copyright under the latest version of the EUPL. # Please see LICENSE file for your rights under this license. - - # pi-hole.net/donate # # Install with this command (from your Linux machine): # # curl -L install.pi-hole.net | bash - # -e option instructs bash to immediately exit if any command [1] has a non-zero exit status # We do not want users to end up with a partially working install, so we exit the script # instead of continuing the installation with something broken @@ -35,6 +34,7 @@ instalLogLoc=/etc/pihole/install.log # This is an important file as it contains information specific to the machine it's being installed on setupVars=/etc/pihole/setupVars.conf # Pi-hole uses lighttpd as a Web server, and this is the config file for it +# shellcheck disable=SC2034 lighttpdConfig=/etc/lighttpd/lighttpd.conf # This is a file used for the colorized output coltable=/opt/pihole/COL_TABLE @@ -79,7 +79,7 @@ reconfigure=false runUnattended=false # If the color table file exists, -if [[ -f ${coltable} ]]; then +if [[ -f "${coltable}" ]]; then # source it source ${coltable} # Othwerise, @@ -91,8 +91,9 @@ else TICK="[${COL_LIGHT_GREEN}✓${COL_NC}]" CROSS="[${COL_LIGHT_RED}✗${COL_NC}]" INFO="[i]" + # shellcheck disable=SC2034 DONE="${COL_LIGHT_GREEN} done!${COL_NC}" - OVER="\r\033[K" + OVER="\\r\\033[K" fi # A simple function that just echoes out our logo in ASCII format @@ -122,7 +123,6 @@ show_ascii_berry() { " } - # Compatibility distro_check() { # If apt-get is installed, then we know it's part of the Debian family @@ -321,13 +321,13 @@ getGitFiles() { # Show that we're checking it echo -e "${OVER} ${TICK} ${str}" # Update the repo, returning an error message on failure - update_repo "${directory}" || { echo -e "\n ${COL_LIGHT_RED}Error: Could not update local repository. Contact support.${COL_NC}"; exit 1; } + update_repo "${directory}" || { echo -e "\\n ${COL_LIGHT_RED}Error: Could not update local repository. Contact support.${COL_NC}"; exit 1; } # If it's not a .git repo, else # Show an error echo -e "${OVER} ${CROSS} ${str}" # Attempt to make the repository, showing an error on falure - make_repo "${directory}" "${remoteRepo}" || { echo -e "\n ${COL_LIGHT_RED}Error: Could not update local repository. Contact support.${COL_NC}"; exit 1; } + make_repo "${directory}" "${remoteRepo}" || { echo -e "\\n ${COL_LIGHT_RED}Error: Could not update local repository. Contact support.${COL_NC}"; exit 1; } fi # echo a blank line echo "" @@ -380,13 +380,13 @@ get_available_interfaces() { # A function for displaying the dialogs the user sees when first running the installer welcomeDialogs() { # Display the welcome dialog using an approriately sized window via the calculation conducted earlier in the script - whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "\n\nThis installer will transform your device 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} # Request that users donate if they enjoy the software since we all work on it in our free time - 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} + 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" "\n\nThe 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} } @@ -400,7 +400,8 @@ verifyFreeDiskSpace() { # Reqired space in KB local required_free_kilobytes=51200 # Calculate existing free space on this machine - local existing_free_kilobytes=$(df -Pk | grep -m1 '\/$' | awk '{print $4}') + local existing_free_kilobytes + existing_free_kilobytes=$(df -Pk | grep -m1 '\/$' | awk '{print $4}') # If the existing space is not an integer, if ! [[ "${existing_free_kilobytes}" =~ ^([0-9])+$ ]]; then @@ -414,7 +415,7 @@ verifyFreeDiskSpace() { # exit with an error code exit 1 # If there is insufficient free disk space, - elif [[ ${existing_free_kilobytes} -lt ${required_free_kilobytes} ]]; then + elif [[ "${existing_free_kilobytes}" -lt "${required_free_kilobytes}" ]]; then # show an error message echo -e " ${CROSS} ${str} Your system disk appears to only have ${existing_free_kilobytes} KB free @@ -428,7 +429,7 @@ verifyFreeDiskSpace() { e.g: curl -L https://install.pi-hole.net | bash" fi # Show there is not enough free space - echo -e "\n ${COL_LIGHT_RED}Insufficient free space, exiting...${COL_NC}" + echo -e "\\n ${COL_LIGHT_RED}Insufficient free space, exiting...${COL_NC}" # and exit with an error exit 1 # Otherwise, @@ -455,7 +456,7 @@ chooseInterface() { interfaceCount=$(echo "${availableInterfaces}" | wc -l) # If there is one interface, - if [[ ${interfaceCount} -eq 1 ]]; then + if [[ "${interfaceCount}" -eq 1 ]]; then # Set it as the interface to use since there is no other option PIHOLE_INTERFACE="${availableInterfaces}" # Otherwise, @@ -465,7 +466,7 @@ chooseInterface() { # use a variable to set the option as OFF to begin with mode="OFF" # If it's the first loop, - if [[ ${firstLoop} -eq 1 ]]; then + if [[ "${firstLoop}" -eq 1 ]]; then # set this as the interface to use (ON) firstLoop=0 mode="ON" @@ -501,11 +502,11 @@ testIPv6() { # will contain 162 which is the decimal value corresponding to 0xa2 value2=$(((0x$first)%256)) # the ULA test is testing for fc00::/7 according to RFC 4193 - ((($value1&254)==252)) && echo "ULA" || true + (((value1&254)==252)) && echo "ULA" || true # the GUA test is testing for 2000::/3 according to RFC 4291 - ((($value1&112)==32)) && echo "GUA" || true + (((value1&112)==32)) && echo "GUA" || true # the LL test is testing for fe80::/10 according to RFC 4193 - ((($value1==254) && (($value2&192)==128))) && echo "Link-local" || true + (((value1==254) && ((value2&192)==128))) && echo "Link-local" || true } # A dialog for showing the user about IPv6 blocking @@ -529,17 +530,17 @@ useIPv6dialog() { # set the IPv6 address to the ULA address IPV6_ADDRESS="${ULA_ADDRESS}" # Show this info to the user - echo "::: Found IPv6 ULA address, using it for blocking IPv6 ads" + echo -e " ${INFO} Found IPv6 ULA address, using it for blocking IPv6 ads" # Otherwise, if the GUA_ADDRESS has a value, elif [[ ! -z "${GUA_ADDRESS}" ]]; then # Let the user know - echo "::: Found IPv6 GUA address, using it for blocking IPv6 ads" + echo -e " ${INFO} Found IPv6 GUA address, using it for blocking IPv6 ads" # And assign it to the global variable IPV6_ADDRESS="${GUA_ADDRESS}" # If none of those work, else # explain that IPv6 blocking will not be used - echo "::: Found neither IPv6 ULA nor GUA address, blocking IPv6 ads will not be enabled" + echo -e " ${INFO} Unable to find IPv6 ULA/GUA address, IPv6 adblocking will not be enabled" # So set the variable to be empty IPV6_ADDRESS="" fi @@ -575,14 +576,14 @@ use4andor6() { esac done # If IPv4 is to be used, - if [[ ${useIPv4} ]]; then + if [[ "${useIPv4}" ]]; then # Run our function to get the information we need find_IPv4_information getStaticIPv4Settings setStaticIPv4 fi # If IPv6 is to be used, - if [[ ${useIPv6} ]]; then + if [[ "${useIPv6}" ]]; then # Run our function to get this information useIPv6dialog fi @@ -590,7 +591,7 @@ use4andor6() { echo -e " ${INFO} IPv4 address: ${IPV4_ADDRESS}" echo -e " ${INFO} IPv6 address: ${IPV6_ADDRESS}" # If neither protocol is selected, - if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then + if [[ ! "${useIPv4}" ]] && [[ ! "${useIPv6}" ]]; then # Show an error in red echo -e " ${COL_LIGHT_RED}Error: Neither IPv4 or IPv6 selected${COL_NC}" # and exit with an error @@ -616,7 +617,7 @@ It is also possible to use a DHCP reservation, but if you are going to do that, # Otherwise, we need to ask the user to input their desired settings. # Start by getting the IPv4 address (pre-filling it with info gathered from DHCP) # Start a loop to let the user enter their information with the chance to go back and edit it if necessary - until [[ ${ipSettingsCorrect} = True ]]; do + until [[ "${ipSettingsCorrect}" = True ]]; do # Ask for the IPv4 address 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) || \ @@ -660,7 +661,7 @@ setStaticIPv4() { local IPADDR local CIDR # For the Debian family, if dhcpcd.conf exists, - if [[ -f /etc/dhcpcd.conf ]]; then + if [[ -f "/etc/dhcpcd.conf" ]]; then # check if the IP is already in the file if grep -q "${IPV4_ADDRESS}" /etc/dhcpcd.conf; then echo -e " ${INFO} Static IP already configured" @@ -672,10 +673,10 @@ setStaticIPv4() { ip addr replace dev "${PIHOLE_INTERFACE}" "${IPV4_ADDRESS}" # Also give a warning that the user may need to reboot their system echo -e " ${TICK} Set IP address to ${IPV4_ADDRESS%/*} - You may need to restart after the install is complete" + You may need to restart after the install is complete" fi # If it's not Debian, check if it's the Fedora family by checking for the file below - elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE} ]];then + elif [[ -f "/etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE}" ]];then # If it exists, IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE} # check if the desired IP is already set @@ -710,7 +711,7 @@ setStaticIPv4() { fi # Show a warning that the user may need to restart echo -e " ${TICK} Set IP address to ${IPV4_ADDRESS%/*} - You may need to restart after the install is complete" + You may need to restart after the install is complete" fi # If all that fails, else @@ -727,7 +728,7 @@ valid_ip() { local stat=1 # If the IP matches the format xxx.xxx.xxx.xxx, - if [[ ${ip} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + if [[ "${ip}" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then # Save the old Interfal Field Separator in a variable OIFS=$IFS # and set the new one to a dot (period) @@ -737,8 +738,8 @@ valid_ip() { # Restore the IFS to what it was IFS=${OIFS} ## Evaluate each octet by checking if it's less than or equal to 255 (the max for each octet) - [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ - && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] + [[ "${ip[0]}" -le 255 && "${ip[1]}" -le 255 \ + && "${ip[2]}" -le 255 && "${ip[3]}" -le 255 ]] # Save the exit code stat=$? fi @@ -801,13 +802,13 @@ setDNS() { ;; Custom) # Until the DNS settings are selected, - until [[ ${DNSSettingsCorrect} = True ]]; do + until [[ "${DNSSettingsCorrect}" = True ]]; do # strInvalid="Invalid" # If the first - if [ ! ${PIHOLE_DNS_1} ]; then + if [[ ! "${PIHOLE_DNS_1}" ]]; then # and second upstream servers do not exist - if [ ! ${PIHOLE_DNS_2} ]; then + if [[ ! "${PIHOLE_DNS_2}" ]]; then # prePopulate="" # Otherwise, @@ -816,39 +817,39 @@ setDNS() { prePopulate=", ${PIHOLE_DNS_2}" fi # - elif [ ${PIHOLE_DNS_1} ] && [ ! ${PIHOLE_DNS_2} ]; then + elif [[ "${PIHOLE_DNS_1}" ]] && [[ ! "${PIHOLE_DNS_2}" ]]; then # prePopulate="${PIHOLE_DNS_1}" # - elif [ ${PIHOLE_DNS_1} ] && [ ${PIHOLE_DNS_2} ]; then + elif [[ "${PIHOLE_DNS_1}" ]] && [[ "${PIHOLE_DNS_2}" ]]; then # prePopulate="${PIHOLE_DNS_1}, ${PIHOLE_DNS_2}" fi # Dialog for the user to enter custom upstream servers - piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\n\nFor example '8.8.8.8, 8.8.4.4'" ${r} ${c} "${prePopulate}" 3>&1 1>&2 2>&3) || \ + piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\\n\\nFor example '8.8.8.8, 8.8.4.4'" ${r} ${c} "${prePopulate}" 3>&1 1>&2 2>&3) || \ { echo -e " ${COL_LIGHT_RED}Cancel was selected, exiting installer${COL_NC}"; exit 1; } # PIHOLE_DNS_1=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}') PIHOLE_DNS_2=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}') # If the IP is valid, - if ! valid_ip "${PIHOLE_DNS_1}" || [ ! "${PIHOLE_DNS_1}" ]; then + if ! valid_ip "${PIHOLE_DNS_1}" || [[ ! "${PIHOLE_DNS_1}" ]]; then # store it in the variable so we can use it PIHOLE_DNS_1=${strInvalid} fi # Do the same for the secondary server - if ! valid_ip "${PIHOLE_DNS_2}" && [ "${PIHOLE_DNS_2}" ]; then + if ! valid_ip "${PIHOLE_DNS_2}" && [[ "${PIHOLE_DNS_2}" ]]; then PIHOLE_DNS_2=${strInvalid} fi # If either of the DNS servers are invalid, - if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]] || [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then + if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]] || [[ "${PIHOLE_DNS_2}" == "${strInvalid}" ]]; then # explain this to the user - whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $PIHOLE_DNS_1\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c} + whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\\n\\n DNS Server 1: $PIHOLE_DNS_1\\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c} # and set the variables back to nothing - if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]]; then + if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]]; then PIHOLE_DNS_1="" fi - if [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then + if [[ "${PIHOLE_DNS_2}" == "${strInvalid}" ]]; then PIHOLE_DNS_2="" fi # Since the settings will not work, stay in the loop @@ -856,7 +857,7 @@ setDNS() { # Othwerise, else # Show the settings - if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\n DNS Server 1: $PIHOLE_DNS_1\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c}); then + if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\\n DNS Server 1: $PIHOLE_DNS_1\\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c}); then # and break from the loop since the servers are vaid DNSSettingsCorrect=True # Otherwise, @@ -878,7 +879,7 @@ setLogging() { local LogChoices # Ask if the user wants to log queries - LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6) + LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6) # The default selection is on LogChooseOptions=("On (Recommended)" "" on Off "" off) @@ -916,12 +917,12 @@ setAdminFlag() { # Depending on their choice case ${WebChoices} in "On (Recommended)") - echo -e " ${INFO} Web Interface On." + echo -e " ${INFO} Web Interface On" # Set it to true INSTALL_WEB=true ;; Off) - echo -e " ${INFO} Web Interface off." + echo -e " ${INFO} Web Interface Off" # or false INSTALL_WEB=false ;; @@ -939,7 +940,7 @@ version_check_dnsmasq() { local dnsmasq_pihole_01_location="/etc/dnsmasq.d/01-pihole.conf" # If the dnsmasq config file exists - if [ -f ${dnsmasq_conf} ]; then + if [[ -f "${dnsmasq_conf}" ]]; then echo -ne " ${INFO} Existing dnsmasq.conf found..." # If gravity.list is found within this file, we presume it's from older versions on Pi-hole, if grep -q ${dnsmasq_pihole_id_string} ${dnsmasq_conf}; then @@ -1048,8 +1049,8 @@ installScripts() { # Otherwise, else # Show an error and exit - echo -e "${OVER} ${CROSS} ${str}" - echo -e " ${COL_LIGHT_RED}Error: Local repo ${PI_HOLE_LOCAL_REPO} not found, exiting installer${COL_NC}" + echo -e "${OVER} ${CROSS} ${str} + ${COL_LIGHT_RED}Error: Local repo ${PI_HOLE_LOCAL_REPO} not found, exiting installer${COL_NC}" exit 1 fi } @@ -1062,15 +1063,15 @@ installConfigs() { version_check_dnsmasq # If the user chose to install the dashboard, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # and if the Web server conf directory does not exist, - if [ ! -d "/etc/lighttpd" ]; then + if [[ ! -d "/etc/lighttpd" ]]; then # make it mkdir /etc/lighttpd # and set the owners chown "${USER}":root /etc/lighttpd # Otherwise, if the config file already exists - elif [ -f "/etc/lighttpd/lighttpd.conf" ]; then + elif [[ -f "/etc/lighttpd/lighttpd.conf" ]]; then # back up the original mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig fi @@ -1164,16 +1165,13 @@ update_package_cache() { notify_package_updates_available() { # Local, named variables local str="Checking ${PKG_MANAGER} for upgraded packages" - echo "" - echo -ne " ${INFO} ${str}..." + echo -ne "\\n ${INFO} ${str}..." # Store the list of packages in a variable updatesToInstall=$(eval "${PKG_COUNT}") - #echo -e "\r\033[K ${TICK} ${str}" - #echo "" - # + if [[ -d "/lib/modules/$(uname -r)" ]]; then # - if [[ ${updatesToInstall} -eq "0" ]]; then + if [[ "${updatesToInstall}" -eq 0 ]]; then # echo -e "${OVER} ${TICK} ${str}... up to date!" echo "" @@ -1184,10 +1182,8 @@ notify_package_updates_available() { echo "" fi else - # echo -e "${OVER} ${CROSS} ${str} - Kernel update detected. If the install fails, please reboot and try again" - echo "" + Kernel update detected. If the install fails, please reboot and try again\\n" fi } @@ -1199,7 +1195,7 @@ install_dependent_packages() { # Add one to the counter counter=$((counter+1)) # If it equals 1, - if [ ${counter} == 1 ]; then + if [[ "${counter}" == 1 ]]; then # echo -e " ${INFO} Installer Dependency checks..." else @@ -1233,7 +1229,7 @@ install_dependent_packages() { fi done # - if [[ ${#installArray[@]} -gt 0 ]]; then + if [[ "${#installArray[@]}" -gt 0 ]]; then # test_dpkg_lock # @@ -1258,7 +1254,7 @@ install_dependent_packages() { fi done # - if [[ ${#installArray[@]} -gt 0 ]]; then + if [[ "${#installArray[@]}" -gt 0 ]]; then # "${PKG_INSTALL[@]}" "${installArray[@]}" &> /dev/null return @@ -1273,7 +1269,7 @@ CreateLogFile() { echo "" echo -ne " ${INFO} ${str}..." # If the pihole log does not exist, - if [ ! -f /var/log/pihole.log ]; then + if [[ ! -f "/var/log/pihole.log" ]]; then # Make it, touch /var/log/pihole.log # set the permissions, @@ -1293,11 +1289,11 @@ installPiholeWeb() { echo "" echo " ${INFO} Installing blocking page..." # If the pihole Web directory exists, - if [ -d "/var/www/html/pihole" ]; then + if [[ -d "/var/www/html/pihole" ]]; then local str="Installing index.php" echo -ne " ${INFO} ${str}..." # and if the index file exists, - if [ -f "/var/www/html/pihole/index.php" ]; then + if [[ -f "/var/www/html/pihole/index.php" ]]; then # do not overwrite it, echo -e " ${COL_LIGHT_GREEN}detected index.php, not overwriting${COL_NC}" # if it doesn't exist @@ -1310,7 +1306,7 @@ installPiholeWeb() { local str="Installing index.js" echo -ne " ${INFO} ${str}..." # and if the index file exists, - if [ -f "/var/www/html/pihole/index.js" ]; then + if [[ -f "/var/www/html/pihole/index.js" ]]; then # do not overwrite it, echo -e " ${COL_LIGHT_GREEN}detected index.js, not overwriting${COL_NC}" else @@ -1322,7 +1318,7 @@ installPiholeWeb() { local str="Installing blockingpage.css" echo -ne " ${INFO} ${str}..." # and if the index file exists, - if [ -f "/var/www/html/pihole/blockingpage.css" ]; then + if [[ -f "/var/www/html/pihole/blockingpage.css" ]]; then # do not overwrite it, echo -e " ${COL_LIGHT_GREEN}detected blockingpage.css, not overwriting${COL_NC}" else @@ -1343,15 +1339,15 @@ installPiholeWeb() { local str="Backing up index.lighttpd.html" echo -ne " ${INFO} ${str}..." # If the default index file exists, - if [ -f /var/www/html/index.lighttpd.html ]; then + if [[ -f "/var/www/html/index.lighttpd.html" ]]; then # back it up mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig echo -e "${OVER} ${TICK} ${str}" # Othwerwise, else # don't do anything - echo -e "${OVER} ${CROSS} ${str}" - echo -e " No default index.lighttpd.html file found... not backing up" + echo -e "${OVER} ${CROSS} ${str} + No default index.lighttpd.html file found... not backing up" fi fi @@ -1435,9 +1431,9 @@ configureFirewall() { # If a firewall is running, if firewall-cmd --state &> /dev/null; then # ask if the user wants to install Pi-hole's default firwall rules - whiptail --title "Firewall in use" --yesno "We have detected a running firewall\n\nPi-hole currently requires HTTP and DNS port access.\n\n\n\nInstall Pi-hole default firewall rules?" ${r} ${c} || \ + whiptail --title "Firewall in use" --yesno "We have detected a running firewall\\n\\nPi-hole currently requires HTTP and DNS port access.\\n\\n\\n\\nInstall Pi-hole default firewall rules?" ${r} ${c} || \ { echo -e " ${INFO} Not installing firewall rulesets."; return 0; } - echo -e " ${TICK} Configuring FirewallD for httpd and dnsmasq." + echo -e " ${TICK} Configuring FirewallD for httpd and dnsmasq" # Allow HTTP and DNS traffice firewall-cmd --permanent --add-service=http --add-service=dns # Reload the firewall to apply these changes @@ -1448,9 +1444,9 @@ configureFirewall() { # If chain Policy is not ACCEPT or last Rule is not ACCEPT # then check and insert our Rules above the DROP/REJECT Rule. if iptables -S INPUT | head -n1 | grep -qv '^-P.*ACCEPT$' || iptables -S INPUT | tail -n1 | grep -qv '^-\(A\|P\).*ACCEPT$'; then - whiptail --title "Firewall in use" --yesno "We have detected a running firewall\n\nPi-hole currently requires HTTP and DNS port access.\n\n\n\nInstall Pi-hole default firewall rules?" ${r} ${c} || \ + whiptail --title "Firewall in use" --yesno "We have detected a running firewall\\n\\nPi-hole currently requires HTTP and DNS port access.\\n\\n\\n\\nInstall Pi-hole default firewall rules?" ${r} ${c} || \ { echo -e " ${INFO} Not installing firewall rulesets."; return 0; } - echo -e " ${TICK} Installing new IPTables firewall rulesets." + echo -e " ${TICK} Installing new IPTables firewall rulesets" # Check chain first, otherwise a new rule will duplicate old ones iptables -C INPUT -p tcp -m tcp --dport 80 -j ACCEPT &> /dev/null || iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT iptables -C INPUT -p tcp -m tcp --dport 53 -j ACCEPT &> /dev/null || iptables -I INPUT 1 -p tcp -m tcp --dport 53 -j ACCEPT @@ -1461,31 +1457,32 @@ configureFirewall() { # Othwerwise, else # no firewall is running - echo -e " ${INFO} No active firewall detected.. skipping firewall configuration." + echo -e " ${INFO} No active firewall detected.. skipping firewall configuration" # so just exit return 0 fi - echo -e " ${INFO} Skipping firewall configuration." + echo -e " ${INFO} Skipping firewall configuration" } # finalExports() { # If the Web interface is not set to be installed, - if [[ ${INSTALL_WEB} == false ]]; then + if [[ "${INSTALL_WEB}" == false ]]; then # and if there is not an IPv4 address, - if [ ${IPV4_ADDRESS} ]; then + if [[ "${IPV4_ADDRESS}" ]]; then # there is no block page, so set IPv4 to 0.0.0.0 (all IP addresses) IPV4_ADDRESS="0.0.0.0" fi - if [ ${IPV6_ADDRESS} ]; then + if [[ "${IPV6_ADDRESS}" ]]; then # and IPv6 to ::/0 IPV6_ADDRESS="::/0" fi fi # If the setup variable file exists, - if [ -e "${setupVars}" ]; then - sed -i.update.bak '/PIHOLE_INTERFACE/d;/IPV4_ADDRESS/d;/IPV6_ADDRESS/d;/PIHOLE_DNS_1/d;/PIHOLE_DNS_2/d;/QUERY_LOGGING/d;/INSTALL_WEB/d;/LIGHTTPD_ENABLED/d;' "${setupVars}" + if [[ -e "${setupVars}" ]]; then + # update the variables in the file + sed -i.update.bak '/PIHOLE_INTERFACE/d;/IPV4_ADDRESS/d;/IPV6_ADDRESS/d;/PIHOLE_DNS_1/d;/PIHOLE_DNS_2/d;/QUERY_LOGGING/d;/INSTALL_WEB/d;' "${setupVars}" fi # echo the information to the user { @@ -1526,7 +1523,7 @@ installLogrotate() { # the local properties of the /var/log directory logusergroup="$(stat -c '%U %G' /var/log)" # If the variable has a value, - if [[ ! -z $logusergroup ]]; then + if [[ ! -z "${logusergroup}" ]]; then # sed -i "s/# su #/su ${logusergroup}/g;" /etc/pihole/logrotate fi @@ -1539,8 +1536,8 @@ installPihole() { create_pihole_user # If the user wants to install the Web interface, - if [[ ${INSTALL_WEB} == true ]]; then - if [ ! -d "/var/www/html" ]; then + if [[ "${INSTALL_WEB}" == true ]]; then + if [[ ! -d "/var/www/html" ]]; then # make the Web directory if necessary mkdir -p /var/www/html fi @@ -1550,13 +1547,13 @@ installPihole() { # Give pihole access to the Web server group usermod -a -G ${LIGHTTPD_GROUP} pihole # If the lighttpd command is executable, - if [ -x "$(command -v lighty-enable-mod)" ]; then + if [[ -x "$(command -v lighty-enable-mod)" ]]; then # enable fastcgi and fastcgi-php lighty-enable-mod fastcgi fastcgi-php > /dev/null || true else # Othweise, show info about installing them echo -e " ${INFO} Warning: 'lighty-enable-mod' utility not found - Please ensure fastcgi is enabled if you experience issues\n" + Please ensure fastcgi is enabled if you experience issues\\n" fi fi # Install scripts, @@ -1566,7 +1563,7 @@ installPihole() { # and create the log file CreateLogFile # If the user wants to install the dashboard, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # do so installPiholeWeb fi @@ -1575,7 +1572,7 @@ installPihole() { # Install the logrotate file installLogrotate # Check if FTL is installed - FTLdetect || echo -e " ${CROSS} FTL Engine not installed." + FTLdetect || echo -e " ${CROSS} FTL Engine not installed" # Configure the firewall configureFirewall @@ -1604,7 +1601,7 @@ updatePihole() { # Create the log file CreateLogFile # If the user wants to install the dasboard, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # do so installPiholeWeb fi @@ -1625,19 +1622,17 @@ updatePihole() { checkSelinux() { # If the getenforce command exists, if command -v getenforce &> /dev/null; then - echo "" - echo -ne " ${INFO} SELinux Support Detected... Mode: " # Store the current mode in a variable enforceMode=$(getenforce) - echo "${enforceMode}" + echo -e "\\n ${INFO} SELinux mode detected: ${enforceMode}" + # If it's enforcing, if [[ "${enforceMode}" == "Enforcing" ]]; then # Explain Pi-hole does not support it yet - whiptail --title "SELinux Enforcing Detected" --yesno "SELinux is being Enforced on your system!\n\nPi-hole currently does not support SELinux, but you may still continue with the installation.\n\nNote: Admin UI Will not function fully without setting your policies correctly\n\nContinue installing Pi-hole?" ${r} ${c} || \ - { echo ""; echo -e " ${COL_LIGHT_RED}SELinux Enforcing detected, exiting installer${COL_NC}"; exit 1; } - echo "" - echo -e " ${INFO} Continuing installation with SELinux Enforcing" - echo -e " ${INFO} Please refer to official SELinux documentation to create a custom policy" + whiptail --defaultno --title "SELinux Enforcing Detected" --yesno "SELinux is being ENFORCED on your system! \\n\\nPi-hole currently does not support SELinux, but you may still continue with the installation.\\n\\nNote: Web Admin will not be fully functional unless you set your policies correctly\\n\\nContinue installing Pi-hole?" ${r} ${c} || \ + { echo -e "\\n ${COL_LIGHT_RED}SELinux Enforcing detected, exiting installer${COL_NC}"; exit 1; } + echo -e " ${INFO} Continuing installation with SELinux Enforcing + ${INFO} Please refer to official SELinux documentation to create a custom policy" fi fi } @@ -1645,7 +1640,7 @@ checkSelinux() { # Installation complete message with instructions for the user displayFinalMessage() { # If - if [[ ${#1} -gt 0 ]] ; then + if [[ "${#1}" -gt 0 ]] ; then pwstring="$1" # else, if the dashboard password in the setup variables exists, elif [[ $(grep 'WEBPASSWORD' -c /etc/pihole/setupVars.conf) -gt 0 ]]; then @@ -1656,7 +1651,7 @@ displayFinalMessage() { pwstring="NOT SET" fi # If the user wants to install the dashboard, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # Store a message in a variable and display it additional="View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin @@ -1678,7 +1673,7 @@ ${additional}" ${r} ${c} update_dialogs() { # If pihole -r "reconfigure" option was selected, - if [ "${reconfigure}" = true ]; then + if [[ "${reconfigure}" = true ]]; then # set some variables that will be used opt1a="Repair" opt1b="This will retain existing settings" @@ -1694,7 +1689,7 @@ update_dialogs() { opt2b="This will allow you to enter new settings" # Display the information to the user - 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 \ + 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) || \ { echo -e " ${COL_LIGHT_RED}Cancel was selected, exiting installer${COL_NC}"; exit 1; } @@ -1703,7 +1698,7 @@ update_dialogs() { case ${UpdateCmd} in # repair, or ${opt1a}) - echo -e " ${INFO} ${opt1a} option selected." + echo -e " ${INFO} ${opt1a} option selected" useUpdateVars=true ;; # recongigure, @@ -1714,7 +1709,6 @@ update_dialogs() { esac } - clone_or_update_repos() { # If the user wants to reconfigure, if [[ "${reconfigure}" == true ]]; then @@ -1725,7 +1719,7 @@ clone_or_update_repos() { exit 1; \ } # If the Web interface was installed, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # reset it's repo resetRepo ${webInterfaceDir} || \ { echo -e " ${COL_LIGHT_RED}Unable to reset ${webInterfaceDir}, exiting installer${COL_NC}"; \ @@ -1736,11 +1730,11 @@ clone_or_update_repos() { else # so get git files for Core getGitFiles ${PI_HOLE_LOCAL_REPO} ${piholeGitUrl} || \ - { echo "!!! Unable to clone ${piholeGitUrl} into ${PI_HOLE_LOCAL_REPO}, unable to continue."; \ + { echo -e " ${COL_LIGHT_RED}Unable to clone ${piholeGitUrl} into ${PI_HOLE_LOCAL_REPO}, unable to continue${COL_NC}"; \ exit 1; \ } # If the Web interface was installed, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # get the Web git files getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} || \ { echo -e " ${COL_LIGHT_RED}Unable to clone ${webInterfaceGitUrl} into ${webInterfaceDir}, exiting installer${COL_NC}"; \ @@ -1824,21 +1818,23 @@ FTLdetect() { local str="Detecting architecture" echo -ne " ${INFO} ${str}..." # If the machine is arm or aarch - if [[ ${machine} == arm* || ${machine} == *aarch* ]]; then + if [[ "${machine}" == "arm"* || "${machine}" == *"aarch"* ]]; then # ARM # - local rev=$(uname -m | sed "s/[^0-9]//g;") + local rev + rev=$(uname -m | sed "s/[^0-9]//g;") # - local lib=$(ldd /bin/ls | grep -E '^\s*/lib' | awk '{ print $1 }') + local lib + lib=$(ldd /bin/ls | grep -E '^\s*/lib' | awk '{ print $1 }') # - if [[ "$lib" == "/lib/ld-linux-aarch64.so.1" ]]; then + if [[ "${lib}" == "/lib/ld-linux-aarch64.so.1" ]]; then echo -e "${OVER} ${TICK} Detected ARM-aarch64 architecture" # set the binary to be used binary="pihole-FTL-aarch64-linux-gnu" # - elif [[ "$lib" == "/lib/ld-linux-armhf.so.3" ]]; then + elif [[ "${lib}" == "/lib/ld-linux-armhf.so.3" ]]; then # - if [ "$rev" -gt "6" ]; then + if [[ "${rev}" -gt 6 ]]; then echo -e "${OVER} ${TICK} Detected ARM-hf architecture (armv7+)" # set the binary to be used binary="pihole-FTL-arm-linux-gnueabihf" @@ -1853,22 +1849,22 @@ FTLdetect() { # set the binary to be used binary="pihole-FTL-arm-linux-gnueabi" fi - elif [[ $machine == ppc ]]; then + elif [[ "${machine}" == "ppc" ]]; then # PowerPC - echo "::: Detected PowerPC architecture" + echo -e "${OVER} ${TICK} Detected PowerPC architecture" # set the binary to be used binary="pihole-FTL-powerpc-linux-gnu" - elif [[ ${machine} == x86_64 ]]; then + elif [[ "${machine}" == "x86_64" ]]; then # 64bit echo -e "${OVER} ${TICK} Detected x86_64 architecture" # set the binary to be used binary="pihole-FTL-linux-x86_64" else # Something else - we try to use 32bit executable and warn the user - if [[ ! ${machine} == i686 ]]; then + if [[ ! "${machine}" == "i686" ]]; then echo -e "${OVER} ${CROSS} ${str}... - ${COL_LIGHT_RED}Not able to detect architecture (unknown: ${machine}), trying 32bit executable - Contact support if you experience issues (e.g: FTL not running)${COL_NC}" + ${COL_LIGHT_RED}Not able to detect architecture (unknown: ${machine}), trying 32bit executable${COL_NC} + Contact Pi-hole Support if you experience issues (e.g: FTL not running)" else echo -e "${OVER} ${TICK} Detected 32bit (i686) architecture" fi @@ -1910,7 +1906,6 @@ FTLdetect() { } main() { - ######## FIRST CHECK ######## # Show the Pi-hole logo so people know it's genuine since the logo and name are trademarked show_ascii_berry @@ -1919,18 +1914,17 @@ main() { echo "" # If the user's id is zero, - if [[ ${EUID} -eq 0 ]]; then + if [[ "${EUID}" -eq 0 ]]; then # they are root and all is good echo -e " ${TICK} ${str}" # Otherwise, else # They do not have enough privileges, so let the user know echo -e " ${CROSS} ${str} - Script called with non-root privileges - The Pi-hole requires elevated privleges to install and run - Please check the installer for any concerns regarding this requirement - Make sure to download this script from a trusted source" - echo "" + ${COL_LIGHT_RED}Script called with non-root privileges${COL_NC} + The Pi-hole requires elevated privleges to install and run + Please check the installer for any concerns regarding this requirement + Make sure to download this script from a trusted source\\n" echo -ne " ${INFO} Sudo utility check" # If the sudo command exists, @@ -1943,7 +1937,7 @@ main() { else # Let them know they need to run it as root echo -e "${OVER} ${CROSS} Sudo utility check - Sudo is needed for the Web Interface to run pihole commands\n + Sudo is needed for the Web Interface to run pihole commands\\n ${COL_LIGHT_RED}Please re-run this installer as root${COL_NC}" exit 1 fi @@ -1962,7 +1956,7 @@ main() { done # If the setup variable file exists, - if [[ -f ${setupVars} ]]; then + if [[ -f "${setupVars}" ]]; then # if it's running unattended, if [[ "${runUnattended}" == true ]]; then echo -e " ${INFO} Performing unattended setup, no whiptail dialogs will be displayed" @@ -1995,15 +1989,14 @@ main() { # Check if SELinux is Enforcing checkSelinux - - if [[ ${useUpdateVars} == false ]]; then + if [[ "${useUpdateVars}" == false ]]; then # Display welcome dialogs welcomeDialogs # Create directory for Pi-hole storage mkdir -p /etc/pihole/ stop_service dnsmasq - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then stop_service lighttpd fi # Determine available interfaces @@ -2022,7 +2015,7 @@ main() { clone_or_update_repos # Install packages used by the Pi-hole - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # Install the Web dependencies DEPS=("${PIHOLE_DEPS[@]}" "${PIHOLE_WEB_DEPS[@]}") # Otherwise, @@ -2046,11 +2039,11 @@ main() { # Clone/Update the repos clone_or_update_repos - # Source ${setupVars} for use in the rest of the functions. + # Source ${setupVars} for use in the rest of the functions source ${setupVars} # Install packages used by the Pi-hole - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # Install the Web dependencies DEPS=("${PIHOLE_DEPS[@]}" "${PIHOLE_WEB_DEPS[@]}") # Otherwise, @@ -2074,13 +2067,14 @@ main() { # Move the log file into /etc/pihole for storage mv ${tmpLog} ${instalLogLoc} - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # Add password to web UI if there is none pw="" # If no password is set, if [[ $(grep 'WEBPASSWORD' -c /etc/pihole/setupVars.conf) == 0 ]] ; then # generate a random password pw=$(tr -dc _A-Z-a-z-0-9 < /dev/urandom | head -c 8) + # shellcheck disable=SC1091 . /opt/pihole/webpage.sh echo "WEBPASSWORD=$(HashPassword ${pw})" >> ${setupVars} fi @@ -2115,20 +2109,19 @@ main() { fi # If the Web interface was installed, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then # If there is a password, if (( ${#pw} > 0 )) ; then # display the password echo -e " ${INFO} Web Interface password: ${COL_LIGHT_GREEN}${pw}${COL_NC} - This can be changed using 'pihole -a -p'" - echo "" + This can be changed using 'pihole -a -p'\\n" fi fi # if [[ "${useUpdateVars}" == false ]]; then # If the Web interface was installed, - if [[ ${INSTALL_WEB} == true ]]; then + if [[ "${INSTALL_WEB}" == true ]]; then echo -e " View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" echo "" fi @@ -2145,7 +2138,7 @@ main() { fi # Display where the log file is - echo -e "\n ${INFO} The install log is located at: /etc/pihole/install.log + echo -e "\\n ${INFO} The install log is located at: /etc/pihole/install.log ${COL_LIGHT_GREEN}${INSTALL_TYPE} Complete! ${COL_NC}" } diff --git a/test/test_automated_install.py b/test/test_automated_install.py index 9129c314..7f1a86a1 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -80,7 +80,7 @@ def test_configureFirewall_firewalld_running_no_errors(Pihole): source /opt/pihole/basic-install.sh configureFirewall ''') - expected_stdout = 'Configuring FirewallD for httpd and dnsmasq.' + expected_stdout = 'Configuring FirewallD for httpd and dnsmasq' assert expected_stdout in configureFirewall.stdout firewall_calls = Pihole.run('cat /var/log/firewall-cmd').stdout assert 'firewall-cmd --state' in firewall_calls @@ -95,7 +95,7 @@ def test_configureFirewall_firewalld_disabled_no_errors(Pihole): source /opt/pihole/basic-install.sh configureFirewall ''') - expected_stdout = 'No active firewall detected.. skipping firewall configuration.' + expected_stdout = 'No active firewall detected.. skipping firewall configuration' assert expected_stdout in configureFirewall.stdout def test_configureFirewall_firewalld_enabled_declined_no_errors(Pihole): @@ -444,7 +444,7 @@ def test_IPv6_only_link_local(Pihole): source /opt/pihole/basic-install.sh useIPv6dialog ''') - expected_stdout = 'Found neither IPv6 ULA nor GUA address, blocking IPv6 ads will not be enabled' + expected_stdout = 'Unable to find IPv6 ULA/GUA address, IPv6 adblocking will not be enabled' assert expected_stdout in detectPlatform.stdout def test_IPv6_only_ULA(Pihole):