It's going to take 3 replies
pi@raspberry:~ $ curl -sSL https://install.pi-hole.net | sudo bash -x
+ set -e
+ export PATH+=:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+ PATH+=:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
++ cat
+ DNS_SERVERS='Google (ECS);8.8.8.8;8.8.4.4;2001:4860:4860:0:0:0:0:8888;2001:4860:4860:0:0:0:0:8844
OpenDNS (ECS, DNSSEC);208.67.222.222;208.67.220.220;2620:119:35::35;2620:119:53::53
Level3;4.2.2.1;4.2.2.2;;
Comodo;8.26.56.26;8.20.247.20;;
DNS.WATCH;84.200.69.80;84.200.70.40;2001:1608:10:25:0:0:1c04:b12f;2001:1608:10:25:0:0:9249:d69b
Quad9 (filtered, DNSSEC);9.9.9.9;149.112.112.112;2620:fe::fe;2620:fe::9
Quad9 (unfiltered, no DNSSEC);9.9.9.10;149.112.112.10;2620:fe::10;2620:fe::fe:10
Quad9 (filtered + ECS);9.9.9.11;149.112.112.11;2620:fe::11;2620:fe::fe:11
Cloudflare;1.1.1.1;1.0.0.1;2606:4700:4700::1111;2606:4700:4700::1001'
+ installLogLoc=/etc/pihole/install.log
+ setupVars=/etc/pihole/setupVars.conf
+ lighttpdConfig=/etc/lighttpd/lighttpd.conf
+ coltable=/opt/pihole/COL_TABLE
+ webroot=/var/www/html
+ webInterfaceGitUrl=https://github.com/pi-hole/AdminLTE.git
+ webInterfaceDir=/var/www/html/admin
+ piholeGitUrl=https://github.com/pi-hole/pi-hole.git
+ PI_HOLE_LOCAL_REPO=/etc/.pihole
+ PI_HOLE_FILES=(chronometer list piholeDebug piholeLogFlush setupLCD update version gravity uninstall webpage)
+ PI_HOLE_INSTALL_DIR=/opt/pihole
+ PI_HOLE_CONFIG_DIR=/etc/pihole
+ PI_HOLE_BIN_DIR=/usr/local/bin
+ PI_HOLE_BLOCKPAGE_DIR=/var/www/html/pihole
+ '[' -z '' ']'
+ useUpdateVars=false
+ adlistFile=/etc/pihole/adlists.list
+ IPV4_ADDRESS=
+ IPV6_ADDRESS=
+ QUERY_LOGGING=true
+ INSTALL_WEB_INTERFACE=true
+ PRIVACY_LEVEL=0
+ CACHE_SIZE=10000
+ '[' -z root ']'
+ '[' -t 0 ']'
+ screen_size='24 80'
+ printf -v rows %d 24
+ printf -v columns %d 80
+ r=12
+ c=40
+ r=20
+ c=70
+ reconfigure=false
+ runUnattended=false
+ INSTALL_WEB_SERVER=true
+ [[ -f /opt/pihole/COL_TABLE ]]
+ COL_NC='\e[0m'
+ COL_LIGHT_GREEN='\e[1;32m'
+ COL_LIGHT_RED='\e[1;31m'
+ TICK='[\e[1;32m✓\e[0m]'
+ CROSS='[\e[1;31m✗\e[0m]'
+ INFO='[i]'
+ DONE='\e[1;32m done!\e[0m'
+ OVER='\r\033[K'
+ counter=0
+ [[ '' != true ]]
+ main
+ local 'str=Root user check'
+ printf '\n'
+ [[ 0 -eq 0 ]]
+ printf ' %b %s\n' '[\e[1;32m✓\e[0m]' 'Root user check'
[✓] Root user check
+ show_ascii_berry
+ echo -e '
\e[1;32m.;;,.
.ccccc:,.
:cccclll:. ..,,
:ccccclll. ;ooodc
'\''ccll:;ll .oooodc
.;cll.;;looo:.
\e[1;31m.. '\'','\''.
.'\'',,,,,,'\''.
.'\'',,,,,,,,,,.
.'\'',,,,,,,,,,,,....
....'\'''\'''\'',,,,,,,'\''.......
......... .... .........
.......... ..........
.......... ..........
......... .... .........
........,,,,,,,'\''......
....'\'',,,,,,,,,,,,.
.'\'',,,,,,,,,'\''.
.'\'',,,,,,'\''.
..'\'''\'''\''.\e[0m
'
.;;,.
.ccccc:,.
:cccclll:. ..,,
:ccccclll. ;ooodc
'ccll:;ll .oooodc
.;cll.;;looo:.
.. ','.
.',,,,,,'.
.',,,,,,,,,,.
.',,,,,,,,,,,,....
....''',,,,,,,'.......
......... .... .........
.......... ..........
.......... ..........
......... .... .........
........,,,,,,,'......
....',,,,,,,,,,,,.
.',,,,,,,,,'.
.',,,,,,'.
..'''.
+ make_temporary_log
++ mktemp /tmp/pihole_temp.XXXXXX
+ TEMPLOG=/tmp/pihole_temp.8JI678
+ exec
+ rm /tmp/pihole_temp.8JI678
+ distro_check
+ is_command apt-get
+ local check_command=apt-get
+ command -v apt-get
+ PKG_MANAGER=apt-get
+ UPDATE_PKG_CACHE='apt-get update'
+ PKG_INSTALL=("${PKG_MANAGER}" -qq --no-install-recommends install)
+ PKG_COUNT='apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true'
+ APT_SOURCES=/etc/apt/sources.list
+ awk 'BEGIN{a=1;b=0}/bionic main/{a=0}/bionic.*universe/{b=1}END{exit a + b}' /etc/apt/sources.list
+ update_package_cache
+ local 'str=Update local cache of available packages'
+ printf ' %b %s...' '[i]' 'Update local cache of available packages'
[i] Update local cache of available packages...+ eval 'apt-get update'
+ printf '%b %b %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' 'Update local cache of available packages'
[✓] Update local cache of available packages
+ apt-cache show iproute2
+ iproute_pkg=iproute2
+ is_command php
+ local check_command=php
+ command -v php
+ [[ '' != true ]]
+ apt-cache show php
+ phpVer=php
+ apt-cache show php-sqlite3
+ phpSqlite=sqlite3
+ INSTALLER_DEPS=(dhcpcd5 git "${iproute_pkg}" whiptail dnsutils)
+ PIHOLE_DEPS=(cron curl iputils-ping lsof netcat psmisc sudo unzip wget idn2 sqlite3 libcap2-bin dns-root-data libcap2)
+ PIHOLE_WEB_DEPS=(lighttpd "${phpVer}-common" "${phpVer}-cgi" "${phpVer}-${phpSqlite}" "${phpVer}-xml" "${phpVer}-json" "${phpVer}-intl")
+ LIGHTTPD_USER=www-data
+ LIGHTTPD_GROUP=www-data
+ LIGHTTPD_CFG=lighttpd.conf.debian
+ [[ -f /etc/pihole/setupVars.conf ]]
+ notify_package_updates_available
+ local 'str=Checking apt-get for upgraded packages'
+ printf '\n %b %s...' '[i]' 'Checking apt-get for upgraded packages'
[i] Checking apt-get for upgraded packages...++ eval 'apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true'
+++ grep -c '^Inst'
+++ apt-get -s -o Debug::NoLocking=true upgrade
+ updatesToInstall=302
++ uname -r
+ [[ -d /lib/modules/4.19.0-8-amd64 ]]
+ [[ 302 -eq 0 ]]
+ printf '%b %b %s... %s updates available\n' '\r\033[K' '[\e[1;32m✓\e[0m]' 'Checking apt-get for upgraded packages' 302
[✓] Checking apt-get for upgraded packages... 302 updates available
+ printf ' %b %bIt is recommended to update your OS after installing the Pi-hole!%b\n\n' '[i]' '\e[1;32m' '\e[0m'
[i] It is recommended to update your OS after installing the Pi-hole!
+ install_dependent_packages dhcpcd5 git iproute2 whiptail dnsutils
+ counter=1
+ [[ 1 == 1 ]]
+ printf ' %b Installer Dependency checks...\n' '[i]'
[i] Installer Dependency checks...
+ declare -a installArray
+ is_command apt-get
+ local check_command=apt-get
+ command -v apt-get
+ for i in "$@"
+ printf ' %b Checking for %s...' '[i]' dhcpcd5
[i] Checking for dhcpcd5...+ grep 'ok installed'
+ dpkg-query -W '-f=${Status}' dhcpcd5
+ printf '%b %b Checking for %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' dhcpcd5
[✓] Checking for dhcpcd5
+ for i in "$@"
+ printf ' %b Checking for %s...' '[i]' git
[i] Checking for git...+ grep 'ok installed'
+ dpkg-query -W '-f=${Status}' git
+ printf '%b %b Checking for %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' git
[✓] Checking for git
+ for i in "$@"
+ printf ' %b Checking for %s...' '[i]' iproute2
[i] Checking for iproute2...+ grep 'ok installed'
+ dpkg-query -W '-f=${Status}' iproute2
+ printf '%b %b Checking for %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' iproute2
[✓] Checking for iproute2
+ for i in "$@"
+ printf ' %b Checking for %s...' '[i]' whiptail
[i] Checking for whiptail...+ grep 'ok installed'
+ dpkg-query -W '-f=${Status}' whiptail
+ printf '%b %b Checking for %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' whiptail
[✓] Checking for whiptail
+ for i in "$@"
+ printf ' %b Checking for %s...' '[i]' dnsutils
[i] Checking for dnsutils...+ grep 'ok installed'
+ dpkg-query -W '-f=${Status}' dnsutils
+ printf '%b %b Checking for %s (will be installed)\n' '\r\033[K' '[i]' dnsutils
[i] Checking for dnsutils (will be installed)
+ installArray+=("${i}")
+ [[ 1 -gt 0 ]]
+ test_dpkg_lock
+ i=0
+ fuser /var/lib/dpkg/lock
+ return 0
+ printf ' %b Processing %s install(s) for: %s, please wait...\n' '[i]' apt-get dnsutils
[i] Processing apt-get install(s) for: dnsutils, please wait...
+ tr ' ' -
+ printf '%*s\n' 80 ''
--------------------------------------------------------------------------------
+ apt-get -qq --no-install-recommends install dnsutils
(Reading database ... 142069 files and directories currently installed.)
Preparing to unpack .../0-bind9-host_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking bind9-host (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../1-libbind9-161_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libbind9-161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../2-libisccfg163_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libisccfg163:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../3-libisccc161_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libisccc161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../4-libdns1104_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libdns1104:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../5-libisc1100_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libisc1100:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Preparing to unpack .../6-liblwres161_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking liblwres161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) over (1:9.11.5.P4+dfsg-5.1) ...
Selecting previously unselected package libirs161:i386.
Preparing to unpack .../7-libirs161_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking libirs161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Selecting previously unselected package dnsutils.
Preparing to unpack .../8-dnsutils_1%3a9.11.5.P4+dfsg-5.1+deb10u2_i386.deb ...
Unpacking dnsutils (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libisc1100:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up liblwres161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libisccc161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libdns1104:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libisccfg163:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libbind9-161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up libirs161:i386 (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up bind9-host (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Setting up dnsutils (1:9.11.5.P4+dfsg-5.1+deb10u2) ...
Processing triggers for libc-bin (2.28-10) ...
Processing triggers for man-db (2.8.5-2) ...
+ tr ' ' -
+ printf '%*s\n' 80 ''
--------------------------------------------------------------------------------
+ return
+ os_check
+ '[' '' '!=' true ']'
+ local remote_os_domain valid_os valid_version valid_response detected_os detected_version display_warning cmdResult digReturnCode response
+ remote_os_domain=versions.pi-hole.net
++ tr -d '"'
++ cut -d = -f2
++ grep '\bID\b' /etc/os-release
+ detected_os=debian
++ tr -d '"'
++ cut -d = -f2
++ grep VERSION_ID /etc/os-release
+ detected_version=10
++ dig +short -t txt versions.pi-hole.net @ns1.pi-hole.net
++ echo 0
+ cmdResult='"Raspbian=9,10 Ubuntu=16,18,20 Debian=9,10 Fedora=31,32 CentOS=7,8"
0'
+ digReturnCode=0
+ '[' '!' 0 == 0 ']'
+ response='"Raspbian=9,10 Ubuntu=16,18,20 Debian=9,10 Fedora=31,32 CentOS=7,8"'
+ '[' '"Raspbian=9,10 Ubuntu=16,18,20 Debian=9,10 Fedora=31,32 CentOS=7,8"' == 0 ']'
+ IFS=' '
+ read -r -a supportedOS
++ tr -d '"'
++ echo '"Raspbian=9,10 Ubuntu=16,18,20 Debian=9,10 Fedora=31,32 CentOS=7,8"'
+ for distro_and_versions in "${supportedOS[@]}"
+ distro_part=Raspbian
+ versions_part=9,10
+ [[ DEBIAN =~ RASPBIAN ]]
+ for distro_and_versions in "${supportedOS[@]}"
+ distro_part=Ubuntu
+ versions_part=16,18,20
+ [[ DEBIAN =~ UBUNTU ]]
+ for distro_and_versions in "${supportedOS[@]}"
+ distro_part=Debian
+ versions_part=9,10
+ [[ DEBIAN =~ DEBIAN ]]
+ valid_os=true
+ IFS=,
+ read -r -a supportedVer
+ for version in "${supportedVer[@]}"
+ [[ 10 =~ 9 ]]
+ for version in "${supportedVer[@]}"
+ [[ 10 =~ 10 ]]
+ valid_version=true
+ break
+ break
+ '[' true = true ']'
+ '[' true = true ']'
+ '[' '!' '' = false ']'
+ display_warning=false
+ '[' false '!=' false ']'
+ printf ' %b %bSupported OS detected%b\n' '[\e[1;32m✓\e[0m]' '\e[1;32m' '\e[0m'
[✓] Supported OS detected
+ checkSelinux
+ local DEFAULT_SELINUX
+ local CURRENT_SELINUX
+ local SELINUX_ENFORCING=0
+ [[ -f /etc/selinux/config ]]
+ echo -e ' [i] SELinux not detected\e[0m'
[i] SELinux not detected
+ [[ 0 -eq 1 ]]
+ [[ 0 -eq 1 ]]
+ [[ false == false ]]
+ welcomeDialogs
+ whiptail --msgbox --backtitle Welcome --title 'Pi-hole automated installer' '\n\nThis installer will transform your device into a network-wide ad blocker!' 20 70
+ whiptail --msgbox --backtitle Plea --title 'Free and open source' '\n\nThe Pi-hole is free, but powered by your donations: https://pi-hole.net/donate/' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ whiptail --msgbox --backtitle 'Initiating network interface' --title 'Static IP Needed' '\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them.' 20 70
+ install -d -m 755 /etc/pihole/
+ get_available_interfaces
++ cut -d@ -f1
++ cut -d: -f1
++ awk '{print $2}'
++ grep -v lo
++ ip --oneline link show up
+ availableInterfaces=eth0
+ chooseInterface
+ interfacesArray=()
+ local interfacesArray
+ local interfaceCount
+ local chooseInterfaceCmd
+ local chooseInterfaceOptions
+ local firstLoop=1
++ wc -l
+ interfaceCount=1
+ [[ 1 -eq 1 ]]
+ PIHOLE_INTERFACE=eth0
+ setDNS
+ local DNSSettingsCorrect
+ DNSChooseOptions=()
+ local DNSServerCount=0
+ OIFS='
'
+ IFS='
'
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Google (ECS)'
+ DNSChooseOptions[DNSServerCount]='Google (ECS)'
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='OpenDNS (ECS, DNSSEC)'
+ DNSChooseOptions[DNSServerCount]='OpenDNS (ECS, DNSSEC)'
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Level3
+ DNSChooseOptions[DNSServerCount]=Level3
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Comodo
+ DNSChooseOptions[DNSServerCount]=Comodo
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=DNS.WATCH
+ DNSChooseOptions[DNSServerCount]=DNS.WATCH
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (filtered, DNSSEC)'
+ DNSChooseOptions[DNSServerCount]='Quad9 (filtered, DNSSEC)'
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (unfiltered, no DNSSEC)'
+ DNSChooseOptions[DNSServerCount]='Quad9 (unfiltered, no DNSSEC)'
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (filtered + ECS)'
+ DNSChooseOptions[DNSServerCount]='Quad9 (filtered + ECS)'
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Cloudflare
+ DNSChooseOptions[DNSServerCount]=Cloudflare
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=Custom
+ (( DNSServerCount=DNSServerCount+1 ))
+ DNSChooseOptions[DNSServerCount]=
+ IFS='
'
++ whiptail --separate-output --menu 'Select Upstream DNS Provider. To use your own, select Custom.' 20 70 7 'Google (ECS)' '' 'OpenDNS (ECS, DNSSEC)' '' Level3 '' Comodo '' DNS.WATCH '' 'Quad9 (filtered, DNSSEC)' '' 'Quad9 (unfiltered, no DNSSEC)' '' 'Quad9 (filtered + ECS)' '' Cloudflare '' Custom ''
+ DNSchoices=Cloudflare
+ [[ Cloudflare == \C\u\s\t\o\m ]]
+ OIFS='
'
+ IFS='
'
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Google (ECS)'
+ [[ Cloudflare == \G\o\o\g\l\e\ \(\E\C\S\) ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='OpenDNS (ECS, DNSSEC)'
+ [[ Cloudflare == \O\p\e\n\D\N\S\ \(\E\C\S\,\ \D\N\S\S\E\C\) ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Level3
+ [[ Cloudflare == \L\e\v\e\l\3 ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Comodo
+ [[ Cloudflare == \C\o\m\o\d\o ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=DNS.WATCH
+ [[ Cloudflare == \D\N\S\.\W\A\T\C\H ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (filtered, DNSSEC)'
+ [[ Cloudflare == \Q\u\a\d\9\ \(\f\i\l\t\e\r\e\d\,\ \D\N\S\S\E\C\) ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (unfiltered, no DNSSEC)'
+ [[ Cloudflare == \Q\u\a\d\9\ \(\u\n\f\i\l\t\e\r\e\d\,\ \n\o\ \D\N\S\S\E\C\) ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName='Quad9 (filtered + ECS)'
+ [[ Cloudflare == \Q\u\a\d\9\ \(\f\i\l\t\e\r\e\d\ \+\ \E\C\S\) ]]
+ for DNSServer in ${DNS_SERVERS}
++ cut '-d;' -f1
+ DNSName=Cloudflare
+ [[ Cloudflare == \C\l\o\u\d\f\l\a\r\e ]]
++ cut '-d;' -f2
+ PIHOLE_DNS_1=1.1.1.1
++ cut '-d;' -f3
+ PIHOLE_DNS_2=1.0.0.1
+ break
+ IFS='
'
+ local DNSIP=1.1.1.1
+ [[ -z 1.0.0.1 ]]
+ DNSIP+=', 1.0.0.1'
+ printf ' %b Using upstream DNS: %s (%s)\n' '[i]' Cloudflare '1.1.1.1, 1.0.0.1'
[i] Using upstream DNS: Cloudflare (1.1.1.1, 1.0.0.1)
+ chooseBlocklists
+ [[ -f /etc/pihole/adlists.list ]]
+ cmd=(whiptail --separate-output --checklist "Pi-hole relies on third party lists in order to block ads.\\n\\nYou can use the suggestions below, and/or add your own after installation\\n\\nTo deselect any list, use the arrow keys and spacebar" "${r}" "${c}" 5)
+ options=(StevenBlack "StevenBlack's Unified Hosts List" on MalwareDom "MalwareDomains" on)
++ whiptail --separate-output --checklist 'Pi-hole relies on third party lists in order to block ads.\n\nYou can use the suggestions below, and/or add your own after installation\n\nTo deselect any list, use the arrow keys and spacebar' 20 70 5 StevenBlack 'StevenBlack'\''s Unified Hosts List' on MalwareDom MalwareDomains on
+ choices='StevenBlack
MalwareDom'
+ for choice in ${choices}
+ appendToListsFile StevenBlack
+ case $1 in
+ echo https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
+ for choice in ${choices}
+ appendToListsFile MalwareDom
+ case $1 in
+ echo https://mirror1.malwaredomains.com/files/justdomains
+ touch /etc/pihole/adlists.list
+ chmod 644 /etc/pihole/adlists.list
+ use4andor6
+ local useIPv4
+ local useIPv6
+ cmd=(whiptail --separate-output --checklist "Select Protocols (press space to toggle selection)" "${r}" "${c}" 2)
+ options=(IPv4 "Block ads over IPv4" on IPv6 "Block ads over IPv6" on)
++ whiptail --separate-output --checklist 'Select Protocols (press space to toggle selection)' 20 70 2 IPv4 'Block ads over IPv4' on IPv6 'Block ads over IPv6' on
+ choices='IPv4
IPv6'
+ for choice in ${choices}
+ case ${choice} in
+ useIPv4=true
+ for choice in ${choices}
+ case ${choice} in
+ useIPv6=true
+ [[ -n true ]]
+ find_IPv4_information
+ local route
+ local IPv4bare
++ ip route get 8.8.8.8
+ route='8.8.8.8 via 10.0.1.254 dev eth0 src 10.0.1.253 uid 0
cache '
++ printf 10.0.1.253 uid 0 cache
+ printf -v IPv4bare 10.0.1.253
++ printf 10.0.1.254 dev eth0 src 10.0.1.253 uid 0 cache
+ printf -v IPv4gw 10.0.1.254
+ valid_ip 10.0.1.253
+ local ip=10.0.1.253
+ local stat=1
+ local 'ipv4elem=(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)'
+ local 'portelem=(#([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6]))?'
+ local 'regex=^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(#([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6]))?$'
+ [[ 10.0.1.253 =~ ^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)(#([1-9]|[1-8][0-9]|9[0-9]|[1-8][0-9]{2}|9[0-8][0-9]|99[0-9]|[1-8][0-9]{3}|9[0-8][0-9]{2}|99[0-8][0-9]|999[0-9]|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-6]))?$ ]]
+ stat=0
+ return 0
++ awk 'END {print}'
++ awk '{print $4}'
++ grep 10.0.1.253/
++ ip -oneline -family inet address show
+ IPV4_ADDRESS=10.0.1.253/24
+ getStaticIPv4Settings
+ local ipSettingsCorrect
+ 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: 10.0.1.253/24
Gateway: 10.0.1.254' 20 70
+ 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.
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.
It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address.' 20 70
+ setStaticIPv4
+ local IFCFG_FILE
+ local CONNECTION_NAME
+ [[ -r /etc/sysconfig/network/ifcfg-eth0 ]]
+ [[ -f /etc/dhcpcd.conf ]]
+ setDHCPCD
+ grep -q 10.0.1.253/24 /etc/dhcpcd.conf
+ setStaticIPv4
+ local IFCFG_FILE
+ local CONNECTION_NAME
+ [[ -r /etc/sysconfig/network/ifcfg-eth0 ]]
+ [[ -f /etc/dhcpcd.conf ]]
+ setDHCPCD
+ grep -q 10.0.1.253/24 /etc/dhcpcd.conf
+ tee -a /etc/dhcpcd.conf
+ echo 'interface eth0
static ip_address=10.0.1.253/24
static routers=10.0.1.254
static domain_name_servers=1.1.1.1 1.0.0.1'
+ ip addr replace dev eth0 10.0.1.253/24
+ printf ' %b Set IP address to %s\n' '[\e[1;32m✓\e[0m]' 10.0.1.253
[✓] Set IP address to 10.0.1.253
+ printf ' %b You may need to restart after the install is complete\n' '[i]'
[i] You may need to restart after the install is complete
+ return 0
+ [[ -n true ]]
+ useIPv6dialog
+ IPV6_ADDRESSES=($(ip -6 address | grep 'scope global' | awk '{print $2}'))
++ awk '{print $2}'
++ grep 'scope global'
++ ip -6 address
+ [[ ! -z '' ]]
+ [[ ! -z '' ]]
+ printf ' %b Unable to find IPv6 ULA/GUA address, IPv6 adblocking will not be enabled\n' '[i]'
[i] Unable to find IPv6 ULA/GUA address, IPv6 adblocking will not be enabled
+ IPV6_ADDRESS=
+ [[ ! -z '' ]]
+ printf ' %b IPv4 address: %s\n' '[i]' 10.0.1.253/24
[i] IPv4 address: 10.0.1.253/24
+ printf ' %b IPv6 address: %s\n' '[i]' ''
[i] IPv6 address:
+ [[ ! -n true ]]
+ setAdminFlag
+ local WebToggleCommand
+ local WebChooseOptions
+ local WebChoices
+ WebToggleCommand=(whiptail --separate-output --radiolist "Do you wish to install the web admin interface?" "${r}" "${c}" 6)
+ WebChooseOptions=("On (Recommended)" "" on Off "" off)
++ whiptail --separate-output --radiolist 'Do you wish to install the web admin interface?' 20 70 6 'On (Recommended)' '' on Off '' off
+ WebChoices='On (Recommended)'
+ case ${WebChoices} in
+ printf ' %b Web Interface On\n' '[i]'
[i] Web Interface On
+ INSTALL_WEB_INTERFACE=true
+ [[ true == true ]]
+ local i php_modules
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ lighttpd == \p\h\p* ]]
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-common == \p\h\p* ]]
+ [[ php-common != *\-\c\o\m\m\o\n ]]
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-cgi == \p\h\p* ]]
+ [[ php-cgi != *\-\c\o\m\m\o\n ]]
+ [[ php-cgi != *\-\c\g\i ]]
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-sqlite3 == \p\h\p* ]]
+ [[ php-sqlite3 != *\-\c\o\m\m\o\n ]]
+ [[ php-sqlite3 != *\-\c\g\i ]]
+ php_modules+=' sqlite3'
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-xml == \p\h\p* ]]
+ [[ php-xml != *\-\c\o\m\m\o\n ]]
+ [[ php-xml != *\-\c\g\i ]]
+ php_modules+=' xml'
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-json == \p\h\p* ]]
+ [[ php-json != *\-\c\o\m\m\o\n ]]
+ [[ php-json != *\-\c\g\i ]]
+ php_modules+=' json'
+ for i in "${PIHOLE_WEB_DEPS[@]}"
+ [[ php-intl == \p\h\p* ]]
+ [[ php-intl != *\-\c\o\m\m\o\n ]]
+ [[ php-intl != *\-\c\g\i ]]
+ php_modules+=' intl'
+ WebToggleCommand=(whiptail --separate-output --radiolist "Do you wish to install the web server (lighttpd) and required PHP modules?\\n\\nNB: If you disable this, and, do not have an existing web server and required PHP modules (${php_modules# }) installed, the web interface will not function. Additionally the web server user needs to be member of the \"pihole\" group for full functionality." "${r}" "${c}" 6)
+ WebChooseOptions=("On (Recommended)" "" on Off "" off)
++ whiptail --separate-output --radiolist 'Do you wish to install the web server (lighttpd) and required PHP modules?\n\nNB: If you disable this, and, do not have an existing web server and required PHP modules (sqlite3 xml json intl) installed, the web interface will not function. Additionally the web server user needs to be member of the "pihole" group for full functionality.' 20 70 6 'On (Recommended)' '' on Off '' off
+ WebChoices='On (Recommended)'
+ case ${WebChoices} in
+ printf ' %b Web Server On\n' '[i]'
[i] Web Server On
+ INSTALL_WEB_SERVER=true
+ setLogging
+ local LogToggleCommand
+ local LogChooseOptions
+ local LogChoices
+ LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?" "${r}" "${c}" 6)
+ LogChooseOptions=("On (Recommended)" "" on Off "" off)
++ whiptail --separate-output --radiolist 'Do you want to log queries?' 20 70 6 'On (Recommended)' '' on Off '' off
+ LogChoices='On (Recommended)'
+ case ${LogChoices} in
+ printf ' %b Logging On.\n' '[i]'
[i] Logging On.
+ QUERY_LOGGING=true
+ setPrivacyLevel
+ local LevelCommand
+ local LevelOptions
+ LevelCommand=(whiptail --separate-output --radiolist "Select a privacy mode for FTL. https://docs.pi-hole.net/ftldns/privacylevels/" "${r}" "${c}" 6)
+ LevelOptions=("0" "Show everything" on "1" "Hide domains" off "2" "Hide domains and clients" off "3" "Anonymous mode" off)
++ whiptail --separate-output --radiolist 'Select a privacy mode for FTL. https://docs.pi-hole.net/ftldns/privacylevels/' 20 70 6 0 'Show everything' on 1 'Hide domains' off 2 'Hide domains and clients' off 3 'Anonymous mode' off
+ PRIVACY_LEVEL=0
+ printf ' %b Privacy level %d' '[i]' 0
[i] Privacy level 0+ clone_or_update_repos
+ [[ false == true ]]
+ getGitFiles /etc/.pihole https://github.com/pi-hole/pi-hole.git
+ local directory=/etc/.pihole
+ local remoteRepo=https://github.com/pi-hole/pi-hole.git
+ local 'str=Check for existing repository in /etc/.pihole'
+ printf ' %b %s...' '[i]' 'Check for existing repository in /etc/.pihole'
[i] Check for existing repository in /etc/.pihole...+ is_repo /etc/.pihole
+ local directory=/etc/.pihole
+ local rc
+ [[ -d /etc/.pihole ]]
+ rc=1
+ popd
+ return 1
+ printf '%b %b %s\n' '\r\033[K' '[\e[1;31m✗\e[0m]' 'Check for existing repository in /etc/.pihole'
[✗] Check for existing repository in /etc/.pihole
+ make_repo /etc/.pihole https://github.com/pi-hole/pi-hole.git
+ local directory=/etc/.pihole
+ local remoteRepo=https://github.com/pi-hole/pi-hole.git
+ str='Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole'
+ printf ' %b %s...' '[i]' 'Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole'
[i] Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole...+ [[ -d /etc/.pihole ]]
+ git clone -q --depth 20 https://github.com/pi-hole/pi-hole.git /etc/.pihole
+ pushd /etc/.pihole
++ git rev-parse --abbrev-ref HEAD
+ curBranch=master
+ [[ master == \m\a\s\t\e\r ]]
++ git describe --abbrev=0 --tags
+ git reset --hard v5.2.1
HEAD is now at 0d8ece1 Merge pull request #3889 from pi-hole/release/v5.2.1
+ printf '%b %b %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' 'Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole'
[✓] Clone https://github.com/pi-hole/pi-hole.git into /etc/.pihole
+ chmod -R a+rX /etc/.pihole
+ popd
+ return 0
+ echo ''
+ return 0
+ [[ true == true ]]
+ getGitFiles /var/www/html/admin https://github.com/pi-hole/AdminLTE.git
+ local directory=/var/www/html/admin
+ local remoteRepo=https://github.com/pi-hole/AdminLTE.git
+ local 'str=Check for existing repository in /var/www/html/admin'
+ printf ' %b %s...' '[i]' 'Check for existing repository in /var/www/html/admin'
[i] Check for existing repository in /var/www/html/admin...+ is_repo /var/www/html/admin
+ local directory=/var/www/html/admin
+ local rc
+ [[ -d /var/www/html/admin ]]
+ rc=1
+ popd
+ return 1
+ printf '%b %b %s\n' '\r\033[K' '[\e[1;31m✗\e[0m]' 'Check for existing repository in /var/www/html/admin'
[✗] Check for existing repository in /var/www/html/admin
+ make_repo /var/www/html/admin https://github.com/pi-hole/AdminLTE.git
+ local directory=/var/www/html/admin
+ local remoteRepo=https://github.com/pi-hole/AdminLTE.git
+ str='Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin'
+ printf ' %b %s...' '[i]' 'Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin'
[i] Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin...+ [[ -d /var/www/html/admin ]]
+ git clone -q --depth 20 https://github.com/pi-hole/AdminLTE.git /var/www/html/admin
+ pushd /var/www/html/admin
++ git rev-parse --abbrev-ref HEAD
+ curBranch=master
+ [[ master == \m\a\s\t\e\r ]]
++ git describe --abbrev=0 --tags
+ git reset --hard v5.2.1
HEAD is now at 8ac95be Merge pull request #1647 from pi-hole/release/v5.2.1
+ printf '%b %b %s\n' '\r\033[K' '[\e[1;32m✓\e[0m]' 'Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin'
[✓] Clone https://github.com/pi-hole/AdminLTE.git into /var/www/html/admin
+ chmod -R a+rX /var/www/html/admin
+ popd
+ return 0
+ echo ''