2015-11-25 21:43:59 +00:00
#!/usr/bin/env bash
2015-10-28 22:29:34 +00:00
# Pi-hole: A black hole for Internet advertisements
2016-01-30 20:12:40 +00:00
# (c) 2015, 2016 by Jacob Salmela
2015-10-28 22:29:34 +00:00
# Network-wide ad blocking via your Raspberry Pi
2016-01-30 20:12:40 +00:00
# http://pi-hole.net
# Installs Pi-hole
2015-12-06 14:31:49 +00:00
#
# Pi-hole is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
2016-01-30 20:12:40 +00:00
2015-10-28 22:29:34 +00:00
# pi-hole.net/donate
2015-06-14 03:14:21 +00:00
#
2015-10-28 22:29:34 +00:00
# Install with this command (from your Pi):
2015-06-14 03:14:21 +00:00
#
2015-10-28 22:29:34 +00:00
# curl -L install.pi-hole.net | bash
2015-06-14 03:14:21 +00:00
2016-10-10 04:32:25 +00:00
set -e
2015-10-28 22:29:34 +00:00
######## VARIABLES #########
2016-01-27 22:32:08 +00:00
2016-08-19 21:31:11 +00:00
2015-10-31 14:19:57 +00:00
tmpLog = /tmp/pihole-install.log
2015-10-31 14:15:57 +00:00
instalLogLoc = /etc/pihole/install.log
2016-08-21 16:57:11 +00:00
setupVars = /etc/pihole/setupVars.conf
2015-10-31 14:15:57 +00:00
2016-01-24 03:31:12 +00:00
webInterfaceGitUrl = "https://github.com/pi-hole/AdminLTE.git"
webInterfaceDir = "/var/www/html/admin"
piholeGitUrl = "https://github.com/pi-hole/pi-hole.git"
piholeFilesDir = "/etc/.pihole"
2016-01-23 00:13:16 +00:00
2016-08-19 21:31:11 +00:00
useUpdateVars = false
2016-01-23 00:13:16 +00:00
2015-10-28 22:29:34 +00:00
# Find the rows and columns
2016-01-02 23:20:33 +00:00
rows = $( tput lines)
columns = $( tput cols)
2015-10-28 22:29:34 +00:00
# Divide by two so the dialogs take up half of the screen, which looks nice.
r = $(( rows / 2 ))
c = $(( columns / 2 ))
2016-01-23 22:25:30 +00:00
######## FIRST CHECK ########
# Must be root to install
2016-01-24 16:33:53 +00:00
echo ":::"
2016-01-23 22:25:30 +00:00
if [ [ $EUID -eq 0 ] ] ; then
2016-04-03 22:25:48 +00:00
echo "::: You are root."
2015-06-21 12:50:02 +00:00
else
2016-10-08 19:56:26 +00:00
echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures"
echo "::: system networking, it requires elevated rights. Please check the contents of the script for"
echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source."
echo ":::"
echo "::: Detecting the presence of the sudo utility for continuation of this install..."
2016-04-25 23:31:00 +00:00
if [ -x " $( command -v sudo) " ] ; then
2016-10-08 19:56:26 +00:00
echo "::: Utility sudo located."
exec sudo bash " $0 " " $@ "
exit $?
2016-04-03 22:25:48 +00:00
else
2016-06-11 18:21:08 +00:00
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
2016-04-03 22:25:48 +00:00
exit 1
fi
2015-06-21 12:50:02 +00:00
fi
2015-10-28 22:29:34 +00:00
2016-08-19 21:31:11 +00:00
# Compatibility
2016-09-05 14:52:09 +00:00
if [ -x " $( command -v apt-get) " ] ; then
2016-09-27 10:11:47 +00:00
#Debian Family
#Decide if php should be `php5` or just `php` (Fixes issues with Ubuntu 16.04 LTS)
2016-10-10 04:31:36 +00:00
phpVer = "php5"
apt-get install --dry-run php5 > /dev/null 2>& 1 || phpVer = "php"
2016-09-27 10:11:47 +00:00
#############################################
2016-09-05 14:52:09 +00:00
PKG_MANAGER = "apt-get"
2016-10-08 20:47:35 +00:00
PKG_CACHE = "/var/lib/apt/lists/"
2016-10-10 02:41:32 +00:00
UPDATE_PKG_CACHE = " $PKG_MANAGER -qq update "
2016-09-05 14:52:09 +00:00
PKG_UPDATE = " $PKG_MANAGER upgrade "
2016-10-10 02:41:32 +00:00
PKG_INSTALL = " $PKG_MANAGER --yes --quiet install "
2016-10-10 05:27:37 +00:00
# grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE
PKG_COUNT = " $PKG_MANAGER -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true "
2016-10-10 05:00:23 +00:00
INSTALLER_DEPS = ( apt-utils whiptail git dhcpcd5)
PIHOLE_DEPS = ( dnsutils bc dnsmasq lighttpd ${ phpVer } -common ${ phpVer } -cgi curl unzip wget sudo netcat cron iproute2 )
2016-09-05 14:52:09 +00:00
LIGHTTPD_USER = "www-data"
LIGHTTPD_GROUP = "www-data"
LIGHTTPD_CFG = "lighttpd.conf.debian"
2016-10-10 04:44:45 +00:00
package_check_install( ) {
dpkg-query -W -f= '${Status}' " $1 " 2>/dev/null | grep -c "ok installed" || ${ PKG_INSTALL } " $1 "
2016-09-05 14:52:09 +00:00
}
elif [ -x " $( command -v rpm) " ] ; then
2016-04-26 04:51:00 +00:00
# Fedora Family
if [ -x " $( command -v dnf) " ] ; then
PKG_MANAGER = "dnf"
else
PKG_MANAGER = "yum"
fi
PKG_CACHE = " /var/cache/ $PKG_MANAGER "
2016-05-01 06:27:46 +00:00
UPDATE_PKG_CACHE = " $PKG_MANAGER check-update -q "
PKG_UPDATE = " $PKG_MANAGER update -y "
2016-04-26 04:51:00 +00:00
PKG_INSTALL = " $PKG_MANAGER install -y "
2016-05-01 06:27:46 +00:00
PKG_COUNT = " $PKG_MANAGER check-update | grep -v ^Last | grep -c ^[a-zA-Z0-9] "
2016-10-10 05:00:23 +00:00
INSTALLER_DEPS = ( iproute net-tools procps-ng newt git )
PIHOLE_DEPS = ( epel-release bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common php-cli php curl unzip wget findutils cronie sudo nmap-ncat )
2016-05-04 06:01:38 +00:00
LIGHTTPD_USER = "lighttpd"
LIGHTTPD_GROUP = "lighttpd"
2016-05-01 21:06:57 +00:00
LIGHTTPD_CFG = "lighttpd.conf.fedora"
2016-10-10 04:44:45 +00:00
package_check_install( ) {
2016-04-26 04:51:00 +00:00
rpm -qa | grep ^$1 - > /dev/null
}
else
echo "OS distribution not supported"
exit
fi
2015-11-08 23:21:02 +00:00
2016-01-21 17:29:44 +00:00
####### FUNCTIONS ##########
2016-03-26 21:50:05 +00:00
spinner( )
{
2016-04-03 22:25:48 +00:00
local pid = $1
2016-03-27 06:53:48 +00:00
local delay = 0.50
2016-04-03 17:10:50 +00:00
local spinstr = '/-\|'
2016-03-27 06:53:48 +00:00
while [ " $( ps a | awk '{print $1}' | grep " $pid " ) " ] ; do
2016-04-03 22:25:48 +00:00
local temp = ${ spinstr #? }
2016-03-26 21:50:05 +00:00
printf " [%c] " " $spinstr "
2016-08-19 21:31:11 +00:00
local spinstr = ${ temp } ${ spinstr % " $temp " }
sleep ${ delay }
2016-03-26 21:50:05 +00:00
printf "\b\b\b\b\b\b"
done
printf " \b\b\b\b"
2016-01-27 06:11:38 +00:00
}
2016-01-24 03:31:12 +00:00
2016-05-01 02:27:38 +00:00
findIPRoute( ) {
# 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)}' )
IPv4addr = $( 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}' )
availableInterfaces = $( ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1)
}
2015-11-10 00:33:32 +00:00
2016-01-27 06:11:38 +00:00
welcomeDialogs( ) {
2016-04-03 22:25:48 +00:00
# Display the welcome dialog
2016-08-19 21:31:11 +00:00
whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" ${ r } ${ c }
2016-01-28 09:25:00 +00:00
2016-04-03 22:25:48 +00:00
# Support for a part-time dev
2016-08-19 21:31:11 +00:00
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 }
2016-01-28 09:25:00 +00:00
2016-04-03 22:25:48 +00:00
# Explain the need for a static address
2016-08-19 21:31:11 +00:00
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.
2016-06-10 22:47:27 +00:00
2016-08-19 21:31:11 +00:00
In the next section, you can choose to use your current network settings ( DHCP) or to manually edit them." ${ r } ${ c }
2015-11-08 23:21:02 +00:00
}
2016-02-10 15:34:06 +00:00
verifyFreeDiskSpace( ) {
2016-08-12 11:44:45 +00:00
2016-04-03 22:25:48 +00:00
# 50MB is the minimum space needed (45MB install (includes web admin bootstrap/jquery libraries etc) + 5MB one day of logs.)
2016-08-12 11:44:45 +00:00
# - Fourdee: Local ensures the variable is only created, and accessible within this function/void. Generally considered a "good" coding practice for non-global variables.
2016-10-02 10:09:14 +00:00
echo "::: Verifying free disk space..."
2016-08-25 11:11:54 +00:00
local required_free_kilobytes = 51200
local existing_free_kilobytes = $( df -Pk | grep -m1 '\/$' | awk '{print $4}' )
2016-04-03 22:25:48 +00:00
2016-08-12 11:44:45 +00:00
# - Unknown free disk space , not a integer
2016-08-25 11:11:54 +00:00
if ! [ [ " $existing_free_kilobytes " = ~ ^( [ 0-9] ) +$ ] ] ; then
2016-10-02 10:09:14 +00:00
echo "::: Unknown free disk space!"
echo "::: We were unable to determine available free disk space on this system."
echo "::: You may override this check and force the installation, however, it is not recommended"
2016-10-02 10:16:48 +00:00
echo "::: To do so, pass the argument '--i_do_not_follow_recommendations' to the install script"
echo "::: eg. curl -L https://install.pi-hole.net | bash /dev/stdin --i_do_not_follow_recommendations"
2016-10-02 10:09:14 +00:00
exit 1
2016-08-12 11:44:45 +00:00
# - Insufficient free disk space
2016-10-02 09:39:09 +00:00
elif [ [ ${ existing_free_kilobytes } -lt ${ required_free_kilobytes } ] ] ; then
2016-10-02 10:09:14 +00:00
echo "::: Insufficient Disk Space!"
echo " ::: Your system appears to be low on disk space. pi-hole recommends a minimum of $required_free_kilobytes KiloBytes. "
echo " ::: You only have $existing_free_kilobytes KiloBytes free. "
echo "::: If this is a new install you may need to expand your disk."
echo "::: Try running 'sudo raspi-config', and choose the 'expand file system option'"
echo "::: After rebooting, run this installation again. (curl -L https://install.pi-hole.net | bash)"
2016-08-12 11:44:45 +00:00
2016-04-03 22:25:48 +00:00
echo "Insufficient free space, exiting..."
exit 1
2016-08-12 11:44:45 +00:00
2016-04-03 22:25:48 +00:00
fi
2016-08-12 11:44:45 +00:00
2016-02-10 15:34:06 +00:00
}
2016-01-27 06:11:38 +00:00
chooseInterface( ) {
2016-04-03 22:25:48 +00:00
# Turn the available interfaces into an array so it can be used with a whiptail dialog
interfacesArray = ( )
2016-08-19 21:31:11 +00:00
firstLoop = 1
2016-04-03 22:25:48 +00:00
while read -r line
do
mode = "OFF"
2016-08-19 21:31:11 +00:00
if [ [ ${ firstLoop } -eq 1 ] ] ; then
firstLoop = 0
2016-04-03 22:25:48 +00:00
mode = "ON"
fi
interfacesArray += ( " $line " "available" " $mode " )
done <<< " $availableInterfaces "
# Find out how many interfaces are available to choose from
interfaceCount = $( echo " $availableInterfaces " | wc -l)
2016-09-19 21:17:58 +00:00
chooseInterfaceCmd = ( whiptail --separate-output --radiolist "Choose An Interface (press space to select)" ${ r } ${ c } ${ interfaceCount } )
2016-04-03 22:25:48 +00:00
chooseInterfaceOptions = $( " ${ chooseInterfaceCmd [@] } " " ${ interfacesArray [@] } " 2>& 1 >/dev/tty)
if [ [ $? = 0 ] ] ; then
2016-08-19 21:31:11 +00:00
for desiredInterface in ${ chooseInterfaceOptions }
2016-04-03 22:25:48 +00:00
do
2016-08-19 21:31:11 +00:00
piholeInterface = ${ desiredInterface }
2016-04-03 22:25:48 +00:00
echo " ::: Using interface: $piholeInterface "
done
else
echo "::: Cancel selected, exiting...."
exit 1
fi
2016-03-06 05:16:23 +00:00
2015-11-10 00:33:32 +00:00
}
2016-01-27 06:11:38 +00:00
use4andor6( ) {
2016-04-03 22:25:48 +00:00
# Let use select IPv4 and/or IPv6
2016-08-19 21:31:11 +00:00
cmd = ( whiptail --separate-output --checklist "Select Protocols (press space to select)" ${ r } ${ c } 2)
2016-04-03 22:25:48 +00:00
options = ( IPv4 "Block ads over IPv4" on
IPv6 "Block ads over IPv6" off)
choices = $( " ${ cmd [@] } " " ${ options [@] } " 2>& 1 >/dev/tty)
if [ [ $? = 0 ] ] ; then
2016-08-19 21:31:11 +00:00
for choice in ${ choices }
2016-04-03 22:25:48 +00:00
do
2016-08-19 21:31:11 +00:00
case ${ choice } in
2016-04-03 22:25:48 +00:00
IPv4 ) useIPv4 = true; ;
IPv6 ) useIPv6 = true; ;
esac
done
2016-08-19 21:31:11 +00:00
if [ ${ useIPv4 } ] && [ ! ${ useIPv6 } ] ; then
2016-04-03 22:25:48 +00:00
getStaticIPv4Settings
setStaticIPv4
echo " ::: Using IPv4 on $IPv4addr "
echo "::: IPv6 will NOT be used."
fi
2016-08-19 21:31:11 +00:00
if [ ! ${ useIPv4 } ] && [ ${ useIPv6 } ] ; then
2016-04-03 22:25:48 +00:00
useIPv6dialog
echo "::: IPv4 will NOT be used."
echo " ::: Using IPv6 on $piholeIPv6 "
fi
2016-08-19 21:31:11 +00:00
if [ ${ useIPv4 } ] && [ ${ useIPv6 } ] ; then
2016-04-03 22:25:48 +00:00
getStaticIPv4Settings
setStaticIPv4
useIPv6dialog
echo " ::: Using IPv4 on $IPv4addr "
echo " ::: Using IPv6 on $piholeIPv6 "
fi
2016-08-19 21:31:11 +00:00
if [ ! ${ useIPv4 } ] && [ ! ${ useIPv6 } ] ; then
2016-04-03 22:25:48 +00:00
echo "::: Cannot continue, neither IPv4 or IPv6 selected"
echo "::: Exiting"
exit 1
fi
2016-09-16 22:09:14 +00:00
2016-04-03 22:25:48 +00:00
else
echo "::: Cancel selected. Exiting..."
exit 1
fi
2015-11-10 00:33:32 +00:00
}
2015-11-08 23:21:02 +00:00
2016-01-27 06:11:38 +00:00
useIPv6dialog( ) {
2016-04-03 22:25:48 +00:00
# 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) }' )
2016-08-19 21:31:11 +00:00
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" " $piholeIPv6 will be used to block ads. " ${ r } ${ c }
2016-01-23 00:13:16 +00:00
}
2015-11-08 23:21:02 +00:00
2016-01-27 06:11:38 +00:00
getStaticIPv4Settings( ) {
2016-04-03 22:25:48 +00:00
# Ask if the user wants to use DHCP settings as their static IP
if ( whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno " Do you want to use your current network settings as a static address?
IP address: $IPv4addr
2016-08-19 21:31:11 +00:00
Gateway: $IPv4gw " ${ r } ${ c } ); then
2016-04-03 22:25:48 +00:00
# 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.
2016-04-03 23:05:11 +00:00
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.
2016-08-19 21:31:11 +00:00
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." ${ r } ${ c }
2016-04-03 22:25:48 +00:00
# Nothing else to do since the variables are already set above
else
# Otherwise, we need to ask the user to input their desired settings.
# Start by getting the IPv4 address (pre-filling it with info gathered from DHCP)
# Start a loop to let the user enter their information with the chance to go back and edit it if necessary
2016-08-19 21:31:11 +00:00
until [ [ ${ ipSettingsCorrect } = True ] ]
2016-04-03 22:25:48 +00:00
do
# Ask for the IPv4 address
2016-08-19 21:31:11 +00:00
IPv4addr = $( whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${ r } ${ c } " $IPv4addr " 3>& 1 1>& 2 2>& 3)
2016-04-03 22:25:48 +00:00
if [ [ $? = 0 ] ] ; then
echo " ::: Your static IPv4 address: $IPv4addr "
# Ask for the gateway
2016-08-19 21:31:11 +00:00
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)
2016-04-03 22:25:48 +00:00
if [ [ $? = 0 ] ] ; then
echo " ::: Your static IPv4 gateway: $IPv4gw "
# Give the user a chance to review their settings before moving on
if ( whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno " Are these settings correct?
IP address: $IPv4addr
2016-08-19 21:31:11 +00:00
Gateway: $IPv4gw " ${ r } ${ c } ); then
2016-04-03 22:25:48 +00:00
# After that's done, the loop ends and we move on
ipSettingsCorrect = True
else
# If the settings are wrong, the loop continues
ipSettingsCorrect = False
fi
else
# Cancelling gateway settings window
ipSettingsCorrect = False
echo "::: Cancel selected. Exiting..."
exit 1
fi
else
# Cancelling IPv4 settings window
ipSettingsCorrect = False
echo "::: Cancel selected. Exiting..."
exit 1
fi
done
# End the if statement for DHCP vs. static
fi
2015-11-08 23:21:02 +00:00
}
2016-01-27 06:11:38 +00:00
setDHCPCD( ) {
2016-04-03 22:25:48 +00:00
# Append these lines to dhcpcd.conf to enable a static IP
2016-07-15 17:27:40 +00:00
echo " ## interface $piholeInterface
2016-04-03 22:25:48 +00:00
static ip_address = $IPv4addr
static routers = $IPv4gw
2016-10-08 19:56:26 +00:00
static domain_name_servers = $IPv4gw " | tee -a /etc/dhcpcd.conf >/dev/null
2015-10-31 14:11:29 +00:00
}
2016-01-27 06:11:38 +00:00
setStaticIPv4( ) {
2016-06-12 04:08:18 +00:00
if [ [ -f /etc/dhcpcd.conf ] ] ; then
# Debian Family
if grep -q " $IPv4addr " /etc/dhcpcd.conf; then
echo "::: Static IP already configured"
else
setDHCPCD
2016-10-08 19:56:26 +00:00
ip addr replace dev " $piholeInterface " " $IPv4addr "
2016-06-12 04:08:18 +00:00
echo ":::"
echo " ::: Setting IP to $IPv4addr . You may need to restart after the install is complete. "
echo ":::"
fi
2016-08-19 21:31:11 +00:00
elif [ [ -f /etc/sysconfig/network-scripts/ifcfg-${ piholeInterface } ] ] ; then
2016-06-12 04:08:18 +00:00
# Fedora Family
2016-08-19 21:31:11 +00:00
IFCFG_FILE = /etc/sysconfig/network-scripts/ifcfg-${ piholeInterface }
if grep -q " $IPv4addr " ${ IFCFG_FILE } ; then
2016-06-12 04:08:18 +00:00
echo "::: Static IP already configured"
else
2016-08-19 21:31:11 +00:00
IPADDR = $( echo ${ IPv4addr } | cut -f1 -d/)
CIDR = $( echo ${ IPv4addr } | cut -f2 -d/)
2016-06-12 04:08:18 +00:00
# Backup existing interface configuration:
2016-08-19 21:31:11 +00:00
cp ${ IFCFG_FILE } ${ IFCFG_FILE } .backup-$( date +%Y-%m-%d-%H%M%S)
2016-06-12 04:08:18 +00:00
# Build Interface configuration file:
2016-10-08 19:56:26 +00:00
echo "# Configured via Pi-Hole installer" > ${ IFCFG_FILE }
echo " DEVICE= $piholeInterface " >> ${ IFCFG_FILE }
echo "BOOTPROTO=none" >> ${ IFCFG_FILE }
echo "ONBOOT=yes" >> ${ IFCFG_FILE }
echo " IPADDR= $IPADDR " >> ${ IFCFG_FILE }
echo " PREFIX= $CIDR " >> ${ IFCFG_FILE }
echo " GATEWAY= $IPv4gw " >> ${ IFCFG_FILE }
echo " DNS1= $piholeDNS1 " >> ${ IFCFG_FILE }
echo " DNS2= $piholeDNS2 " >> ${ IFCFG_FILE }
echo "USERCTL=no" >> ${ IFCFG_FILE }
ip addr replace dev " $piholeInterface " " $IPv4addr "
2016-06-12 04:08:18 +00:00
if [ -x " $( command -v nmcli) " ] ; then
# Tell NetworkManager to read our new sysconfig file
2016-10-08 19:56:26 +00:00
nmcli con load ${ IFCFG_FILE } > /dev/null
2016-06-12 04:08:18 +00:00
fi
echo ":::"
echo " ::: Setting IP to $IPv4addr . You may need to restart after the install is complete. "
echo ":::"
fi
2016-04-03 22:25:48 +00:00
else
2016-06-12 04:08:18 +00:00
echo "::: Warning: Unable to locate configuration file to set static IPv4 address!"
exit 1
2016-04-03 22:25:48 +00:00
fi
2015-12-06 10:40:30 +00:00
}
2016-02-20 17:33:20 +00:00
function valid_ip( )
{
2016-04-03 22:25:48 +00:00
local ip = $1
local stat = 1
2016-08-19 21:31:11 +00:00
if [ [ ${ ip } = ~ ^[ 0-9] { 1,3} \. [ 0-9] { 1,3} \. [ 0-9] { 1,3} \. [ 0-9] { 1,3} $ ] ] ; then
2016-04-03 22:25:48 +00:00
OIFS = $IFS
IFS = '.'
2016-08-19 21:31:11 +00:00
ip = ( ${ ip } )
IFS = ${ OIFS }
2016-04-03 22:25:48 +00:00
[ [ ${ ip [0] } -le 255 && ${ ip [1] } -le 255 \
&& ${ ip [2] } -le 255 && ${ ip [3] } -le 255 ] ]
stat = $?
fi
2016-08-19 21:31:11 +00:00
return ${ stat }
2016-02-20 17:33:20 +00:00
}
2016-01-25 05:11:00 +00:00
setDNS( ) {
2016-08-19 21:31:11 +00:00
DNSChoseCmd = ( whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." ${ r } ${ c } 6)
2016-04-03 22:25:48 +00:00
DNSChooseOptions = ( Google "" on
OpenDNS "" off
Level3 "" off
Norton "" off
Comodo "" off
Custom "" off)
DNSchoices = $( " ${ DNSChoseCmd [@] } " " ${ DNSChooseOptions [@] } " 2>& 1 >/dev/tty)
if [ [ $? = 0 ] ] ; then
2016-08-19 21:31:11 +00:00
case ${ DNSchoices } in
Google)
echo "::: Using Google DNS servers."
piholeDNS1 = "8.8.8.8"
piholeDNS2 = "8.8.4.4"
; ;
OpenDNS)
echo "::: Using OpenDNS servers."
piholeDNS1 = "208.67.222.222"
piholeDNS2 = "208.67.220.220"
; ;
Level3)
echo "::: Using Level3 servers."
piholeDNS1 = "4.2.2.1"
piholeDNS2 = "4.2.2.2"
; ;
Norton)
echo "::: Using Norton ConnectSafe servers."
piholeDNS1 = "199.85.126.10"
piholeDNS2 = "199.85.127.10"
; ;
Comodo)
echo "::: Using Comodo Secure servers."
piholeDNS1 = "8.26.56.26"
piholeDNS2 = "8.20.247.20"
; ;
Custom)
until [ [ ${ DNSSettingsCorrect } = True ] ]
do
strInvalid = "Invalid"
if [ ! ${ piholeDNS1 } ] ; then
if [ ! ${ piholeDNS2 } ] ; then
prePopulate = ""
else
prePopulate = " , $piholeDNS2 "
fi
elif [ ${ piholeDNS1 } ] && [ ! ${ piholeDNS2 } ] ; then
prePopulate = " $piholeDNS1 "
elif [ ${ piholeDNS1 } ] && [ ${ piholeDNS2 } ] ; then
prePopulate = " $piholeDNS1 , $piholeDNS2 "
fi
piholeDNS = $( whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\n\nFor example '8.8.8.8, 8.8.4.4'" ${ r } ${ c } " $prePopulate " 3>& 1 1>& 2 2>& 3)
if [ [ $? = 0 ] ] ; then
piholeDNS1 = $( echo " $piholeDNS " | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}' )
piholeDNS2 = $( echo " $piholeDNS " | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}' )
if ! valid_ip " $piholeDNS1 " || [ ! " $piholeDNS1 " ] ; then
piholeDNS1 = ${ strInvalid }
fi
if ! valid_ip " $piholeDNS2 " && [ " $piholeDNS2 " ] ; then
piholeDNS2 = ${ strInvalid }
fi
else
echo "::: Cancel selected, exiting...."
exit 1
fi
if [ [ ${ piholeDNS1 } = = " $strInvalid " ] ] || [ [ ${ piholeDNS2 } = = " $strInvalid " ] ] ; then
whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" " One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $piholeDNS1 \n DNS Server 2: $piholeDNS2 " ${ r } ${ c }
if [ [ ${ piholeDNS1 } = = " $strInvalid " ] ] ; then
piholeDNS1 = ""
fi
if [ [ ${ piholeDNS2 } = = " $strInvalid " ] ] ; then
piholeDNS2 = ""
fi
DNSSettingsCorrect = False
else
if ( whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno " Are these settings correct?\n DNS Server 1: $piholeDNS1 \n DNS Server 2: $piholeDNS2 " ${ r } ${ c } ) ; then
DNSSettingsCorrect = True
else
# If the settings are wrong, the loop continues
DNSSettingsCorrect = False
fi
fi
done
; ;
esac
2016-04-03 22:25:48 +00:00
else
echo "::: Cancel selected. Exiting..."
exit 1
fi
2016-01-25 05:11:00 +00:00
}
2016-01-25 06:09:45 +00:00
versionCheckDNSmasq( ) {
2016-04-03 22:25:48 +00:00
# Check if /etc/dnsmasq.conf is from pihole. If so replace with an original and install new in .d directory
dnsFile1 = "/etc/dnsmasq.conf"
dnsFile2 = "/etc/dnsmasq.conf.orig"
dnsSearch = "addn-hosts=/etc/pihole/gravity.list"
defaultFile = "/etc/.pihole/advanced/dnsmasq.conf.original"
newFileToInstall = "/etc/.pihole/advanced/01-pihole.conf"
newFileFinalLocation = "/etc/dnsmasq.d/01-pihole.conf"
2016-08-19 21:31:11 +00:00
if [ -f ${ dnsFile1 } ] ; then
2016-04-03 22:25:48 +00:00
echo -n "::: Existing dnsmasq.conf found..."
2016-08-19 21:31:11 +00:00
if grep -q ${ dnsSearch } ${ dnsFile1 } ; then
2016-04-03 22:25:48 +00:00
echo " it is from a previous pi-hole install."
echo -n "::: Backing up dnsmasq.conf to dnsmasq.conf.orig..."
2016-10-08 19:56:26 +00:00
mv -f ${ dnsFile1 } ${ dnsFile2 }
2016-04-03 22:25:48 +00:00
echo " done."
echo -n "::: Restoring default dnsmasq.conf..."
2016-10-08 19:56:26 +00:00
cp ${ defaultFile } ${ dnsFile1 }
2016-04-03 22:25:48 +00:00
echo " done."
else
echo " it is not a pi-hole file, leaving alone!"
fi
else
echo -n "::: No dnsmasq.conf found.. restoring default dnsmasq.conf..."
2016-10-08 19:56:26 +00:00
cp ${ defaultFile } ${ dnsFile1 }
2016-04-03 22:25:48 +00:00
echo " done."
fi
echo -n "::: Copying 01-pihole.conf to /etc/dnsmasq.d/01-pihole.conf..."
2016-10-08 19:56:26 +00:00
cp ${ newFileToInstall } ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
echo " done."
2016-10-08 19:56:26 +00:00
sed -i " s/@INT@/ $piholeInterface / " ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
if [ [ " $piholeDNS1 " != "" ] ] ; then
2016-10-08 19:56:26 +00:00
sed -i " s/@DNS1@/ $piholeDNS1 / " ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
else
2016-10-08 19:56:26 +00:00
sed -i '/^server=@DNS1@/d' ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
fi
if [ [ " $piholeDNS2 " != "" ] ] ; then
2016-10-08 19:56:26 +00:00
sed -i " s/@DNS2@/ $piholeDNS2 / " ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
else
2016-10-08 19:56:26 +00:00
sed -i '/^server=@DNS2@/d' ${ newFileFinalLocation }
2016-04-03 22:25:48 +00:00
fi
2016-10-08 19:56:26 +00:00
sed -i 's/^#conf-dir=\/etc\/dnsmasq.d$/conf-dir=\/etc\/dnsmasq.d/' ${ dnsFile1 }
2016-01-25 05:04:02 +00:00
}
2016-01-27 06:11:38 +00:00
installScripts( ) {
2016-04-03 22:25:48 +00:00
# Install the scripts from /etc/.pihole to their various locations
2016-10-05 17:16:56 +00:00
echo ":::"
echo -n "::: Installing scripts to /opt/pihole..."
2016-10-08 19:56:26 +00:00
install -o " ${ USER } " -m755 -d /opt/pihole
2016-10-05 16:57:48 +00:00
cd /etc/.pihole/
2016-10-08 19:56:26 +00:00
install -o " ${ USER } " -Dm755 -t /opt/pihole/ gravity.sh
install -o " ${ USER } " -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh
install -o " ${ USER } " -Dm755 -t /usr/local/bin/ pihole
2016-10-05 17:19:47 +00:00
2016-10-08 19:56:26 +00:00
install -Dm644 ./advanced/bash-completion/pihole /etc/bash_completion.d/pihole
2016-04-03 22:25:48 +00:00
. /etc/bash_completion.d/pihole
#Tidy up /usr/local/bin directory if installing over previous install.
oldFiles = ( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug)
for i in " ${ oldFiles [@] } " ; do
if [ -f " /usr/local/bin/ $i .sh " ] ; then
2016-10-08 19:56:26 +00:00
rm /usr/local/bin/" $i " .sh
2016-04-03 22:25:48 +00:00
fi
done
2016-10-05 17:16:56 +00:00
echo " done."
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
installConfigs( ) {
2016-04-03 22:25:48 +00:00
# Install the configs from /etc/.pihole to their various locations
2016-10-05 17:46:10 +00:00
echo ":::"
echo "::: Installing configs..."
2016-04-03 22:25:48 +00:00
versionCheckDNSmasq
if [ ! -d "/etc/lighttpd" ] ; then
2016-10-08 19:56:26 +00:00
mkdir /etc/lighttpd
chown " $USER " :root /etc/lighttpd
mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
2016-04-03 22:25:48 +00:00
fi
2016-10-08 19:56:26 +00:00
cp /etc/.pihole/advanced/${ LIGHTTPD_CFG } /etc/lighttpd/lighttpd.conf
mkdir -p /var/run/lighttpd
chown ${ LIGHTTPD_USER } :${ LIGHTTPD_GROUP } /var/run/lighttpd
mkdir -p /var/cache/lighttpd/compress
chown ${ LIGHTTPD_USER } :${ LIGHTTPD_GROUP } /var/cache/lighttpd/compress
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
stopServices( ) {
2016-04-03 22:25:48 +00:00
# Stop dnsmasq and lighttpd
2016-10-05 17:46:10 +00:00
echo ":::"
echo -n "::: Stopping services..."
2016-04-03 22:25:48 +00:00
#$SUDO service dnsmasq stop & spinner $! || true
2016-05-01 14:45:41 +00:00
if [ -x " $( command -v systemctl) " ] ; then
2016-10-08 19:56:26 +00:00
systemctl stop lighttpd & spinner $! || true
2016-05-01 14:45:41 +00:00
else
2016-10-08 19:56:26 +00:00
service lighttpd stop & spinner $! || true
2016-05-01 14:45:41 +00:00
fi
2016-10-05 17:46:10 +00:00
echo " done."
2015-12-03 17:25:13 +00:00
}
2016-10-10 05:05:06 +00:00
2016-10-10 05:00:23 +00:00
update_pacakge_cache( ) {
2016-04-03 22:25:48 +00:00
#Running apt-get update/upgrade with minimal output can cause some issues with
#requiring user input (e.g password for phpmyadmin see #218)
2016-10-10 05:00:23 +00:00
2016-04-03 22:25:48 +00:00
#Check to see if apt-get update has already been run today
2016-10-10 05:00:23 +00:00
#it needs to have been run at least once on new installs!
2016-08-19 21:31:11 +00:00
timestamp = $( stat -c %Y ${ PKG_CACHE } )
2016-04-03 22:25:48 +00:00
timestampAsDate = $( date -d @" $timestamp " "+%b %e" )
today = $( date "+%b %e" )
if [ ! " $today " = = " $timestampAsDate " ] ; then
#update package lists
echo ":::"
2016-04-26 04:51:00 +00:00
echo -n " ::: $PKG_MANAGER update has not been run today. Running now... "
2016-10-08 19:56:26 +00:00
${ UPDATE_PKG_CACHE } > /dev/null 2>& 1
2016-04-03 22:25:48 +00:00
echo " done!"
fi
2016-10-10 05:00:23 +00:00
}
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.
2016-04-03 22:25:48 +00:00
echo ":::"
2016-05-01 06:27:46 +00:00
echo -n " ::: Checking $PKG_MANAGER for upgraded packages.... "
2016-10-08 19:56:26 +00:00
updatesToInstall = $( eval " ${ PKG_COUNT } " )
2016-05-01 06:27:46 +00:00
echo " done!"
2016-05-01 23:46:15 +00:00
echo ":::"
2016-08-19 21:31:11 +00:00
if [ [ ${ updatesToInstall } -eq "0" ] ] ; then
2016-10-10 05:00:23 +00:00
echo "::: Your system is up to date! Continuing with Pi-hole installation..."
2016-05-01 23:46:15 +00:00
else
2016-10-10 05:00:23 +00:00
echo " ::: There are $updatesToInstall updates available for your system! "
2016-05-01 06:27:46 +00:00
echo " ::: We recommend you run ' $PKG_UPDATE ' after installing Pi-Hole! "
2016-04-03 22:25:48 +00:00
echo ":::"
2016-05-01 23:46:15 +00:00
fi
2016-10-10 05:00:23 +00:00
}
2016-10-10 05:05:06 +00:00
install_dependent_packages( ) {
2016-10-10 05:24:13 +00:00
# Install packages passed in via argument array
2016-10-10 05:05:06 +00:00
declare -a argArray1 = ( " ${ !1 } " )
for i in " ${ argArray1 [@] } " ; do
2016-04-03 22:25:48 +00:00
echo -n " ::: Checking for $i ... "
2016-10-10 05:24:13 +00:00
package_check_install ${ i } > /dev/null
2016-10-10 04:44:45 +00:00
echo " installed!"
2016-04-03 22:25:48 +00:00
done
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
getGitFiles( ) {
2016-10-10 07:02:50 +00:00
# Setup git repos for directory and repository passed
# as arguments 1 and 2
2016-04-03 22:25:48 +00:00
echo ":::"
2016-10-10 08:04:03 +00:00
echo "::: Checking for existing repository..."
if is_repo " ${ 1 } " ; then
update_repo " ${ 1 } "
2016-04-03 22:25:48 +00:00
else
2016-10-10 08:04:03 +00:00
make_repo " ${ 1 } " " ${ 2 } "
2016-10-10 06:53:18 +00:00
fi
2015-12-03 17:25:13 +00:00
}
2016-01-24 03:31:12 +00:00
is_repo( ) {
2016-10-10 08:04:03 +00:00
# Use git to check if directory is currently under VCS
2016-04-03 22:25:48 +00:00
echo -n " ::: Checking $1 is a repo... "
2016-10-10 08:04:03 +00:00
cd " ${ 1 } " || return 1
git status & > /dev/null && echo " OK!" ; return 0 || echo " not found!" ; return 1
2016-01-24 03:31:12 +00:00
}
make_repo( ) {
2016-01-27 06:11:38 +00:00
# Remove the non-repod interface and clone the interface
2016-01-24 16:33:53 +00:00
echo -n " ::: Cloning $2 into $1 ... "
2016-10-10 08:04:03 +00:00
rm -rf " ${ 1 } "
git clone -q --depth 1 " ${ 2 } " " ${ 1 } " > /dev/null & spinner $!
2016-01-24 16:33:53 +00:00
echo " done!"
2016-01-24 03:31:12 +00:00
}
update_repo( ) {
2016-01-27 06:11:38 +00:00
# Pull the latest commits
2016-01-24 16:33:53 +00:00
echo -n " ::: Updating repo in $1 ... "
2016-10-10 08:04:03 +00:00
cd " ${ 1 } " || exit 1
2016-10-08 19:56:26 +00:00
git pull -q > /dev/null & spinner $!
2016-01-24 16:33:53 +00:00
echo " done!"
2016-01-24 03:31:12 +00:00
}
2016-01-27 06:11:38 +00:00
CreateLogFile( ) {
2016-04-03 22:25:48 +00:00
# Create logfiles if necessary
echo ":::"
2016-10-08 19:56:26 +00:00
echo -n "::: Creating log file and changing owner to dnsmasq..."
2016-04-03 22:25:48 +00:00
if [ ! -f /var/log/pihole.log ] ; then
2016-10-08 19:56:26 +00:00
touch /var/log/pihole.log
chmod 644 /var/log/pihole.log
chown dnsmasq:root /var/log/pihole.log
echo " done!"
2016-04-03 22:25:48 +00:00
else
2016-10-08 19:56:26 +00:00
echo " already exists!"
2016-04-03 22:25:48 +00:00
fi
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
installPiholeWeb( ) {
2016-04-03 22:25:48 +00:00
# Install the web interface
2016-10-08 19:56:26 +00:00
echo ":::"
echo -n "::: Installing pihole custom index page..."
2016-04-03 22:25:48 +00:00
if [ -d "/var/www/html/pihole" ] ; then
2016-10-08 19:56:26 +00:00
echo " Existing page detected, not overwriting"
2016-04-03 22:25:48 +00:00
else
2016-10-08 19:56:26 +00:00
mkdir /var/www/html/pihole
2016-04-03 22:25:48 +00:00
if [ -f /var/www/html/index.lighttpd.html ] ; then
2016-10-08 19:56:26 +00:00
mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig
2016-04-03 22:25:48 +00:00
else
printf "\n:::\tNo default index.lighttpd.html file found... not backing up"
fi
2016-10-08 19:56:26 +00:00
cp /etc/.pihole/advanced/index.* /var/www/html/pihole/.
echo " done!"
2016-04-03 22:25:48 +00:00
fi
2016-04-18 03:03:12 +00:00
# Install Sudoer file
echo -n "::: Installing sudoer file..."
2016-10-08 19:56:26 +00:00
mkdir -p /etc/sudoers.d/
cp /etc/.pihole/advanced/pihole.sudo /etc/sudoers.d/pihole
chmod 0440 /etc/sudoers.d/pihole
2016-04-18 03:03:12 +00:00
echo " done!"
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
installCron( ) {
2016-04-03 22:25:48 +00:00
# Install the cron job
2016-10-08 19:56:26 +00:00
echo ":::"
echo -n "::: Installing latest Cron script..."
cp /etc/.pihole/advanced/pihole.cron /etc/cron.d/pihole
echo " done!"
2015-12-03 17:25:13 +00:00
}
2016-01-27 06:11:38 +00:00
runGravity( ) {
2016-10-10 05:38:00 +00:00
# Run gravity.sh to build blacklists
2016-10-08 19:56:26 +00:00
echo ":::"
echo "::: Preparing to run gravity.sh to refresh hosts..."
2016-04-03 22:25:48 +00:00
if ls /etc/pihole/list* 1> /dev/null 2>& 1; then
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
2016-10-08 19:56:26 +00:00
rm /etc/pihole/list.*
2016-04-03 22:25:48 +00:00
fi
echo "::: Running gravity.sh"
2016-10-08 19:56:26 +00:00
/opt/pihole/gravity.sh
2016-01-19 22:52:29 +00:00
}
2016-01-25 05:28:53 +00:00
setUser( ) {
2016-04-03 22:25:48 +00:00
# Check if user pihole exists and create if not
echo "::: Checking if user 'pihole' exists..."
if id -u pihole > /dev/null 2>& 1; then
echo "::: User 'pihole' already exists"
else
echo "::: User 'pihole' doesn't exist. Creating..."
2016-10-08 19:56:26 +00:00
useradd -r -s /usr/sbin/nologin pihole
2016-04-03 22:25:48 +00:00
fi
2016-01-25 05:28:53 +00:00
}
2016-01-20 23:34:18 +00:00
2016-05-14 23:05:40 +00:00
configureFirewall( ) {
# Allow HTTP and DNS traffic
if [ -x " $( command -v firewall-cmd) " ] ; then
2016-10-08 19:56:26 +00:00
firewall-cmd --state > /dev/null
2016-05-15 01:51:05 +00:00
if [ [ $? -eq 0 ] ] ; then
2016-10-08 19:56:26 +00:00
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
2016-05-15 01:51:05 +00:00
fi
2016-05-14 23:05:40 +00:00
elif [ -x " $( command -v iptables) " ] ; then
2016-10-08 19:56:26 +00:00
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 53 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
2016-05-14 23:05:40 +00:00
else
2016-10-08 19:56:26 +00:00
echo "::: No firewall detected.. skipping firewall configuration."
2016-05-14 23:05:40 +00:00
fi
}
2016-08-26 21:45:38 +00:00
finalExports( ) {
#If it already exists, lets overwrite it with the new values.
if [ [ -f ${ setupVars } ] ] ; then
2016-10-08 19:56:26 +00:00
rm ${ setupVars }
2016-08-26 21:45:38 +00:00
fi
2016-10-08 19:56:26 +00:00
echo " piholeInterface= ${ piholeInterface } " >> ${ setupVars }
echo " IPv4addr= ${ IPv4addr } " >> ${ setupVars }
echo " piholeIPv6= ${ piholeIPv6 } " >> ${ setupVars }
echo " piholeDNS1= ${ piholeDNS1 } " >> ${ setupVars }
echo " piholeDNS2= ${ piholeDNS2 } " >> ${ setupVars }
2015-11-07 18:07:50 +00:00
}
2016-08-26 21:45:38 +00:00
2016-08-19 21:45:24 +00:00
installPihole( ) {
# Install base files and web interface
stopServices
setUser
if [ ! -d "/var/www/html" ] ; then
2016-10-08 19:56:26 +00:00
mkdir -p /var/www/html
2016-08-19 21:45:24 +00:00
fi
2016-10-08 19:56:26 +00:00
chown ${ LIGHTTPD_USER } :${ LIGHTTPD_GROUP } /var/www/html
chmod 775 /var/www/html
usermod -a -G ${ LIGHTTPD_GROUP } pihole
2016-08-19 21:45:24 +00:00
if [ -x " $( command -v lighty-enable-mod) " ] ; then
2016-10-10 06:53:18 +00:00
lighty-enable-mod fastcgi fastcgi-php > /dev/null || true
2016-08-19 21:45:24 +00:00
else
printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n"
fi
installScripts
installConfigs
CreateLogFile
configureSelinux
installPiholeWeb
installCron
configureFirewall
2016-08-26 21:45:38 +00:00
finalExports
2016-10-08 19:58:42 +00:00
runGravity
2016-08-19 21:45:24 +00:00
}
updatePihole( ) {
# Install base files and web interface
stopServices
installScripts
installConfigs
CreateLogFile
configureSelinux
installPiholeWeb
installCron
configureFirewall
2016-10-08 19:58:42 +00:00
runGravity
2016-08-19 21:45:24 +00:00
}
2016-06-05 20:43:18 +00:00
configureSelinux( ) {
if [ -x " $( command -v getenforce) " ] ; then
printf "\n::: SELinux Detected\n"
printf ":::\tChecking for SELinux policy development packages..."
2016-10-10 04:44:45 +00:00
package_check_install "selinux-policy-devel" > /dev/null
echo " installed!"
2016-06-05 21:24:33 +00:00
printf "::: Enabling httpd server side includes (SSI).. "
2016-10-08 19:56:26 +00:00
setsebool -P httpd_ssi_exec on
2016-06-05 21:24:33 +00:00
if [ $? -eq 0 ] ; then
2016-09-08 02:06:36 +00:00
echo -n "Success"
2016-06-05 21:24:33 +00:00
fi
2016-09-08 02:06:36 +00:00
printf "\n:::\tCompiling Pi-Hole SELinux policy..\n"
2016-10-08 19:56:26 +00:00
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 -i /etc/pihole/pihole.pp
rm -f /etc/pihole/pihole.mod
semodule -l | grep pihole > /dev/null
2016-06-05 20:43:18 +00:00
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
2015-11-07 18:07:50 +00:00
}
2016-01-27 06:11:38 +00:00
displayFinalMessage( ) {
2016-04-03 22:25:48 +00:00
# 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:
2016-01-01 02:26:05 +00:00
2016-05-25 22:55:36 +00:00
IPv4: ${ IPv4addr %/* }
2016-04-03 23:05:11 +00:00
IPv6: $piholeIPv6
2016-01-01 02:26:05 +00:00
2016-04-03 23:05:11 +00:00
If you set a new IP address, you should restart the Pi.
2016-01-01 02:26:05 +00:00
2016-05-25 22:55:36 +00:00
The install log is in /etc/pihole.
2016-08-19 21:31:11 +00:00
View the web interface at http://pi.hole/admin or http://${ IPv4addr %/* } /admin" ${ r } ${ c }
}
2016-10-10 08:04:59 +00:00
update_dialogs( ) {
2016-08-19 21:31:11 +00:00
2016-10-10 08:04:03 +00:00
UpdateCmd = $( whiptail --title "Existing Install Detected!" --menu "We have detected an existing install.\n\n Please chose from the following options:" ${ r } ${ c } 2 \
"Update" "Update install will retain existing settings." \
"Install" "Install will allow you to enter new settings." 3>& 2 2>& 1 1>& 3)
2016-08-24 21:52:11 +00:00
if [ [ $? = 0 ] ] ; then
2016-10-10 08:04:03 +00:00
case ${ UpdateCmd } in
2016-08-24 21:52:11 +00:00
Update)
echo "::: Updating existing install"
useUpdateVars = true
; ;
Install)
echo "::: Running complete install script"
useUpdateVars = false
; ;
esac
else
echo "::: Cancel selected. Exiting..."
exit 1
fi
2016-08-19 21:31:11 +00:00
2016-01-01 02:26:05 +00:00
}
2016-10-08 19:17:04 +00:00
main( ) {
2016-08-21 16:57:11 +00:00
if [ [ -f ${ setupVars } ] ] ; then
. ${ setupVars }
2016-08-26 22:06:35 +00:00
if [ " $1 " = = "pihole" ] ; then
useUpdateVars = true
else
2016-10-10 08:04:59 +00:00
update_dialogs
2016-08-26 22:06:35 +00:00
fi
2016-08-19 21:31:11 +00:00
fi
2016-05-01 06:27:46 +00:00
2016-08-19 21:31:11 +00:00
# Start the installer
2016-10-02 09:33:04 +00:00
# Verify there is enough disk space for the install
2016-10-07 10:36:34 +00:00
if [ [ $1 = "--i_do_not_follow_recommendations" ] ] ; then
2016-10-07 12:09:27 +00:00
echo "::: --i_do_not_follow_recommendations passed to script"
2016-10-02 10:16:48 +00:00
echo "::: skipping free disk space verification!"
2016-10-02 10:09:14 +00:00
else
verifyFreeDiskSpace
fi
2016-10-10 05:00:23 +00:00
# Update package cache
update_pacakge_cache
# Notify user of package availability
notify_package_updates_available
2016-05-01 06:27:46 +00:00
# Install packages used by this installation script
2016-10-10 05:05:06 +00:00
install_dependent_packages INSTALLER_DEPS[ @]
2016-05-01 06:27:46 +00:00
2016-08-19 21:31:11 +00:00
if [ [ ${ useUpdateVars } = = false ] ] ; then
2016-10-10 07:02:50 +00:00
# Display welcome dialogs
2016-08-19 21:31:11 +00:00
welcomeDialogs
2016-10-10 07:02:50 +00:00
# Create directory for Pi-hole storage
2016-10-08 19:56:26 +00:00
mkdir -p /etc/pihole/
2016-10-10 07:02:50 +00:00
# Get Git files for Core and Admin
getGitFiles ${ piholeFilesDir } ${ piholeGitUrl }
getGitFiles ${ webInterfaceDir } ${ webInterfaceGitUrl }
2016-08-19 21:31:11 +00:00
# Find IP used to route to outside world
findIPRoute
# Find interfaces and let the user choose one
chooseInterface
# Let the user decide if they want to block ads over IPv4 and/or IPv6
use4andor6
# Decide what upstream DNS Servers to use
setDNS
2016-10-10 05:24:13 +00:00
# Install packages used by the Pi-hole
install_dependent_packages PIHOLE_DEPS[ @]
2016-08-19 21:31:11 +00:00
# Install and log everything to a file
installPihole | tee ${ tmpLog }
else
2016-08-19 21:45:24 +00:00
updatePihole | tee ${ tmpLog }
2016-08-19 21:31:11 +00:00
fi
2016-02-10 15:34:06 +00:00
2015-11-07 18:07:50 +00:00
# Move the log file into /etc/pihole for storage
2016-10-08 19:56:26 +00:00
mv ${ tmpLog } ${ instalLogLoc }
2015-11-07 18:35:08 +00:00
2016-08-21 17:00:41 +00:00
if [ [ ${ useUpdateVars } = = false ] ] ; then
displayFinalMessage
fi
2015-11-07 19:09:23 +00:00
2016-02-06 13:02:21 +00:00
echo -n "::: Restarting services..."
2016-01-27 06:11:38 +00:00
# Start services
2016-05-01 14:45:41 +00:00
if [ -x " $( command -v systemctl) " ] ; then
2016-10-08 19:56:26 +00:00
systemctl enable dnsmasq
systemctl restart dnsmasq
systemctl enable lighttpd
systemctl start lighttpd
2016-05-01 14:45:41 +00:00
else
2016-10-08 19:56:26 +00:00
service dnsmasq restart
service lighttpd start
2016-05-01 14:45:41 +00:00
fi
2016-02-06 13:02:21 +00:00
echo " done."
echo ":::"
2016-08-21 17:00:41 +00:00
if [ [ ${ useUpdateVars } = = false ] ] ; then
echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:"
echo " ::: ${ IPv4addr %/* } "
echo " ::: $piholeIPv6 "
echo ":::"
echo "::: If you set a new IP address, you should restart the Pi."
else
echo "::: Update complete!"
fi
2016-05-25 22:55:36 +00:00
echo ":::"
2016-02-06 13:04:54 +00:00
echo "::: The install log is located at: /etc/pihole/install.log"
2016-05-25 22:55:36 +00:00
echo " ::: View the web interface at http://pi.hole/admin or http:// ${ IPv4addr %/* } /admin "
2016-10-08 19:17:04 +00:00
}
2016-10-10 02:41:32 +00:00
main " $@ "