@ -21,8 +21,8 @@
# instead of continuing the installation with something broken
set -e
# Set PATH to a usual default to as sure that all basic commands are available.
# When using "su" an u ncomplete PATH could be passed: https://github.com/pi-hole/pi-hole/issues/3209
# Append common folders to the PATH to en sure that all basic commands are available.
# When using "su" an i ncomplete PATH could be passed: https://github.com/pi-hole/pi-hole/issues/3209
export PATH += ':/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
######## VARIABLES #########
@ -59,12 +59,17 @@ coltable=/opt/pihole/COL_TABLE
# Root of the web server
webroot = "/var/www/html"
# We store several other directories and
# We clone (or update) two git repositories during the install. This helps to make sure that we always have the latest versions of the relevant files.
# AdminLTE is used to set up the Web admin interface.
# Pi-hole contains various setup scripts and files which are critical to the installation.
# Search for "PI_HOLE_LOCAL_REPO" in this file to see all such scripts.
# Two notable scripts are gravity.sh (used to generate the HOSTS file) and advanced/Scripts/webpage.sh (used to install the Web admin interface)
webInterfaceGitUrl = "https://github.com/pi-hole/AdminLTE.git"
webInterfaceDir = " ${ webroot } /admin "
piholeGitUrl = "https://github.com/pi-hole/pi-hole.git"
PI_HOLE_LOCAL_REPO = "/etc/.pihole"
# These are the names of pi-holes files, stored in an array
# List of pihole script s, stored in an array
PI_HOLE_FILES = ( chronometer list piholeDebug piholeLogFlush setupLCD update version gravity uninstall webpage)
# This directory is where the Pi-hole scripts will be installed
PI_HOLE_INSTALL_DIR = "/opt/pihole"
@ -76,11 +81,10 @@ if [ -z "$useUpdateVars" ]; then
fi
adlistFile = "/etc/pihole/adlists.list"
# Pi-hole needs an IP address; to begin, these variables are empty since we don't know what the IP is until
# this script can run
# Pi-hole needs an IP address; to begin, these variables are empty since we don't know what the IP is until this script can run
IPV4_ADDRESS = ${ IPV4_ADDRESS }
IPV6_ADDRESS = ${ IPV6_ADDRESS }
# By default, query logging is enabled and the dashboard is set to be installed
# Give settings their default values. These may be changed by prompts later in the script.
QUERY_LOGGING = true
INSTALL_WEB_INTERFACE = true
PRIVACY_LEVEL = 0
@ -98,9 +102,8 @@ if [ -t 0 ] ; then
else
screen_size = "24 80"
fi
# Set rows variable to contain first number
# Determine terminal rows and columns by parsing screen_size
printf -v rows '%d' " ${ screen_size %% * } "
# Set columns variable to contain second number
printf -v columns '%d' " ${ screen_size ##* } "
# Divide by two so the dialogs take up half of the screen, which looks nice.
@ -171,9 +174,8 @@ show_ascii_berry() {
}
is_command( ) {
# Checks for existence of string passed in as only function argument.
# Exit value of 0 when exists, 1 if not exists. Value is the result
# of the `command` shell built-in call.
# Checks to see if the given command (passed as a string argument) exists on the system.
# The function returns 0 (success) if the command exists, and 1 if it doesn't.
local check_command = " $1 "
command -v " ${ check_command } " >/dev/null 2>& 1
@ -190,15 +192,15 @@ os_check() {
detected_version = $( grep VERSION_ID /etc/os-release | cut -d '=' -f2 | tr -d '"' )
cmdResult = " $( dig +short -t txt ${ remote_os_domain } @ns1.pi-hole.net 2>& 1; echo $? ) "
# Get the return code of the previous command (last line)
# Gets the return code of the previous command (last line)
digReturnCode = " ${ cmdResult ##* $'\n' } "
if [ ! " ${ digReturnCode } " = = "0" ] ; then
valid_response = false
else
# Dig returned 0 code , so get the actual response, and loop through it to determine if the detected variables above are valid
# Dig returned 0 (success) , so get the actual response, and loop through it to determine if the detected variables above are valid
response = " ${ cmdResult %% $'\n' * } "
# If the value of ${res ult} is a single 0, then this is the return code, not the response. Response is blank
# If the value of ${res ponse} is a single 0, then this is the return code, not an actual response.
if [ " ${ response } " = = 0 ] ; then
valid_response = false
fi
@ -209,6 +211,7 @@ os_check() {
distro_part = " ${ distro_and_versions %%=* } "
versions_part = " ${ distro_and_versions ##*= } "
# If the distro part is a (case-insensistive) substring of the computer OS
if [ [ " ${ detected_os ^^ } " = ~ ${ distro_part ^^ } ] ] ; then
valid_os = true
IFS = "," read -r -a supportedVer <<< " ${ versions_part } "
@ -281,9 +284,9 @@ if is_command apt-get ; then
PKG_MANAGER = "apt-get"
# A variable to store the command used to update the package cache
UPDATE_PKG_CACHE = " ${ PKG_MANAGER } update "
# An array for something...
# The command we will use to actually install packages
PKG_INSTALL = ( " ${ PKG_MANAGER } " -qq --no-install-recommends install)
# grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE
# grep -c will return 1 if there are no matches. This is an acceptable condition, so we OR TRUE to prevent set -e exiting the script.
PKG_COUNT = " ${ PKG_MANAGER } -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true "
# Some distros vary slightly so these fixes for dependencies may apply
# on Ubuntu 18.04.1 LTS we need to add the universe repository to gain access to dhcpcd5
@ -291,7 +294,7 @@ if is_command apt-get ; then
if awk 'BEGIN{a=1;b=0}/bionic main/{a=0}/bionic.*universe/{b=1}END{exit a + b}' ${ APT_SOURCES } ; then
if ! whiptail --defaultno --title "Dependencies Require Update to Allowed Repositories" --yesno "Would you like to enable 'universe' repository?\\n\\nThis repository is required by the following packages:\\n\\n- dhcpcd5" " ${ r } " " ${ c } " ; then
printf " %b Aborting installation: Dependencies could not be installed.\\n" " ${ CROSS } "
exit 1 # exit the installer
exit 1
else
printf " %b Enabling universe package repository for Ubuntu Bionic\\n" " ${ INFO } "
cp -p ${ APT_SOURCES } ${ APT_SOURCES } .backup # Backup current repo list
@ -323,7 +326,8 @@ if is_command apt-get ; then
phpInsNewer = true
fi
fi
# Check if installed php is v 7.0, or newer to determine packages to install
# Several other packages depend on the version of PHP. If PHP is not installed, or an insufficient version,
# those packages should fall back to the default (latest?)
if [ [ " $phpInsNewer " != true ] ] ; then
# Prefer the php metapackage if it's there
if apt-cache show php > /dev/null 2>& 1; then
@ -337,7 +341,8 @@ if is_command apt-get ; then
exit 1
fi
else
# Newer php is installed, its common, cgi & sqlite counterparts are deps
# Else, PHP is already installed at a version beyond v7.0, so the additional packages
# should match version with the current PHP version.
phpVer = " php $phpInsMajor . $phpInsMinor "
fi
# We also need the correct version for `php-sqlite` (which differs across distros)
@ -349,13 +354,12 @@ if is_command apt-get ; then
printf " %b Aborting installation: No SQLite PHP module was found in APT repository.\\n" " ${ CROSS } "
exit 1
fi
# Since our install script is so large, we need several other programs to successfully get a machine provisioned
# These programs are stored in an array so they can be looped through later
# Packages required to run this install script (stored as an array)
INSTALLER_DEPS = ( dhcpcd5 git " ${ iproute_pkg } " whiptail dnsutils)
# P i-hole itself has several dependencies that also need to be installed
# P ackages required to run Pi-hole (stored as an array)
PIHOLE_DEPS = ( cron curl iputils-ping lsof netcat psmisc sudo unzip wget idn2 sqlite3 libcap2-bin dns-root-data libcap2)
# The Web dashboard has some that also need to be installed
# It's useful to separate th e two since our repos are also setup as "Core" code and "Web" code
# Packages required for the Web admin interface (stored as an array)
# It's useful to separate th is from Pi-hole, since the two repos are also setup separately
PIHOLE_WEB_DEPS = ( lighttpd " ${ phpVer } -common " " ${ phpVer } -cgi " " ${ phpVer } - ${ phpSqlite } " " ${ phpVer } -xml " " ${ phpVer } -json " " ${ phpVer } -intl " )
# The Web server user,
LIGHTTPD_USER = "www-data"
@ -364,20 +368,19 @@ if is_command apt-get ; then
# and config file
LIGHTTPD_CFG = "lighttpd.conf.debian"
# A function to check.. .
# This function waits for dpkg to unlock, which signals that the previous apt-get command has finished .
test_dpkg_lock( ) {
# An iterator used for counting loop iterations
i = 0
# fuser is a program to show which processes use the named files, sockets, or filesystems
# So while the command is true
while fuser /var/lib/dpkg/lock >/dev/null 2>& 1 ; do
# Wait half a second
# So while the lock is held,
while fuser /var/lib/dpkg/lock >/dev/null 2>& 1
do
# we wait half a second,
sleep 0.5
# and increase the iterator
# increase the iterator,
( ( i = i+1) )
done
# Always return success, since we only return if there is no
# lock (anymore)
# and then report success once dpkg is unlocked.
return 0
}
@ -390,6 +393,7 @@ elif is_command rpm ; then
PKG_MANAGER = "yum"
fi
# These variable names match the ones in the Debian family. See above for an explanation of what they are for.
PKG_INSTALL = ( " ${ PKG_MANAGER } " install -y)
PKG_COUNT = " ${ PKG_MANAGER } check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l "
INSTALLER_DEPS = ( git iproute newt procps-ng which chkconfig bind-utils)
@ -476,7 +480,7 @@ elif is_command rpm ; then
# Warn user of unsupported version of Fedora or CentOS
if ! whiptail --defaultno --title "Unsupported RPM based distribution" --yesno "Would you like to continue installation on an unsupported RPM based distribution?\\n\\nPlease ensure the following packages have been installed manually:\\n\\n- lighttpd\\n- lighttpd-fastcgi\\n- PHP version 7+" " ${ r } " " ${ c } " ; then
printf " %b Aborting installation due to unsupported RPM based distribution\\n" " ${ CROSS } "
exit # exit the installer
exit
else
printf " %b Continuing installation with unsupported RPM based distribution\\n" " ${ INFO } "
fi
@ -540,8 +544,9 @@ make_repo() {
# Check current branch. If it is master, then reset to the latest available tag.
# In case extra commits have been added after tagging/release (i.e in case of metadata updates/README.MD tweaks)
curBranch = $( git rev-parse --abbrev-ref HEAD)
if [ [ " ${ curBranch } " = = "master" ] ] ; then #If we're calling make_repo() then it should always be master, we may not need to check.
git reset --hard " $( git describe --abbrev= 0 --tags) " || return $?
if [ [ " ${ curBranch } " = = "master" ] ] ; then
# If we're calling make_repo() then it should always be master, we may not need to check.
git reset --hard " $( git describe --abbrev= 0 --tags) " || return $?
fi
# Show a colored message showing it's status
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
@ -589,7 +594,7 @@ update_repo() {
return 0
}
# A function that combines the functions previously made
# A function that combines the previous git functions to update or clone a repo
getGitFiles( ) {
# Setup named variables for the git repos
# We need the directory
@ -613,9 +618,8 @@ getGitFiles() {
# Attempt to make the repository, showing an error on failure
make_repo " ${ directory } " " ${ remoteRepo } " || { printf "\\n %bError: Could not update local repository. Contact support.%b\\n" " ${ COL_LIGHT_RED } " " ${ COL_NC } " ; exit 1; }
fi
# echo a blank line
echo ""
# and return success?
# Success via one of the two branches, as the commands would exit if they failed.
return 0
}
@ -637,7 +641,7 @@ resetRepo() {
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
# Return to where we came from
popd & > /dev/null || return 1
# Returning success anyway?
# Function succeeded, as "git reset" would have triggered a return earlier if it failed
return 0
}
@ -689,7 +693,7 @@ welcomeDialogs() {
In the next section, you can choose to use your current network settings ( DHCP) or to manually edit them." " ${ r } " " ${ c } "
}
# A function that let ' s the user pick an interface to use with Pi-hole
# A function that let s the user pick an interface to use with Pi-hole
chooseInterface( ) {
# Turn the available interfaces into an array so it can be used with a whiptail dialog
local interfacesArray = ( )
@ -713,7 +717,7 @@ chooseInterface() {
else
# While reading through the available interfaces
while read -r line; do
# u se a variable to set the option as OFF to begin with
# U se a variable to set the option as OFF to begin with
mode = "OFF"
# If it's the first loop,
if [ [ " ${ firstLoop } " -eq 1 ] ] ; then
@ -747,9 +751,9 @@ chooseInterface() {
testIPv6( ) {
# first will contain fda2 (ULA)
printf -v first "%s" " ${ 1 %% : * } "
# value1 will contain 253 which is the decimal value corresponding to 0x fd
# value1 will contain 253 which is the decimal value corresponding to 0x FD
value1 = $(( ( 0 x$first ) / 256 ))
# will contain 162 which is the decimal value corresponding to 0xa 2
# value2 will contain 162 which is the decimal value corresponding to 0xA 2
value2 = $(( ( 0 x$first ) % 256 ))
# the ULA test is testing for fc00::/7 according to RFC 4193
if ( ( ( value1& 254) = = 252 ) ) ; then
@ -779,8 +783,9 @@ useIPv6dialog() {
result = $( testIPv6 " $i " )
# If it's a ULA address, use it and store it as a global variable
[ [ " ${ result } " = = "ULA" ] ] && ULA_ADDRESS = " ${ i %/* } "
# If it's a GUA address, we can still use it si store it as a global variable
# If it's a GUA address, use it and store it as a global variable
[ [ " ${ result } " = = "GUA" ] ] && GUA_ADDRESS = " ${ i %/* } "
# Else if it's a Link-local address, we cannot use it, so just continue
done
# Determine which address to be used: Prefer ULA over GUA or don't use any if none found
@ -858,7 +863,6 @@ use4andor6() {
fi
}
#
getStaticIPv4Settings( ) {
# Local, named variables
local ipSettingsCorrect
@ -905,9 +909,9 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
fi
}
# c onfigure networking via dhcpcd
# C onfigure networking via dhcpcd
setDHCPCD( ) {
# c heck if the IP is already in the file
# C heck if the IP is already in the file
if grep -q " ${ IPV4_ADDRESS } " /etc/dhcpcd.conf; then
printf " %b Static IP already configured\\n" " ${ INFO } "
# If it's not,
@ -925,8 +929,8 @@ setDHCPCD() {
fi
}
# c onfigure networking ifcfg-xxxx file found at /etc/sysconfig/network-scripts/
# t his function requires the full path of an ifcfg file passed as an argument
# C onfigure networking ifcfg-xxxx file found at /etc/sysconfig/network-scripts/
# T his function requires the full path of an ifcfg file passed as an argument
setIFCFG( ) {
# Local, named variables
local IFCFG_FILE
@ -934,12 +938,11 @@ setIFCFG() {
local CIDR
IFCFG_FILE = $1
printf -v IPADDR "%s" " ${ IPV4_ADDRESS %%/* } "
# c heck if the desired IP is already set
# C heck if the desired IP is already set
if grep -Eq " ${ IPADDR } (\\b|\\/) " " ${ IFCFG_FILE } " ; then
printf " %b Static IP already configured\\n" " ${ INFO } "
# Otherwise,
else
# P ut the IP in variables without the CIDR notation
# Otherwise, p ut the IP in variables without the CIDR notation
printf -v CIDR "%s" " ${ IPV4_ADDRESS ##*/ } "
# Backup existing interface configuration:
cp -p " ${ IFCFG_FILE } " " ${ IFCFG_FILE } " .pihole.orig
@ -981,24 +984,23 @@ setStaticIPv4() {
return 0
fi
fi
# For the Debian family, if dhcpcd.conf exists ,
# For the Debian family, if dhcpcd.conf exists then we can just configure using DHCPD.
if [ [ -f "/etc/dhcpcd.conf" ] ] ; then
# configure networking via dhcpcd
setDHCPCD
return 0
fi
# If a DHCPCD config file was not found, check for an ifcfg config file based on interface name
# If a DHCPCD config file was not found, check for an ifcfg config file based on the interface name
if [ [ -f " /etc/sysconfig/network-scripts/ifcfg- ${ PIHOLE_INTERFACE } " ] ] ; then
# If it exists,
# If it exists, then we can configure using IFCFG
IFCFG_FILE = /etc/sysconfig/network-scripts/ifcfg-${ PIHOLE_INTERFACE }
setIFCFG " ${ IFCFG_FILE } "
return 0
fi
# if an ifcfg config does not exists for the interface name, try the connection name via network manager
# If an ifcfg config does not exists for the interface name, search for one based on the connection name via network manager
if is_command nmcli && nmcli general status & > /dev/null; then
CONNECTION_NAME = $( nmcli dev show " ${ PIHOLE_INTERFACE } " | grep 'GENERAL.CONNECTION' | cut -d: -f2 | sed 's/^System//' | xargs | tr ' ' '_' )
if [ [ -f " /etc/sysconfig/network-scripts/ifcfg- ${ CONNECTION_NAME } " ] ] ; then
# If it exists,
# If it exists, then we can configure using IFCFG
IFCFG_FILE = /etc/sysconfig/network-scripts/ifcfg-${ CONNECTION_NAME }
setIFCFG " ${ IFCFG_FILE } "
return 0
@ -1015,17 +1017,17 @@ valid_ip() {
local ip = ${ 1 }
local stat = 1
# One IPv4 element is 8bit: 0 - 256
# Regex matching one IPv4 component, i.e. an integer from 0 to 255.
local ipv4elem = "(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)" ;
# optional port number starting '#' with range of 1- 65536
# Regex matching an optional port beginning with # matching optional port number starting '#' with range of 1 to 65536
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]))?"
# build a full regex string from the above part s
# Build a full IPv4 regex from the above subexpression s
local regex = " ^ ${ ipv4elem } \. ${ ipv4elem } \. ${ ipv4elem } \. ${ ipv4elem } ${ portelem } $"
# Evaluate the regex, and return the result
[ [ $ip = ~ ${ regex } ] ]
stat = $?
# Return the exit code
return " ${ stat } "
}
@ -1033,19 +1035,19 @@ valid_ip6() {
local ip = ${ 1 }
local stat = 1
# One IPv6 element is 16bit: 0000 - FFFF
# Regex matching one IPv6 element, i.e. a hex value from 0000 to FFFF
local ipv6elem = "[0-9a-fA-F]{1,4}"
# CIDR for IPv6 is 1- 128 bit
# Regex matching an IPv6 CIDR, i.e. 1 to 128
local v6cidr = "(\\/([1-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8])){0,1}"
# optional port number starting '#' with range of 1-65536
# Regex matching an optional port beginning with # matching optional port number starting '#' with range of 1-65536
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]))?"
# build a full regex string from the above part s
# Build a full IPv6 regex from the above subexpression s
local regex = " ^((( ${ ipv6elem } ))*((: ${ ipv6elem } ))*::(( ${ ipv6elem } ))*((: ${ ipv6elem } ))*|(( ${ ipv6elem } ))((: ${ ipv6elem } )){7}) ${ v6cidr } ${ portelem } $"
# Evaluate the regex, and return the result
[ [ ${ ip } = ~ ${ regex } ] ]
stat = $?
# Return the exit code
return " ${ stat } "
}
@ -1057,7 +1059,7 @@ setDNS() {
# In an array, list the available upstream providers
DNSChooseOptions = ( )
local DNSServerCount = 0
# Save the old Internal Field Separator in a variable
# Save the old Internal Field Separator in a variable ,
OIFS = $IFS
# and set the new one to newline
IFS = $'\n'
@ -1078,23 +1080,22 @@ setDNS() {
# In a whiptail dialog, show the options
DNSchoices = $( whiptail --separate-output --menu "Select Upstream DNS Provider. To use your own, select Custom." " ${ r } " " ${ c } " 7 \
" ${ DNSChooseOptions [@] } " 2>& 1 >/dev/tty) || \
# exit if Cancel is selected
# Exit if the user selects "Cancel"
{ printf " %bCancel was selected, exiting installer%b\\n" " ${ COL_LIGHT_RED } " " ${ COL_NC } " ; exit 1; }
# Depending on the user's choice, set the GLOBA l variables to the IP of the respective provider
# Depending on the user's choice, set the GLOBA L variables to the IP of the respective provider
if [ [ " ${ DNSchoices } " = = "Custom" ] ]
then
# Until the DNS settings are selected,
# Loop until we have a valid DNS setting
until [ [ " ${ DNSSettingsCorrect } " = True ] ] ; do
#
# Signal value, to be used if the user inputs an invalid IP address
strInvalid = "Invalid"
# If the first
if [ [ ! " ${ PIHOLE_DNS_1 } " ] ] ; then
# and second upstream servers do not exist
if [ [ ! " ${ PIHOLE_DNS_2 } " ] ] ; then
# If the first and second upstream servers do not exist, do not prepopulate an IP address
prePopulate = ""
# Otherwise,
else
# Otherwise, prepopulate the whiptail dialogue with the appropriate DNS value(s)
prePopulate = " , ${ PIHOLE_DNS_2 } "
fi
elif [ [ " ${ PIHOLE_DNS_1 } " ] ] && [ [ ! " ${ PIHOLE_DNS_2 } " ] ] ; then
@ -1103,52 +1104,48 @@ setDNS() {
prePopulate = " ${ PIHOLE_DNS_1 } , ${ PIHOLE_DNS_2 } "
fi
# Dialog for the user to enter custom upstream servers
# Prompt the user to enter custom upstream servers
piholeDNS = $( whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), separated by a comma.\\n\\nFor example '8.8.8.8, 8.8.4.4'" " ${ r } " " ${ c } " " ${ prePopulate } " 3>& 1 1>& 2 2>& 3) || \
{ printf " %bCancel was selected, exiting installer%b\\n" " ${ COL_LIGHT_RED } " " ${ COL_NC } " ; exit 1; }
# Clean user input and replace whitespace with comma.
piholeDNS = $( sed 's/[, \t]\+/,/g' <<< " ${ piholeDNS } " )
# Separate the user input into the two DNS values (separated by a comma)
printf -v PIHOLE_DNS_1 "%s" " ${ piholeDNS %%,* } "
printf -v PIHOLE_DNS_2 "%s" " ${ piholeDNS ##*, } "
# If the IP is valid,
# If the first DNS value is invalid or empty, this if statement will be true and we will set PIHOLE_DNS_1="Invalid"
if ! valid_ip " ${ PIHOLE_DNS_1 } " || [ [ ! " ${ PIHOLE_DNS_1 } " ] ] ; then
# store it in the variable so we can use it
PIHOLE_DNS_1 = ${ strInvalid }
fi
# Do the same for the secondary server
# If the second DNS value is invalid or empty, this if statement will be true and we will set PIHOLE_DNS_2="Invalid"
if ! valid_ip " ${ PIHOLE_DNS_2 } " && [ [ " ${ PIHOLE_DNS_2 } " ] ] ; then
PIHOLE_DNS_2 = ${ strInvalid }
fi
# If either of the DNS servers are invalid,
if [ [ " ${ PIHOLE_DNS_1 } " = = " ${ strInvalid } " ] ] || [ [ " ${ PIHOLE_DNS_2 } " = = " ${ strInvalid } " ] ] ; then
# explain this to the user
# explain this to the user ,
whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" " One or both entered IP addresses were invalid. Please try again.\\n\\n DNS Server 1: $PIHOLE_DNS_1 \\n DNS Server 2: ${ PIHOLE_DNS_2 } " ${ r } ${ c }
# and set the variables back to nothing
# set the variables back to nothing,
if [ [ " ${ PIHOLE_DNS_1 } " = = " ${ strInvalid } " ] ] ; then
PIHOLE_DNS_1 = ""
fi
if [ [ " ${ PIHOLE_DNS_2 } " = = " ${ strInvalid } " ] ] ; then
PIHOLE_DNS_2 = ""
fi
# Since the settings will not work, stay in the loop
# and continue the loop.
DNSSettingsCorrect = False
# Otherwise,
else
# Show the settings
# Otherwise, show the DNS setting to the user, and break the loop if they confirm them.
if ( whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno " Are these settings correct?\\n DNS Server 1: $PIHOLE_DNS_1 \\n DNS Server 2: ${ PIHOLE_DNS_2 } " " ${ r } " " ${ c } " ) ; then
# and break from the loop since the servers are valid
DNSSettingsCorrect = True
# Otherwise,
else
# If the settings are wrong, the loop continues
DNSSettingsCorrect = False
fi
fi
done
else
# Save the old Internal Field Separator in a variable
# Save the old Internal Field Separator in a variable ,
OIFS = $IFS
# and set the new one to newline
IFS = $'\n'
@ -1187,16 +1184,16 @@ setLogging() {
# Get the user's choice
LogChoices = $( " ${ LogToggleCommand [@] } " " ${ LogChooseOptions [@] } " 2>& 1 >/dev/tty) || ( printf " %bCancel was selected, exiting installer%b\\n" " ${ COL_LIGHT_RED } " " ${ COL_NC } " && exit 1)
case ${ LogChoices } in
# If it's on
# If it's on ,
"On (Recommended)" )
printf " %b Logging On.\\n" " ${ INFO } "
# Set the GLOBAL variable to true so we know what they selected
# set the GLOBAL variable setting to true
QUERY_LOGGING = true
; ;
# Otherwise, it's off,
Off)
printf " %b Logging Off.\\n" " ${ INFO } "
# So set it to false
# set the GLOBAL var iable se tting to false
QUERY_LOGGING = false
; ;
esac
@ -1252,7 +1249,7 @@ setAdminFlag() {
; ;
esac
# Request user to install web server, if it has not been deselected before (INSTALL_WEB_SERVER=true is default).
# If the user wants to install the Web admin interface (i.e. it has not been deselected above)
if [ [ " ${ INSTALL_WEB_SERVER } " = = true ] ] ; then
# Get list of required PHP modules, excluding base package (common) and handler (cgi)
local i php_modules
@ -1291,18 +1288,18 @@ chooseBlocklists() {
# In a variable, show the choices available; exit if Cancel is selected
choices = $( " ${ cmd [@] } " " ${ options [@] } " 2>& 1 >/dev/tty) || { printf " %bCancel was selected, exiting installer%b\\n" " ${ COL_LIGHT_RED } " " ${ COL_NC } " ; rm " ${ adlistFile } " ; exit 1; }
# For each choice available,
# Add all selected choices to the lists file
for choice in ${ choices }
do
appendToListsFile " ${ choice } "
done
# Create an empty adList file with appropriate permissions.
touch " ${ adlistFile } "
chmod 644 " ${ adlistFile } "
}
# Accept a string parameter, it must be one of the default lists
# This function allow to not duplicate code in chooseBlocklists and
# in installDefaultBlocklists
# This function saves duplication between chooseBlocklists and installDefaultBlocklists
appendToListsFile( ) {
case $1 in
StevenBlack ) echo "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" >> " ${ adlistFile } " ; ;
@ -1339,16 +1336,15 @@ version_check_dnsmasq() {
grep -q " ${ dnsmasq_pihole_id_string2 } " " ${ dnsmasq_conf } " ; then
printf " it is from a previous Pi-hole install.\\n"
printf " %b Backing up dnsmasq.conf to dnsmasq.conf.orig..." " ${ INFO } "
# so backup the original file
# so backup the original file ,
mv -f " ${ dnsmasq_conf } " " ${ dnsmasq_conf_orig } "
printf "%b %b Backing up dnsmasq.conf to dnsmasq.conf.orig...\\n" " ${ OVER } " " ${ TICK } "
printf " %b Restoring default dnsmasq.conf..." " ${ INFO } "
# and replace it with the default
install -D -m 644 -T " ${ dnsmasq_original_config } " " ${ dnsmasq_conf } "
printf "%b %b Restoring default dnsmasq.conf...\\n" " ${ OVER } " " ${ TICK } "
# Otherwise,
else
# D on't to anything
# Otherwise, d on't to anything
printf " it is not a Pi-hole file, leaving alone!\\n"
fi
else
@ -1368,36 +1364,33 @@ version_check_dnsmasq() {
install -D -m 644 -T " ${ dnsmasq_pihole_01_snippet } " " ${ dnsmasq_pihole_01_location } "
printf "%b %b Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf\\n" " ${ OVER } " " ${ TICK } "
# Replace our placeholder values with the GLOBAL DNS variables that we populated earlier
# First, swap in the interface to listen on
# First, swap in the interface to listen on ,
sed -i " s/@INT@/ $PIHOLE_INTERFACE / " " ${ dnsmasq_pihole_01_location } "
if [ [ " ${ PIHOLE_DNS_1 } " != "" ] ] ; then
# Then swap in the primary DNS server
# then swap in the primary DNS server.
sed -i " s/@DNS1@/ $PIHOLE_DNS_1 / " " ${ dnsmasq_pihole_01_location } "
else
#
# Otherwise, remove the line which sets DNS1.
sed -i '/^server=@DNS1@/d' " ${ dnsmasq_pihole_01_location } "
fi
# Ditto if DNS2 is not empty
if [ [ " ${ PIHOLE_DNS_2 } " != "" ] ] ; then
# Then swap in the primary DNS server
sed -i " s/@DNS2@/ $PIHOLE_DNS_2 / " " ${ dnsmasq_pihole_01_location } "
else
#
sed -i '/^server=@DNS2@/d' " ${ dnsmasq_pihole_01_location } "
fi
# Set the cache size
sed -i " s/@CACHE_SIZE@/ $CACHE_SIZE / " ${ dnsmasq_pihole_01_location }
#
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' " ${ dnsmasq_conf } "
# If the user does not want to enable logging,
if [ [ " ${ QUERY_LOGGING } " = = false ] ] ; then
# D isable it by commenting out the directive in the DNS config file
# d isable it by commenting out the directive in the DNS config file
sed -i 's/^log-queries/#log-queries/' " ${ dnsmasq_pihole_01_location } "
# Otherwise,
else
# enable it by uncommenting the directive in the DNS config file
# Otherwise, enable it by uncommenting the directive in the DNS config file
sed -i 's/^#log-queries/log-queries/' " ${ dnsmasq_pihole_01_location } "
fi
}
@ -1407,14 +1400,13 @@ clean_existing() {
# Local, named variables
# ${1} Directory to clean
local clean_directory = " ${ 1 } "
# Make ${2} the new one?
# Pop the first argument, and shift all addresses down by one (i.e. ${2} becomes ${1})
shift
# ${2} Array of files to remove
# Then, we can access all arguments ($@) without including the directory to clean
local old_files = ( " $@ " )
# For each script found in the old files array
# Remove each script in the old_ files array
for script in " ${ old_files [@] } " ; do
# Remove them
rm -f " ${ clean_directory } / ${ script } .sh "
done
}
@ -1447,9 +1439,8 @@ installScripts() {
install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
# Otherwise,
else
# S how an error and exit
# Otherwise, s how an error and exit
printf "%b %b %s\\n" " ${ OVER } " " ${ CROSS } " " ${ str } "
printf "\\t\\t%bError: Local repo %s not found, exiting installer%b\\n" " ${ COL_LIGHT_RED } " " ${ PI_HOLE_LOCAL_REPO } " " ${ COL_NC } "
return 1
@ -1501,7 +1492,7 @@ installConfigs() {
# Make sure the external.conf file exists, as lighttpd v1.4.50 crashes without it
touch /etc/lighttpd/external.conf
chmod 644 /etc/lighttpd/external.conf
# i f there is a custom block page in the html/pihole directory, replace 404 handler in lighttpd config
# I f there is a custom block page in the html/pihole directory, replace 404 handler in lighttpd config
if [ [ -f " ${ PI_HOLE_BLOCKPAGE_DIR } /custom.php " ] ] ; then
sed -i 's/^\(server\.error-handler-404\s*=\s*\).*$/\1"pihole\/custom\.php"/' /etc/lighttpd/lighttpd.conf
fi
@ -1575,9 +1566,8 @@ restart_service() {
if is_command systemctl ; then
# use that to restart the service
systemctl restart " ${ 1 } " & > /dev/null
# Otherwise,
else
# fall back to the service command
# Otherwise, fall back to the service command
service " ${ 1 } " restart & > /dev/null
fi
printf "%b %b %s...\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
@ -1592,9 +1582,8 @@ enable_service() {
if is_command systemctl ; then
# use that to enable the service
systemctl enable " ${ 1 } " & > /dev/null
# Otherwise,
else
# use update-rc.d to accomplish this
# Otherwise, use update-rc.d to accomplish this
update-rc.d " ${ 1 } " defaults & > /dev/null
fi
printf "%b %b %s...\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
@ -1609,9 +1598,8 @@ disable_service() {
if is_command systemctl ; then
# use that to disable the service
systemctl disable " ${ 1 } " & > /dev/null
# Otherwise,
else
# use update-rc.d to accomplish this
# Otherwise, use update-rc.d to accomplish this
update-rc.d " ${ 1 } " disable & > /dev/null
fi
printf "%b %b %s...\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
@ -1622,9 +1610,8 @@ check_service_active() {
if is_command systemctl ; then
# use that to check the status of the service
systemctl is-enabled " ${ 1 } " & > /dev/null
# Otherwise,
else
# fall back to service command
# Otherwise, fall back to service command
service " ${ 1 } " status & > /dev/null
fi
}
@ -1666,9 +1653,8 @@ update_package_cache() {
# Create a command from the package cache variable
if eval " ${ UPDATE_PKG_CACHE } " & > /dev/null; then
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
# Otherwise,
else
# show an error and exit
# Otherwise, show an error and exit
printf "%b %b %s\\n" " ${ OVER } " " ${ CROSS } " " ${ str } "
printf " %bError: Unable to update package cache. Please try \"%s\"%b" " ${ COL_LIGHT_RED } " " ${ UPDATE_PKG_CACHE } " " ${ COL_NC } "
return 1
@ -1697,19 +1683,18 @@ notify_package_updates_available() {
fi
}
# What's this doing outside of a function in the middle of nowhere?
# This counter is outside of install_dependent_packages so that it can count the number of times the function is called.
counter = 0
install_dependent_packages( ) {
# Local, named variables should be used here, especially for an iterator
# Add one to the counter
counter = $(( counter+1))
# If it equals 1,
if [ [ " ${ counter } " = = 1 ] ] ; then
#
# On the first loop, print a special message
printf " %b Installer Dependency checks...\\n" " ${ INFO } "
else
#
# On all subsequent loops, print a generic message.
printf " %b Main Dependency checks...\\n" " ${ INFO } "
fi
@ -1723,7 +1708,7 @@ install_dependent_packages() {
# NOTE: We may be able to use this installArray in the future to create a list of package that were
# installed by us, and remove only the installed packages, and not the entire list.
if is_command apt-get ; then
# For each package,
# For each package, check if it's already installed (and if so, don't add it to the installArray)
for i in " $@ " ; do
printf " %b Checking for %s..." " ${ INFO } " " ${ i } "
if dpkg-query -W -f= '${Status}' " ${ i } " 2>/dev/null | grep "ok installed" & > /dev/null; then
@ -1733,6 +1718,7 @@ install_dependent_packages() {
installArray += ( " ${ i } " )
fi
done
# If there's anything to install, install everything in the list.
if [ [ " ${# installArray [@] } " -gt 0 ] ] ; then
test_dpkg_lock
printf " %b Processing %s install(s) for: %s, please wait...\\n" " ${ INFO } " " ${ PKG_MANAGER } " " ${ installArray [*] } "
@ -1747,6 +1733,7 @@ install_dependent_packages() {
# Install Fedora/CentOS packages
for i in " $@ " ; do
# For each package, check if it's already installed (and if so, don't add it to the installArray)
printf " %b Checking for %s..." " ${ INFO } " " ${ i } "
if " ${ PKG_MANAGER } " -q list installed " ${ i } " & > /dev/null; then
printf "%b %b Checking for %s\\n" " ${ OVER } " " ${ TICK } " " ${ i } "
@ -1755,6 +1742,7 @@ install_dependent_packages() {
installArray += ( " ${ i } " )
fi
done
# If there's anything to install, install everything in the list.
if [ [ " ${# installArray [@] } " -gt 0 ] ] ; then
printf " %b Processing %s install(s) for: %s, please wait...\\n" " ${ INFO } " " ${ PKG_MANAGER } " " ${ installArray [*] } "
printf '%*s\n' " $columns " '' | tr " " -;
@ -1772,7 +1760,7 @@ installPiholeWeb() {
local str = "Creating directory for blocking page, and copying files"
printf " %b %s..." " ${ INFO } " " ${ str } "
# Install the directory
# Install the directory ,
install -d -m 0755 ${ PI_HOLE_BLOCKPAGE_DIR }
# and the blockpage
install -D -m 644 ${ PI_HOLE_LOCAL_REPO } /advanced/{ index,blockingpage} .* ${ PI_HOLE_BLOCKPAGE_DIR } /
@ -1791,9 +1779,8 @@ installPiholeWeb() {
# back it up
mv ${ webroot } /index.lighttpd.html ${ webroot } /index.lighttpd.orig
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
# Otherwise,
else
# don't do anything
# Otherwise, don't do anything
printf "%b %b %s\\n" " ${ OVER } " " ${ INFO } " " ${ str } "
printf " No default index.lighttpd.html file found... not backing up\\n"
fi
@ -1801,7 +1788,7 @@ installPiholeWeb() {
# Install Sudoers file
local str = "Installing sudoer file"
printf "\\n %b %s..." " ${ INFO } " " ${ str } "
# Make the .d directory if it doesn't exist
# Make the .d directory if it doesn't exist ,
install -d -m 755 /etc/sudoers.d/
# and copy in the pihole sudoers file
install -m 0640 ${ PI_HOLE_LOCAL_REPO } /advanced/Templates/pihole.sudo /etc/sudoers.d/pihole
@ -1845,11 +1832,11 @@ runGravity() {
create_pihole_user( ) {
local str = "Checking for user 'pihole'"
printf " %b %s..." " ${ INFO } " " ${ str } "
# If the user pihole exists,
# If the pihole user exists,
if id -u pihole & > /dev/null; then
# if group exists
# and if the pihole group exists,
if getent group pihole > /dev/null 2>& 1; then
# just show a success
# succeed
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
else
local str = "Checking for group 'pihole'"
@ -1870,14 +1857,14 @@ create_pihole_user() {
printf "%b %b %s\\n" " ${ OVER } " " ${ CROSS } " " ${ str } "
fi
fi
# Otherwise,
else
# If the pihole user doesn't exist,
printf "%b %b %s" " ${ OVER } " " ${ CROSS } " " ${ str } "
local str = "Creating user 'pihole'"
printf "%b %b %s..." " ${ OVER } " " ${ INFO } " " ${ str } "
# create her with the useradd command
# create her with the useradd command ,
if getent group pihole > /dev/null 2>& 1; then
# add primary group pihole as it already exists
# then add her to the pihole group (as it already exists)
if useradd -r --no-user-group -g pihole -s /usr/sbin/nologin pihole; then
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
else
@ -1894,7 +1881,7 @@ create_pihole_user() {
fi
}
#
# This function saves any changes to the setup variables into the setupvars.conf file for future runs
finalExports( ) {
# If the Web interface is not set to be installed,
if [ [ " ${ INSTALL_WEB_INTERFACE } " = = false ] ] ; then
@ -1946,7 +1933,6 @@ finalExports() {
# Install the logrotate script
installLogrotate( ) {
local str = "Installing latest logrotate script"
printf "\\n %b %s..." " ${ INFO } " " ${ str } "
# Copy the file over from the local repo
@ -1958,9 +1944,9 @@ installLogrotate() {
# customize the logrotate script here in order to reflect
# the local properties of the /var/log directory
logusergroup = " $( stat -c '%U %G' /var/log) "
# If the variable has a value ,
# If the re is a usergroup for log rotation ,
if [ [ ! -z " ${ logusergroup } " ] ] ; then
#
# replace the line in the logrotate script with that usergroup.
sed -i " s/# su #/su ${ logusergroup } /g; " /etc/pihole/logrotate
fi
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
@ -2099,15 +2085,15 @@ checkSelinux() {
# Installation complete message with instructions for the user
displayFinalMessage( ) {
# If
# If the number of arguments is > 0,
if [ [ " ${# 1 } " -gt 0 ] ] ; then
# set the password to the first argument.
pwstring = " $1 "
# else, if the dashboard password in the setup variables exists,
elif [ [ $( grep 'WEBPASSWORD' -c /etc/pihole/setupVars.conf) -gt 0 ] ] ; then
# set a variable for evaluation later
# Else if the password exists from previous setup, we'll load it later
pwstring = "unchanged"
else
# set a variable for evaluation later
# Else, inform the user that there is no set password.
pwstring = "NOT SET"
fi
# If the user wants to install the dashboard,
@ -2138,9 +2124,8 @@ update_dialogs() {
opt1a = "Repair"
opt1b = "This will retain existing settings"
strAdd = "You will remain on the same version"
# Otherwise,
else
# set some variables with different values
# Otherwise, set some variables with different values
opt1a = "Update"
opt1b = "This will retain existing settings."
strAdd = "You will be updated to the latest version."
@ -2291,7 +2276,6 @@ clone_or_update_repos() {
# Disable directive for SC2120 a value _can_ be passed to this function, but it is passed from an external script that sources this one
# shellcheck disable=SC2120
FTLinstall( ) {
# Local, named variables
local latesttag
local str = "Downloading and Installing FTL"
@ -2322,9 +2306,8 @@ FTLinstall() {
url = " https://ftl.pi-hole.net/ ${ ftlBranch } "
fi
# If the download worked,
if curl -sSL --fail " ${ url } / ${ binary } " -o " ${ binary } " ; then
# get sha1 of the binary we just downloaded for verification.
# If the download worked, get sha1 of the binary we just downloaded for verification.
curl -sSL --fail " ${ url } / ${ binary } .sha1 " -o " ${ binary } .sha1 "
# If we downloaded binary file (as opposed to text),
@ -2348,16 +2331,15 @@ FTLinstall() {
# Installed the FTL service
printf "%b %b %s\\n" " ${ OVER } " " ${ TICK } " " ${ str } "
return 0
# Otherwise,
else
# the download failed, so just go back to the original directory
# Otherwise, the hash download failed, so print and exit.
popd > /dev/null || { printf "Unable to return to original directory after FTL binary download.\\n" ; return 1; }
printf "%b %b %s\\n" " ${ OVER } " " ${ CROSS } " " ${ str } "
printf " %bError: Download of %s/%s failed (checksum error)%b\\n" " ${ COL_LIGHT_RED } " " ${ url } " " ${ binary } " " ${ COL_NC } "
return 1
fi
# Otherwise,
else
# Otherwise, the download failed, so print and exit.
popd > /dev/null || { printf "Unable to return to original directory after FTL binary download.\\n" ; return 1; }
printf "%b %b %s\\n" " ${ OVER } " " ${ CROSS } " " ${ str } "
# The URL could not be found
@ -2400,18 +2382,14 @@ get_binary_name() {
# If the machine is arm or aarch
if [ [ " ${ machine } " = = "arm" * || " ${ machine } " = = *"aarch" * ] ] ; then
# ARM
#
local rev
rev = $( uname -m | sed "s/[^0-9]//g;" )
#
local lib
lib = $( ldd /bin/ls | grep -E '^\s*/lib' | awk '{ print $1 }' )
#
if [ [ " ${ lib } " = = "/lib/ld-linux-aarch64.so.1" ] ] ; then
printf "%b %b Detected AArch64 (64 Bit ARM) processor\\n" " ${ OVER } " " ${ TICK } "
# set the binary to be used
l_binary = "pihole-FTL-aarch64-linux-gnu"
#
elif [ [ " ${ lib } " = = "/lib/ld-linux-armhf.so.3" ] ] ; then
# Hard-float available: Use gnueabihf binaries
# If ARMv8 or higher is found (e.g., BCM2837 as found in Raspberry Pi Model 3B)
@ -2419,13 +2397,13 @@ get_binary_name() {
printf "%b %b Detected ARMv8 (or newer) processor\\n" " ${ OVER } " " ${ TICK } "
# set the binary to be used
l_binary = "pihole-FTL-armv8-linux-gnueabihf"
# Otherwise, if ARMv7 is found (e.g., BCM2836 as found in Raspberry Pi Model 2)
elif [ [ " ${ rev } " -eq 7 ] ] ; then
# Otherwise, if ARMv7 is found (e.g., BCM2836 as found in Raspberry Pi Model 2)
printf "%b %b Detected ARMv7 processor (with hard-float support)\\n" " ${ OVER } " " ${ TICK } "
# set the binary to be used
l_binary = "pihole-FTL-armv7-linux-gnueabihf"
# Otherwise, use the ARMv6 binary (e.g., BCM2835 as found in Raspberry Pi Zero and Model 1)
else
# Otherwise, use the ARMv6 binary (e.g., BCM2835 as found in Raspberry Pi Zero and Model 1)
printf "%b %b Detected ARMv6 processor (with hard-float support)\\n" " ${ OVER } " " ${ TICK } "
# set the binary to be used
l_binary = "pihole-FTL-armv6-linux-gnueabihf"
@ -2475,6 +2453,7 @@ get_binary_name() {
l_binary = "pihole-FTL-linux-x86_32"
fi
# Returning a string value via echo
echo ${ l_binary }
}
@ -2611,9 +2590,8 @@ main() {
# Show the Pi-hole logo so people know it's genuine since the logo and name are trademarked
show_ascii_berry
make_temporary_log
# Otherwise,
else
# T hey do not have enough privileges, so let the user know
# Otherwise, t hey do not have enough privileges, so let the user know
printf " %b %s\\n" " ${ INFO } " " ${ str } "
printf " %b %bScript called with non-root privileges%b\\n" " ${ INFO } " " ${ COL_LIGHT_RED } " " ${ COL_NC } "
printf " The Pi-hole requires elevated privileges to install and run\\n"
@ -2621,7 +2599,7 @@ main() {
printf " Make sure to download this script from a trusted source\\n\\n"
printf " %b Sudo utility check" " ${ INFO } "
# If the sudo command exists,
# If the sudo command exists, try rerunning as admin
if is_command sudo ; then
printf "%b %b Sudo utility check\\n" " ${ OVER } " " ${ TICK } "
@ -2635,9 +2613,8 @@ main() {
fi
exit $?
# Otherwise,
else
# Let them know they need to run it as root
# Otherwise, tell the user they need to run the script as root, and bail
printf "%b %b Sudo utility check\\n" " ${ OVER } " " ${ CROSS } "
printf " %b Sudo is needed for the Web Interface to run pihole commands\\n\\n" " ${ INFO } "
printf " %b %bPlease re-run this installer as root ${ COL_NC } \\n " " ${ INFO } " " ${ COL_LIGHT_RED } "
@ -2657,9 +2634,8 @@ main() {
useUpdateVars = true
# also disable debconf-apt-progress dialogs
export DEBIAN_FRONTEND = "noninteractive"
# Otherwise,
else
# show the available options (repair/reconfigure)
# If running attended, show the available options (repair/reconfigure)
update_dialogs
fi
fi
@ -2713,13 +2689,13 @@ main() {
PRIVACY_LEVEL = " ${ PRIVACY_LEVEL :- 0 } "
fi
fi
# Clone/Update the repos
# Download or update the scripts by updating the appropriate git repos
clone_or_update_repos
# Install the Core dependencies
local dep_install_list = ( " ${ PIHOLE_DEPS [@] } " )
if [ [ " ${ INSTALL_WEB_SERVER } " = = true ] ] ; then
# Install the Web dependencies
# And, if the setting says so, install the Web admin interface dependencies
dep_install_list += ( " ${ PIHOLE_WEB_DEPS [@] } " )
fi
@ -2727,7 +2703,7 @@ main() {
unset dep_install_list
# On some systems, lighttpd is not enabled on first install. We need to enable it here if the user
# has chosen to install the web interface, else the ` LIGHTTPD_ENABLED` check will fail
# has chosen to install the web interface, else the LIGHTTPD_ENABLED check will fail
if [ [ " ${ INSTALL_WEB_SERVER } " = = true ] ] ; then
enable_service lighttpd
fi
@ -2779,7 +2755,6 @@ main() {
# If the Web server was installed,
if [ [ " ${ INSTALL_WEB_SERVER } " = = true ] ] ; then
if [ [ " ${ LIGHTTPD_ENABLED } " = = true ] ] ; then
restart_service lighttpd
enable_service lighttpd