From a03caea549c033796de8720e5ed45dd8384a12f2 Mon Sep 17 00:00:00 2001 From: diginc Date: Mon, 10 Oct 2016 23:14:39 -0500 Subject: [PATCH 01/75] setupVar tests passing for debian & centos --- .gitignore | 4 ++ automated install/basic-install.sh | 4 +- autotest | 1 + test/__init__.py | 0 test/centos.Dockerfile | 14 ++++++ test/conftest.py | 46 ++++++++++++++++++ test/debian.Dockerfile | 15 ++++++ test/test_000_build_containers.py | 18 +++++++ test/test_automated_install.py | 77 ++++++++++++++++++++++++++++++ 9 files changed, 178 insertions(+), 1 deletion(-) create mode 100755 autotest create mode 100644 test/__init__.py create mode 100644 test/centos.Dockerfile create mode 100644 test/conftest.py create mode 100644 test/debian.Dockerfile create mode 100644 test/test_000_build_containers.py create mode 100644 test/test_automated_install.py diff --git a/.gitignore b/.gitignore index e43b0f98..0e0d4b99 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ .DS_Store +*.pyc +*.swp +__pycache__ +.cache diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 945fa1e1..13e546ba 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -971,4 +971,6 @@ echo "::: The install log is located at: /etc/pihole/install.log" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" } -main "$@" +if [[ -z "$PHTEST" ]] ; then + main "$@" +fi diff --git a/autotest b/autotest new file mode 100755 index 00000000..3747cc0b --- /dev/null +++ b/autotest @@ -0,0 +1 @@ +py.test -v -f test/ diff --git a/test/__init__.py b/test/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/test/centos.Dockerfile b/test/centos.Dockerfile new file mode 100644 index 00000000..9af7eb4d --- /dev/null +++ b/test/centos.Dockerfile @@ -0,0 +1,14 @@ +FROM centos:7 + +ENV GITDIR /etc/.pihole +ENV SCRIPTDIR /opt/pihole + +RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole +ADD . $GITDIR +RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/ +ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR + +RUN true && \ + chmod +x $SCRIPTDIR/* + +#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \ diff --git a/test/conftest.py b/test/conftest.py new file mode 100644 index 00000000..407d00dc --- /dev/null +++ b/test/conftest.py @@ -0,0 +1,46 @@ +import pytest +import testinfra + +check_output = testinfra.get_backend( + "local://" +).get_module("Command").check_output + +@pytest.fixture +def Pihole(Docker): + ''' used to contain some script stubbing, now pretty much an alias ''' + return Docker + +@pytest.fixture +def Docker(request, args, image, cmd): + ''' combine our fixtures into a docker run command and setup finalizer to cleanup ''' + assert 'docker' in check_output('id'), "Are you in the docker group?" + docker_run = "docker run {} {} {}".format(args, image, cmd) + docker_id = check_output(docker_run) + + def teardown(): + check_output("docker rm -f %s", docker_id) + request.addfinalizer(teardown) + + docker_container = testinfra.get_backend("docker://" + docker_id) + docker_container.id = docker_id + return docker_container + +@pytest.fixture +def args(request): + ''' -t became required when tput began being used ''' + return '-t -d' + +@pytest.fixture(params=['debian', 'centos']) +def tag(request): + ''' consumed by image to make the test matrix ''' + return request.param + +@pytest.fixture() +def image(request, tag): + ''' built by test_000_build_containers.py ''' + return 'pytest_pihole:{}'.format(tag) + +@pytest.fixture() +def cmd(request): + ''' default to doing nothing by tailing null, but don't exit ''' + return 'tail -f /dev/null' diff --git a/test/debian.Dockerfile b/test/debian.Dockerfile new file mode 100644 index 00000000..b80d6155 --- /dev/null +++ b/test/debian.Dockerfile @@ -0,0 +1,15 @@ +FROM debian:jessie + +ENV GITDIR /etc/.pihole +ENV SCRIPTDIR /opt/pihole + +RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole +ADD . $GITDIR +RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/ +ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR + + +RUN true && \ + chmod +x $SCRIPTDIR/* + +#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \ diff --git a/test/test_000_build_containers.py b/test/test_000_build_containers.py new file mode 100644 index 00000000..c617f3ae --- /dev/null +++ b/test/test_000_build_containers.py @@ -0,0 +1,18 @@ +''' This file starts with 000 to make it run first ''' +import pytest +import testinfra + +run_local = testinfra.get_backend( + "local://" +).get_module("Command").run + +@pytest.mark.parametrize("image,tag", [ + ( 'test/debian.Dockerfile', 'pytest_pihole:debian' ), + ( 'test/centos.Dockerfile', 'pytest_pihole:centos' ), +]) +def test_build_pihole_image(image, tag): + build_cmd = run_local('docker build -f {} -t {} .'.format(image, tag)) + if build_cmd.rc != 0: + print build_cmd.stdout + print build_cmd.stderr + assert build_cmd.rc == 0 diff --git a/test/test_automated_install.py b/test/test_automated_install.py new file mode 100644 index 00000000..1605fdb6 --- /dev/null +++ b/test/test_automated_install.py @@ -0,0 +1,77 @@ +import pytest +from textwrap import dedent + +SETUPVARS = { + 'piholeInterface' : 'eth99', + 'IPv4_address' : '1.1.1.1', + 'IPv6_address' : '2:2:2:2:2:2', + 'piholeDNS1' : '4.2.2.1', + 'piholeDNS2' : '4.2.2.2' +} + +def test_setupVars_are_sourced_to_global_scope(Pihole): + ''' currently update_dialogs sources setupVars with a dot, + then various other functions use the variables ''' + setup_var_file = 'cat < /etc/pihole/setupVars.conf\n' + for k,v in SETUPVARS.iteritems(): + setup_var_file += "{}={}\n".format(k, v) + setup_var_file += "EOF\n" + Pihole.run(setup_var_file) + + script = dedent('''\ + #!/bin/bash -e + printSetupVars() { + # Currently debug test function only + echo "Outputting sourced variables" + echo "piholeInterface=\${piholeInterface}" + echo "IPv4_address=\${IPv4_address}" + echo "IPv6_address=\${IPv6_address}" + echo "piholeDNS1=\${piholeDNS1}" + echo "piholeDNS2=\${piholeDNS2}" + } + update_dialogs() { + . /etc/pihole/setupVars.conf + } + update_dialogs + printSetupVars + ''') + + output = run_script(Pihole, script).stdout + + for k,v in SETUPVARS.iteritems(): + assert "{}={}".format(k, v) in output + +def test_setupVars_saved_to_file(Pihole): + ''' confirm saved settings are written to a file for future updates to re-use ''' + set_setup_vars = '\n' # dedent works better with this and padding matching script below + for k,v in SETUPVARS.iteritems(): + set_setup_vars += " {}={}\n".format(k, v) + Pihole.run(set_setup_vars).stdout + + script = dedent('''\ + #!/bin/bash -e + echo start + TERM=xterm + PHTEST=TRUE + source /opt/pihole/basic-install.sh + {} + finalExports + cat /etc/pihole/setupVars.conf + '''.format(set_setup_vars)) + + output = run_script(Pihole, script).stdout + + for k,v in SETUPVARS.iteritems(): + assert "{}={}".format(k, v) in output + +def run_script(Pihole, script, file="/test.sh"): + _write_test_script(Pihole, script, file=file) + result = Pihole.run(file) + assert result.rc == 0 + return result + +def _write_test_script(Pihole, script, file): + ''' Running the test script blocks directly can behave differently with regard to global vars ''' + ''' this is a cheap work around to that until all functions no longer rely on global variables ''' + Pihole.run('cat < {file}\n{script}\nEOF'.format(file=file, script=script)) + Pihole.run('chmod +x {}'.format(file)) From 97c44042e19858137b7e010800263d7a5490e714 Mon Sep 17 00:00:00 2001 From: diginc Date: Mon, 10 Oct 2016 23:18:05 -0500 Subject: [PATCH 02/75] Adding failing shellcheck test and results Should be useful for showing others why other changes were made in the next commit. --- test/shellcheck_failing_output.txt | 140 +++++++++++++++++++++++++++++ test/test_shellcheck.py | 13 +++ 2 files changed, 153 insertions(+) create mode 100644 test/shellcheck_failing_output.txt create mode 100644 test/test_shellcheck.py diff --git a/test/shellcheck_failing_output.txt b/test/shellcheck_failing_output.txt new file mode 100644 index 00000000..65b79560 --- /dev/null +++ b/test/shellcheck_failing_output.txt @@ -0,0 +1,140 @@ +============================= test session starts ============================== +platform linux2 -- Python 2.7.6, pytest-2.9.2, py-1.4.31, pluggy-0.3.1 -- /usr/bin/python +cachedir: .cache +rootdir: /home/a/opensource/pi-hole, inifile: +plugins: cov-2.3.0, bdd-2.17.0, xdist-1.14, testinfra-1.4.0 +collecting ... collected 7 items + +test/test_000_build_containers.py::test_build_pihole_image[test/debian.Dockerfile-pytest_pihole:debian] PASSED +test/test_000_build_containers.py::test_build_pihole_image[test/centos.Dockerfile-pytest_pihole:centos] PASSED +test/test_automated_install.py::test_setupVars_are_sourced_to_global_scope[debian] PASSED +test/test_automated_install.py::test_setupVars_are_sourced_to_global_scope[centos] PASSED +test/test_automated_install.py::test_setupVars_saved_to_file[debian] PASSED +test/test_automated_install.py::test_setupVars_saved_to_file[centos] PASSED +test/test_shellcheck.py::test_scripts_pass_shellcheck FAILED + +=================================== FAILURES =================================== +_________________________ test_scripts_pass_shellcheck _________________________ + + def test_scripts_pass_shellcheck(): + ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' + shellcheck = "find . -name 'basic-install.sh' | while read file; do shellcheck \"$file\"; done;" + results = run_local(shellcheck) + print results.stdout +> assert '' == results.stdout +E assert '' == '\nIn ./automated install/bas...C may run when A is true.\n\n' +E + +E + In ./automated install/basic-install.sh line 79: +E + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) +E + ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. +E + +E + +E + In ./automated install/basic-install.sh line 80: +E + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) +E + ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. +E Detailed information truncated (91 more lines), use "-vv" to show + +test/test_shellcheck.py:13: AssertionError +----------------------------- Captured stdout call ----------------------------- + +In ./automated install/basic-install.sh line 79: + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) + ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. + + +In ./automated install/basic-install.sh line 80: + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) + ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. + + +In ./automated install/basic-install.sh line 86: + dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" + ^-- SC2016: Expressions don't expand in single quotes, use double quotes for that. + + +In ./automated install/basic-install.sh line 100: + INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) + ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. + + +In ./automated install/basic-install.sh line 101: + PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) + ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. + + +In ./automated install/basic-install.sh line 120: + while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do + ^-- SC2143: Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar . + + +In ./automated install/basic-install.sh line 214: + chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) + ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. + + +In ./automated install/basic-install.sh line 241: + choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) + ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. + + +In ./automated install/basic-install.sh line 354: + cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" + ^-- SC2140: The double quotes around this do nothing. Remove or escape them. + + +In ./automated install/basic-install.sh line 408: + DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) + ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. + + +In ./automated install/basic-install.sh line 585: + systemctl stop "${1}" &> /dev/null & spinner $! || true + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 587: + service "${1}" stop &> /dev/null & spinner $! || true + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 598: + systemctl restart "${1}" &> /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 600: + service "${1}" restart &> /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 610: + systemctl enable "${1}" &> /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 612: + update-rc.d "${1}" defaults &> /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 631: + ${UPDATE_PKG_CACHE} &> /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 688: + git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 696: + git pull -q > /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. + + +In ./automated install/basic-install.sh line 761: + id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole) + ^-- SC2015: Note that A && B || C is not if-then-else. C may run when A is true. + + +===================== 1 failed, 6 passed in 20.79 seconds ====================== diff --git a/test/test_shellcheck.py b/test/test_shellcheck.py new file mode 100644 index 00000000..7f777caf --- /dev/null +++ b/test/test_shellcheck.py @@ -0,0 +1,13 @@ +import pytest +import testinfra + +run_local = testinfra.get_backend( + "local://" +).get_module("Command").run + +def test_scripts_pass_shellcheck(): + ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' + shellcheck = "find . -name 'basic-install.sh' | while read file; do shellcheck \"$file\"; done;" + results = run_local(shellcheck) + print results.stdout + assert '' == results.stdout From f1efc97357695a7e1fc1c1b6eab23891051e23e8 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:04:33 -0700 Subject: [PATCH 03/75] Clairfy condition to make sure they operate as per the specs of the logic flow layout. --- advanced/Scripts/update.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index a2220d57..a743b549 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -104,12 +104,12 @@ echo ":::" -if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then +if [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ ${webVersion} == ${webVersionLatest} ]]; then echo "::: Everything is up to date!" echo "" exit 0 -elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then +elif [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ ${webVersion} != ${webVersionLatest} ]]; then echo "::: Pi-hole Web Admin files out of date" getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} echo ":::" @@ -117,7 +117,7 @@ elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVers 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 "" -elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then +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 @@ -126,7 +126,7 @@ elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVers 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 "" -elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then +elif [[ ${piholeVersion} != ${piholeVersionLatest} ]] && [[ ${webVersion} != ${webVersionLatest} ]]; then echo "::: Updating Everything" getGitFiles ${piholeFilesDir} ${piholeGitUrl} /etc/.pihole/automated\ install/basic-install.sh --unattended From 1e7e5230cca66f000883e7fd25d027b4b06c6f2c Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:15:21 -0700 Subject: [PATCH 04/75] Clarify what exactly is being called and the expected returned value format --- advanced/Scripts/update.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index a743b549..afccd10e 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -79,10 +79,14 @@ if [ ! -d "/var/www/html/admin" ]; then #This is unlikely fi echo "::: Checking for updates..." +# Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X piholeVersion=$(pihole -v -p -c) +# Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X piholeVersionLatest=$(pihole -v -p -l) +# Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X webVersion=$(pihole -v -a -c) +# Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X webVersionLatest=$(pihole -v -a -l) echo ":::" @@ -104,7 +108,7 @@ echo ":::" -if [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ ${webVersion} == ${webVersionLatest} ]]; then +if [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then echo "::: Everything is up to date!" echo "" exit 0 From 0c9520d7e35f032fa6a0b3a30f9b98061893d85c Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:18:41 -0700 Subject: [PATCH 05/75] Protect against unexepcted return values (GitHub not responding as we'd expect.) And make sure bash doesn't maul the variables and cause firing of unattended reinstall of application when values returned aren't as expected. --- advanced/Scripts/update.sh | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index afccd10e..cbbf804f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -108,12 +108,12 @@ echo ":::" -if [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then +if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then echo "::: Everything is up to date!" echo "" exit 0 -elif [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ ${webVersion} != ${webVersionLatest} ]]; then +elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} echo ":::" @@ -121,7 +121,7 @@ elif [[ ${piholeVersion} == ${piholeVersionLatest} ]] && [[ ${webVersion} != ${w 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 "" -elif [[ ${piholeVersion} != ${piholeVersionLatest} ]] && [[ ${webVersion} == ${webVersionLatest} ]]; then +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 @@ -130,11 +130,14 @@ elif [[ ${piholeVersion} != ${piholeVersionLatest} ]] && [[ ${webVersion} == ${w 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 "" -elif [[ ${piholeVersion} != ${piholeVersionLatest} ]] && [[ ${webVersion} != ${webVersionLatest} ]]; then +elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Updating Everything" getGitFiles ${piholeFilesDir} ${piholeGitUrl} /etc/.pihole/automated\ install/basic-install.sh --unattended + + # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X webVersion=$(pihole -v -a -c) + # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X piholeVersion=$(pihole -v -p -c) echo ":::" echo "::: Pi-hole version is now at ${piholeVersion}" From c3e2bce956d032b5dabf6dbf0d1bb0704535c157 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:26:57 -0700 Subject: [PATCH 06/75] Variables declared as strings, make sure they are strings when we use them in functions. --- advanced/Scripts/update.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index cbbf804f..d682f265 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -115,7 +115,7 @@ if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" - getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} + getGitFiles "${webInterfaceDir}" "${webInterfaceGitUrl}" echo ":::" webVersion=$(pihole -v -a -c) echo "::: Web Admin version is now at ${webVersion}" @@ -123,7 +123,7 @@ elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then echo "::: Pi-hole core files out of date" - getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles "${piholeFilesDir}" "${piholeGitUrl}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended echo ":::" piholeVersion=$(pihole -v -p -c) @@ -132,7 +132,7 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Updating Everything" - getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles "${piholeFilesDir}" "${piholeGitUrl}" /etc/.pihole/automated\ install/basic-install.sh --unattended # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X From ffbfadbccf082657a67210ce2050c7bdfde8f2a4 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:33:04 -0700 Subject: [PATCH 07/75] Detail what the script does. --- advanced/Scripts/update.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index d682f265..41748717 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -3,7 +3,9 @@ # (c) 2015, 2016 by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net -# Whitelists domains +# Check Pi-hole core and admin pages versions and determine what +# upgrade (if any) is required. Automatically updates and reinstalls +# application if update is detected. # # 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 From 1991ee7a7d992f4d33fbaafbf9d72dc1932716c3 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:36:44 -0700 Subject: [PATCH 08/75] Google Style Guide. `readonly` and cap constants. --- advanced/Scripts/update.sh | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 41748717..2feecd54 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -14,10 +14,10 @@ # 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" +readonly WEBINTERFACEGITURL="https://github.com/pi-hole/AdminLTE.git" +readonly WEBINTERFACEDIR="/var/www/html/admin" +readonly PIHOLEGITURL="https://github.com/pi-hole/pi-hole.git" +readonly PIHOLEFILESDIR="/etc/.pihole" spinner() { local pid=${1} @@ -117,7 +117,7 @@ if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" - getGitFiles "${webInterfaceDir}" "${webInterfaceGitUrl}" + getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" echo ":::" webVersion=$(pihole -v -a -c) echo "::: Web Admin version is now at ${webVersion}" @@ -125,7 +125,7 @@ elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then echo "::: Pi-hole core files out of date" - getGitFiles "${piholeFilesDir}" "${piholeGitUrl}" + getGitFiles "${PIHOLEFILESDIR}" "${PIHOLEGITURL}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended echo ":::" piholeVersion=$(pihole -v -p -c) @@ -134,7 +134,7 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Updating Everything" - getGitFiles "${piholeFilesDir}" "${piholeGitUrl}" + getGitFiles "${PIHOLEFILESDIR}" "${PIHOLEGITURL}" /etc/.pihole/automated\ install/basic-install.sh --unattended # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X From fbc800e55621d93315de6b666410ed1febd08c86 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:42:18 -0700 Subject: [PATCH 09/75] If unattened reinstall fails, notify user and exit script immediately. --- advanced/Scripts/update.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 2feecd54..5ecb6a6f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -135,7 +135,8 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Updating Everything" getGitFiles "${PIHOLEFILESDIR}" "${PIHOLEGITURL}" - /etc/.pihole/automated\ install/basic-install.sh --unattended + + /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X webVersion=$(pihole -v -a -c) From 807b60b0e61412bfb97fe035582ca5ac3a10fa79 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:44:16 -0700 Subject: [PATCH 10/75] Missed the second reinstaller.... --- advanced/Scripts/update.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 5ecb6a6f..783ae625 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -126,7 +126,9 @@ elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != 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 + + /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 + echo ":::" piholeVersion=$(pihole -v -p -c) echo "::: Pi-hole version is now at ${piholeVersion}" From 5fef5f1ed49fc5eb50f849132759ce874167d4de Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 11:54:14 -0700 Subject: [PATCH 11/75] Break down `is_repo` to make sure it does what is expected. --- advanced/Scripts/update.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 783ae625..2af64738 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -49,7 +49,13 @@ 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 + if [[ $(git status --short) ]]; then + echo " OK!" + return 0 + else + echo " not found!" + return 1 + fi } make_repo() { From 114bc13c2369a7c6936742dbe85363ed70514b26 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 12:03:26 -0700 Subject: [PATCH 12/75] Specify path, cron may not know where the files are located. --- advanced/Scripts/update.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 2af64738..e682e837 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -88,14 +88,14 @@ fi echo "::: Checking for updates..." # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X -piholeVersion=$(pihole -v -p -c) +piholeVersion=$(/usr/local/bin/pihole -v -p -c) # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X -piholeVersionLatest=$(pihole -v -p -l) +piholeVersionLatest=$(/usr/local/bin/pihole -v -p -l) # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X -webVersion=$(pihole -v -a -c) +webVersion=$(/usr/local/bin/pihole -v -a -c) # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X -webVersionLatest=$(pihole -v -a -l) +webVersionLatest=$(/usr/local/bin/pihole -v -a -l) echo ":::" echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" @@ -125,7 +125,7 @@ elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != echo "::: Pi-hole Web Admin files out of date" getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" echo ":::" - webVersion=$(pihole -v -a -c) + webVersion=$(/usr/local/bin/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 "" @@ -136,7 +136,7 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 echo ":::" - piholeVersion=$(pihole -v -p -c) + piholeVersion=$(/usr/local/bin/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 "" @@ -147,9 +147,9 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - webVersion=$(pihole -v -a -c) + webVersion=$(/usr/local/bin/pihole -v -a -c) # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - piholeVersion=$(pihole -v -p -c) + piholeVersion=$(/usr/local/bin/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'" From 85b8676b8e817b38179ab93870b6b9b41413f295 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 12:16:46 -0700 Subject: [PATCH 13/75] Remove spinner, no functions here should last that long, and it masks a few potential exit avenues. --- advanced/Scripts/update.sh | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index e682e837..e5e8766d 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -19,20 +19,6 @@ readonly WEBINTERFACEDIR="/var/www/html/admin" readonly PIHOLEGITURL="https://github.com/pi-hole/pi-hole.git" readonly PIHOLEFILESDIR="/etc/.pihole" -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" -} - getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 @@ -70,8 +56,8 @@ 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 $! + git stash -q > /dev/null || exit 1 + git pull -q > /dev/null || exit 1 echo " done!" } From 04da292df999b51dfd21496802b9a7ac58e51802 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 12:17:38 -0700 Subject: [PATCH 14/75] Missed one spinner, updated and exit script if github is unreachable. --- advanced/Scripts/update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index e5e8766d..71b0a6ad 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -48,7 +48,7 @@ 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 $! + git clone -q --depth 1 "${2}" "${1}" > /dev/null || exit 1 echo " done!" } From bdd240ecb66d8acafe60c166c7c962ce9b3bbe04 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 15:36:27 -0700 Subject: [PATCH 15/75] Shellcheck catch for always true expansion. --- advanced/Scripts/update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 71b0a6ad..90b82ce3 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -107,7 +107,7 @@ if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == echo "" exit 0 -elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then +elif [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" echo ":::" From 72015b0226e31bae8b349f4896562bb175bbd696 Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:00:14 -0500 Subject: [PATCH 16/75] reduce complexity and un needed cat --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b28b3f3e..496816fb 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Works on most Debian and CentOS/RHEL based distributions! ```bash wget -O basic-install.sh https://install.pi-hole.net -cat basic-install.sh | bash +bash basic-install.sh ``` If you wish to read over the script before running it, then after the [`wget`](https://linux.die.net/man/1/wget) command, run `nano basic-install.sh` to open the file in a text viewer. From a8fa061f2e89c24d3123687a89951e979030669b Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:02:06 -0500 Subject: [PATCH 17/75] quote all the assignments prevent accidental glob splitting --- advanced/Scripts/update.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 71b0a6ad..c28e4249 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -74,14 +74,14 @@ fi echo "::: Checking for updates..." # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X -piholeVersion=$(/usr/local/bin/pihole -v -p -c) +piholeVersion="$(/usr/local/bin/pihole -v -p -c)" # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X -piholeVersionLatest=$(/usr/local/bin/pihole -v -p -l) +piholeVersionLatest="$(/usr/local/bin/pihole -v -p -l)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X -webVersion=$(/usr/local/bin/pihole -v -a -c) +webVersion="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X -webVersionLatest=$(/usr/local/bin/pihole -v -a -l) +webVersionLatest="$(/usr/local/bin/pihole -v -a -l)" echo ":::" echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" @@ -111,7 +111,7 @@ elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != echo "::: Pi-hole Web Admin files out of date" getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" echo ":::" - webVersion=$(/usr/local/bin/pihole -v -a -c) + webVersion="$(/usr/local/bin/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 "" @@ -122,7 +122,7 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 echo ":::" - piholeVersion=$(/usr/local/bin/pihole -v -p -c) + piholeVersion="$(/usr/local/bin/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 "" @@ -133,9 +133,9 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - webVersion=$(/usr/local/bin/pihole -v -a -c) + webVersion="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - piholeVersion=$(/usr/local/bin/pihole -v -p -c) + piholeVersion="$(/usr/local/bin/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'" From d986746ef9e1fa565f319adef025bfd168a14435 Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:02:50 -0500 Subject: [PATCH 18/75] missing quote added --- advanced/Scripts/update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index c28e4249..7b08179d 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -107,7 +107,7 @@ if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == echo "" exit 0 -elif [[ "${piholeVersion} == ${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then +elif [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" echo ":::" From c30478bf4a594084375c9e5bd766b722e2b96852 Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:21:50 -0500 Subject: [PATCH 19/75] cleanup and use sentintel in is_repo --- advanced/Scripts/update.sh | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 7b08179d..0e36c2a2 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -33,15 +33,17 @@ getGitFiles() { 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 - if [[ $(git status --short) ]]; then - echo " OK!" - return 0 - else - echo " not found!" - return 1 - fi + local directory="${1}" + local gitRepo=0 + echo -n "::: Checking if ${directory} is a repo... " + cd "${directory}" &> /dev/null || return 1 + if [[ $(git status --short > /dev/null) ]]; then + echo "OK" + else + echo "not found!" + gitRepo=1 + fi; + return ${gitRepo} } make_repo() { From 26789f9b3670a1390e0bcd948900f4c1e6fcb243 Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:53:11 -0500 Subject: [PATCH 20/75] add travis and python requirements --- .travis.yml | 10 ++++++++++ requirements.txt | 5 +++++ 2 files changed, 15 insertions(+) create mode 100644 .travis.yml create mode 100644 requirements.txt diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..2ca3b2d2 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +sudo: required +services: + - docker +language: python +python: + - "2.7" +install: + - pip install -r requirements.txt + +script: py.test -vv diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..53737ca5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +docker-compose +pytest +pytest-xdist +pytest-cov +testinfra From 7548d9a8fe935320a564da5e3ae77b4147edc3a5 Mon Sep 17 00:00:00 2001 From: diginc Date: Tue, 1 Nov 2016 23:56:46 -0500 Subject: [PATCH 21/75] point shellcheck at update.sh instead --- test/shellcheck_failing_output.txt | 128 ++++++++--------------------- test/test_shellcheck.py | 2 +- 2 files changed, 33 insertions(+), 97 deletions(-) diff --git a/test/shellcheck_failing_output.txt b/test/shellcheck_failing_output.txt index 65b79560..c741a8e9 100644 --- a/test/shellcheck_failing_output.txt +++ b/test/shellcheck_failing_output.txt @@ -18,123 +18,59 @@ _________________________ test_scripts_pass_shellcheck _________________________ def test_scripts_pass_shellcheck(): ''' Make sure shellcheck does not find anything wrong with our shell scripts ''' - shellcheck = "find . -name 'basic-install.sh' | while read file; do shellcheck \"$file\"; done;" + shellcheck = "find . -name 'update.sh' | while read file; do shellcheck \"$file\"; done;" results = run_local(shellcheck) print results.stdout > assert '' == results.stdout -E assert '' == '\nIn ./automated install/bas...C may run when A is true.\n\n' +E assert '' == '\nIn ./advanced/Scripts/upda...vent glob interpretation.\n\n' E + -E + In ./automated install/basic-install.sh line 79: -E + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) -E + ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. +E + In ./advanced/Scripts/update.sh line 24: +E + while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do +E + ^-- SC2143: Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar . E + E + -E + In ./automated install/basic-install.sh line 80: -E + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) -E + ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. -E Detailed information truncated (91 more lines), use "-vv" to show +E + In ./advanced/Scripts/update.sh line 57: +E + git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! +E + ^-- SC2086: Double quote to prevent globbing and word splitting. +E Detailed information truncated (27 more lines), use "-vv" to show test/test_shellcheck.py:13: AssertionError ----------------------------- Captured stdout call ----------------------------- -In ./automated install/basic-install.sh line 79: - INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) - ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. +In ./advanced/Scripts/update.sh line 24: + while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do + ^-- SC2143: Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar . -In ./automated install/basic-install.sh line 80: - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) - ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. +In ./advanced/Scripts/update.sh line 57: + git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. -In ./automated install/basic-install.sh line 86: - dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" - ^-- SC2016: Expressions don't expand in single quotes, use double quotes for that. +In ./advanced/Scripts/update.sh line 65: + git stash -q > /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. -In ./automated install/basic-install.sh line 100: - INSTALLER_DEPS=( iproute net-tools procps-ng newt git ) - ^-- SC2034: INSTALLER_DEPS appears unused. Verify it or export it. +In ./advanced/Scripts/update.sh line 66: + git pull -q > /dev/null & spinner $! + ^-- SC2086: Double quote to prevent globbing and word splitting. -In ./automated install/basic-install.sh line 101: - PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat ) - ^-- SC2034: PIHOLE_DEPS appears unused. Verify it or export it. +In ./advanced/Scripts/update.sh line 107: +if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then + ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob interpretation. + ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob interpretation. -In ./automated install/basic-install.sh line 120: - while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do - ^-- SC2143: Instead of [ -n $(foo | grep bar) ], use foo | grep -q bar . +In ./advanced/Scripts/update.sh line 112: +elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then + ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob interpretation. -In ./automated install/basic-install.sh line 214: - chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) - ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. +In ./advanced/Scripts/update.sh line 120: +elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then + ^-- SC2053: Quote the rhs of = in [[ ]] to prevent glob interpretation. -In ./automated install/basic-install.sh line 241: - choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) - ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. - - -In ./automated install/basic-install.sh line 354: - cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)" - ^-- SC2140: The double quotes around this do nothing. Remove or escape them. - - -In ./automated install/basic-install.sh line 408: - DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) - ^-- SC2069: The order of the 2>&1 and the redirect matters. The 2>&1 has to be last. - - -In ./automated install/basic-install.sh line 585: - systemctl stop "${1}" &> /dev/null & spinner $! || true - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 587: - service "${1}" stop &> /dev/null & spinner $! || true - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 598: - systemctl restart "${1}" &> /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 600: - service "${1}" restart &> /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 610: - systemctl enable "${1}" &> /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 612: - update-rc.d "${1}" defaults &> /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 631: - ${UPDATE_PKG_CACHE} &> /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 688: - git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 696: - git pull -q > /dev/null & spinner $! - ^-- SC2086: Double quote to prevent globbing and word splitting. - - -In ./automated install/basic-install.sh line 761: - id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole) - ^-- SC2015: Note that A && B || C is not if-then-else. C may run when A is true. - - -===================== 1 failed, 6 passed in 20.79 seconds ====================== +===================== 1 failed, 6 passed in 24.01 seconds ====================== diff --git a/test/test_shellcheck.py b/test/test_shellcheck.py index 7f777caf..43b27164 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 . -name 'basic-install.sh' | while read file; do shellcheck \"$file\"; done;" + shellcheck = "find . -name 'update.sh' | while read file; do shellcheck \"$file\"; done;" results = run_local(shellcheck) print results.stdout assert '' == results.stdout From 7a2247178761a00cb52d81242df7cdcab5ae3d48 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 22:19:40 -0700 Subject: [PATCH 22/75] New naming convention, and reorder functions as bash would prefer them to be. --- advanced/Scripts/update.sh | 38 +++++++++++++++--------------- automated install/basic-install.sh | 32 ++++++++++++------------- 2 files changed, 35 insertions(+), 35 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 90b82ce3..b14b9bcd 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -14,22 +14,10 @@ # Variables -readonly WEBINTERFACEGITURL="https://github.com/pi-hole/AdminLTE.git" -readonly WEBINTERFACEDIR="/var/www/html/admin" -readonly PIHOLEGITURL="https://github.com/pi-hole/pi-hole.git" -readonly PIHOLEFILESDIR="/etc/.pihole" - -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 -} +readonly ADMIN_INTERFACE_GIT_URL="https://github.com/pi-hole/AdminLTE.git" +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" is_repo() { # Use git to check if directory is currently under VCS @@ -61,6 +49,18 @@ update_repo() { echo " done!" } +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 +} + 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" @@ -109,7 +109,7 @@ if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == elif [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Pi-hole Web Admin files out of date" - getGitFiles "${WEBINTERFACEDIR}" "${WEBINTERFACEGITURL}" + getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" echo ":::" webVersion=$(/usr/local/bin/pihole -v -a -c) echo "::: Web Admin version is now at ${webVersion}" @@ -117,7 +117,7 @@ elif [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then echo "::: Pi-hole core files out of date" - getGitFiles "${PIHOLEFILESDIR}" "${PIHOLEGITURL}" + getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 @@ -128,7 +128,7 @@ elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" echo "" elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then echo "::: Updating Everything" - getGitFiles "${PIHOLEFILESDIR}" "${PIHOLEGITURL}" + getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 6489a5fc..921b0ffa 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -712,6 +712,22 @@ install_dependent_packages() { done } +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!" +} getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 @@ -731,22 +747,6 @@ is_repo() { 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 stash -q > /dev/null & spinner $! - git pull -q > /dev/null & spinner $! - echo " done!" -} CreateLogFile() { # Create logfiles if necessary From db0f3307e07a5b4d40b2b7a032556eb3efeef580 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 1 Nov 2016 22:48:30 -0700 Subject: [PATCH 23/75] Only take out scripts in the directory, don't remove the directory as a whole. Need this for the future installs. --- 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 921b0ffa..a9a5d47d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -593,8 +593,7 @@ installScripts() { echo ":::" echo -n "::: Installing scripts to /opt/pihole..." #clear out /opt/pihole and recreate it. This allows us to remove scripts from future installs - rm -rf /opt/pihole - install -o "${USER}" -m755 -d /opt/pihole + rm -f /opt/pihole/*.sh cd /etc/.pihole/ From 12f5f8ba00b2f3c31517c1f18905b349119a902c Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 00:14:25 -0700 Subject: [PATCH 24/75] Begin to bring code up to Pi-hole conventions. Block installScripts and begin factoring out redundant code. --- automated install/basic-install.sh | 122 +++++++++++++++++------------ 1 file changed, 70 insertions(+), 52 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a9a5d47d..ea1fb8d9 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -25,8 +25,8 @@ setupVars=/etc/pihole/setupVars.conf 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" - +PI_HOLE_LOCAL_REPO="/etc/.pihole" +PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version) useUpdateVars=false IPv4_address="" @@ -144,6 +144,42 @@ spinner() { printf " \b\b\b\b" } +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 stash -q > /dev/null & spinner $! + git pull -q > /dev/null & spinner $! + echo " done!" +} + +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 +} + 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)}') @@ -169,7 +205,6 @@ welcomeDialogs() { In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." ${r} ${c} } - verifyFreeDiskSpace() { # 50MB is the minimum space needed (45MB install (includes web admin bootstrap/jquery libraries etc) + 5MB one day of logs.) @@ -588,22 +623,41 @@ remove_legacy_scripts() { done } +clean_existing() { + # Clean an exiting installation to prepare for upgrade/reinstall + # ${1} Directory to clean; ${2} Array of files to remove + local clean_directory="${1}" + local old_files=${2} + + for script in "${old_files[@]}"; do + rm -f "${clean_directory}${script}.sh" + done + +} + installScripts() { - # Install the scripts from /etc/.pihole to their various locations + # Install the scripts from repository to their various locations + readonly install_dir="/opt/pihole/" + echo ":::" - echo -n "::: Installing scripts to /opt/pihole..." - #clear out /opt/pihole and recreate it. This allows us to remove scripts from future installs - rm -f /opt/pihole/*.sh + echo -n "::: Installing scripts to ${PI_HOLE_LOCAL_REPO}..." - cd /etc/.pihole/ + # Clear out script files from Pi-hole scripts directory. + clean_existing "${install_dir}" "${PI_HOLE_FILES}" - install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh - install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh - install -o "${USER}" -Dm755 -t /opt/pihole/ ./automated\ install/uninstall.sh - install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole - - install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole - echo " done." + # Install files from local core repository + if [[ $(is_repo "${PI_HOLE_LOCAL_REPO}") ]]; then + cd "${PI_HOLE_LOCAL_REPO}" + install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh + install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh + install -o "${USER}" -Dm755 -t /opt/pihole/ ./automated\ install/uninstall.sh + install -o "${USER}" -Dm755 -t /usr/local/bin/ pihole + install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole + echo " done." + else + echo " *** ERROR: Local repo ${core_repo} not found, exiting." + exit 1 + fi } installConfigs() { @@ -711,42 +765,6 @@ install_dependent_packages() { done } -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!" -} -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 -} - - CreateLogFile() { # Create logfiles if necessary echo ":::" @@ -994,7 +1012,7 @@ main() { echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else # Get Git files for Core and Admin - getGitFiles ${piholeFilesDir} ${piholeGitUrl} + getGitFiles ${PI_HOLE_LOCAL_REPO} ${piholeGitUrl} getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} fi From d9528dfd0967cb947f42ef6ab0e3d6721c9f71d1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 00:51:38 -0700 Subject: [PATCH 25/75] Bash is funny with returns. --- advanced/Scripts/update.sh | 10 +++++++--- automated install/basic-install.sh | 6 +++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index fd67a484..8531dc2c 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -25,7 +25,7 @@ is_repo() { local gitRepo=0 echo -n "::: Checking if ${directory} is a repo... " cd "${directory}" &> /dev/null || return 1 - if [[ $(git status --short > /dev/null) ]]; then + if [[ $(git status --short &> /dev/null) ]]; then echo "OK" else echo "not found!" @@ -63,12 +63,16 @@ getGitFiles() { fi } -if [ ! -d "/etc/.pihole" ]; then #This is unlikely + +is_repo "${PI_HOLE_FILES_DIR}" &> /dev/null +if [[ $? -eq 1 ]]; 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 + +is_repo "${ADMIN_INTERFACE_DIR}" &> /dev/null +if [[ $? -eq 1 ]]; 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; diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ea1fb8d9..49329f5a 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -73,7 +73,7 @@ fi # Compatibility -if [ -x "$(command -v apt-get)" ]; then +if [[ $(command -v apt-get) ]]; then #Debian Family ############################################# PKG_MANAGER="apt-get" @@ -99,9 +99,9 @@ if [ -x "$(command -v apt-get)" ]; then 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 +elif [ $(command -v rpm) ]; then # Fedora Family - if [ -x "$(command -v dnf)" ]; then + if [ $(command -v dnf) ]; then PKG_MANAGER="dnf" else PKG_MANAGER="yum" From 7d414b5628690cadc63acdac3071c3ae118530b4 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 01:12:02 -0700 Subject: [PATCH 26/75] Move version messages to main function, check for repos. --- advanced/Scripts/update.sh | 149 ++++++++++++++++++------------------- 1 file changed, 74 insertions(+), 75 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 8531dc2c..dfabccb0 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -63,90 +63,89 @@ getGitFiles() { fi } +main() { -is_repo "${PI_HOLE_FILES_DIR}" &> /dev/null -if [[ $? -eq 1 ]]; 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 + is_repo "${PI_HOLE_FILES_DIR}" &> /dev/null + if [[ $? -eq 1 ]]; 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 -is_repo "${ADMIN_INTERFACE_DIR}" &> /dev/null -if [[ $? -eq 1 ]]; 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 + is_repo "${ADMIN_INTERFACE_DIR}" &> /dev/null + if [[ $? -eq 1 ]]; 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..." -# Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X -piholeVersion="$(/usr/local/bin/pihole -v -p -c)" -# Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X -piholeVersionLatest="$(/usr/local/bin/pihole -v -p -l)" + echo "::: Checking for updates..." + # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X + local -r pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X + local -r pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" -# Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X -webVersion="$(/usr/local/bin/pihole -v -a -c)" -# Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X -webVersionLatest="$(/usr/local/bin/pihole -v -a -l)" + # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X + local -r web_version_current="$(/usr/local/bin/pihole -v -a -c)" + # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X + local -r web_version_latest="$(/usr/local/bin/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 -# 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 [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then + echo "::: Pi-hole version is $pihole_version_current" + echo "::: Web Admin version is $web_version_current" + echo "::: Everything is up to date!" + echo "" + exit 0 + elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then + echo "::: Pi-hole Web Admin files out of date" + getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" + echo ":::" + web_version_current="$(/usr/local/bin/pihole -v -a -c)" + echo "::: Web Admin version is now at ${web_version_current}" + echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'" + echo "" + elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then + echo "::: Pi-hole core files out of date" + getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" + /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 -if [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then - echo "::: Everything is up to date!" - echo "" - exit 0 + echo ":::" + pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + echo "::: Pi-hole version is now at ${pihole_version_current}" + echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" + echo "" + elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then + echo "::: Updating Everything" + getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" -elif [[ "${piholeVersion}" == "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then - echo "::: Pi-hole Web Admin files out of date" - getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" - echo ":::" - webVersion="$(/usr/local/bin/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 "" -elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" == "${webVersionLatest}" ]]; then - echo "::: Pi-hole core files out of date" - getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" + /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 + # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X + web_version_current="$(/usr/local/bin/pihole -v -a -c)" + # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X + pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + echo ":::" + echo "::: Pi-hole version is now at ${pihole_version_current}" + 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 ${pihole_version_current}" + echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" + echo "" + fi +} - echo ":::" - piholeVersion="$(/usr/local/bin/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 "" -elif [[ "${piholeVersion}" != "${piholeVersionLatest}" ]] && [[ "${webVersion}" != "${webVersionLatest}" ]]; then - echo "::: Updating Everything" - getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - - /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - webVersion="$(/usr/local/bin/pihole -v -a -c)" - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - piholeVersion="$(/usr/local/bin/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 +main From 34482c5ed62e711e40deec5c71467c8ac2c09970 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 03:09:59 -0700 Subject: [PATCH 27/75] Modified `is_repo` --- advanced/Scripts/update.sh | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index dfabccb0..b8514c1c 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -22,16 +22,15 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { # Use git to check if directory is currently under VCS local directory="${1}" - local gitRepo=0 echo -n "::: Checking if ${directory} is a repo... " - cd "${directory}" &> /dev/null || return 1 - if [[ $(git status --short &> /dev/null) ]]; then + cd "${directory}" &> /dev/null || false + if [[ $(git status --short &> /dev/null) -eq 0 ]]; then echo "OK" + true else echo "not found!" - gitRepo=1 + false fi; - return ${gitRepo} } make_repo() { @@ -65,7 +64,7 @@ getGitFiles() { main() { - is_repo "${PI_HOLE_FILES_DIR}" &> /dev/null + is_repo "${PI_HOLE_FILES_DIR}" if [[ $? -eq 1 ]]; 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" From 9ec5bbd5605f3a5c1982e2f7eaf6bd1bc565ba17 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 03:38:35 -0700 Subject: [PATCH 28/75] Actually get `is_repo` to return a value and have it expected. --- advanced/Scripts/update.sh | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index b8514c1c..1fce075f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -22,18 +22,12 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { # Use git to check if directory is currently under VCS local directory="${1}" - echo -n "::: Checking if ${directory} is a repo... " cd "${directory}" &> /dev/null || false - if [[ $(git status --short &> /dev/null) -eq 0 ]]; then - echo "OK" - true - else - echo "not found!" - false - fi; + $(git status --short &> /dev/null) + return } -make_repo() { + make_repo() { # Remove the non-repod interface and clone the interface echo -n "::: Cloning $2 into $1..." rm -rf "${1}" @@ -65,14 +59,14 @@ getGitFiles() { main() { is_repo "${PI_HOLE_FILES_DIR}" - if [[ $? -eq 1 ]]; then #This is unlikely + if [[ $? -ne 0 ]]; 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 is_repo "${ADMIN_INTERFACE_DIR}" &> /dev/null - if [[ $? -eq 1 ]]; then #This is unlikely + if [[ $? -ne 0 ]]; 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; From 035e4bf727e14961b0b45de78d7b1ebe5cc1f81e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 03:55:04 -0700 Subject: [PATCH 29/75] Move value checks to `if` calls. --- 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 1fce075f..74bd2e54 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -58,15 +58,13 @@ getGitFiles() { main() { - is_repo "${PI_HOLE_FILES_DIR}" - if [[ $? -ne 0 ]]; then #This is unlikely + if ! is_repo "${PI_HOLE_FILES_DIR}"; 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 - is_repo "${ADMIN_INTERFACE_DIR}" &> /dev/null - if [[ $? -ne 0 ]]; then #This is unlikely + if ! $(is_repo "${ADMIN_INTERFACE_DIR}"); 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; From d4dccfdb2d33953290ffb01968d901410888ea1f Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 31 Oct 2016 21:38:48 +0000 Subject: [PATCH 30/75] Cherry pick 229439c --- automated install/basic-install.sh | 38 ++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 49329f5a..b3b34757 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -537,6 +537,29 @@ setDNS() { fi } +setLogging() { + LogToggleCommand=(whiptail --separate-output --radiolist "Select Logging mode:" ${r} ${c} 6) + DNSChooseOptions=("On (Reccomended)" "" on + Off "" off) + DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) + if [[ $? = 0 ]];then + case ${DNSchoices} in + "On (Reccomended)") + echo "::: Logging On." + queryLogging=true + ;; + Off) + echo "::: Logging Off." + queryLogging=false + ;; + esac + else + echo "::: Cancel selected. Exiting..." + exit 1 + fi +} + + version_check_dnsmasq() { # Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory local dnsmasq_conf="/etc/dnsmasq.conf" @@ -611,6 +634,14 @@ version_check_dnsmasq() { fi sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf} + + if [[ "${queryLogging}" == false ]] ; then + #Disable Logging + sed -i 's/^log-queries/#log-queries/' ${dnsmasq_pihole_01_location} + else + #Enable Logging + sed -i 's/^#log-queries/log-queries/' ${dnsmasq_pihole_01_location} + fi } remove_legacy_scripts() { @@ -855,6 +886,7 @@ finalExports() { echo "IPv6_address=${IPv6_address}" echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS2=${piholeDNS2}" + echo "queryLogging=${queryLogging}" }>> "${setupVars}" } @@ -1034,6 +1066,12 @@ main() { use4andor6 # Decide what upstream DNS Servers to use setDNS + # Let the user decide if they want query logging enabled... + setLogging + + # Install packages used by the Pi-hole + install_dependent_packages PIHOLE_DEPS[@] + # Install and log everything to a file installPihole | tee ${tmpLog} else From 617a1477069e6cc2b806d801450ebf8ac0744bc4 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 31 Oct 2016 21:40:20 +0000 Subject: [PATCH 31/75] Wording adjustment --- 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 b3b34757..6d66fb89 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -538,13 +538,13 @@ setDNS() { } setLogging() { - LogToggleCommand=(whiptail --separate-output --radiolist "Select Logging mode:" ${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) DNSChooseOptions=("On (Reccomended)" "" on Off "" off) DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) if [[ $? = 0 ]];then case ${DNSchoices} in - "On (Reccomended)") + "On (Recommended)") echo "::: Logging On." queryLogging=true ;; From 1d21b0da9a83fd288741857c0704ac8618661e5d Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 31 Oct 2016 22:02:20 +0000 Subject: [PATCH 32/75] enable or disable logging from pihole command --- pihole | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/pihole b/pihole index 4b197d12..55d82569 100755 --- a/pihole +++ b/pihole @@ -125,6 +125,27 @@ piholeEnable() { restartDNS } +piholeLogging() { + + shift + + if [[ "${1}" == "off" ]] ; then + #Disable Logging + sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf + sed -i 's/^queryLogging=true/queryLogging=false/' /etc/pihole/setupVars.conf + echo "::: Logging has been disabled!" + elif [[ "${1}" == "on" ]] ; then + #Enable logging + sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf + sed -i 's/^queryLogging=false/queryLogging=true/' /etc/pihole/setupVars.conf + echo "::: Logging has been enabled!" + else + echo "::: Invalid option passed, please pass 'on' or 'off'" + exit 1 + fi + restartDNS +} + piholeStatus() { if [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "#addn-hosts=/") ]] ; then #list is commented out @@ -173,6 +194,7 @@ helpFunc() { ::: -h, help Show this help dialog ::: -v, version Show current versions ::: -q, query Query the adlists for a specific domain +::: -l, logging Enable or Disable logging (pass 'on' or 'off') ::: uninstall Uninstall Pi-Hole from your system :(! ::: status Is Pi-Hole Enabled or Disabled ::: enable Enable Pi-Hole DNS Blocking @@ -200,6 +222,7 @@ case "${1}" in "-h" | "help" ) helpFunc;; "-v" | "version" ) versionFunc "$@";; "-q" | "query" ) queryFunc "$@";; + "-l" | "logging" ) piholeLogging "$@";; "uninstall" ) uninstallFunc;; "enable" ) piholeEnable 1;; "disable" ) piholeEnable 0;; From bbc09ed31347dbf1a58487d6df9befadb33c1e92 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 31 Oct 2016 16:48:02 -0700 Subject: [PATCH 33/75] Swap variable names. --- 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 6d66fb89..3abaca7c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -539,11 +539,11 @@ setDNS() { setLogging() { LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6) - DNSChooseOptions=("On (Reccomended)" "" on + LogChooseOptions=("On (Reccomended)" "" on Off "" off) - DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) + LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) if [[ $? = 0 ]];then - case ${DNSchoices} in + case ${LogChoices} in "On (Recommended)") echo "::: Logging On." queryLogging=true @@ -554,6 +554,7 @@ setLogging() { ;; esac else + # Well never see this, `set -e` kicked in already and dropped us. echo "::: Cancel selected. Exiting..." exit 1 fi From d695c5972f0c84046281bf7c9b051984a4744cd4 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 31 Oct 2016 16:48:58 -0700 Subject: [PATCH 34/75] `local` variables just to be safe and make sure they stay in this function. --- 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 3abaca7c..0ee45e77 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -538,6 +538,10 @@ setDNS() { } setLogging() { + local LogToggleCommand + local LogChooseOptions + local LogChoices + LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6) LogChooseOptions=("On (Reccomended)" "" on Off "" off) From c07d7165ab31b612bb6de34ef8ac4ebffa51f215 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 31 Oct 2016 16:49:40 -0700 Subject: [PATCH 35/75] Global variables CAP'ed --- automated install/basic-install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 0ee45e77..028e20a4 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -550,11 +550,11 @@ setLogging() { case ${LogChoices} in "On (Recommended)") echo "::: Logging On." - queryLogging=true + QUERYLOGGING=true ;; Off) echo "::: Logging Off." - queryLogging=false + QUERYLOGGING=false ;; esac else @@ -640,7 +640,7 @@ version_check_dnsmasq() { sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf} - if [[ "${queryLogging}" == false ]] ; then + if [[ "${QUERYLOGGING}" == false ]] ; then #Disable Logging sed -i 's/^log-queries/#log-queries/' ${dnsmasq_pihole_01_location} else @@ -891,7 +891,7 @@ finalExports() { echo "IPv6_address=${IPv6_address}" echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS2=${piholeDNS2}" - echo "queryLogging=${queryLogging}" + echo "queryLogging=${QUERYLOGGING}" }>> "${setupVars}" } From 9a1876571b11a55ac4c387d5c1a890f940548b3d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 31 Oct 2016 16:55:10 -0700 Subject: [PATCH 36/75] Prototype `whiptails` so they don't fall to shell. Need to do this to all functions. --- automated install/basic-install.sh | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 028e20a4..ddb83e3b 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -545,8 +545,7 @@ setLogging() { LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6) LogChooseOptions=("On (Reccomended)" "" on Off "" off) - LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) - if [[ $? = 0 ]];then + LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) || (echo "::: Cancel selected. Exiting..." && exit 1) case ${LogChoices} in "On (Recommended)") echo "::: Logging On." @@ -557,11 +556,6 @@ setLogging() { QUERYLOGGING=false ;; esac - else - # Well never see this, `set -e` kicked in already and dropped us. - echo "::: Cancel selected. Exiting..." - exit 1 - fi } From a2903b6e6345d71d6b95734459cfaab02c845e58 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:32:57 +0000 Subject: [PATCH 37/75] Consistency --- 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 ddb83e3b..c649d448 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -885,7 +885,7 @@ finalExports() { echo "IPv6_address=${IPv6_address}" echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS2=${piholeDNS2}" - echo "queryLogging=${QUERYLOGGING}" + echo "QUERYLOGGING=${QUERYLOGGING}" }>> "${setupVars}" } From b723714c0c1f4e7f536c4ed0c5be72ee3c2530e2 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:33:39 +0000 Subject: [PATCH 38/75] Convention : https://google.github.io/styleguide/shell.xml?showone=Constants_and_Environment_Variable_Names#Constants_and_Environment_Variable_Names --- automated install/basic-install.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index c649d448..19c71818 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -549,11 +549,11 @@ setLogging() { case ${LogChoices} in "On (Recommended)") echo "::: Logging On." - QUERYLOGGING=true + QUERY_LOGGING=true ;; Off) echo "::: Logging Off." - QUERYLOGGING=false + QUERY_LOGGING=false ;; esac } @@ -634,7 +634,7 @@ version_check_dnsmasq() { sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf} - if [[ "${QUERYLOGGING}" == false ]] ; then + if [[ "${QUERY_LOGGING}" == false ]] ; then #Disable Logging sed -i 's/^log-queries/#log-queries/' ${dnsmasq_pihole_01_location} else @@ -885,7 +885,7 @@ finalExports() { echo "IPv6_address=${IPv6_address}" echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS2=${piholeDNS2}" - echo "QUERYLOGGING=${QUERYLOGGING}" + echo "QUERY_LOGGING=${QUERY_LOGGING}" }>> "${setupVars}" } From 82e7de2aaad483d22c2dab6750d1cc04c049d3ed Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:36:59 +0000 Subject: [PATCH 39/75] Account for variable name changes --- automated install/basic-install.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 19c71818..77f14dc4 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -914,10 +914,16 @@ installPihole() { runGravity } -updatePihole() { +accountForRefactor() { + # At some point in the future this list can be pruned, for now we'll need it to ensure updates don't break. # 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} + +} + +updatePihole() { + accountForRefactor # Source ${setupVars} for use in the rest of the functions. . ${setupVars} # Install base files and web interface From edd00e8e708419e43b6fbf545615532658b9c30c Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:45:22 +0000 Subject: [PATCH 40/75] consistency --- automated install/basic-install.sh | 164 +++++++++++++++-------------- 1 file changed, 86 insertions(+), 78 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 77f14dc4..7020eeff 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -29,8 +29,8 @@ PI_HOLE_LOCAL_REPO="/etc/.pihole" PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version) useUpdateVars=false -IPv4_address="" -IPv6_address="" +IPV4_ADDRESS="" +IPV6_ADDRESS="" # Find the rows and columns will default to 80x24 is it can not be detected screen_size=$(stty size 2>/dev/null || echo 24 80) @@ -183,7 +183,7 @@ getGitFiles() { 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)}') - IPv4_address=$(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}') } @@ -265,8 +265,8 @@ chooseInterface() { chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) if [[ $? = 0 ]]; then for desiredInterface in ${chooseInterfaceOptions}; do - piholeInterface=${desiredInterface} - echo "::: Using interface: $piholeInterface" + PIHOLE_INTERFACE=${desiredInterface} + echo "::: Using interface: $PIHOLE_INTERFACE" done else echo "::: Cancel selected, exiting...." @@ -276,8 +276,8 @@ chooseInterface() { 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} + 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} } @@ -305,8 +305,8 @@ use4andor6() { if [[ ${useIPv6} ]]; then useIPv6dialog fi - echo "::: IPv4 address: ${IPv4_address}" - echo "::: IPv6 address: ${IPv6_address}" + echo "::: IPv4 address: ${IPV4_ADDRESS}" + echo "::: IPv6 address: ${IPV6_ADDRESS}" if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then echo "::: Cannot continue, neither IPv4 or IPv6 selected" echo "::: Exiting" @@ -321,7 +321,7 @@ use4andor6() { 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: ${IPv4_address} + 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. @@ -334,16 +334,16 @@ It is also possible to use a DHCP reservation, but if you are going to do that, # 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 # 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) + 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: ${IPv4_address}" + 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: ${IPv4_address} + IP address: ${IPV4_ADDRESS} Gateway: ${IPv4gw}" ${r} ${c}); then # After that's done, the loop ends and we move on ipSettingsCorrect=True @@ -370,8 +370,8 @@ 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=${IPv4_address} + echo "## interface ${PIHOLE_INTERFACE} + static ip_address=${IPV4_ADDRESS} static routers=${IPv4gw} static domain_name_servers=${IPv4gw}" | tee -a /etc/dhcpcd.conf >/dev/null } @@ -382,45 +382,45 @@ setStaticIPv4() { local CIDR if [[ -f /etc/dhcpcd.conf ]]; then # Debian Family - if grep -q "${IPv4_address}" /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}" "${IPv4_address}" + ip addr replace dev "${PIHOLE_INTERFACE}" "${IPV4_ADDRESS}" 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 - elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then + elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE} ]];then # Fedora Family - IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface} - if grep -q "${IPv4_address}" "${IFCFG_FILE}"; then + IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${PIHOLE_INTERFACE} + if grep -q "${IPV4_ADDRESS}" "${IFCFG_FILE}"; then echo "::: Static IP already configured" else - IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/) - CIDR=$(echo "${IPv4_address}" | 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}".pihole.orig # Build Interface configuration file: { echo "# Configured via Pi-Hole installer" - echo "DEVICE=$piholeInterface" + echo "DEVICE=$PIHOLE_INTERFACE" echo "BOOTPROTO=none" echo "ONBOOT=yes" echo "IPADDR=$IPADDR" echo "PREFIX=$CIDR" echo "GATEWAY=$IPv4gw" - echo "DNS1=$piholeDNS1" - echo "DNS2=$piholeDNS2" + echo "DNS1=$PIHOLE_DNS_1" + echo "DNS2=$PIHOLE_DNS_2" echo "USERCTL=no" }>> "${IFCFG_FILE}" - ip addr replace dev "${piholeInterface}" "${IPv4_address}" + ip addr replace dev "${PIHOLE_INTERFACE}" "${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 ${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 @@ -458,70 +458,70 @@ setDNS() { case ${DNSchoices} in Google) echo "::: Using Google DNS servers." - piholeDNS1="8.8.8.8" - piholeDNS2="8.8.4.4" + PIHOLE_DNS_1="8.8.8.8" + PIHOLE_DNS_2="8.8.4.4" ;; OpenDNS) echo "::: Using OpenDNS servers." - piholeDNS1="208.67.222.222" - piholeDNS2="208.67.220.220" + PIHOLE_DNS_1="208.67.222.222" + PIHOLE_DNS_2="208.67.220.220" ;; Level3) echo "::: Using Level3 servers." - piholeDNS1="4.2.2.1" - piholeDNS2="4.2.2.2" + PIHOLE_DNS_1="4.2.2.1" + PIHOLE_DNS_2="4.2.2.2" ;; Norton) echo "::: Using Norton ConnectSafe servers." - piholeDNS1="199.85.126.10" - piholeDNS2="199.85.127.10" + PIHOLE_DNS_1="199.85.126.10" + PIHOLE_DNS_2="199.85.127.10" ;; Comodo) echo "::: Using Comodo Secure servers." - piholeDNS1="8.26.56.26" - piholeDNS2="8.20.247.20" + PIHOLE_DNS_1="8.26.56.26" + PIHOLE_DNS_2="8.20.247.20" ;; Custom) until [[ ${DNSSettingsCorrect} = True ]]; do strInvalid="Invalid" - if [ ! ${piholeDNS1} ]; then - if [ ! ${piholeDNS2} ]; then + if [ ! ${PIHOLE_DNS_1} ]; then + if [ ! ${PIHOLE_DNS_2} ]; then prePopulate="" else - prePopulate=", ${piholeDNS2}" + prePopulate=", ${PIHOLE_DNS_2}" fi - elif [ ${piholeDNS1} ] && [ ! ${piholeDNS2} ]; then - prePopulate="${piholeDNS1}" - elif [ ${piholeDNS1} ] && [ ${piholeDNS2} ]; then - prePopulate="${piholeDNS1}, ${piholeDNS2}" + elif [ ${PIHOLE_DNS_1} ] && [ ! ${PIHOLE_DNS_2} ]; then + prePopulate="${PIHOLE_DNS_1}" + elif [ ${PIHOLE_DNS_1} ] && [ ${PIHOLE_DNS_2} ]; then + prePopulate="${PIHOLE_DNS_1}, ${PIHOLE_DNS_2}" fi 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) if [[ $? = 0 ]]; then - piholeDNS1=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}') - piholeDNS2=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}') - if ! valid_ip "${piholeDNS1}" || [ ! "${piholeDNS1}" ]; then - piholeDNS1=${strInvalid} + 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 ! valid_ip "${PIHOLE_DNS_1}" || [ ! "${PIHOLE_DNS_1}" ]; then + PIHOLE_DNS_1=${strInvalid} fi - if ! valid_ip "${piholeDNS2}" && [ "${piholeDNS2}" ]; then - piholeDNS2=${strInvalid} + if ! valid_ip "${PIHOLE_DNS_2}" && [ "${PIHOLE_DNS_2}" ]; then + PIHOLE_DNS_2=${strInvalid} fi else echo "::: Cancel selected, exiting...." exit 1 fi - if [[ ${piholeDNS1} == "${strInvalid}" ]] || [[ ${piholeDNS2} == "${strInvalid}" ]]; then - whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $piholeDNS1\n DNS Server 2: ${piholeDNS2}" ${r} ${c} - if [[ ${piholeDNS1} == "${strInvalid}" ]]; then - piholeDNS1="" + if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]] || [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then + 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} + if [[ ${PIHOLE_DNS_1} == "${strInvalid}" ]]; then + PIHOLE_DNS_1="" fi - if [[ ${piholeDNS2} == "${strInvalid}" ]]; then - piholeDNS2="" + if [[ ${PIHOLE_DNS_2} == "${strInvalid}" ]]; then + PIHOLE_DNS_2="" fi DNSSettingsCorrect=False else - if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\n DNS Server 1: $piholeDNS1\n DNS Server 2: ${piholeDNS2}" ${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 DNSSettingsCorrect=True else # If the settings are wrong, the loop continues @@ -590,14 +590,14 @@ version_check_dnsmasq() { echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..." cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location} echo " done." - sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location} - if [[ "${piholeDNS1}" != "" ]]; then - sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location} + sed -i "s/@INT@/$PIHOLE_INTERFACE/" ${dnsmasq_pihole_01_location} + if [[ "${PIHOLE_DNS_1}" != "" ]]; then + sed -i "s/@DNS1@/$PIHOLE_DNS_1/" ${dnsmasq_pihole_01_location} else sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location} fi - if [[ "${piholeDNS2}" != "" ]]; then - sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location} + if [[ "${PIHOLE_DNS_2}" != "" ]]; then + sed -i "s/@DNS2@/$PIHOLE_DNS_2/" ${dnsmasq_pihole_01_location} else sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location} fi @@ -611,16 +611,16 @@ version_check_dnsmasq() { fi #Replace IPv4 and IPv6 tokens in 01-pihole.conf for pi.hole resolution. - if [[ "${IPv4_address}" != "" ]]; then - tmp=${IPv4_address%/*} + if [[ "${IPV4_ADDRESS}" != "" ]]; then + tmp=${IPV4_ADDRESS%/*} sed -i "s/@IPv4@/$tmp/" ${dnsmasq_pihole_01_location} else sed -i '/^address=\/pi.hole\/@IPv4@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/@HOSTNAME@\/@IPv4@/d' ${dnsmasq_pihole_01_location} fi - if [[ "${IPv6_address}" != "" ]]; then - sed -i "s/@IPv6@/$IPv6_address/" ${dnsmasq_pihole_01_location} + if [[ "${IPV6_ADDRESS}" != "" ]]; then + sed -i "s/@IPv6@/$IPV6_ADDRESS/" ${dnsmasq_pihole_01_location} else sed -i '/^address=\/pi.hole\/@IPv6@/d' ${dnsmasq_pihole_01_location} sed -i '/^address=\/@HOSTNAME@\/@IPv6@/d' ${dnsmasq_pihole_01_location} @@ -880,11 +880,11 @@ finalExports() { rm ${setupVars} fi { - echo "piholeInterface=${piholeInterface}" - echo "IPv4_address=${IPv4_address}" - echo "IPv6_address=${IPv6_address}" - echo "piholeDNS1=${piholeDNS1}" - echo "piholeDNS2=${piholeDNS2}" + echo "PIHOLE_INTERFACE=${PIHOLE_INTERFACE}" + echo "IPV4_ADDRESS=${IPV4_ADDRESS}" + echo "IPV6_ADDRESS=${IPV6_ADDRESS}" + echo "PIHOLE_DNS_1=${PIHOLE_DNS_1}" + echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}" echo "QUERY_LOGGING=${QUERY_LOGGING}" }>> "${setupVars}" } @@ -916,10 +916,18 @@ installPihole() { accountForRefactor() { # At some point in the future this list can be pruned, for now we'll need it to ensure updates don't break. + # 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} + # Account for renaming of global variables. + sed -i 's/piholeInterface/PIHOLE_INTERFACE/g' ${setupVars} + sed -i 's/IPv4_address/IPV4_ADDRESS/g' ${setupVars} + sed -i 's/IPv6_address/IPV6_ADDRESS/g' ${setupVars} + sed -i 's/piholeDNS1/PIHOLE_DNS_1/g' ${setupVars} + sed -i 's/piholeDNS2/PIHOLE_DNS_2/g' ${setupVars} + } updatePihole() { @@ -961,13 +969,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: ${IPv4_address%/*} -IPv6: ${IPv6_address} +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://${IPv4_address%/*}/admin" ${r} ${c} +View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" ${r} ${c} } update_dialogs() { @@ -1101,8 +1109,8 @@ main() { echo ":::" 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}" + echo "::: ${IPV4_ADDRESS%/*}" + echo "::: ${IPV6_ADDRESS}" echo ":::" echo "::: If you set a new IP address, you should restart the Pi." else @@ -1111,7 +1119,7 @@ main() { echo ":::" echo "::: The install log is located at: /etc/pihole/install.log" - echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" + echo "::: View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" } main "$@" From c47c5e466f27b0bb14b88edcd6784ee1fc484971 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:48:21 +0000 Subject: [PATCH 41/75] consistency --- pihole | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pihole b/pihole index 55d82569..478d995e 100755 --- a/pihole +++ b/pihole @@ -132,12 +132,12 @@ piholeLogging() { if [[ "${1}" == "off" ]] ; then #Disable Logging sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf - sed -i 's/^queryLogging=true/queryLogging=false/' /etc/pihole/setupVars.conf + sed -i 's/^QUERY_LOGGING=true/QUERY_LOGGING=false/' /etc/pihole/setupVars.conf echo "::: Logging has been disabled!" elif [[ "${1}" == "on" ]] ; then #Enable logging sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf - sed -i 's/^queryLogging=false/queryLogging=true/' /etc/pihole/setupVars.conf + sed -i 's/^QUERY_LOGGING=false/QUERY_LOGGING=true/' /etc/pihole/setupVars.conf echo "::: Logging has been enabled!" else echo "::: Invalid option passed, please pass 'on' or 'off'" From 99057ed859cc973b4bd9fb4329ada73ee29289e5 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 09:47:31 +0000 Subject: [PATCH 42/75] Update var names from setupVars.conf in gravity.sh --- gravity.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gravity.sh b/gravity.sh index 112b42b6..15e157f6 100755 --- a/gravity.sh +++ b/gravity.sh @@ -44,7 +44,7 @@ else fi #Remove the /* from the end of the IPv4addr. -IPv4_address=${IPv4_address%/*} +IPV4_ADDRESS=${IPV4_ADDRESS%/*} # Variables for various stages of downloading and formatting the list basename=pihole @@ -242,22 +242,22 @@ gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "::: Formatting domains into a HOSTS file..." # Check vars from setupVars.conf to see if we're using IPv4, IPv6, Or both. - if [[ -n "${IPv4_address}" && -n "${IPv6_address}" ]];then + if [[ -n "${IPV4_ADDRESS}" && -n "${IPV6_ADDRESS}" ]];then # Both IPv4 and IPv6 - cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} + cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPV4_ADDRESS" -v ipv6addr="$IPV6_ADDRESS" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} - elif [[ -n "${IPv4_address}" && -z "${IPv6_address}" ]];then + elif [[ -n "${IPV4_ADDRESS}" && -z "${IPV6_ADDRESS}" ]];then # Only IPv4 - cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc} + cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPV4_ADDRESS" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc} - elif [[ -z "${IPv4_address}" && -n "${IPv6_address}" ]];then + elif [[ -z "${IPV4_ADDRESS}" && -n "${IPV6_ADDRESS}" ]];then # Only IPv6 - cat ${piholeDir}/${eventHorizon} | awk -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} + cat ${piholeDir}/${eventHorizon} | awk -v ipv6addr="$IPV6_ADDRESS" '{sub(/\r$/,""); print ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} - elif [[ -z "${IPv4_address}" && -z "${IPv6_address}" ]];then + elif [[ -z "${IPV4_ADDRESS}" && -z "${IPV6_ADDRESS}" ]];then echo "::: No IP Values found! Please run 'pihole -r' and choose reconfigure to restore values" exit 1 fi From 354309fcad1be97f175bd87efab6c3329c8e5cae Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Tue, 1 Nov 2016 16:46:54 +0000 Subject: [PATCH 43/75] set QUERY_LOGGING default to true --- 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 7020eeff..79b823b1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -31,6 +31,7 @@ useUpdateVars=false IPV4_ADDRESS="" IPV6_ADDRESS="" +QUERY_LOGGING=true # Find the rows and columns will default to 80x24 is it can not be detected screen_size=$(stty size 2>/dev/null || echo 24 80) From 3df2ef8587df0f3ca5381f9dc9a083681fe2e7b8 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 2 Nov 2016 09:33:17 +0000 Subject: [PATCH 44/75] Cherry picking f6f6f6d, conflict fix --- automated install/basic-install.sh | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 79b823b1..c068fb39 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -932,18 +932,19 @@ accountForRefactor() { } updatePihole() { - accountForRefactor - # 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 + accountForRefactor + # Source ${setupVars} for use in the rest of the functions. + . ${setupVars} + # Install base files and web interface + installScripts + installConfigs + CreateLogFile + configureSelinux + installPiholeWeb + installCron + configureFirewall + finalExports #re-export setupVars.conf to account for any new vars added in new versions + runGravity } configureSelinux() { From f36e4ba336432e480d19e335db6846ef259fa275 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 2 Nov 2016 09:35:48 +0000 Subject: [PATCH 45/75] Cherry picking 3f049fa79, conflict fix --- pihole | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/pihole b/pihole index 478d995e..ace0d9a9 100755 --- a/pihole +++ b/pihole @@ -126,24 +126,24 @@ piholeEnable() { } piholeLogging() { + shift - shift - - if [[ "${1}" == "off" ]] ; then - #Disable Logging - sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf - sed -i 's/^QUERY_LOGGING=true/QUERY_LOGGING=false/' /etc/pihole/setupVars.conf - echo "::: Logging has been disabled!" - elif [[ "${1}" == "on" ]] ; then - #Enable logging - sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf - sed -i 's/^QUERY_LOGGING=false/QUERY_LOGGING=true/' /etc/pihole/setupVars.conf - echo "::: Logging has been enabled!" - else - echo "::: Invalid option passed, please pass 'on' or 'off'" - exit 1 - fi - restartDNS + if [[ "${1}" == "off" ]] ; then + #Disable Logging + sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf + sed -i 's/^QUERY_LOGGING=true/QUERY_LOGGING=false/' /etc/pihole/setupVars.conf + pihole -f + echo "::: Logging has been disabled!" + elif [[ "${1}" == "on" ]] ; then + #Enable logging + sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf + sed -i 's/^QUERY_LOGGING=false/QUERY_LOGGING=true/' /etc/pihole/setupVars.conf + echo "::: Logging has been enabled!" + else + echo "::: Invalid option passed, please pass 'on' or 'off'" + exit 1 + fi + restartDNS } piholeStatus() { From 7740e4268c0dbbca9a5fa7f676322fe6ea3bae68 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 05:17:28 -0700 Subject: [PATCH 46/75] Consistency and standards basic-install start. --- automated install/basic-install.sh | 184 +++++++++++++++-------------- 1 file changed, 94 insertions(+), 90 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 49329f5a..017ea8f1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -33,7 +33,7 @@ IPv4_address="" IPv6_address="" # Find the rows and columns will default to 80x24 is it can not be detected -screen_size=$(stty size 2>/dev/null || echo 24 80) +screen_size=$(stty size 2>/dev/null || echo 24 80) rows=$(echo $screen_size | awk '{print $1}') columns=$(echo $screen_size | awk '{print $2}') @@ -53,119 +53,123 @@ runUnattended=false # Must be root to install echo ":::" if [[ ${EUID} -eq 0 ]]; then - echo "::: You are root." + echo "::: You are root." else - echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures" - echo "::: system networking, it requires elevated rights. Please check the contents of the script for" - echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source." - echo ":::" - echo "::: Detecting the presence of the sudo utility for continuation of this install..." + echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures" + echo "::: system networking, it requires elevated rights. Please check the contents of the script for" + echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source." + echo ":::" + echo "::: Detecting the presence of the sudo utility for continuation of this install..." - if [ -x "$(command -v sudo)" ]; then - echo "::: Utility sudo located." - 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." - exit 1 - fi + if [ -x "$(command -v sudo)" ]; then + echo "::: Utility sudo located." + 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." + exit 1 + fi fi # Compatibility if [[ $(command -v apt-get) ]]; then - #Debian Family - ############################################# - PKG_MANAGER="apt-get" - PKG_CACHE="/var/lib/apt/lists/" - UPDATE_PKG_CACHE="${PKG_MANAGER} update" - PKG_UPDATE="${PKG_MANAGER} upgrade" - 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" - # ######################################### - # fixes for dependancy differences - # Debian 7 doesn't have iproute2 use iproute - ${PKG_MANAGER} install --dry-run iproute2 > /dev/null 2>&1 && IPROUTE_PKG="iproute2" || IPROUTE_PKG="iproute" - # Ubuntu 16.04 LTS php / php5 fix - ${PKG_MANAGER} install --dry-run php5 > /dev/null 2>&1 && phpVer="php5" || phpVer="php" - # ######################################### - INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) - PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron ${IPROUTE_PKG} ) - 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}" - } + #Debian Family + ############################################# + PKG_MANAGER="apt-get" + PKG_CACHE="/var/lib/apt/lists/" + UPDATE_PKG_CACHE="${PKG_MANAGER} update" + PKG_UPDATE="${PKG_MANAGER} upgrade" + 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" + # ######################################### + # fixes for dependancy differences + # Debian 7 doesn't have iproute2 use iproute + ${PKG_MANAGER} install --dry-run iproute2 > /dev/null 2>&1 && IPROUTE_PKG="iproute2" || IPROUTE_PKG="iproute" + # Ubuntu 16.04 LTS php / php5 fix + ${PKG_MANAGER} install --dry-run php5 > /dev/null 2>&1 && phpVer="php5" || phpVer="php" + # ######################################### + INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) + PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron ${IPROUTE_PKG} ) + 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}" + } elif [ $(command -v rpm) ]; then - # Fedora Family - if [ $(command -v dnf) ]; then - PKG_MANAGER="dnf" - else - PKG_MANAGER="yum" - fi - PKG_CACHE="/var/cache/${PKG_MANAGER}" - 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 | 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 - remove_deps=(epel-release); - PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} ); - fi - 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}" - } + # Fedora Family + if [ $(command -v dnf) ]; then + PKG_MANAGER="dnf" + else + PKG_MANAGER="yum" + fi + PKG_CACHE="/var/cache/${PKG_MANAGER}" + 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 | 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 + remove_deps=(epel-release); + PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} ); + fi + 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}" + } else - echo "OS distribution not supported" - exit + echo "OS distribution not supported" + exit fi ####### FUNCTIONS ########## 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" + 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" } 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 + git status &> /dev/null && (echo " OK!"; true) || (echo " not found!"; false) } 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!" + # 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!" + # 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!" } getGitFiles() { @@ -1035,7 +1039,7 @@ main() { # Decide what upstream DNS Servers to use setDNS # Install and log everything to a file - installPihole | tee ${tmpLog} + installPihole | tee ${tmpLog} else updatePihole | tee ${tmpLog} fi From a0d9a1133cac1da095ffa1b01525b5f6ef630963 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 05:34:39 -0700 Subject: [PATCH 47/75] Factoring and combining functions --- advanced/Scripts/update.sh | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 74bd2e54..c27d837b 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -23,16 +23,25 @@ is_repo() { # Use git to check if directory is currently under VCS local directory="${1}" cd "${directory}" &> /dev/null || false - $(git status --short &> /dev/null) + git status --short &> /dev/null return } - 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 || exit 1 - echo " done!" +prep_dirs() { + # Prepare directory for local repository building + local dir_to_clean="${1}" + cd "${dir_to_clean}" &> /dev/null || (echo "Unable to prepare directory, please contact support"; exit false) + rm -rf "${dir_to_clean}" &> /dev/null || (echo "Unable to prepare directory, please contact support"; exit false) +} + +make_repo() { + # Remove the non-repod interface and clone the interface + local source_repo="${2}" + local dest_dir="${1}" + echo -n "::: Cloning ${source_repo} into ${dest_dir}..." + rm -rf "${dest_dir}" + git clone -q --depth 1 "${2}" "${1}" > /dev/null || exit 1 + echo " done!" } update_repo() { @@ -58,14 +67,8 @@ getGitFiles() { main() { - if ! is_repo "${PI_HOLE_FILES_DIR}"; 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 ! $(is_repo "${ADMIN_INTERFACE_DIR}"); then #This is unlikely - echo "::: Critical Error: Pi-Hole repo missing from system!" + if ! is_repo "${PI_HOLE_FILES_DIR}" && ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely + echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" exit 1; fi From 8dc9143b34d9ffeb47c61753c36feba6f3767296 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 05:45:29 -0700 Subject: [PATCH 48/75] Just delete, no need to cd there first. --- advanced/Scripts/update.sh | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index c27d837b..0c5e625c 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -20,9 +20,9 @@ readonly PI_HOLE_GIT_URL="https://github.com/pi-hole/pi-hole.git" readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { - # Use git to check if directory is currently under VCS - local directory="${1}" - cd "${directory}" &> /dev/null || false + # Use git to check if directory is currently under VCS, do not exit if failed + local directory="${1}" + cd "${directory}" &> /dev/null || false git status --short &> /dev/null return } @@ -30,17 +30,18 @@ is_repo() { prep_dirs() { # Prepare directory for local repository building local dir_to_clean="${1}" - cd "${dir_to_clean}" &> /dev/null || (echo "Unable to prepare directory, please contact support"; exit false) - rm -rf "${dir_to_clean}" &> /dev/null || (echo "Unable to prepare directory, please contact support"; exit false) + rm -rf "${dir_to_clean}" &> /dev/null } make_repo() { # Remove the non-repod interface and clone the interface local source_repo="${2}" local dest_dir="${1}" + echo -n "::: Cloning ${source_repo} into ${dest_dir}..." - rm -rf "${dest_dir}" - git clone -q --depth 1 "${2}" "${1}" > /dev/null || exit 1 + prep_dirs "${dest_dir}" + git clone -q --depth 1 "${source_repo}" "${dest_dir}" > /dev/null \ + || (echo "Unable to clone directory, please contact support"; exit false) echo " done!" } @@ -67,7 +68,7 @@ getGitFiles() { main() { - if ! is_repo "${PI_HOLE_FILES_DIR}" && ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely + if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" exit 1; From 93d91353a1615aaea530c0bcce818df94cabab96 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 05:49:33 -0700 Subject: [PATCH 49/75] All tabs now spaced --- advanced/Scripts/update.sh | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 0c5e625c..ea04dc2e 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -20,7 +20,7 @@ readonly PI_HOLE_GIT_URL="https://github.com/pi-hole/pi-hole.git" readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { - # Use git to check if directory is currently under VCS, do not exit if failed + # Use git to check if directory is currently under VCS, do not exit if failed local directory="${1}" cd "${directory}" &> /dev/null || false git status --short &> /dev/null @@ -46,24 +46,24 @@ make_repo() { } update_repo() { -# Pull the latest commits - echo -n "::: Updating repo in $1..." - cd "${1}" || exit 1 - git stash -q > /dev/null || exit 1 - git pull -q > /dev/null || exit 1 - echo " done!" + # Pull the latest commits + echo -n "::: Updating repo in $1..." + cd "${1}" || exit 1 + git stash -q > /dev/null || exit 1 + git pull -q > /dev/null || exit 1 + echo " done!" } 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 + # 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 } main() { From 50bd8b4a09078f0410d1561ab7304dd385543b25 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 2 Nov 2016 13:34:57 +0000 Subject: [PATCH 50/75] Further tweaks to local repo handling --- advanced/Scripts/update.sh | 35 +++++++++++++++++------------- automated install/basic-install.sh | 31 +++++++++++++++----------- 2 files changed, 38 insertions(+), 28 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 74bd2e54..b4c9728a 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -20,39 +20,44 @@ readonly PI_HOLE_GIT_URL="https://github.com/pi-hole/pi-hole.git" readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { - # Use git to check if directory is currently under VCS - local directory="${1}" - cd "${directory}" &> /dev/null || false - $(git status --short &> /dev/null) + # Use git to check if directory is currently under VCS, return the value + local directory="${1}" + git -C "${directory}" status --short &> /dev/null return } - make_repo() { +make_repo() { + local directory="${1}" + local remoteRepo="{$2}" # 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 || exit 1 + echo -n "::: Cloning $remoteRepo into $directory..." + rm -rf "${directory}" + git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null echo " done!" } update_repo() { -# Pull the latest commits +echo "update" && exit 1 + local directory="${1}" + # Pull the latest commits echo -n "::: Updating repo in $1..." - cd "${1}" || exit 1 - git stash -q > /dev/null || exit 1 - git pull -q > /dev/null || exit 1 + cd "${directory}" || exit 1 + git stash -q > /dev/null + git pull -q > /dev/null echo " done!" } getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 + local directory="${1}" + local remoteRepo="{$2}" echo ":::" echo "::: Checking for existing repository..." - if is_repo "${1}"; then - update_repo "${1}" + if is_repo "${directory}"; then + update_repo "${directory}" else - make_repo "${1}" "${2}" + make_repo "${directory}" "${remoteRepo}" fi } diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index c068fb39..8e797a20 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -146,24 +146,27 @@ spinner() { } 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 + # Use git to check if directory is currently under VCS, return the value + local directory="${1}" + git -C "${directory}" status --short &> /dev/null + return } make_repo() { + local directory="${1}" + local remoteRepo="${2}" # 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 -n "::: Cloning $remoteRepo into $directory..." + rm -rf "${directory}" + git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null & spinner $! echo " done!" } update_repo() { + local directory="${1}" # Pull the latest commits echo -n "::: Updating repo in $1..." - cd "${1}" || exit 1 + cd "${directory}" || exit 1 git stash -q > /dev/null & spinner $! git pull -q > /dev/null & spinner $! echo " done!" @@ -172,12 +175,14 @@ update_repo() { getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 + local directory="${1}" + local remoteRepo="${2}" echo ":::" echo "::: Checking for existing repository..." - if is_repo "${1}"; then - update_repo "${1}" + if is_repo "${directory}"; then + update_repo "${directory}" else - make_repo "${1}" "${2}" + make_repo "${directory}" "${remoteRepo}" fi } @@ -671,13 +676,13 @@ installScripts() { readonly install_dir="/opt/pihole/" echo ":::" - echo -n "::: Installing scripts to ${PI_HOLE_LOCAL_REPO}..." + echo -n "::: Installing scripts from ${PI_HOLE_LOCAL_REPO}..." # Clear out script files from Pi-hole scripts directory. clean_existing "${install_dir}" "${PI_HOLE_FILES}" # Install files from local core repository - if [[ $(is_repo "${PI_HOLE_LOCAL_REPO}") ]]; then + if is_repo "${PI_HOLE_LOCAL_REPO}"; then cd "${PI_HOLE_LOCAL_REPO}" install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh From ece1667fb0c2853fb597d4ee3c2e3b3be16c7d90 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 06:41:51 -0700 Subject: [PATCH 51/75] Refactor and move some bits. --- advanced/Scripts/update.sh | 52 +++++++++++++++----------------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index ea04dc2e..dbad17f8 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -20,10 +20,9 @@ readonly PI_HOLE_GIT_URL="https://github.com/pi-hole/pi-hole.git" readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { - # Use git to check if directory is currently under VCS, do not exit if failed + # Use git to check if directory is currently under VCS, return the value local directory="${1}" - cd "${directory}" &> /dev/null || false - git status --short &> /dev/null + git -C "${directory}" status --short &> /dev/null return } @@ -31,6 +30,7 @@ prep_dirs() { # Prepare directory for local repository building local dir_to_clean="${1}" rm -rf "${dir_to_clean}" &> /dev/null + return } make_repo() { @@ -39,18 +39,18 @@ make_repo() { local dest_dir="${1}" echo -n "::: Cloning ${source_repo} into ${dest_dir}..." - prep_dirs "${dest_dir}" - git clone -q --depth 1 "${source_repo}" "${dest_dir}" > /dev/null \ - || (echo "Unable to clone directory, please contact support"; exit false) - echo " done!" + if (prep_dirs "${dest_dir}" && git clone -q --depth 1 "${source_repo}" "${dest_dir}" > /dev/null); then \ + echo " done!" || (echo "Unable to clone repository, please contact support"; exit false) + fi } update_repo() { + local dest_dir="${1}" # Pull the latest commits - echo -n "::: Updating repo in $1..." + echo -n "::: Updating repository in ${dest_dir}..." cd "${1}" || exit 1 - git stash -q > /dev/null || exit 1 - git pull -q > /dev/null || exit 1 + git stash -q > /dev/null || exit $? + git pull -q > /dev/null || exit $? echo " done!" } @@ -98,49 +98,39 @@ main() { # pull pihole repo run install --unattended if [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then - echo "::: Pi-hole version is $pihole_version_current" - echo "::: Web Admin version is $web_version_current" echo "::: Everything is up to date!" - echo "" - exit 0 elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then echo "::: Pi-hole Web Admin files out of date" getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" echo ":::" web_version_current="$(/usr/local/bin/pihole -v -a -c)" - echo "::: Web Admin version is now at ${web_version_current}" - echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'" - echo "" + elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then echo "::: Pi-hole core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - echo ":::" pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" - echo "::: Pi-hole version is now at ${pihole_version_current}" - echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" - echo "" + + elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then echo "::: Updating Everything" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" - /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X web_version_current="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" - echo ":::" - echo "::: Pi-hole version is now at ${pihole_version_current}" - 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 ${pihole_version_current}" - echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" - echo "" fi + echo ":::" + echo "::: Pi-hole version is now at ${pihole_version_current}" + echo "::: If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" + echo ":::" + echo "::: Web Admin version is now at ${web_version_current}" + echo "::: If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'" + echo "" + exit 0 } main From b636c1e1f8221dc6f9a7ce62970148e2b608bc5d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 07:00:43 -0700 Subject: [PATCH 52/75] Whitespace. --- advanced/Scripts/update.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 7d05efd8..c29c6b70 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -55,17 +55,17 @@ update_repo() { } getGitFiles() { - # Setup git repos for directory and repository passed - # as arguments 1 and 2 - local directory="${1}" - local remoteRepo="{$2}" - echo ":::" - echo "::: Checking for existing repository..." - if is_repo "${directory}"; then - update_repo "${directory}" - else - make_repo "${directory}" "${remoteRepo}" - fi + # Setup git repos for directory and repository passed + # as arguments 1 and 2 + local directory="${1}" + local remoteRepo="{$2}" + echo ":::" + echo "::: Checking for existing repository..." + if is_repo "${directory}"; then + update_repo "${directory}" + else + make_repo "${directory}" "${remoteRepo}" + fi } main() { From ee37c37cab37a5faa9f53aeb09eb5fb6fff168a9 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Wed, 2 Nov 2016 14:29:20 +0000 Subject: [PATCH 53/75] fix update output logic. version number variables should not be read only! --- advanced/Scripts/update.sh | 40 ++++++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 7d05efd8..1a12dfc1 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -78,14 +78,14 @@ main() { echo "::: Checking for updates..." # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X - local -r pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + local pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X - local -r pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" + local pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - local -r web_version_current="$(/usr/local/bin/pihole -v -a -c)" + local web_version_current="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X - local -r web_version_latest="$(/usr/local/bin/pihole -v -a -l)" + local web_version_latest="$(/usr/local/bin/pihole -v -a -l)" # Logic # If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!): @@ -100,21 +100,27 @@ main() { # pull pihole repo run install --unattended if [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then + echo ":::" + echo "::: Pi-hole version is $pihole_version_current" + echo "::: Web Admin version is $web_version_current" + echo ":::" echo "::: Everything is up to date!" + exit 0 elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then + echo ":::" echo "::: Pi-hole Web Admin files out of date" getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" - echo ":::" + web_version_current="$(/usr/local/bin/pihole -v -a -c)" + web_updated=true elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then echo "::: Pi-hole core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - echo ":::" pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" - + core_updated=true elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then echo "::: Updating Everything" @@ -124,15 +130,25 @@ main() { web_version_current="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + web_updated=true + core_updated=true fi - echo ":::" - echo "::: Pi-hole version is now at ${pihole_version_current}" - echo "::: If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" + + if [[ "${web_updated}" == true ]]; then echo ":::" echo "::: Web Admin version is now at ${web_version_current}" echo "::: If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'" - echo "" - exit 0 + fi + + if [[ "${core_updated}" == true ]]; then + echo ":::" + echo "::: Pi-hole version is now at ${pihole_version_current}" + echo "::: If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" + fi + + echo "" + exit 0 + } main From fef9ab674e2d853b970bb73200d69c0286fef9e5 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 07:53:02 -0700 Subject: [PATCH 54/75] Pi-hole CORE installer variables are being changed to standardize scripts. --- test/test_automated_install.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/test/test_automated_install.py b/test/test_automated_install.py index 1605fdb6..b09eabd6 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -23,11 +23,11 @@ def test_setupVars_are_sourced_to_global_scope(Pihole): printSetupVars() { # Currently debug test function only echo "Outputting sourced variables" - echo "piholeInterface=\${piholeInterface}" - echo "IPv4_address=\${IPv4_address}" - echo "IPv6_address=\${IPv6_address}" - echo "piholeDNS1=\${piholeDNS1}" - echo "piholeDNS2=\${piholeDNS2}" + echo "PIHOLE_INTERFAC=\${piholeInterface}" + echo "IPv4_ADDRESS=\${IPv4_address}" + echo "IPv6_ADDRESS=\${IPv6_address}" + echo "PIHOLE_DNS1=\${piholeDNS1}" + echo "PIHOLE_DNS2=\${piholeDNS2}" } update_dialogs() { . /etc/pihole/setupVars.conf From e99ef9c093666434898eb641129685c97ed4793a Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 08:22:45 -0700 Subject: [PATCH 55/75] Cap the variables and echo out the proper environment. --- test/test_automated_install.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/test_automated_install.py b/test/test_automated_install.py index b09eabd6..44bdacb2 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -2,11 +2,11 @@ import pytest from textwrap import dedent SETUPVARS = { - 'piholeInterface' : 'eth99', - 'IPv4_address' : '1.1.1.1', - 'IPv6_address' : '2:2:2:2:2:2', - 'piholeDNS1' : '4.2.2.1', - 'piholeDNS2' : '4.2.2.2' + 'PIHOLE_INTERFACE' : 'eth99', + 'IPV4_ADDRESS' : '1.1.1.1', + 'IPV6_ADDRESS' : 'FE80::240:D0FF:FE48:4672', + 'PIHOLE_DNS1' : '4.2.2.1', + 'PIHOLE_DNS2' : '4.2.2.2' } def test_setupVars_are_sourced_to_global_scope(Pihole): @@ -23,11 +23,11 @@ def test_setupVars_are_sourced_to_global_scope(Pihole): printSetupVars() { # Currently debug test function only echo "Outputting sourced variables" - echo "PIHOLE_INTERFAC=\${piholeInterface}" - echo "IPv4_ADDRESS=\${IPv4_address}" - echo "IPv6_ADDRESS=\${IPv6_address}" - echo "PIHOLE_DNS1=\${piholeDNS1}" - echo "PIHOLE_DNS2=\${piholeDNS2}" + echo "PIHOLE_INTERFACE=\${PIHOLE_INTERFACE}" + echo "IPv4_ADDRESS=\${IPv4_ADDRESS}" + echo "IPv6_ADDRESS=\${IPv6_ADDRESS}" + echo "PIHOLE_DNS1=\${PIHOLE_DNS1}" + echo "PIHOLE_DNS2=\${PIHOLE_DNS2}" } update_dialogs() { . /etc/pihole/setupVars.conf From 07029f93e36c0a03ccefa6b1b5f352e3d72bce00 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 08:34:56 -0700 Subject: [PATCH 56/75] Match team convention in naming. --- test/test_automated_install.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/test_automated_install.py b/test/test_automated_install.py index 44bdacb2..b9b05708 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -24,8 +24,8 @@ def test_setupVars_are_sourced_to_global_scope(Pihole): # Currently debug test function only echo "Outputting sourced variables" echo "PIHOLE_INTERFACE=\${PIHOLE_INTERFACE}" - echo "IPv4_ADDRESS=\${IPv4_ADDRESS}" - echo "IPv6_ADDRESS=\${IPv6_ADDRESS}" + echo "IPV4_ADDRESS=\${IPV4_ADDRESS}" + echo "IPV6_ADDRESS=\${IPV6_ADDRESS}" echo "PIHOLE_DNS1=\${PIHOLE_DNS1}" echo "PIHOLE_DNS2=\${PIHOLE_DNS2}" } From a1a9a7fa9e0cfe49a4e8e1cec28b40573204b9aa Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 08:52:23 -0700 Subject: [PATCH 57/75] Clarify which DNS entry we are modifying. --- test/test_automated_install.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/test_automated_install.py b/test/test_automated_install.py index b9b05708..458536eb 100644 --- a/test/test_automated_install.py +++ b/test/test_automated_install.py @@ -5,8 +5,8 @@ SETUPVARS = { 'PIHOLE_INTERFACE' : 'eth99', 'IPV4_ADDRESS' : '1.1.1.1', 'IPV6_ADDRESS' : 'FE80::240:D0FF:FE48:4672', - 'PIHOLE_DNS1' : '4.2.2.1', - 'PIHOLE_DNS2' : '4.2.2.2' + 'PIHOLE_DNS_1' : '4.2.2.1', + 'PIHOLE_DNS_2' : '4.2.2.2' } def test_setupVars_are_sourced_to_global_scope(Pihole): @@ -26,8 +26,8 @@ def test_setupVars_are_sourced_to_global_scope(Pihole): echo "PIHOLE_INTERFACE=\${PIHOLE_INTERFACE}" echo "IPV4_ADDRESS=\${IPV4_ADDRESS}" echo "IPV6_ADDRESS=\${IPV6_ADDRESS}" - echo "PIHOLE_DNS1=\${PIHOLE_DNS1}" - echo "PIHOLE_DNS2=\${PIHOLE_DNS2}" + echo "PIHOLE_DNS_1=\${PIHOLE_DNS_1}" + echo "PIHOLE_DNS_2=\${PIHOLE_DNS_2}" } update_dialogs() { . /etc/pihole/setupVars.conf From fe18d69b659a5f00e0155ba039d7c809fa886edd Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 09:25:32 -0700 Subject: [PATCH 58/75] Grep should start at the beginning of line to make sure it doesn't fire on `#` beginning lines. --- pihole | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pihole b/pihole index ace0d9a9..199c0a68 100755 --- a/pihole +++ b/pihole @@ -154,7 +154,7 @@ piholeStatus() { else echo "::: Pi-hole blocking is Disabled"; fi - elif [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "addn-hosts=/") ]] ; then + elif [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "^addn-hosts=/") ]] ; then #list set if [[ "${1}" == "web" ]] ; then echo 1; From e42a037b7db3a99bc84bda809b9d80e5a0008482 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 09:28:00 -0700 Subject: [PATCH 59/75] Grep -i instead of cat. --- pihole | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pihole b/pihole index 199c0a68..25805b7f 100755 --- a/pihole +++ b/pihole @@ -147,14 +147,14 @@ piholeLogging() { } piholeStatus() { - if [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "#addn-hosts=/") ]] ; then + if [[ $(grep -i "^#addn-hosts=/" /etc/dnsmasq.d/01-pihole.conf) ]] ; then #list is commented out if [[ "${1}" == "web" ]] ; then echo 0; else echo "::: Pi-hole blocking is Disabled"; fi - elif [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "^addn-hosts=/") ]] ; then + elif [[ $(grep -i "^addn-hosts=/" /etc/dnsmasq.d/01-pihole.conf) ]] ; then #list set if [[ "${1}" == "web" ]] ; then echo 1; From 0ef8832b041b61383f4d029857790701757bc049 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 09:36:30 -0700 Subject: [PATCH 60/75] whitespace --- pihole | 125 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/pihole b/pihole index 25805b7f..a1c03420 100755 --- a/pihole +++ b/pihole @@ -12,85 +12,84 @@ # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then - if [ -x "$(command -v sudo)" ];then - 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 + 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() { - /opt/pihole/list.sh "$@" - exit 0 + /opt/pihole/list.sh "$@" + exit 0 } blacklistFunc() { - /opt/pihole/list.sh "$@" - exit 0 + /opt/pihole/list.sh "$@" + exit 0 } debugFunc() { - /opt/pihole/piholeDebug.sh - exit 0 + /opt/pihole/piholeDebug.sh + exit 0 } flushFunc() { - /opt/pihole/piholeLogFlush.sh - exit 0 + /opt/pihole/piholeLogFlush.sh + exit 0 } - updatePiholeFunc() { - /opt/pihole/update.sh - exit 0 + /opt/pihole/update.sh + exit 0 } reconfigurePiholeFunc() { - /etc/.pihole/automated\ install/basic-install.sh --reconfigure - exit 0; + /etc/.pihole/automated\ install/basic-install.sh --reconfigure + exit 0; } updateGravityFunc() { - /opt/pihole/gravity.sh "$@" - exit 0 + /opt/pihole/gravity.sh "$@" + exit 0 } setupLCDFunction() { - /opt/pihole/setupLCD.sh - exit 0 + /opt/pihole/setupLCD.sh + exit 0 } queryFunc() { - domain=$2 - for list in /etc/pihole/list.*; do - count=$(grep ${domain} $list | wc -l) - echo "::: ${list} (${count} results)" - if [[ ${count} > 0 ]]; then - grep ${domain} ${list} - fi - echo "" - done - exit 0 + domain=$2 + for list in /etc/pihole/list.*; do + count=$(grep ${domain} $list | wc -l) + echo "::: ${list} (${count} results)" + if [[ ${count} > 0 ]]; then + grep ${domain} ${list} + fi + echo "" + done + exit 0 } chronometerFunc() { - shift - /opt/pihole/chronometer.sh "$@" - exit 0 + shift + /opt/pihole/chronometer.sh "$@" + exit 0 } uninstallFunc() { - /opt/pihole/uninstall.sh - exit 0 + /opt/pihole/uninstall.sh + exit 0 } versionFunc() { - shift - /opt/pihole/version.sh "$@" - exit 0 + shift + /opt/pihole/version.sh "$@" + exit 0 } restartDNS() { @@ -201,32 +200,32 @@ helpFunc() { ::: disable Disable Pi-Hole DNS Blocking ::: restartdns Restart dnsmasq EOM - exit 1 + exit 1 } if [[ $# = 0 ]]; then - helpFunc + helpFunc fi # Handle redirecting to specific functions based on arguments case "${1}" in - "-w" | "whitelist" ) whitelistFunc "$@";; - "-b" | "blacklist" ) blacklistFunc "$@";; - "-d" | "debug" ) debugFunc;; - "-f" | "flush" ) flushFunc;; - "-up" | "updatePihole" ) updatePiholeFunc;; - "-r" | "reconfigure" ) reconfigurePiholeFunc;; - "-g" | "updateGravity" ) updateGravityFunc "$@";; - "-s" | "setupLCD" ) setupLCDFunction;; - "-c" | "chronometer" ) chronometerFunc "$@";; - "-h" | "help" ) helpFunc;; - "-v" | "version" ) versionFunc "$@";; - "-q" | "query" ) queryFunc "$@";; - "-l" | "logging" ) piholeLogging "$@";; - "uninstall" ) uninstallFunc;; - "enable" ) piholeEnable 1;; - "disable" ) piholeEnable 0;; - "status" ) piholeStatus "$2";; - "restartdns" ) restartDNS;; - * ) helpFunc;; + "-w" | "whitelist" ) whitelistFunc "$@";; + "-b" | "blacklist" ) blacklistFunc "$@";; + "-d" | "debug" ) debugFunc;; + "-f" | "flush" ) flushFunc;; + "-up" | "updatePihole" ) updatePiholeFunc;; + "-r" | "reconfigure" ) reconfigurePiholeFunc;; + "-g" | "updateGravity" ) updateGravityFunc "$@";; + "-s" | "setupLCD" ) setupLCDFunction;; + "-c" | "chronometer" ) chronometerFunc "$@";; + "-h" | "help" ) helpFunc;; + "-v" | "version" ) versionFunc "$@";; + "-q" | "query" ) queryFunc "$@";; + "-l" | "logging" ) piholeLogging "$@";; + "uninstall" ) uninstallFunc;; + "enable" ) piholeEnable 1;; + "disable" ) piholeEnable 0;; + "status" ) piholeStatus "$2";; + "restartdns" ) restartDNS;; + * ) helpFunc;; esac From dfb4ac03653f6b83a168dcb1b0976535921b18de Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 09:52:15 -0700 Subject: [PATCH 61/75] Keep .yml's from going to user local repos. --- .gitignore | 1 + pihole | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0e0d4b99..19b458d3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.swp __pycache__ .cache +*.yml diff --git a/pihole b/pihole index a1c03420..758aa660 100755 --- a/pihole +++ b/pihole @@ -62,7 +62,7 @@ setupLCDFunction() { } queryFunc() { - domain=$2 + domain="${2}" for list in /etc/pihole/list.*; do count=$(grep ${domain} $list | wc -l) echo "::: ${list} (${count} results)" From 1d64ad1ccd13c485c7def7d0fa27acf5a1979e63 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 10:39:27 -0700 Subject: [PATCH 62/75] Stash all changed files, clean directory and pull updates. --- advanced/Scripts/update.sh | 16 ++++++++++------ pihole | 21 +++++++++++---------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 549e5176..c12248a9 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -28,8 +28,8 @@ is_repo() { prep_dirs() { # Prepare directory for local repository building - local dir_to_clean="${1}" - rm -rf "${dir_to_clean}" &> /dev/null + local directory="${1}" + rm -rf "${directory}" &> /dev/null return } @@ -48,9 +48,13 @@ update_repo() { local dest_dir="${1}" # Pull the latest commits echo -n "::: Updating repository in ${dest_dir}..." - cd "${1}" || exit 1 - git stash -q > /dev/null || exit $? - git pull -q > /dev/null || exit $? + + # Stash all files not tracked for later retrieval + git -C "${dest_dir}" stash --all --quiet &> /dev/null || false + # Force a clean working directory for cloning + git -C "${dest_dir}" clean --force -d &> /dev/null || false + # Fetch latest changes and apply + git -C "${dest_dir}" pull --quiet &> /dev/null || false echo " done!" } @@ -62,7 +66,7 @@ getGitFiles() { echo ":::" echo "::: Checking for existing repository..." if is_repo "${directory}"; then - update_repo "${directory}" + update_repo "${directory}" || (echo "*** Error: Could not update local repository. Contact support."; exit 1) else make_repo "${directory}" "${remoteRepo}" fi diff --git a/pihole b/pihole index 758aa660..83046675 100755 --- a/pihole +++ b/pihole @@ -10,6 +10,7 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. +PI_HOLE_SCRIPT_DIR="/opt/pihole" # Must be root to use this tool if [[ ! $EUID -eq 0 ]];then if [ -x "$(command -v sudo)" ];then @@ -22,27 +23,27 @@ if [[ ! $EUID -eq 0 ]];then fi whitelistFunc() { - /opt/pihole/list.sh "$@" + "${PI_HOLE_SCRIPT_DIR}"/list.sh "$@" exit 0 } blacklistFunc() { - /opt/pihole/list.sh "$@" + "${PI_HOLE_SCRIPT_DIR}"/list.sh "$@" exit 0 } debugFunc() { - /opt/pihole/piholeDebug.sh + "${PI_HOLE_SCRIPT_DIR}"/piholeDebug.sh exit 0 } flushFunc() { - /opt/pihole/piholeLogFlush.sh + "${PI_HOLE_SCRIPT_DIR}"/piholeLogFlush.sh exit 0 } updatePiholeFunc() { - /opt/pihole/update.sh + "${PI_HOLE_SCRIPT_DIR}"/update.sh exit 0 } @@ -52,12 +53,12 @@ reconfigurePiholeFunc() { } updateGravityFunc() { - /opt/pihole/gravity.sh "$@" + "${PI_HOLE_SCRIPT_DIR}"/gravity.sh "$@" exit 0 } setupLCDFunction() { - /opt/pihole/setupLCD.sh + "${PI_HOLE_SCRIPT_DIR}"/setupLCD.sh exit 0 } @@ -76,19 +77,19 @@ queryFunc() { chronometerFunc() { shift - /opt/pihole/chronometer.sh "$@" + "${PI_HOLE_SCRIPT_DIR}"/chronometer.sh "$@" exit 0 } uninstallFunc() { - /opt/pihole/uninstall.sh + "${PI_HOLE_SCRIPT_DIR}"/uninstall.sh exit 0 } versionFunc() { shift - /opt/pihole/version.sh "$@" + "${PI_HOLE_SCRIPT_DIR}"/version.sh "$@" exit 0 } From 34be601dd7f8f6c84304ba3b138f457ca56431ed Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 10:42:05 -0700 Subject: [PATCH 63/75] Test for lexicographically less than tag version. --- advanced/Scripts/update.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index c12248a9..c20357e9 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -111,7 +111,7 @@ main() { echo "::: Everything is up to date!" exit 0 - elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then + elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" < "${web_version_latest}" ]]; then echo ":::" echo "::: Pi-hole Web Admin files out of date" getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" @@ -119,14 +119,14 @@ main() { web_version_current="$(/usr/local/bin/pihole -v -a -c)" web_updated=true - elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then + elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then echo "::: Pi-hole core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" core_updated=true - elif [[ "${pihole_version_current}" != "${pihole_version_latest}" ]] && [[ "${web_version_current}" != "${web_version_latest}" ]]; then + elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" < "${web_version_latest}" ]]; then echo "::: Updating Everything" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 From b8a5ed710ea9c2c3e8bce927d328fed438ce8410 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 10:51:09 -0700 Subject: [PATCH 64/75] Take echos out of utility functions and move up a level. --- advanced/Scripts/update.sh | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index c20357e9..089cad5f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -22,6 +22,7 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole" is_repo() { # Use git to check if directory is currently under VCS, return the value local directory="${1}" + git -C "${directory}" status --short &> /dev/null return } @@ -29,18 +30,18 @@ is_repo() { prep_dirs() { # Prepare directory for local repository building local directory="${1}" + rm -rf "${directory}" &> /dev/null return } make_repo() { # Remove the non-repod interface and clone the interface - local source_repo="${2}" - local dest_dir="${1}" + local remoteRepo="${2}" + local directory="${1}" - echo -n "::: Cloning ${source_repo} into ${dest_dir}..." - if (prep_dirs "${dest_dir}" && git clone -q --depth 1 "${source_repo}" "${dest_dir}" > /dev/null); then \ - echo " done!" || (echo "Unable to clone repository, please contact support"; exit false) + if ! (prep_dirs "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null); then \ + return false fi } @@ -68,7 +69,9 @@ getGitFiles() { if is_repo "${directory}"; then update_repo "${directory}" || (echo "*** Error: Could not update local repository. Contact support."; exit 1) else - make_repo "${directory}" "${remoteRepo}" + echo -n "::: Cloning ${remoteRepo} into ${directory}..." + make_repo "${directory}" "${remoteRepo}" || (echo "Unable to clone repository, please contact support"; exit 1) + echo " done!" fi } From bd68db51e061ac7dd76a50f3a3162d1f298b7833 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 11:01:50 -0700 Subject: [PATCH 65/75] ShellCheck split local declaration and assignment. --- advanced/Scripts/update.sh | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 089cad5f..30f03e2e 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -40,9 +40,8 @@ make_repo() { local remoteRepo="${2}" local directory="${1}" - if ! (prep_dirs "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null); then \ - return false - fi + (prep_dirs "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null) + return } update_repo() { @@ -63,7 +62,7 @@ getGitFiles() { # Setup git repos for directory and repository passed # as arguments 1 and 2 local directory="${1}" - local remoteRepo="{$2}" + local remoteRepo="${2}" echo ":::" echo "::: Checking for existing repository..." if is_repo "${directory}"; then @@ -76,6 +75,10 @@ getGitFiles() { } main() { + local pihole_version_current + local pihole_version_latest + local web_version_current + local web_version_latest if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" @@ -85,14 +88,14 @@ main() { echo "::: Checking for updates..." # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X - local pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" + pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X - local pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" + pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - local web_version_current="$(/usr/local/bin/pihole -v -a -c)" + web_version_current="$(/usr/local/bin/pihole -v -a -c)" # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X - local web_version_latest="$(/usr/local/bin/pihole -v -a -l)" + web_version_latest="$(/usr/local/bin/pihole -v -a -l)" # Logic # If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!): From 3f61aea7fcb808a2b616650653ce996f1d1b2475 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 11:09:53 -0700 Subject: [PATCH 66/75] Utility functions fully quiet now. Calling functions have the echos. --- advanced/Scripts/update.sh | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 30f03e2e..de9db399 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -45,17 +45,17 @@ make_repo() { } update_repo() { - local dest_dir="${1}" + local directory="${1}" + local retVal=0 # Pull the latest commits - echo -n "::: Updating repository in ${dest_dir}..." # Stash all files not tracked for later retrieval - git -C "${dest_dir}" stash --all --quiet &> /dev/null || false + git -C "${directory}" stash --all --quiet &> /dev/null || ${retVal}=1 # Force a clean working directory for cloning - git -C "${dest_dir}" clean --force -d &> /dev/null || false + git -C "${directory}" clean --force -d &> /dev/null || ${retVal}=1 # Fetch latest changes and apply - git -C "${dest_dir}" pull --quiet &> /dev/null || false - echo " done!" + git -C "${directory}" pull --quiet &> /dev/null || ${retVal}=1 + return ${retVal} } getGitFiles() { @@ -66,7 +66,9 @@ getGitFiles() { echo ":::" echo "::: Checking for existing repository..." if is_repo "${directory}"; then + echo -n "::: Updating repository in ${directory}..." update_repo "${directory}" || (echo "*** Error: Could not update local repository. Contact support."; exit 1) + echo " done!" else echo -n "::: Cloning ${remoteRepo} into ${directory}..." make_repo "${directory}" "${remoteRepo}" || (echo "Unable to clone repository, please contact support"; exit 1) From c1a3f003e802f778ec2dfe102808a1324ed74f91 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 11:18:13 -0700 Subject: [PATCH 67/75] Rename the only utilty function left that didn't say `repo` --- 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 de9db399..da88127f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -27,7 +27,7 @@ is_repo() { return } -prep_dirs() { +prep_repo() { # Prepare directory for local repository building local directory="${1}" @@ -40,7 +40,7 @@ make_repo() { local remoteRepo="${2}" local directory="${1}" - (prep_dirs "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null) + (prep_repo "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null) return } From 3cf6a65da9ecb880f65785014849c7f7bd6a7639 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 11:32:53 -0700 Subject: [PATCH 68/75] Remove *.yml ignoring Travis YAML might not be good to ignore. --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 19b458d3..0e0d4b99 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,3 @@ *.swp __pycache__ .cache -*.yml From 3d43e1568cb6d88a139cf09a2dbb5aba68bed43b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 11:39:22 -0700 Subject: [PATCH 69/75] Use explicit calls for function to self-document --- .gitignore | 3 ++- advanced/Scripts/update.sh | 14 +++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 19b458d3..c4b497a0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,5 @@ *.swp __pycache__ .cache -*.yml +.pullapprove.yml + diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index da88127f..0b26ac7a 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -89,15 +89,11 @@ main() { fi echo "::: Checking for updates..." - # Checks Pi-hole version > pihole only > current local git repo version : returns string in format vX.X.X - pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" - # Checks Pi-hole version > pihole only > remote upstream repo version : returns string in format vX.X.X - pihole_version_latest="$(/usr/local/bin/pihole -v -p -l)" - - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - web_version_current="$(/usr/local/bin/pihole -v -a -c)" - # Checks Pi-hole version > admin only > remote upstream repo version : returns string in format vX.X.X - web_version_latest="$(/usr/local/bin/pihole -v -a -l)" + # Checks Pi-hole version string in format vX.X.X + pihole_version_current="$(/usr/local/bin/pihole version --pihole --current)" + pihole_version_latest="$(/usr/local/bin/pihole version --pihole --latest)" + web_version_current="$(/usr/local/bin/pihole version --admin --current)" + web_version_latest="$(/usr/local/bin/pihole version --admin --latest)" # Logic # If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!): From f7266ef4c8280b8e332790d4278301c6bcabefcf Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 12:07:59 -0700 Subject: [PATCH 70/75] Version remote check returns -1 on failure to detect curl silent failing. Update detects loss of contact to GitHub or fallthrough condition and reports to user. --- advanced/Scripts/update.sh | 26 +++++++++++++++----------- advanced/Scripts/version.sh | 4 ++-- 2 files changed, 17 insertions(+), 13 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 0b26ac7a..9b17168b 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -82,11 +82,11 @@ main() { local web_version_current local web_version_latest - if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely - echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" - echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" - exit 1; - fi +# if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely +# echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" +# echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" +# exit 1; +# fi echo "::: Checking for updates..." # Checks Pi-hole version string in format vX.X.X @@ -95,6 +95,11 @@ main() { web_version_current="$(/usr/local/bin/pihole version --admin --current)" web_version_latest="$(/usr/local/bin/pihole version --admin --latest)" + if [[ "${pihole_version_latest}" -eq "-1" || "${web_version_latest}" -eq -1 ]]; then + echo "*** Unable to contact GitHub for latest version. Please try again later, contact support if this continues." + exit 1 + fi + # Logic # If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!): # Update anyway @@ -120,35 +125,34 @@ main() { echo "::: Pi-hole Web Admin files out of date" getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}" - web_version_current="$(/usr/local/bin/pihole -v -a -c)" web_updated=true elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then echo "::: Pi-hole core files out of date" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" core_updated=true elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" < "${web_version_latest}" ]]; then echo "::: Updating Everything" getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}" /etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1 - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - web_version_current="$(/usr/local/bin/pihole -v -a -c)" - # Checks Pi-hole version > admin only > current local git repo version : returns string in format vX.X.X - pihole_version_current="$(/usr/local/bin/pihole -v -p -c)" web_updated=true core_updated=true + else + echo "*** Update script has malfunctioned, fallthrough reached. Please contact support" + exit 1 fi if [[ "${web_updated}" == true ]]; then + web_version_current="$(/usr/local/bin/pihole version --admin --current)" echo ":::" echo "::: Web Admin version is now at ${web_version_current}" echo "::: If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'" fi if [[ "${core_updated}" == true ]]; then + pihole_version_current="$(/usr/local/bin/pihole version --pihole --current)" echo ":::" echo "::: Pi-hole version is now at ${pihole_version_current}" echo "::: If you had made any changes in '/etc/.pihole/', they have been stashed using 'git stash'" diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index ca78032a..86375415 100644 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -58,10 +58,10 @@ coreOutput() { 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} + echo ${piholeVersionLatest:-"-1"} elif [[ "${latest}" == false && "${current}" == true ]]; then piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) - echo ${piholeVersion} + echo ${piholeVersion:-"-1"} 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/",$//') From 603ec997baa355396ea2d7b0bf358126891e5b26 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 12:09:33 -0700 Subject: [PATCH 71/75] Remove testing block. --- advanced/Scripts/update.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 9b17168b..008f257f 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -82,11 +82,11 @@ main() { local web_version_current local web_version_latest -# if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely -# echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" -# echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" -# exit 1; -# fi + if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely + echo "::: Critical Error: One or more Pi-Hole repos are missing from system!" + echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" + exit 1; + fi echo "::: Checking for updates..." # Checks Pi-hole version string in format vX.X.X From f7d0de53bb6ac7e1e9c6e27f8a4c05b1c906514d Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 12:11:34 -0700 Subject: [PATCH 72/75] Compare string to string. --- advanced/Scripts/update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 008f257f..556270b2 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -95,7 +95,7 @@ main() { web_version_current="$(/usr/local/bin/pihole version --admin --current)" web_version_latest="$(/usr/local/bin/pihole version --admin --latest)" - if [[ "${pihole_version_latest}" -eq "-1" || "${web_version_latest}" -eq -1 ]]; then + if [[ "${pihole_version_latest}" -eq "-1" || "${web_version_latest}" -eq "-1" ]]; then echo "*** Unable to contact GitHub for latest version. Please try again later, contact support if this continues." exit 1 fi From 4b7b859db91befd53493f9257ff61e72d44910d2 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 2 Nov 2016 12:29:55 -0700 Subject: [PATCH 73/75] Gotta catch 'em all...' --- advanced/Scripts/version.sh | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/version.sh b/advanced/Scripts/version.sh index 86375415..fc74f8a0 100644 --- a/advanced/Scripts/version.sh +++ b/advanced/Scripts/version.sh @@ -14,6 +14,8 @@ latest=false current=false +DEFAULT="-1" + normalOutput() { piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) @@ -21,8 +23,8 @@ normalOutput() { 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})" + echo "::: Pi-hole version is ${piholeVersion} (Latest version is ${piholeVersionLatest:-${DEFAULT}})" + echo "::: Web-Admin version is ${webVersion} (Latest version is ${webVersionLatest:-${DEFAULT}})" } webOutput() { @@ -36,14 +38,14 @@ webOutput() { 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} + echo "${webVersionLatest:--1}" elif [[ "${latest}" == false && "${current}" == true ]]; then webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) - echo ${webVersion} + 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/",$//') - echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" + echo "::: Web-Admin version is ${webVersion} (Latest version is ${webVersionLatest:-${DEFAULT}})" fi } @@ -58,14 +60,14 @@ coreOutput() { 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:-"-1"} + echo "${piholeVersionLatest:--1}" elif [[ "${latest}" == false && "${current}" == true ]]; then piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) - echo ${piholeVersion:-"-1"} + 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)" + echo "::: Pi-hole version is ${piholeVersion} (Latest version is ${piholeVersionLatest:-${DEFAULT}})" fi } From 2f976504e829680b4b7ded53561297bd2fc6a330 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Wed, 2 Nov 2016 20:06:21 +0000 Subject: [PATCH 74/75] switch out -eq for == --- advanced/Scripts/update.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/update.sh b/advanced/Scripts/update.sh index 556270b2..10728cd8 100644 --- a/advanced/Scripts/update.sh +++ b/advanced/Scripts/update.sh @@ -95,7 +95,7 @@ main() { web_version_current="$(/usr/local/bin/pihole version --admin --current)" web_version_latest="$(/usr/local/bin/pihole version --admin --latest)" - if [[ "${pihole_version_latest}" -eq "-1" || "${web_version_latest}" -eq "-1" ]]; then + if [[ "${pihole_version_latest}" == "-1" || "${web_version_latest}" == "-1" ]]; then echo "*** Unable to contact GitHub for latest version. Please try again later, contact support if this continues." exit 1 fi From b429e890add80798222bcdae83c66ef50e627e1e Mon Sep 17 00:00:00 2001 From: Promofaux Date: Wed, 2 Nov 2016 20:16:36 +0000 Subject: [PATCH 75/75] move web interface message inside "if not update" block. Check for pi-hole deps AFTER whiptails --- .idea/codeStyleSettings.xml | 22 ++++++++++++++++++++++ automated install/basic-install.sh | 10 +++++----- 2 files changed, 27 insertions(+), 5 deletions(-) create mode 100644 .idea/codeStyleSettings.xml diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml new file mode 100644 index 00000000..a571e63f --- /dev/null +++ b/.idea/codeStyleSettings.xml @@ -0,0 +1,22 @@ + + + + + + \ No newline at end of file diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index fb048ec2..2e8ae77d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1061,9 +1061,6 @@ main() { # 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 [[ "${reconfigure}" == true ]]; then echo "::: --reconfigure passed to install script. Not downloading/updating local repos" else @@ -1094,11 +1091,14 @@ main() { setLogging # Install packages used by the Pi-hole - install_dependent_packages PIHOLE_DEPS[@] + install_dependent_packages PIHOLE_DEPS[@] # Install and log everything to a file installPihole | tee ${tmpLog} else + # update packages used by the Pi-hole + install_dependent_packages PIHOLE_DEPS[@] + updatePihole | tee ${tmpLog} fi @@ -1124,13 +1124,13 @@ main() { echo "::: ${IPV6_ADDRESS}" echo ":::" echo "::: If you set a new IP address, you should restart the Pi." + echo "::: View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" else echo "::: Update complete!" 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://${IPV4_ADDRESS%/*}/admin" } if [[ -z "$PHTEST" ]] ; then