Merge pull request #774 from pi-hole/InstallFixes2

InstallFixes2
This commit is contained in:
Dan Schaper 2016-10-12 11:47:15 -07:00 committed by GitHub
commit 23f7363c70
2 changed files with 203 additions and 203 deletions

View File

@ -16,10 +16,8 @@
# #
# curl -L install.pi-hole.net | bash # curl -L install.pi-hole.net | bash
set -e
######## VARIABLES ######### ######## VARIABLES #########
tmpLog=/tmp/pihole-install.log tmpLog=/tmp/pihole-install.log
instalLogLoc=/etc/pihole/install.log instalLogLoc=/etc/pihole/install.log
setupVars=/etc/pihole/setupVars.conf setupVars=/etc/pihole/setupVars.conf
@ -31,6 +29,9 @@ piholeFilesDir="/etc/.pihole"
useUpdateVars=false useUpdateVars=false
IPv4_address=""
IPv6_address=""
# Find the rows and columns # Find the rows and columns
rows=$(tput lines) rows=$(tput lines)
columns=$(tput cols) columns=$(tput cols)
@ -65,25 +66,24 @@ fi
if [ -x "$(command -v apt-get)" ];then if [ -x "$(command -v apt-get)" ];then
#Debian Family #Debian Family
#Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS) #Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS)
phpVer="php" phpVer="php5"
apt-get install --dry-run php5 > /dev/null 2>&1 apt-get install --dry-run php5 > /dev/null 2>&1 || phpVer="php"
if [ $? == 0 ]; then
phpVer="php5"
fi
############################################# #############################################
PKG_MANAGER="apt-get" PKG_MANAGER="apt-get"
PKG_CACHE="/var/lib/apt/lists/" PKG_CACHE="/var/lib/apt/lists/"
UPDATE_PKG_CACHE="$PKG_MANAGER -qq update" UPDATE_PKG_CACHE="$PKG_MANAGER update"
PKG_UPDATE="$PKG_MANAGER upgrade" PKG_UPDATE="$PKG_MANAGER upgrade"
PKG_INSTALL="$PKG_MANAGER --yes --quiet install" PKG_INSTALL="$PKG_MANAGER --yes --fix-missing install"
PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst" # grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE
INSTALLER_DEPS=( apt-utils whiptail dhcpcd5) PKG_COUNT="$PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true"
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi git curl unzip wget sudo netcat cron iproute2 ) INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5)
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 )
LIGHTTPD_USER="www-data" LIGHTTPD_USER="www-data"
LIGHTTPD_GROUP="www-data" LIGHTTPD_GROUP="www-data"
LIGHTTPD_CFG="lighttpd.conf.debian" LIGHTTPD_CFG="lighttpd.conf.debian"
package_check() { DNSMASQ_USER="dnsmasq"
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" package_check_install() {
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1"
} }
elif [ -x "$(command -v rpm)" ];then elif [ -x "$(command -v rpm)" ];then
# Fedora Family # Fedora Family
@ -93,17 +93,18 @@ elif [ -x "$(command -v rpm)" ];then
PKG_MANAGER="yum" PKG_MANAGER="yum"
fi fi
PKG_CACHE="/var/cache/$PKG_MANAGER" PKG_CACHE="/var/cache/$PKG_MANAGER"
UPDATE_PKG_CACHE="$PKG_MANAGER check-update -q" UPDATE_PKG_CACHE="$PKG_MANAGER check-update"
PKG_UPDATE="$PKG_MANAGER update -y" PKG_UPDATE="$PKG_MANAGER update -y"
PKG_INSTALL="$PKG_MANAGER install -y" PKG_INSTALL="$PKG_MANAGER install -y"
PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]" PKG_COUNT="$PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9]"
INSTALLER_DEPS=( iproute net-tools procps-ng newt ) 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 git curl unzip wget findutils cronie sudo nmap-ncat ) PIHOLE_DEPS=( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat )
LIGHTTPD_USER="lighttpd" LIGHTTPD_USER="lighttpd"
LIGHTTPD_GROUP="lighttpd" LIGHTTPD_GROUP="lighttpd"
LIGHTTPD_CFG="lighttpd.conf.fedora" LIGHTTPD_CFG="lighttpd.conf.fedora"
package_check() { DNSMASQ_USER="nobody"
rpm -qa | grep ^$1- > /dev/null package_check_install() {
rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1"
} }
else else
echo "OS distribution not supported" echo "OS distribution not supported"
@ -126,24 +127,27 @@ spinner()
printf " \b\b\b\b" printf " \b\b\b\b"
} }
findIPRoute() { find_IPv4_information() {
# Find IP used to route to outside world # 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)}') IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
IPv4addr=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') IPv4_address=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}')
}
get_available_interfaces() {
# Get available interfaces. Consider only getting UP interfaces in the future, and leaving DOWN interfaces out of list.
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1) availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1)
} }
welcomeDialogs() { welcomeDialogs() {
# Display the welcome dialog # Display the welcome dialog
whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" ${r} ${c} whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "\n\nThis installer will transform your device into a network-wide ad blocker!" ${r} ${c}
# Support for a part-time dev # Support for a part-time dev
whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" ${r} ${c} whiptail --msgbox --backtitle "Plea" --title "Free and open source" "\n\nThe Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" ${r} ${c}
# Explain the need for a static address # Explain the need for a static address
whiptail --msgbox --backtitle "Initiating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. whiptail --msgbox --backtitle "Initiating network interface" --title "Static IP Needed" "\n\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." ${r} ${c} In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." ${r} ${c}
} }
@ -184,8 +188,15 @@ verifyFreeDiskSpace() {
chooseInterface() { chooseInterface() {
# Turn the available interfaces into an array so it can be used with a whiptail dialog # Turn the available interfaces into an array so it can be used with a whiptail dialog
interfacesArray=() local interfacesArray=()
firstLoop=1 # Number of available interfaces
local interfaceCount
# Whiptail variable storage
local chooseInterfaceCmd
# Temporary Whiptail options storage
local chooseInterfaceOptions
# Loop sentinel variable
local firstLoop=1
while read -r line while read -r line
do do
@ -211,10 +222,18 @@ chooseInterface() {
echo "::: Cancel selected, exiting...." echo "::: Cancel selected, exiting...."
exit 1 exit 1
fi fi
} }
useIPv6dialog() {
# Show the IPv6 address used for blocking
IPv6_address=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$IPv6_address will be used to block ads." ${r} ${c}
}
use4andor6() { use4andor6() {
local useIPv4
local useIPv6
# Let use select IPv4 and/or IPv6 # Let use select IPv4 and/or IPv6
cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" ${r} ${c} 2) cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" ${r} ${c} 2)
options=(IPv4 "Block ads over IPv4" on options=(IPv4 "Block ads over IPv4" on
@ -228,47 +247,31 @@ use4andor6() {
IPv6 ) useIPv6=true;; IPv6 ) useIPv6=true;;
esac esac
done done
if [[ ${useIPv4} ]]; then
if [ ${useIPv4} ] && [ ! ${useIPv6} ]; then find_IPv4_information
getStaticIPv4Settings getStaticIPv4Settings
setStaticIPv4 setStaticIPv4
echo "::: Using IPv4 on $IPv4addr"
echo "::: IPv6 will NOT be used."
fi
if [ ! ${useIPv4} ] && [ ${useIPv6} ]; then
useIPv6dialog
echo "::: IPv4 will NOT be used."
echo "::: Using IPv6 on $piholeIPv6"
fi
if [ ${useIPv4} ] && [ ${useIPv6} ]; then
getStaticIPv4Settings
setStaticIPv4
useIPv6dialog
echo "::: Using IPv4 on $IPv4addr"
echo "::: Using IPv6 on $piholeIPv6"
fi fi
if [[ ${useIPv6} ]]; then
useIPv6dialog
fi
echo "::: IPv4 address: ${IPv4_address}"
echo "::: IPv6 address: ${IPv6_address}"
if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then if [ ! ${useIPv4} ] && [ ! ${useIPv6} ]; then
echo "::: Cannot continue, neither IPv4 or IPv6 selected" echo "::: Cannot continue, neither IPv4 or IPv6 selected"
echo "::: Exiting" echo "::: Exiting"
exit 1 exit 1
fi fi
else else
echo "::: Cancel selected. Exiting..." echo "::: Cancel selected. Exiting..."
exit 1 exit 1
fi fi
} }
useIPv6dialog() {
# Show the IPv6 address used for blocking
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." ${r} ${c}
}
getStaticIPv4Settings() { getStaticIPv4Settings() {
# Ask if the user wants to use DHCP settings as their static IP # 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? if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address?
IP address: $IPv4addr IP address: $IPv4_address
Gateway: $IPv4gw" ${r} ${c}); then 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. # 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. 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.
@ -282,16 +285,16 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
until [[ ${ipSettingsCorrect} = True ]] until [[ ${ipSettingsCorrect} = True ]]
do do
# Ask for the IPv4 address # Ask for the IPv4 address
IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4addr" 3>&1 1>&2 2>&3) IPv4_address=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4_address" 3>&1 1>&2 2>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
echo "::: Your static IPv4 address: $IPv4addr" echo "::: Your static IPv4 address: $IPv4_address"
# Ask for the gateway # 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) 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 if [[ $? = 0 ]];then
echo "::: Your static IPv4 gateway: $IPv4gw" echo "::: Your static IPv4 gateway: $IPv4gw"
# Give the user a chance to review their settings before moving on # 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? if (whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct?
IP address: $IPv4addr IP address: $IPv4_address
Gateway: $IPv4gw" ${r} ${c}); then Gateway: $IPv4gw" ${r} ${c}); then
# After that's done, the loop ends and we move on # After that's done, the loop ends and we move on
ipSettingsCorrect=True ipSettingsCorrect=True
@ -319,53 +322,57 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
setDHCPCD() { setDHCPCD() {
# Append these lines to dhcpcd.conf to enable a static IP # Append these lines to dhcpcd.conf to enable a static IP
echo "## interface $piholeInterface echo "## interface $piholeInterface
static ip_address=$IPv4addr static ip_address=$IPv4_address
static routers=$IPv4gw static routers=$IPv4gw
static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null static domain_name_servers=$IPv4gw" | tee -a /etc/dhcpcd.conf >/dev/null
} }
setStaticIPv4() { setStaticIPv4() {
local IFCFG_FILE
local IPADDR
local CIDR
if [[ -f /etc/dhcpcd.conf ]];then if [[ -f /etc/dhcpcd.conf ]];then
# Debian Family # Debian Family
if grep -q "$IPv4addr" /etc/dhcpcd.conf; then if grep -q "$IPv4_address" /etc/dhcpcd.conf; then
echo "::: Static IP already configured" echo "::: Static IP already configured"
else else
setDHCPCD setDHCPCD
ip addr replace dev "$piholeInterface" "$IPv4addr" ip addr replace dev "$piholeInterface" "$IPv4_address"
echo ":::" echo ":::"
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete."
echo ":::" echo ":::"
fi fi
elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then elif [[ -f /etc/sysconfig/network-scripts/ifcfg-${piholeInterface} ]];then
# Fedora Family # Fedora Family
IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface} IFCFG_FILE=/etc/sysconfig/network-scripts/ifcfg-${piholeInterface}
if grep -q "$IPv4addr" ${IFCFG_FILE}; then if grep -q "$IPv4_address" "${IFCFG_FILE}"; then
echo "::: Static IP already configured" echo "::: Static IP already configured"
else else
IPADDR=$(echo ${IPv4addr} | cut -f1 -d/) IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/)
CIDR=$(echo ${IPv4addr} | cut -f2 -d/) CIDR=$(echo "${IPv4_address}" | cut -f2 -d/)
# Backup existing interface configuration: # Backup existing interface configuration:
cp ${IFCFG_FILE} ${IFCFG_FILE}.backup-$(date +%Y-%m-%d-%H%M%S) cp "${IFCFG_FILE}" "${IFCFG_FILE}".backup-"$(date +%Y-%m-%d-%H%M%S)"
# Build Interface configuration file: # Build Interface configuration file:
echo "# Configured via Pi-Hole installer" > ${IFCFG_FILE} {
echo "DEVICE=$piholeInterface" >> ${IFCFG_FILE} echo "# Configured via Pi-Hole installer"
echo "BOOTPROTO=none" >> ${IFCFG_FILE} echo "DEVICE=$piholeInterface"
echo "ONBOOT=yes" >> ${IFCFG_FILE} echo "BOOTPROTO=none"
echo "IPADDR=$IPADDR" >> ${IFCFG_FILE} echo "ONBOOT=yes"
echo "PREFIX=$CIDR" >> ${IFCFG_FILE} echo "IPADDR=$IPADDR"
echo "GATEWAY=$IPv4gw" >> ${IFCFG_FILE} echo "PREFIX=$CIDR"
echo "DNS1=$piholeDNS1" >> ${IFCFG_FILE} echo "GATEWAY=$IPv4gw"
echo "DNS2=$piholeDNS2" >> ${IFCFG_FILE} echo "DNS1=$piholeDNS1"
echo "USERCTL=no" >> ${IFCFG_FILE} echo "DNS2=$piholeDNS2"
ip addr replace dev "$piholeInterface" "$IPv4addr" echo "USERCTL=no"
}>> "${IFCFG_FILE}"
ip addr replace dev "$piholeInterface" "$IPv4_address"
if [ -x "$(command -v nmcli)" ];then if [ -x "$(command -v nmcli)" ];then
# Tell NetworkManager to read our new sysconfig file # Tell NetworkManager to read our new sysconfig file
nmcli con load ${IFCFG_FILE} > /dev/null nmcli con load "${IFCFG_FILE}" > /dev/null
fi fi
echo ":::" echo ":::"
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete." echo "::: Setting IP to ${IPv4_address}. You may need to restart after the install is complete."
echo ":::" echo ":::"
fi fi
else else
echo "::: Warning: Unable to locate configuration file to set static IPv4 address!" echo "::: Warning: Unable to locate configuration file to set static IPv4 address!"
@ -391,14 +398,14 @@ function valid_ip()
} }
setDNS(){ setDNS(){
DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6) DNSChooseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${r} ${c} 6)
DNSChooseOptions=(Google "" on DNSChooseOptions=(Google "" on
OpenDNS "" off OpenDNS "" off
Level3 "" off Level3 "" off
Norton "" off Norton "" off
Comodo "" off Comodo "" off
Custom "" off) Custom "" off)
DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty) DNSchoices=$("${DNSChooseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
case ${DNSchoices} in case ${DNSchoices} in
Google) Google)
@ -481,49 +488,49 @@ setDNS(){
fi fi
} }
versionCheckDNSmasq(){ version_check_dnsmasq(){
# Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory # Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory
dnsFile1="/etc/dnsmasq.conf" local dnsmasq_conf="/etc/dnsmasq.conf"
dnsFile2="/etc/dnsmasq.conf.orig" local dnsmasq_conf_orig="/etc/dnsmasq.conf.orig"
dnsSearch="addn-hosts=/etc/pihole/gravity.list" local dnsmasq_pihole_id_string="addn-hosts=/etc/pihole/gravity.list"
defaultFile="/etc/.pihole/advanced/dnsmasq.conf.original" local dnsmasq_original_config="/etc/.pihole/advanced/dnsmasq.conf.original"
newFileToInstall="/etc/.pihole/advanced/01-pihole.conf" local dnsmasq_pihole_01_snippet="/etc/.pihole/advanced/01-pihole.conf"
newFileFinalLocation="/etc/dnsmasq.d/01-pihole.conf" local dnsmasq_pihole_01_location="/etc/dnsmasq.d/01-pihole.conf"
if [ -f ${dnsFile1} ]; then if [ -f ${dnsmasq_conf} ]; then
echo -n "::: Existing dnsmasq.conf found..." echo -n "::: Existing dnsmasq.conf found..."
if grep -q ${dnsSearch} ${dnsFile1}; then if grep -q ${dnsmasq_pihole_id_string} ${dnsmasq_conf}; then
echo " it is from a previous pi-hole install." echo " it is from a previous pi-hole install."
echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..." echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..."
mv -f ${dnsFile1} ${dnsFile2} mv -f ${dnsmasq_conf} ${dnsmasq_conf_orig}
echo " done." echo " done."
echo -n "::: Restoring default dnsmasq.conf..." echo -n "::: Restoring default dnsmasq.conf..."
cp ${defaultFile} ${dnsFile1} cp ${dnsmasq_original_config} ${dnsmasq_conf}
echo " done." echo " done."
else else
echo " it is not a pi-hole file, leaving alone!" echo " it is not a pi-hole file, leaving alone!"
fi fi
else else
echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..." echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..."
cp ${defaultFile} ${dnsFile1} cp ${dnsmasq_original_config} ${dnsmasq_conf}
echo " done." echo " done."
fi fi
echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..." echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..."
cp ${newFileToInstall} ${newFileFinalLocation} cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location}
echo " done." echo " done."
sed -i "s/@INT@/$piholeInterface/" ${newFileFinalLocation} sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location}
if [[ "$piholeDNS1" != "" ]]; then if [[ "$piholeDNS1" != "" ]]; then
sed -i "s/@DNS1@/$piholeDNS1/" ${newFileFinalLocation} sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS1@/d' ${newFileFinalLocation} sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location}
fi fi
if [[ "$piholeDNS2" != "" ]]; then if [[ "$piholeDNS2" != "" ]]; then
sed -i "s/@DNS2@/$piholeDNS2/" ${newFileFinalLocation} sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS2@/d' ${newFileFinalLocation} sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location}
fi fi
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsFile1} sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${dnsmasq_conf}
} }
remove_legacy_scripts(){ remove_legacy_scripts(){
@ -556,7 +563,7 @@ installConfigs() {
# Install the configs from /etc/.pihole to their various locations # Install the configs from /etc/.pihole to their various locations
echo ":::" echo ":::"
echo "::: Installing configs..." echo "::: Installing configs..."
versionCheckDNSmasq version_check_dnsmasq
if [ ! -d "/etc/lighttpd" ]; then if [ ! -d "/etc/lighttpd" ]; then
mkdir /etc/lighttpd mkdir /etc/lighttpd
chown "$USER":root /etc/lighttpd chown "$USER":root /etc/lighttpd
@ -577,18 +584,42 @@ stop_service() {
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl stop "${1}" &> /dev/null & spinner $! || true systemctl stop "${1}" &> /dev/null & spinner $! || true
else else
service "${1}" &> /dev/null stop & spinner $! || true service "${1}" stop &> /dev/null & spinner $! || true
fi fi
echo " done." echo " done."
} }
installerDependencies() { start_service() {
# Start/Restart service passed in as argument
# This should not fail, it's an error if it does
echo ":::"
echo -n "::: Starting ${1} service..."
if [ -x "$(command -v systemctl)" ]; then
systemctl restart "${1}" &> /dev/null & spinner $!
else
service "${1}" restart &> /dev/null & spinner $!
fi
echo " done."
}
enable_service() {
# Enable service so that it will start with next reboot
echo ":::"
echo -n "::: Enabling ${1} service to start on reboot..."
if [ -x "$(command -v systemctl)" ]; then
systemctl enable "${1}" &> /dev/null & spinner $!
else
update-rc.d "${1}" defaults &> /dev/null & spinner $!
fi
echo " done."
}
update_pacakge_cache() {
#Running apt-get update/upgrade with minimal output can cause some issues with #Running apt-get update/upgrade with minimal output can cause some issues with
#requiring user input (e.g password for phpmyadmin see #218) #requiring user input (e.g password for phpmyadmin see #218)
#We'll change the logic up here, to check to see if there are any updates availible and
# if so, advise the user to run apt-get update/upgrade at their own discretion
#Check to see if apt-get update has already been run today #Check to see if apt-get update has already been run today
# it needs to have been run at least once on new installs! #it needs to have been run at least once on new installs!
timestamp=$(stat -c %Y ${PKG_CACHE}) timestamp=$(stat -c %Y ${PKG_CACHE})
timestampAsDate=$(date -d @"$timestamp" "+%b %e") timestampAsDate=$(date -d @"$timestamp" "+%b %e")
today=$(date "+%b %e") today=$(date "+%b %e")
@ -597,51 +628,38 @@ installerDependencies() {
#update package lists #update package lists
echo ":::" echo ":::"
echo -n "::: $PKG_MANAGER update has not been run today. Running now..." echo -n "::: $PKG_MANAGER update has not been run today. Running now..."
${UPDATE_PKG_CACHE} > /dev/null 2>&1 ${UPDATE_PKG_CACHE} &> /dev/null & spinner $!
echo " done!" echo " done!"
fi fi
}
notify_package_updates_available(){
# Let user know if they have outdated packages on their system and
# advise them to run a package update at soonest possible.
echo ":::" echo ":::"
echo -n "::: Checking $PKG_MANAGER for upgraded packages...." echo -n "::: Checking $PKG_MANAGER for upgraded packages...."
updatesToInstall=$(eval "${PKG_COUNT}") updatesToInstall=$(eval "${PKG_COUNT}")
echo " done!" echo " done!"
echo ":::" echo ":::"
if [[ ${updatesToInstall} -eq "0" ]]; then if [[ ${updatesToInstall} -eq "0" ]]; then
echo "::: Your pi is up to date! Continuing with pi-hole installation..." echo "::: Your system is up to date! Continuing with Pi-hole installation..."
else else
echo "::: There are $updatesToInstall updates availible for your pi!" echo "::: There are $updatesToInstall updates available for your system!"
echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! " echo "::: We recommend you run '$PKG_UPDATE' after installing Pi-Hole! "
echo ":::" echo ":::"
fi fi
echo ":::"
echo "::: Checking installer dependencies..."
for i in "${INSTALLER_DEPS[@]}"; do
echo -n "::: Checking for $i..."
package_check ${i} > /dev/null
if ! [ $? -eq 0 ]; then
echo -n " Not found! Installing...."
${PKG_INSTALL} "$i" > /dev/null 2>&1
echo " done!"
else
echo " already installed!"
fi
done
} }
checkForDependencies() { install_dependent_packages(){
# Install dependencies for Pi-Hole # Install packages passed in via argument array
echo "::: Checking Pi-Hole dependencies:" # No spinner - conflicts with set -e
declare -a argArray1=("${!1}")
for i in "${PIHOLE_DEPS[@]}"; do for i in "${argArray1[@]}"; do
echo -n "::: Checking for $i..." echo -n "::: Checking for $i..."
package_check ${i} > /dev/null package_check_install "${i}" &> /dev/null
if ! [ $? -eq 0 ]; then echo " installed!"
echo -n " Not found! Installing...." done
${PKG_INSTALL} "$i" > /dev/null & spinner $!
echo " done!"
else
echo " already installed!"
fi
done
} }
getGitFiles() { getGitFiles() {
@ -679,7 +697,6 @@ update_repo() {
echo " done!" echo " done!"
} }
CreateLogFile() { CreateLogFile() {
# Create logfiles if necessary # Create logfiles if necessary
echo ":::" echo ":::"
@ -687,7 +704,7 @@ CreateLogFile() {
if [ ! -f /var/log/pihole.log ]; then if [ ! -f /var/log/pihole.log ]; then
touch /var/log/pihole.log touch /var/log/pihole.log
chmod 644 /var/log/pihole.log chmod 644 /var/log/pihole.log
chown dnsmasq:root /var/log/pihole.log chown "${DNSMASQ_USER}":root /var/log/pihole.log
echo " done!" echo " done!"
else else
echo " already exists!" echo " already exists!"
@ -741,20 +758,14 @@ runGravity() {
create_pihole_user(){ create_pihole_user(){
# Check if user pihole exists and create if not # Check if user pihole exists and create if not
echo "::: Checking if user 'pihole' exists..." echo "::: Checking if user 'pihole' exists..."
id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || echo "::: User 'pihole' doesn't exist. Creating..."; useradd -r -s /usr/sbin/nologin pihole id -u pihole &> /dev/null && echo "::: User 'pihole' already exists" || (echo "::: User 'pihole' doesn't exist. Creating..." && useradd -r -s /usr/sbin/nologin pihole)
} }
configureFirewall() { configureFirewall() {
# Allow HTTP and DNS traffic # Allow HTTP and DNS traffic
if [ -x "$(command -v firewall-cmd)" ]; then if [ -x "$(command -v firewall-cmd)" ]; then
firewall-cmd --state > /dev/null firewall-cmd --state &> /dev/null && ( echo "::: Configuring firewalld for httpd and dnsmasq.." && firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --permanent --add-port=53/tcp \
if [[ $? -eq 0 ]]; then && firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload) || echo "::: FirewallD not enabled"
echo "::: Configuring firewalld for httpd and dnsmasq.."
firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --reload
fi
elif [ -x "$(command -v iptables)" ]; then elif [ -x "$(command -v iptables)" ]; then
echo "::: Configuring iptables for httpd and dnsmasq.." echo "::: Configuring iptables for httpd and dnsmasq.."
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
@ -770,11 +781,13 @@ finalExports() {
if [[ -f ${setupVars} ]];then if [[ -f ${setupVars} ]];then
rm ${setupVars} rm ${setupVars}
fi fi
echo "piholeInterface=${piholeInterface}" >> ${setupVars} {
echo "IPv4addr=${IPv4addr}" >> ${setupVars} echo "piholeInterface=${piholeInterface}"
echo "piholeIPv6=${piholeIPv6}" >> ${setupVars} echo "IPv4_address=${IPv4_address}"
echo "piholeDNS1=${piholeDNS1}" >> ${setupVars} echo "IPv6_address=${IPv6_address}"
echo "piholeDNS2=${piholeDNS2}" >> ${setupVars} echo "piholeDNS1=${piholeDNS1}"
echo "piholeDNS2=${piholeDNS2}"
}>> "${setupVars}"
} }
@ -819,30 +832,16 @@ configureSelinux() {
if [ -x "$(command -v getenforce)" ]; then if [ -x "$(command -v getenforce)" ]; then
printf "\n::: SELinux Detected\n" printf "\n::: SELinux Detected\n"
printf ":::\tChecking for SELinux policy development packages..." printf ":::\tChecking for SELinux policy development packages..."
package_check "selinux-policy-devel" > /dev/null package_check_install "selinux-policy-devel" > /dev/null
if ! [ $? -eq 0 ]; then echo " installed!"
echo -n " Not found! Installing...."
${PKG_INSTALL} "selinux-policy-devel" > /dev/null & spinner $!
echo " done!"
else
echo " already installed!"
fi
printf "::: Enabling httpd server side includes (SSI).. " printf "::: Enabling httpd server side includes (SSI).. "
setsebool -P httpd_ssi_exec on setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled"
if [ $? -eq 0 ]; then
echo -n "Success"
fi
printf "\n:::\tCompiling Pi-Hole SELinux policy..\n" printf "\n:::\tCompiling Pi-Hole SELinux policy..\n"
checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te
semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod
semodule -i /etc/pihole/pihole.pp semodule -i /etc/pihole/pihole.pp
rm -f /etc/pihole/pihole.mod rm -f /etc/pihole/pihole.mod
semodule -l | grep pihole > /dev/null semodule -l | grep pihole &> /dev/null && echo "::: Installed Pi-Hole SELinux policy" || echo "::: Warning: Pi-Hole SELinux policy did not install."
if [ $? -eq 0 ]; then
printf "::: Successfully installed Pi-Hole SELinux policy\n"
else
printf "::: Warning: Pi-Hole SELinux policy did not install correctly!\n"
fi
fi fi
} }
@ -850,18 +849,18 @@ displayFinalMessage() {
# Final completion message to user # 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: whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
IPv4: ${IPv4addr%/*} IPv4: ${IPv4_address%/*}
IPv6: $piholeIPv6 IPv6: $IPv6_address
If you set a new IP address, you should restart the Pi. If you set a new IP address, you should restart the Pi.
The install log is in /etc/pihole. The install log is in /etc/pihole.
View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" ${r} ${c} View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin" ${r} ${c}
} }
update_dialogs(){ update_dialogs(){
UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "We have detected an existing install.\n\n Please chose from the following options:" ${r} ${c} 2 \ UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options:" ${r} ${c} 2 \
"Update" "Update install will retain existing settings." \ "Update" "Update install will retain existing settings." \
"Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3) "Install" "Install will allow you to enter new settings." 3>&2 2>&1 1>&3)
@ -869,6 +868,7 @@ update_dialogs(){
case ${UpdateCmd} in case ${UpdateCmd} in
Update) Update)
echo "::: Updating existing install" echo "::: Updating existing install"
. ${setupVars}
useUpdateVars=true useUpdateVars=true
;; ;;
Install) Install)
@ -885,14 +885,11 @@ update_dialogs(){
main() { main() {
if [[ -f ${setupVars} ]];then if [[ -f ${setupVars} ]];then
. ${setupVars} if [ "$1" == "pihole" ]; then
useUpdateVars=true
if [ "$1" == "pihole" ]; then else
useUpdateVars=true update_dialogs
else fi
update_dialogs
fi
fi fi
# Start the installer # Start the installer
@ -904,8 +901,17 @@ else
verifyFreeDiskSpace verifyFreeDiskSpace
fi fi
# Update package cache
update_pacakge_cache
# Notify user of package availability
notify_package_updates_available
# Install packages used by this installation script # Install packages used by this installation script
installerDependencies install_dependent_packages INSTALLER_DEPS[@]
# Install packages used by the Pi-hole
install_dependent_packages PIHOLE_DEPS[@]
if [[ ${useUpdateVars} == false ]]; then if [[ ${useUpdateVars} == false ]]; then
# Display welcome dialogs # Display welcome dialogs
@ -920,8 +926,8 @@ if [[ ${useUpdateVars} == false ]]; then
# Stop resolver and webserver while installing proceses # Stop resolver and webserver while installing proceses
stop_service dnsmasq stop_service dnsmasq
stop_service lighttpd stop_service lighttpd
# Find IP used to route to outside world # Determine available interfaces
findIPRoute get_available_interfaces
# Find interfaces and let the user choose one # Find interfaces and let the user choose one
chooseInterface chooseInterface
# Let the user decide if they want to block ads over IPv4 and/or IPv6 # Let the user decide if they want to block ads over IPv4 and/or IPv6
@ -943,23 +949,17 @@ fi
echo -n "::: Restarting services..." echo -n "::: Restarting services..."
# Start services # Start services
if [ -x "$(command -v systemctl)" ]; then start_service dnsmasq
systemctl enable dnsmasq enable_service dnsmasq
systemctl restart dnsmasq start_service lighttpd
systemctl enable lighttpd enable_service lighttpd
systemctl start lighttpd
else
service dnsmasq restart
service lighttpd start
fi
echo " done." echo " done."
echo ":::" echo ":::"
if [[ ${useUpdateVars} == false ]]; then if [[ ${useUpdateVars} == false ]]; then
echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:" echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:"
echo "::: ${IPv4addr%/*}" echo "::: ${IPv4_address%/*}"
echo "::: $piholeIPv6" echo "::: $IPv6_address"
echo ":::" echo ":::"
echo "::: If you set a new IP address, you should restart the Pi." echo "::: If you set a new IP address, you should restart the Pi."
else else
@ -968,7 +968,7 @@ fi
echo ":::" echo ":::"
echo "::: The install log is located at: /etc/pihole/install.log" echo "::: The install log is located at: /etc/pihole/install.log"
echo "::: View the web interface at http://pi.hole/admin or http://${IPv4addr%/*}/admin" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin"
} }
main "$@" main "$@"

View File

@ -48,7 +48,7 @@ blacklistScript=/opt/pihole/blacklist.sh
#Source the setupVars from install script for the IP #Source the setupVars from install script for the IP
. /etc/pihole/setupVars.conf . /etc/pihole/setupVars.conf
#Remove the /* from the end of the IPv4addr. #Remove the /* from the end of the IPv4addr.
IPv4addr=${IPv4addr%/*} IPv4addr=${IPv4_address%/*}
# Variables for various stages of downloading and formatting the list # Variables for various stages of downloading and formatting the list
basename=pihole basename=pihole
@ -254,10 +254,10 @@ function gravity_hostFormat() {
echo "::: Error: Unable to determine fully qualified domain name of host" echo "::: Error: Unable to determine fully qualified domain name of host"
fi fi
# If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols # If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols
if [[ -n ${piholeIPv6} ]];then if [[ -n "${IPv6_address}" ]];then
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
echo -e "$IPv4addr $hostname\n$piholeIPv6 $hostname\n$IPv4addr pi.hole\n$piholeIPv6 pi.hole" > ${piholeDir}/${accretionDisc} echo -e "$IPv4addr $hostname\n$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc}
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
else else
# Otherwise, just create gravity.list as normal using IPv4 # Otherwise, just create gravity.list as normal using IPv4
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin) # Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)