merge fix

This commit is contained in:
Eric Warnke 2016-10-24 23:24:55 -04:00
commit acbdea8bd5
14 changed files with 1225 additions and 1253 deletions

View file

@ -1,23 +1,21 @@
_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._
**In raising this issue, I confirm the following (please check boxes, eg [X]):** **In raising this issue, I confirm the following (please check boxes, eg [X]):**
- [ ] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md). - [] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md).
- [ ] The issue I am reporting can be *replicated* - [] The issue I am reporting can be *replicated*
- [ ] The issue I'm reporting isn't a duplicate (see [FAQs](https://github.com/pi-hole/pi-hole/wiki/FAQs), [closed issues](https://github.com/pi-hole/pi-hole/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), and [open issues](https://github.com/pi-hole/pi-hole/issues)). - [] The issue I'm reporting isn't a duplicate (see [FAQs](https://github.com/pi-hole/pi-hole/wiki/FAQs), [closed issues](https://github.com/pi-hole/pi-hole/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), and [open issues](https://github.com/pi-hole/pi-hole/issues)).
**How familiar are you with the codebase?:** **How familiar are you with the codebase?:**
- [ ] 1 (very unfamiliar) - [] 1 (very unfamiliar)
- [ ] 2 - [] 2
- [ ] 3 - [] 3
- [ ] 4 - [] 4
- [ ] 5 - [] 5
- [ ] 6 - [] 6
- [ ] 7 - [] 7
- [ ] 8 - [] 8
- [ ] 9 - [] 9
- [ ] 10 (very familiar) - [] 10 (very familiar)
--- ---
**[FEATURE REQUEST | QUESTION | OTHER]:** **[FEATURE REQUEST | QUESTION | OTHER]:**
@ -40,3 +38,5 @@ _{replace this section with your content or delete if not a FEATURE REQUEST/QUES
**(Optional) Debug Log generated by `pihole -d`:** **(Optional) Debug Log generated by `pihole -d`:**
`http://termbin.com/<something>` `http://termbin.com/<something>`
_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._

View file

@ -1,25 +1,26 @@
_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._
**By submitting this pull request, I confirm the following (please check boxes, eg [X]):** **By submitting this pull request, I confirm the following (please check boxes, eg [X]):**
- [ ] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md). - [] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md).
- [ ] I have checked that [another pull request](https://github.com/pi-hole/pi-hole/pulls) for this purpose does not exist. - [] I have checked that [another pull request](https://github.com/pi-hole/pi-hole/pulls) for this purpose does not exist.
- [ ] I have considered, and confirmed that this submission will be valuable to others. - [] I have considered, and confirmed that this submission will be valuable to others.
- [ ] I accept that this submission may not be used, and the pull request closed at the will of the maintainer. - [] I accept that this submission may not be used, and the pull request closed at the will of the maintainer.
- [ ] I give this submission freely, and claim no ownership to its content. - [] I give this submission freely, and claim no ownership to its content.
**How familiar are you with the codebase?:** **How familiar are you with the codebase?:**
- [ ] 1 (very unfamiliar) - [] 1 (very unfamiliar)
- [ ] 2 - [] 2
- [ ] 3 - [] 3
- [ ] 4 - [] 4
- [ ] 5 - [] 5
- [ ] 6 - [] 6
- [ ] 7 - [] 7
- [ ] 8 - [] 8
- [ ] 9 - [] 9
- [ ] 10 (very familiar) - [] 10 (very familiar)
--- ---
_{replace this line with your pull request content}_ _{replace this line with your pull request content}_
_This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._

View file

@ -47,119 +47,117 @@ domToRemoveList=()
piholeIPfile=/etc/pihole/piholeIP piholeIPfile=/etc/pihole/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6 piholeIPv6file=/etc/pihole/.useIPv6
if [[ -f ${piholeIPfile} ]];then if [[ -f ${piholeIPfile} ]]; then
# If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script # If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script
piholeIP=$(cat ${piholeIPfile}) piholeIP=$(cat ${piholeIPfile})
#rm $piholeIPfile #rm $piholeIPfile
else else
# Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script
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)}')
piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
piholeIP=${piholeIPCIDR%/*} piholeIP=${piholeIPCIDR%/*}
fi fi
modifyHost=false modifyHost=false
# After setting defaults, check if there's local overrides # After setting defaults, check if there's local overrides
if [[ -r ${piholeDir}/pihole.conf ]];then if [[ -r ${piholeDir}/pihole.conf ]]; then
echo "::: Local calibration requested..." echo "::: Local calibration requested..."
. ${piholeDir}/pihole.conf . ${piholeDir}/pihole.conf
fi fi
if [[ -f ${piholeIPv6file} ]];then if [[ -f ${piholeIPv6file} ]]; then
# If the file exists, then the user previously chose to use IPv6 in the automated installer # If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi fi
HandleOther() { HandleOther() {
#check validity of domain #check validity of domain
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') validDomain=$(echo "${1}" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
if [ -z "$validDomain" ]; then if [ -z "${validDomain}" ]; then
echo "::: $1 is not a valid argument or domain name" echo "::: ${1} is not a valid argument or domain name"
else else
domList=("${domList[@]}" ${validDomain}) domList=("${domList[@]}" ${validDomain})
fi fi
} }
PopBlacklistFile() { PopBlacklistFile() {
#check blacklist file exists, and if not, create it #check blacklist file exists, and if not, create it
if [[ ! -f ${blacklist} ]];then if [[ ! -f ${blacklist} ]]; then
touch ${blacklist} touch ${blacklist}
fi fi
for dom in "${domList[@]}"; do for dom in "${domList[@]}"; do
if "$addmode"; then if "${addmode}"; then
AddDomain "$dom" AddDomain "${dom}"
else else
RemoveDomain "$dom" RemoveDomain "${dom}"
fi fi
done done
} }
AddDomain() { AddDomain() {
#| sed 's/\./\\./g' #| sed 's/\./\\./g'
bool=false bool=false
grep -Ex -q "$1" ${blacklist} || bool=true grep -Ex -q "$1" ${blacklist} || bool=true
if ${bool}; then if ${bool}; then
#domain not found in the blacklist file, add it! #domain not found in the blacklist file, add it!
if ${verbose}; then if ${verbose}; then
echo -n "::: Adding $1 to blacklist file..." echo -n "::: Adding $1 to blacklist file..."
fi fi
echo "$1" >> ${blacklist} echo "${1}" >> ${blacklist}
modifyHost=true modifyHost=true
echo " done!" echo " done!"
else else
if ${verbose}; then if ${verbose}; then
echo "::: $1 already exists in $blacklist! No need to add" echo "::: ${1} already exists in ${blacklist}! No need to add"
fi fi
fi fi
} }
RemoveDomain() { RemoveDomain() {
bool=false
bool=false grep -Ex -q "$1" ${blacklist} || bool=true
grep -Ex -q "$1" ${blacklist} || bool=true if ${bool}; then
if ${bool}; then #Domain is not in the blacklist file, no need to Remove
#Domain is not in the blacklist file, no need to Remove if ${verbose}; then
if ${verbose}; then echo "::: $1 is NOT blacklisted! No need to remove"
echo "::: $1 is NOT blacklisted! No need to remove" fi
fi else
else #Domain is in the blacklist file, add to a temporary array
#Domain is in the blacklist file, add to a temporary array if ${verbose}; then
if ${verbose}; then echo "::: Un-blacklisting ${dom}..."
echo "::: Un-blacklisting $dom..." fi
fi domToRemoveList=("${domToRemoveList[@]}" $1)
domToRemoveList=("${domToRemoveList[@]}" $1) modifyHost=true
modifyHost=true fi
fi
} }
ModifyHostFile() { ModifyHostFile() {
if ${addmode}; then if ${addmode}; then
#add domains to the hosts file #add domains to the hosts file
if [[ -r ${blacklist} ]];then if [[ -r ${blacklist} ]]; then
numberOf=$(cat ${blacklist} | sed '/^\s*$/d' | wc -l) numberOf=$(cat ${blacklist} | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s plural=; [[ "${numberOf}" != "1" ]] && plural=s
echo ":::" echo ":::"
echo -n "::: Modifying HOSTS file to blacklist $numberOf domain${plural}..." echo -n "::: Modifying HOSTS file to blacklist $numberOf domain${plural}..."
if [[ -n ${piholeIPv6} ]];then if [[ -n ${piholeIPv6} ]]; then
cat ${blacklist} | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${adList} cat ${blacklist} | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${adList}
else else
cat ${blacklist} | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList} cat ${blacklist} | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList}
fi fi
fi fi
else else
echo ":::" echo ":::"
for dom in "${domToRemoveList[@]}" for dom in "${domToRemoveList[@]}"; do
do #we need to remove the domains from the blacklist file and the host file
#we need to remove the domains from the blacklist file and the host file echo "::: ${dom}"
echo "::: $dom"
echo -n "::: removing from HOSTS file..." echo -n "::: removing from HOSTS file..."
echo "$dom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' ${adList} echo "${dom}" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' ${adList}
echo " done!" echo " done!"
echo -n "::: removing from blackist.txt..." echo -n "::: removing from blackist.txt..."
echo "$dom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist} echo "${dom}" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist}
echo " done!" echo " done!"
done done
fi fi
} }
@ -169,22 +167,22 @@ Reload() {
echo ":::" echo ":::"
echo -n "::: Refresh lists in dnsmasq..." echo -n "::: Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq) dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then if [[ ${dnsmasqPid} ]]; then
# service already running - reload config # service already running - reload config
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq systemctl restart dnsmasq
else else
service dnsmasq restart service dnsmasq restart
fi fi
else else
# service not running, start it up # service not running, start it up
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq systemctl start dnsmasq
else else
service dnsmasq start service dnsmasq start
fi fi
fi fi
echo " done!" echo " done!"
} }
@ -193,26 +191,24 @@ DisplayBlist() {
verbose=false verbose=false
echo -e " Displaying Gravity Affected Domains \n" echo -e " Displaying Gravity Affected Domains \n"
count=1 count=1
while IFS= read -r AD while IFS= read -r AD; do
do echo "${count}: ${AD}"
echo "${count}: $AD"
count=$((count+1)) count=$((count+1))
done < "$blacklist" done < "${blacklist}"
} }
################################################### ###################################################
for var in "$@" for var in "$@"; do
do case "$var" in
case "$var" in "-nr"| "--noreload" ) reload=false;;
"-nr"| "--noreload" ) reload=false;; "-d" | "--delmode" ) addmode=false;;
"-d" | "--delmode" ) addmode=false;; "-f" | "--force" ) force=true;;
"-f" | "--force" ) force=true;; "-q" | "--quiet" ) verbose=false;;
"-q" | "--quiet" ) verbose=false;; "-h" | "--help" ) helpFunc;;
"-h" | "--help" ) helpFunc;; "-l" | "--list" ) DisplayBlist;;
"-l" | "--list" ) DisplayBlist;; * ) HandleOther "$var";;
* ) HandleOther "$var";; esac
esac
done done
PopBlacklistFile PopBlacklistFile
@ -220,7 +216,7 @@ PopBlacklistFile
if ${modifyHost} || ${force}; then if ${modifyHost} || ${force}; then
ModifyHostFile ModifyHostFile
else else
if ${verbose}; then if ${verbose}; then
echo "::: No changes need to be made" echo "::: No changes need to be made"
fi fi
exit 1 exit 1

View file

@ -19,9 +19,9 @@ today=$(date "+%b %e")
CalcBlockedDomains() { CalcBlockedDomains() {
CheckIPv6 CheckIPv6
if [ -e "$gravity" ]; then if [ -e "${gravity}" ]; then
#Are we IPV6 or IPV4? #Are we IPV6 or IPV4?
if [[ -n ${piholeIPv6} ]];then if [[ -n ${piholeIPv6} ]]; then
#We are IPV6 #We are IPV6
blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1/2}') blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1/2}')
else else
@ -34,15 +34,15 @@ CalcBlockedDomains() {
} }
CalcQueriesToday() { CalcQueriesToday() {
if [ -e "$piLog" ];then if [ -e "${piLog}" ]; then
queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l) queriesToday=$(cat "${piLog}" | grep "${today}" | awk '/query/ {print $6}' | wc -l)
else else
queriesToday="Err." queriesToday="Err."
fi fi
} }
CalcblockedToday() { CalcblockedToday() {
if [ -e "$piLog" ] && [ -e "$gravity" ];then if [ -e "${piLog}" ] && [ -e "${gravity}" ];then
blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l) blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
else else
blockedToday="Err." blockedToday="Err."
@ -50,11 +50,11 @@ CalcblockedToday() {
} }
CalcPercentBlockedToday() { CalcPercentBlockedToday() {
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then if [ "${queriesToday}" != "Err." ] && [ "${blockedToday}" != "Err." ]; then
if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :) if [ "${queriesToday}" != 0 ]; then #Fixes divide by zero error :)
#scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros #scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros
percentBlockedToday=$(echo "scale=4; $blockedToday/$queriesToday*100" | bc) percentBlockedToday=$(echo "scale=4; ${blockedToday}/${queriesToday}*100" | bc)
percentBlockedToday=$(sed 's/.\{2\}$//' <<< "$percentBlockedToday") percentBlockedToday=$(sed 's/.\{2\}$//' <<< "${percentBlockedToday}")
else else
percentBlockedToday=0 percentBlockedToday=0
fi fi
@ -64,8 +64,8 @@ CalcPercentBlockedToday() {
CheckIPv6() { CheckIPv6() {
piholeIPv6file="/etc/pihole/.useIPv6" piholeIPv6file="/etc/pihole/.useIPv6"
if [[ -f ${piholeIPv6file} ]];then if [[ -f ${piholeIPv6file} ]];then
# If the file exists, then the user previously chose to use IPv6 in the automated installer # If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi fi
} }
@ -80,8 +80,7 @@ outputJSON() {
} }
normalChrono() { normalChrono() {
for (( ; ; )) for (( ; ; )); do
do
clear clear
# Displays a colorful Pi-hole logo # Displays a colorful Pi-hole logo
echo " ___ _ _ _" echo " ___ _ _ _"
@ -111,11 +110,11 @@ normalChrono() {
CalcBlockedDomains CalcBlockedDomains
echo "Blocking: $blockedDomainsTotal" echo "Blocking: ${blockedDomainsTotal}"
#below commented line does not add up to todaysQueryCount #below commented line does not add up to todaysQueryCount
#echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6" #echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6"
echo "Queries: $queriesToday" #same total calculation as dashboard echo "Queries: ${queriesToday}" #same total calculation as dashboard
echo "Pi-holed: $blockedToday ($percentBlockedToday%)" echo "Pi-holed: ${blockedToday} (${percentBlockedToday}%)"
sleep 5 sleep 5
done done
@ -139,11 +138,10 @@ if [[ $# = 0 ]]; then
normalChrono normalChrono
fi fi
for var in "$@" for var in "$@"; do
do case "$var" in
case "$var" in "-j" | "--json" ) outputJSON;;
"-j" | "--json" ) outputJSON;; "-h" | "--help" ) displayHelp;;
"-h" | "--help" ) displayHelp;; * ) exit 1;;
* ) exit 1;; esac
esac
done done

View file

@ -1,4 +1,4 @@
#/usr/bin/env bash #!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements # Pi-hole: A black hole for Internet advertisements
# (c) 2015, 2016 by Jacob Salmela # (c) 2015, 2016 by Jacob Salmela
# Network-wide ad blocking via your Raspberry Pi # Network-wide ad blocking via your Raspberry Pi
@ -36,286 +36,288 @@ cat << EOM
::: :::
EOM EOM
######## FIRST CHECK ########
# Must be root to debug
if [[ "$EUID" -eq 0 ]]; then
echo "::: Script is executing as root user..."
else
echo "::: Non-root user detected..."
# Check if sudo is actually installed
if [ -x "$(command -v sudo)" ]; then
export SUDO="sudo"
echo "::: sudo command located, debug will run under sudo."
else
echo "::: Unable to locate sudo command. Please install sudo or run this as root."
exit 1
fi
fi
# Ensure the file exists, create if not, clear if exists. # Ensure the file exists, create if not, clear if exists.
if [ ! -f "$DEBUG_LOG" ]; then if [ ! -f "${DEBUG_LOG}" ]; then
${SUDO} touch ${DEBUG_LOG} touch ${DEBUG_LOG}
${SUDO} chmod 644 ${DEBUG_LOG} chmod 644 ${DEBUG_LOG}
${SUDO} chown "$USER":root ${DEBUG_LOG} chown "$USER":root ${DEBUG_LOG}
else else
truncate -s 0 ${DEBUG_LOG} truncate -s 0 ${DEBUG_LOG}
fi fi
### Private functions exist here ### ### Private functions exist here ###
log_write() { log_write() {
echo "$1" >> "${DEBUG_LOG}" echo "${1}" >> "${DEBUG_LOG}"
} }
version_check() { version_check() {
log_write "############################################################" log_write "############################################################"
log_write "########## Installed Versions ##########" log_write "########## Installed Versions ##########"
log_write "############################################################" log_write "############################################################"
echo "::: Detecting Pi-hole installed versions." echo "::: Detecting Pi-hole installed versions."
pi_hole_ver="$(cd /etc/.pihole/ && git describe --tags --abbrev=0)" \ pi_hole_ver="$(cd /etc/.pihole/ && git describe --tags --abbrev=0)" \
&& log_write "Pi-hole Version: $pi_hole_ver" || log_write "Pi-hole git repository not detected." && log_write "Pi-hole Version: $pi_hole_ver" || log_write "Pi-hole git repository not detected."
admin_ver="$(cd /var/www/html/admin && git describe --tags --abbrev=0)" \ admin_ver="$(cd /var/www/html/admin && git describe --tags --abbrev=0)" \
&& log_write "WebUI Version: $admin_ver" || log_write "Pi-hole Admin Pages git repository not detected." && log_write "WebUI Version: $admin_ver" || log_write "Pi-hole Admin Pages git repository not detected."
echo "::: Writing lighttpd version to logfile." echo "::: Writing lighttpd version to logfile."
light_ver="$(lighttpd -v |& head -n1)" && log_write "${light_ver}" || log_write "lighttpd not installed." light_ver="$(lighttpd -v |& head -n1)" && log_write "${light_ver}" || log_write "lighttpd not installed."
echo "::: Writing PHP version to logfile." echo "::: Writing PHP version to logfile."
php_ver="$(php -v |& head -n1)" && log_write "${php_ver}" || log_write "PHP not installed." php_ver="$(php -v |& head -n1)" && log_write "${php_ver}" || log_write "PHP not installed."
}
files_check() {
log_write "############################################################"
log_write "########## Files Check ##########"
log_write "############################################################"
#Check existence of setupVars.conf, and source it to get configured network interface for later use in script.
echo -n "::: Detecting existence setupVars.conf..."
setupVars=/etc/pihole/setupVars.conf
if [[ -f ${setupVars} ]];then
echo " found!"
log_write "/etc/pihole/setupVars.conf exists! Contents:"
while read -r line; do
if [ ! -z "${line}" ]; then
[[ "${line}" =~ ^#.*$ ]] && continue
log_write "${line}"
fi
done < "${setupVars}"
log_write ""
. "${setupVars}"
if [[ -n "${piholeInterface}" ]]; then
# prepend % to the beginning of piholeInterface for later use
piholeInterface="%${piholeInterface}"
fi
else
echo " NOT FOUND!"
log_write "/etc/pihole/setupVars.conf not found!"
fi
} }
distro_check() { distro_check() {
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "######## Installed OS Distribution #########" >> ${DEBUG_LOG} log_write "######## Installed OS Distribution #########"
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "::: Checking installed OS Distribution release." echo "::: Checking installed OS Distribution release."
TMP=$(cat /etc/*release || echo "Failed to find release") TMP=$(cat /etc/*release || echo "Failed to find release")
echo "::: Writing OS Distribution release to logfile." echo "::: Writing OS Distribution release to logfile."
echo "$TMP" >> ${DEBUG_LOG} log_write "${TMP}"
echo >> ${DEBUG_LOG} log_write ""
} }
ip_check() { ip_check() {
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "######## IP Address Information #########" >> ${DEBUG_LOG} log_write "######## IP Address Information #########"
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "::: Writing local IPs to logfile" echo "::: Writing local IPs to logfile"
IPADDR="$(ip a | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "inet") print $(i+1) }')" IPADDR="$(ip a | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "inet") print $(i+1) }')"
echo "$IPADDR" >> ${DEBUG_LOG} log_write "${IPADDR}"
IP6ADDR="$(ip a | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "inet6") print $(i+1) }')" \ IP6ADDR="$(ip a | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "inet6") print $(i+1) }')" \
&& echo "$IP6ADDR" >> ${DEBUG_LOG} || echo "No IPv6 addresses found." >> ${DEBUG_LOG} && log_write "${IP6ADDR}" || log_write "No IPv6 addresses found."
echo >> ${DEBUG_LOG} log_write ""
echo "::: Locating default gateway and checking connectivity" echo "::: Locating default gateway and checking connectivity"
GATEWAY=$(ip r | grep default | cut -d ' ' -f 3) GATEWAY=$(ip r | grep default | cut -d ' ' -f 3)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then echo "::: Pinging default IPv4 gateway..."
echo "::: Pinging default IPv4 gateway..." GATEWAY_CHECK=$(ping -q -w 3 -c 3 -n "${GATEWAY}" | tail -n3)
GATEWAY_CHECK=$(ping -q -w 3 -c 3 -n "${GATEWAY}" | tail -n3) if [[ $? = 0 ]]; then
if [[ $? = 0 ]] log_write "IPv4 Gateway check:"
then else
echo "IPv4 Gateway check:" >> ${DEBUG_LOG} log_write "IPv4 Gateway check failed:"
else fi
echo "IPv4 Gateway check failed:" >> ${DEBUG_LOG} log_write "${GATEWAY_CHECK}"
fi log_write ""
echo "$GATEWAY_CHECK" >> ${DEBUG_LOG}
echo >> ${DEBUG_LOG}
echo "::: Pinging Internet via IPv4..." echo "::: Pinging Internet via IPv4..."
INET_CHECK=$(ping -q -w 5 -c 3 -n 8.8.8.8 | tail -n3) INET_CHECK=$(ping -q -w 5 -c 3 -n 8.8.8.8 | tail -n3)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then log_write "IPv4 Internet check:"
echo "IPv4 Internet check:" >> ${DEBUG_LOG} else
else log_write "IPv4 Internet check failed:"
echo "IPv4 Internet check failed:" >> ${DEBUG_LOG} fi
fi log_write "${INET_CHECK}"
echo "$INET_CHECK" >> ${DEBUG_LOG} log_write ""
echo >> ${DEBUG_LOG} fi
fi
GATEWAY6=$(ip -6 r | grep default | cut -d ' ' -f 3) GATEWAY6=$(ip -6 r | grep default | cut -d ' ' -f 3)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then echo "::: Pinging default IPv6 gateway..."
echo "::: Pinging default IPv6 gateway..." GATEWAY6_CHECK=$(ping6 -q -w 3 -c 3 -n "${GATEWAY6}""${piholeInterface}" | tail -n3)
GATEWAY6_CHECK=$(ping6 -q -w 3 -c 3 -n "${GATEWAY6}" | tail -n3) if [[ $? = 0 ]]; then
if [[ $? = 0 ]] log_write "IPv6 Gateway check:"
then else
echo "IPv6 Gateway check:" >> ${DEBUG_LOG} log_write "IPv6 Gateway check failed:"
else fi
echo "IPv6 Gateway check failed:" >> ${DEBUG_LOG}
fi
echo "::: Pinging Internet via IPv6..." echo "::: Pinging Internet via IPv6..."
GATEWAY6_CHECK=$(ping6 -q -w 3 -c 3 -n 2001:4860:4860::8888 | tail -n3) GATEWAY6_CHECK=$(ping6 -q -w 3 -c 3 -n 2001:4860:4860::8888"${piholeInterface}" | tail -n3)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then log_write "IPv6 Internet check:"
echo "IPv6 Internet check:" >> ${DEBUG_LOG} else
else log_write "IPv6 Internet check failed:"
echo "IPv6 Internet check failed:" >> ${DEBUG_LOG} fi
fi
else else
GATEWAY_CHECK="No IPv6 Gateway Detected" GATEWAY_CHECK="No IPv6 Gateway Detected"
fi fi
echo "$GATEWAY_CHECK" >> ${DEBUG_LOG} log_write "${GATEWAY_CHECK}"
echo >> ${DEBUG_LOG} log_write ""
} }
hostnameCheck() { hostnameCheck() {
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "######## Hostname Information #########" >> ${DEBUG_LOG} log_write "######## Hostname Information #########"
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "::: Writing locally configured hostnames to logfile" echo "::: Writing locally configured hostnames to logfile"
# Write the hostname output to compare against entries in /etc/hosts, which is logged next # Write the hostname output to compare against entries in /etc/hosts, which is logged next
echo "This Pi-hole is: $(hostname)" >> ${DEBUG_LOG} log_write "This Pi-hole is: $(hostname)"
echo "::: Writing hosts file to debug log..." echo "::: Writing hosts file to debug log..."
echo "### Hosts ###" >> ${DEBUG_LOG} log_write "### Hosts ###"
if [ -e "$HOSTSFILE" ] if [ -e "${HOSTSFILE}" ]; then
then cat "${HOSTSFILE}" >> ${DEBUG_LOG}
cat "$HOSTSFILE" >> ${DEBUG_LOG} log_write ""
echo >> ${DEBUG_LOG} else
else log_write "No hosts file found!"
echo "No hosts file found!" >> ${DEBUG_LOG} printf ":::\tNo hosts file found!\n"
printf ":::\tNo hosts file found!\n" fi
fi
} }
portCheck() { portCheck() {
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "######## Open Port Information #########" >> ${DEBUG_LOG} log_write "######## Open Port Information #########"
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "::: Detecting local server port 80 and 53 processes." echo "::: Detecting local server port 80 and 53 processes."
${SUDO} lsof -i :80 >> ${DEBUG_LOG} lsof -i :80 >> ${DEBUG_LOG}
${SUDO} lsof -i :53 >> ${DEBUG_LOG} lsof -i :53 >> ${DEBUG_LOG}
echo >> ${DEBUG_LOG} log_write ""
} }
testResolver() { testResolver() {
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
echo "############ Resolver Functions Check ############" >> ${DEBUG_LOG} log_write "############ Resolver Functions Check ############"
echo "############################################################" >> ${DEBUG_LOG} log_write "############################################################"
# Find a blocked url that has not been whitelisted. # Find a blocked url that has not been whitelisted.
TESTURL="doubleclick.com" TESTURL="doubleclick.com"
if [ -s "$WHITELISTMATCHES" ]; then if [ -s "${WHITELISTMATCHES}" ]; then
while read -r line; do while read -r line; do
CUTURL=${line#*" "} CUTURL=${line#*" "}
if [ "$CUTURL" != "Pi-Hole.IsWorking.OK" ]; then if [ "${CUTURL}" != "Pi-Hole.IsWorking.OK" ]; then
while read -r line2; do while read -r line2; do
CUTURL2=${line2#*" "} CUTURL2=${line2#*" "}
if [ "$CUTURL" != "$CUTURL2" ]; then if [ "${CUTURL}" != "${CUTURL2}" ]; then
TESTURL="$CUTURL" TESTURL="${CUTURL}"
break 2 break 2
fi fi
done < "$WHITELISTMATCHES" done < "${WHITELISTMATCHES}"
fi fi
done < "$GRAVITYFILE" done < "${GRAVITYFILE}"
fi fi
echo "Resolution of $TESTURL from Pi-hole:" >> ${DEBUG_LOG} log_write "Resolution of ${TESTURL} from Pi-hole:"
LOCALDIG=$(dig "$TESTURL" @127.0.0.1) LOCALDIG=$(dig "${TESTURL}" @127.0.0.1)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then log_write "${LOCALDIG}"
echo "$LOCALDIG" >> ${DEBUG_LOG}
else else
echo "Failed to resolve $TESTURL on Pi-hole" >> ${DEBUG_LOG} log_write "Failed to resolve ${TESTURL} on Pi-hole"
fi fi
echo >> ${DEBUG_LOG} log_write ""
echo "Resolution of $TESTURL from 8.8.8.8:" >> ${DEBUG_LOG} log_write "Resolution of ${TESTURL} from 8.8.8.8:"
REMOTEDIG=$(dig "$TESTURL" @8.8.8.8) REMOTEDIG=$(dig "${TESTURL}" @8.8.8.8)
if [[ $? = 0 ]] if [[ $? = 0 ]]; then
then log_write "${REMOTEDIG}"
echo "$REMOTEDIG" >> ${DEBUG_LOG}
else else
echo "Failed to resolve $TESTURL on 8.8.8.8" >> ${DEBUG_LOG} log_write "Failed to resolve ${TESTURL} on 8.8.8.8"
fi fi
echo >> ${DEBUG_LOG} log_write ""
echo "Pi-hole dnsmasq specific records lookups" >> ${DEBUG_LOG} log_write "Pi-hole dnsmasq specific records lookups"
echo "Cache Size:" >> ${DEBUG_LOG} log_write "Cache Size:"
dig +short chaos txt cachesize.bind >> ${DEBUG_LOG} dig +short chaos txt cachesize.bind >> ${DEBUG_LOG}
echo "Insertions count:" >> ${DEBUG_LOG} log_write "Insertions count:"
dig +short chaos txt insertions.bind >> ${DEBUG_LOG} dig +short chaos txt insertions.bind >> ${DEBUG_LOG}
echo "Evictions count:" >> ${DEBUG_LOG} log_write "Evictions count:"
dig +short chaos txt evictions.bind >> ${DEBUG_LOG} dig +short chaos txt evictions.bind >> ${DEBUG_LOG}
echo "Misses count:" >> ${DEBUG_LOG} log_write "Misses count:"
dig +short chaos txt misses.bind >> ${DEBUG_LOG} dig +short chaos txt misses.bind >> ${DEBUG_LOG}
echo "Hits count:" >> ${DEBUG_LOG} log_write "Hits count:"
dig +short chaos txt hits.bind >> ${DEBUG_LOG} dig +short chaos txt hits.bind >> ${DEBUG_LOG}
echo "Auth count:" >> ${DEBUG_LOG} log_write "Auth count:"
dig +short chaos txt auth.bind >> ${DEBUG_LOG} dig +short chaos txt auth.bind >> ${DEBUG_LOG}
echo "Upstream Servers:" >> ${DEBUG_LOG} log_write "Upstream Servers:"
dig +short chaos txt servers.bind >> ${DEBUG_LOG} dig +short chaos txt servers.bind >> ${DEBUG_LOG}
echo >> ${DEBUG_LOG} log_write ""
} }
checkProcesses() { checkProcesses() {
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "########### Processes Check ###########" >> ${DEBUG_LOG} log_write "########### Processes Check ###########"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo ":::" log_write ":::"
echo "::: Logging status of lighttpd and dnsmasq..." echo "::: Logging status of lighttpd and dnsmasq..."
PROCESSES=( lighttpd dnsmasq ) PROCESSES=( lighttpd dnsmasq )
for i in "${PROCESSES[@]}" for i in "${PROCESSES[@]}"; do
do log_write ""
echo "" >> ${DEBUG_LOG} log_write -n "${i}"
echo -n "$i" >> "$DEBUG_LOG" log_write " processes status:"
echo " processes status:" >> ${DEBUG_LOG} systemctl -l status "${i}" >> "${DEBUG_LOG}"
${SUDO} systemctl -l status "$i" >> "$DEBUG_LOG"
done done
echo >> ${DEBUG_LOG} log_write ""
} }
debugLighttpd() { debugLighttpd() {
echo "::: Writing lighttpd to debug log..." log_write "::: Writing lighttpd to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############ lighttpd.conf ############" >> ${DEBUG_LOG} log_write "############ lighttpd.conf ############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$LIGHTTPDFILE" ] if [ -e "${LIGHTTPDFILE}" ]; then
then
while read -r line; do while read -r line; do
if [ ! -z "$line" ]; then if [ ! -z "${line}" ]; then
[[ "$line" =~ ^#.*$ ]] && continue [[ "${line}" =~ ^#.*$ ]] && continue
echo "$line" >> ${DEBUG_LOG} log_write "${line}"
fi fi
done < "$LIGHTTPDFILE" done < "${LIGHTTPDFILE}"
echo >> ${DEBUG_LOG} log_write ""
else else
echo "No lighttpd.conf file found!" >> ${DEBUG_LOG} log_write "No lighttpd.conf file found!"
printf ":::\tNo lighttpd.conf file found\n" printf ":::\tNo lighttpd.conf file found\n"
fi fi
if [ -e "$LIGHTTPDERRFILE" ] if [ -e "${LIGHTTPDERRFILE}" ]; then
then log_write "#######################################"
echo "#######################################" >> ${DEBUG_LOG} log_write "######### lighttpd error.log ##########"
echo "######### lighttpd error.log ##########" >> ${DEBUG_LOG} log_write "#######################################"
echo "#######################################" >> ${DEBUG_LOG} cat "${LIGHTTPDERRFILE}" >> ${DEBUG_LOG}
cat "$LIGHTTPDERRFILE" >> ${DEBUG_LOG}
else else
echo "No lighttpd error.log file found!" >> ${DEBUG_LOG} log_write "No lighttpd error.log file found!"
printf ":::\tNo lighttpd error.log file found\n" printf ":::\tNo lighttpd error.log file found\n"
fi fi
echo >> ${DEBUG_LOG} log_write ""
} }
### END FUNCTIONS ### ### END FUNCTIONS ###
version_check version_check
files_check
distro_check distro_check
ip_check ip_check
hostnameCheck hostnameCheck
@ -325,98 +327,92 @@ testResolver
debugLighttpd debugLighttpd
echo "::: Writing dnsmasq.conf to debug log..." echo "::: Writing dnsmasq.conf to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############### Dnsmasq ###############" >> ${DEBUG_LOG} log_write "############### Dnsmasq ###############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$DNSMASQFILE" ] if [ -e "${DNSMASQFILE}" ]; then
then
#cat $DNSMASQFILE >> $DEBUG_LOG #cat $DNSMASQFILE >> $DEBUG_LOG
while read -r line; do while read -r line; do
if [ ! -z "$line" ]; then if [ ! -z "${line}" ]; then
[[ "$line" =~ ^#.*$ ]] && continue [[ "${line}" =~ ^#.*$ ]] && continue
echo "$line" >> ${DEBUG_LOG} log_write "${line}"
fi fi
done < "$DNSMASQFILE" done < "${DNSMASQFILE}"
echo >> ${DEBUG_LOG} log_write ""
else else
echo "No dnsmasq.conf file found!" >> ${DEBUG_LOG} log_write "No dnsmasq.conf file found!"
printf ":::\tNo dnsmasq.conf file found!\n" printf ":::\tNo dnsmasq.conf file found!\n"
fi fi
echo "::: Writing 01-pihole.conf to debug log..." echo "::: Writing 01-pihole.conf to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "########### 01-pihole.conf ############" >> ${DEBUG_LOG} log_write "########### 01-pihole.conf ############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$PIHOLECONFFILE" ] if [ -e "${PIHOLECONFFILE}" ]; then
then
while read -r line; do while read -r line; do
if [ ! -z "$line" ]; then if [ ! -z "${line}" ]; then
[[ "$line" =~ ^#.*$ ]] && continue [[ "${line}" =~ ^#.*$ ]] && continue
echo "$line" >> ${DEBUG_LOG} log_write "${line}"
fi fi
done < "$PIHOLECONFFILE" done < "${PIHOLECONFFILE}"
echo >> ${DEBUG_LOG} log_write
else else
echo "No 01-pihole.conf file found!" >> ${DEBUG_LOG} log_write "No 01-pihole.conf file found!"
printf ":::\tNo 01-pihole.conf file found\n" printf ":::\tNo 01-pihole.conf file found\n"
fi fi
echo "::: Writing size of gravity.list to debug log..." echo "::: Writing size of gravity.list to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############ gravity.list #############" >> ${DEBUG_LOG} log_write "############ gravity.list #############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$GRAVITYFILE" ] if [ -e "${GRAVITYFILE}" ]; then
then wc -l "${GRAVITYFILE}" >> ${DEBUG_LOG}
wc -l "$GRAVITYFILE" >> ${DEBUG_LOG} log_write ""
echo >> ${DEBUG_LOG}
else else
echo "No gravity.list file found!" >> ${DEBUG_LOG} log_write "No gravity.list file found!"
printf ":::\tNo gravity.list file found\n" printf ":::\tNo gravity.list file found\n"
fi fi
### Pi-hole application specific logging ### ### Pi-hole application specific logging ###
echo "::: Writing whitelist to debug log..." echo "::: Writing whitelist to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############## Whitelist ##############" >> ${DEBUG_LOG} log_write "############## Whitelist ##############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$WHITELISTFILE" ] if [ -e "${WHITELISTFILE}" ]; then
then cat "${WHITELISTFILE}" >> ${DEBUG_LOG}
cat "$WHITELISTFILE" >> ${DEBUG_LOG} log_write
echo >> ${DEBUG_LOG}
else else
echo "No whitelist.txt file found!" >> ${DEBUG_LOG} log_write "No whitelist.txt file found!"
printf ":::\tNo whitelist.txt file found!\n" printf ":::\tNo whitelist.txt file found!\n"
fi fi
echo "::: Writing blacklist to debug log..." echo "::: Writing blacklist to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############## Blacklist ##############" >> ${DEBUG_LOG} log_write "############## Blacklist ##############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$BLACKLISTFILE" ] if [ -e "${BLACKLISTFILE}" ]; then
then cat "${BLACKLISTFILE}" >> ${DEBUG_LOG}
cat "$BLACKLISTFILE" >> ${DEBUG_LOG} log_write
echo >> ${DEBUG_LOG}
else else
echo "No blacklist.txt file found!" >> ${DEBUG_LOG} log_write "No blacklist.txt file found!"
printf ":::\tNo blacklist.txt file found!\n" printf ":::\tNo blacklist.txt file found!\n"
fi fi
echo "::: Writing adlists.list to debug log..." echo "::: Writing adlists.list to debug log..."
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############ adlists.list #############" >> ${DEBUG_LOG} log_write "############ adlists.list #############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$ADLISTSFILE" ] if [ -e "${ADLISTSFILE}" ]; then
then while read -r line; do
while read -r line; do if [ ! -z "${line}" ]; then
if [ ! -z "$line" ]; then [[ "${line}" =~ ^#.*$ ]] && continue
[[ "$line" =~ ^#.*$ ]] && continue log_write "${line}"
echo "$line" >> ${DEBUG_LOG} fi
fi done < "${ADLISTSFILE}"
done < "$ADLISTSFILE" log_write
echo >> ${DEBUG_LOG}
else else
echo "No adlists.list file found... using adlists.default!" >> ${DEBUG_LOG} log_write "No adlists.list file found... using adlists.default!"
printf ":::\tNo adlists.list file found... using adlists.default!\n" printf ":::\tNo adlists.list file found... using adlists.default!\n"
fi fi
@ -425,42 +421,40 @@ fi
dumpPiHoleLog() { dumpPiHoleLog() {
trap '{ echo -e "\n::: Finishing debug write from interrupt... Quitting!" ; exit 1; }' INT trap '{ echo -e "\n::: Finishing debug write from interrupt... Quitting!" ; exit 1; }' INT
echo -e "::: Writing current Pi-hole traffic to debug log...\n:::\tTry loading any/all sites that you are having trouble with now... \n:::\t(Press ctrl+C to finish)" echo -e "::: Writing current Pi-hole traffic to debug log...\n:::\tTry loading any/all sites that you are having trouble with now... \n:::\t(Press ctrl+C to finish)"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
echo "############# pihole.log ##############" >> ${DEBUG_LOG} log_write "############# pihole.log ##############"
echo "#######################################" >> ${DEBUG_LOG} log_write "#######################################"
if [ -e "$PIHOLELOG" ] if [ -e "${PIHOLELOG}" ]; then
then
while true; do while true; do
tail -f "$PIHOLELOG" >> ${DEBUG_LOG} tail -f "${PIHOLELOG}" >> ${DEBUG_LOG}
echo >> ${DEBUG_LOG} log_write ""
done done
else else
echo "No pihole.log file found!" >> ${DEBUG_LOG} log_write "No pihole.log file found!"
printf ":::\tNo pihole.log file found!\n" printf ":::\tNo pihole.log file found!\n"
fi fi
} }
# Anything to be done after capturing of pihole.log terminates # Anything to be done after capturing of pihole.log terminates
finalWork() { finalWork() {
echo "::: Finshed debugging!" echo "::: Finshed debugging!"
echo "::: The debug log can be uploaded to Termbin.com for easier sharing." echo "::: The debug log can be uploaded to Termbin.com for easier sharing."
read -r -p "::: Would you like to upload the log? [y/N] " response read -r -p "::: Would you like to upload the log? [y/N] " response
case ${response} in case ${response} in
[yY][eE][sS]|[yY]) [yY][eE][sS]|[yY])
TERMBIN=$(cat /var/log/pihole_debug.log | nc termbin.com 9999) TERMBIN=$(cat /var/log/pihole_debug.log | nc termbin.com 9999)
;; ;;
*) *)
echo "::: Log will NOT be uploaded to Termbin." echo "::: Log will NOT be uploaded to Termbin."
;; ;;
esac esac
# Check if termbin.com is reachable. When it's not, point to local log instead # Check if termbin.com is reachable. When it's not, point to local log instead
if [ -n "$TERMBIN" ] if [ -n "${TERMBIN}" ]; then
then echo "::: Debug log can be found at : ${TERMBIN}"
echo "::: Debug log can be found at : $TERMBIN" else
else echo "::: Debug log can be found at : /var/log/pihole_debug.log"
echo "::: Debug log can be found at : /var/log/pihole_debug.log" fi
fi
} }
trap finalWork EXIT trap finalWork EXIT

View file

@ -15,28 +15,28 @@
# Borrowed from adafruit-pitft-helper < borrowed from raspi-config # Borrowed from adafruit-pitft-helper < borrowed from raspi-config
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334 # https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334
getInitSys() { getInitSys() {
if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
SYSTEMD=1 SYSTEMD=1
elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
SYSTEMD=0 SYSTEMD=0
else else
echo "Unrecognised init system" echo "Unrecognised init system"
return 1 return 1
fi fi
} }
# Borrowed from adafruit-pitft-helper: # Borrowed from adafruit-pitft-helper:
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L274-L285 # https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L274-L285
autoLoginPiToConsole() { autoLoginPiToConsole() {
if [ -e /etc/init.d/lightdm ]; then if [ -e /etc/init.d/lightdm ]; then
if [ ${SYSTEMD} -eq 1 ]; then if [ ${SYSTEMD} -eq 1 ]; then
systemctl set-default multi-user.target systemctl set-default multi-user.target
ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
else else
update-rc.d lightdm disable 2 update-rc.d lightdm disable 2
sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/" sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/"
fi fi
fi fi
} }
######### SCRIPT ########### ######### SCRIPT ###########

View file

@ -18,17 +18,17 @@ piholeGitUrl="https://github.com/pi-hole/pi-hole.git"
piholeFilesDir="/etc/.pihole" piholeFilesDir="/etc/.pihole"
spinner() { spinner() {
local pid=$1 local pid=${1}
local delay=0.50 local delay=0.50
local spinstr='/-\|' local spinstr='/-\|'
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do
local temp=${spinstr#?} local temp=${spinstr#?}
printf " [%c] " "$spinstr" printf " [%c] " "${spinstr}"
local spinstr=${temp}${spinstr%"$temp"} local spinstr=${temp}${spinstr%"$temp"}
sleep ${delay} sleep ${delay}
printf "\b\b\b\b\b\b" printf "\b\b\b\b\b\b"
done done
printf " \b\b\b\b" printf " \b\b\b\b"
} }
getGitFiles() { getGitFiles() {
@ -37,45 +37,45 @@ getGitFiles() {
echo ":::" echo ":::"
echo "::: Checking for existing repository..." echo "::: Checking for existing repository..."
if is_repo "${1}"; then if is_repo "${1}"; then
update_repo "${1}" update_repo "${1}"
else else
make_repo "${1}" "${2}" make_repo "${1}" "${2}"
fi fi
} }
is_repo() { is_repo() {
# Use git to check if directory is currently under VCS # Use git to check if directory is currently under VCS
echo -n "::: Checking $1 is a repo..." echo -n "::: Checking $1 is a repo..."
cd "${1}" &> /dev/null || return 1 cd "${1}" &> /dev/null || return 1
git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1 git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1
} }
make_repo() { make_repo() {
# Remove the non-repod interface and clone the interface # Remove the non-repod interface and clone the interface
echo -n "::: Cloning $2 into $1..." echo -n "::: Cloning $2 into $1..."
rm -rf "${1}" rm -rf "${1}"
git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $!
echo " done!" echo " done!"
} }
update_repo() { update_repo() {
# Pull the latest commits # Pull the latest commits
echo -n "::: Updating repo in $1..." echo -n "::: Updating repo in $1..."
cd "${1}" || exit 1 cd "${1}" || exit 1
git stash -q > /dev/null & spinner $! git stash -q > /dev/null & spinner $!
git pull -q > /dev/null & spinner $! git pull -q > /dev/null & spinner $!
echo " done!" echo " done!"
} }
if [ ! -d "/etc/.pihole" ]; then #This is unlikely if [ ! -d "/etc/.pihole" ]; then #This is unlikely
echo "::: Critical Error: Pi-Hole repo missing from system!" echo "::: Critical Error: Pi-Hole repo missing from system!"
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
exit 1; exit 1;
fi fi
if [ ! -d "/var/www/html/admin" ]; then #This is unlikely if [ ! -d "/var/www/html/admin" ]; then #This is unlikely
echo "::: Critical Error: Pi-Hole repo missing from system!" echo "::: Critical Error: Pi-Hole repo missing from system!"
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole" echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
exit 1; exit 1;
fi fi
echo "::: Checking for updates..." echo "::: Checking for updates..."
@ -105,40 +105,38 @@ echo ":::"
if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then if [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then
echo "::: Everything is up to date!" echo "::: Everything is up to date!"
echo "" echo ""
exit 0 exit 0
elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then elif [[ ${piholeVersion} == ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then
echo "::: Pi-hole Web Admin files out of date" echo "::: Pi-hole Web Admin files out of date"
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl}
echo ":::" echo ":::"
webVersion=$(pihole -v -a -c) webVersion=$(pihole -v -a -c)
echo "::: Web Admin version is now at ${webVersion}" echo "::: Web Admin version is now at ${webVersion}"
echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'" echo "::: If you had made any changes in '/var/www/html/admin', they have been stashed using 'git stash'"
echo "" echo ""
elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} == ${webVersionLatest} ]]; then
echo "::: Pi-hole core files out of date" echo "::: Pi-hole core files out of date"
getGitFiles ${piholeFilesDir} ${piholeGitUrl} getGitFiles ${piholeFilesDir} ${piholeGitUrl}
/etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended /etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended
echo ":::" echo ":::"
piholeVersion=$(pihole -v -p -c) piholeVersion=$(pihole -v -p -c)
echo "::: Pi-hole version is now at ${piholeVersion}" echo "::: Pi-hole version is now at ${piholeVersion}"
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
echo "" echo ""
elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then elif [[ ${piholeVersion} != ${piholeVersionLatest} && ${webVersion} != ${webVersionLatest} ]]; then
echo "::: Updating Everything" echo "::: Updating Everything"
getGitFiles ${piholeFilesDir} ${piholeGitUrl} getGitFiles ${piholeFilesDir} ${piholeGitUrl}
/etc/.pihole/automated\ install/basic-install.sh --unattended /etc/.pihole/automated\ install/basic-install.sh --unattended
webVersion=$(pihole -v -a -c) webVersion=$(pihole -v -a -c)
piholeVersion=$(pihole -v -p -c) piholeVersion=$(pihole -v -p -c)
echo ":::" echo ":::"
echo "::: Pi-hole version is now at ${piholeVersion}" echo "::: Pi-hole version is now at ${piholeVersion}"
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
echo ":::" echo ":::"
echo "::: Pi-hole version is now at ${piholeVersion}" echo "::: Pi-hole version is now at ${piholeVersion}"
echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'" echo "::: If you had made any changes in '/etc/.pihole', they have been stashed using 'git stash'"
echo "" echo ""
fi fi

View file

@ -15,60 +15,58 @@ latest=false
current=false current=false
normalOutput() { normalOutput() {
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" echo "::: Pi-hole version is ${piholeVersion} (Latest version is ${piholeVersionLatest})"
echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" echo "::: Web-Admin version is ${webVersion} (Latest version is ${webVersionLatest})"
} }
webOutput() { webOutput() {
for var in "$@" for var in "$@"; do
do case "${var}" in
case "$var" in "-l" | "--latest" ) latest=true;;
"-l" | "--latest" ) latest=true;; "-c" | "--current" ) current=true;;
"-c" | "--current" ) current=true;; * ) echo "::: Invalid Option!"; exit 1;
* ) echo "::: Invalid Option!"; exit 1; esac
esac done
done
if [[ "${latest}" == true && "${current}" == false ]]; then if [[ "${latest}" == true && "${current}" == false ]]; then
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
echo ${webVersionLatest} echo ${webVersionLatest}
elif [[ "${latest}" == false && "${current}" == true ]]; then elif [[ "${latest}" == false && "${current}" == true ]]; then
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
echo ${webVersion} echo ${webVersion}
else else
webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0) webVersion=$(cd /var/www/html/admin/ && git describe --tags --abbrev=0)
webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') webVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/AdminLTE/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)" echo "::: Web-Admin version is $webVersion (Latest version is $webVersionLatest)"
fi fi
} }
coreOutput() { coreOutput() {
for var in "$@" for var in "$@"; do
do case "${var}" in
case "$var" in "-l" | "--latest" ) latest=true;;
"-l" | "--latest" ) latest=true;; "-c" | "--current" ) current=true;;
"-c" | "--current" ) current=true;; * ) echo "::: Invalid Option!"; exit 1;
* ) echo "::: Invalid Option!"; exit 1; esac
esac done
done
if [[ "${latest}" == true && "${current}" == false ]]; then if [[ "${latest}" == true && "${current}" == false ]]; then
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
echo ${piholeVersionLatest} echo ${piholeVersionLatest}
elif [[ "${latest}" == false && "${current}" == true ]]; then elif [[ "${latest}" == false && "${current}" == true ]]; then
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
echo ${piholeVersion} echo ${piholeVersion}
else else
piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0) piholeVersion=$(cd /etc/.pihole/ && git describe --tags --abbrev=0)
piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//') piholeVersionLatest=$(curl -s https://api.github.com/repos/pi-hole/pi-hole/releases/latest | grep -Po '"tag_name":.*?[^\\]",' | perl -pe 's/"tag_name": "//; s/^"//; s/",$//')
echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)" echo "::: Pi-hole version is $piholeVersion (Latest version is $piholeVersionLatest)"
fi fi
} }
helpFunc() { helpFunc() {
@ -93,11 +91,10 @@ if [[ $# = 0 ]]; then
normalOutput normalOutput
fi fi
for var in "$@" for var in "$@"; do
do case "${var}" in
case "$var" in "-a" | "--admin" ) shift; webOutput "$@";;
"-a" | "--admin" ) shift; webOutput "$@";; "-p" | "--pihole" ) shift; coreOutput "$@" ;;
"-p" | "--pihole" ) shift; coreOutput "$@" ;; "-h" | "--help" ) helpFunc;;
"-h" | "--help" ) helpFunc;; esac
esac
done done

View file

@ -48,160 +48,158 @@ domToRemoveList=()
piholeIPfile=/etc/pihole/piholeIP piholeIPfile=/etc/pihole/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6 piholeIPv6file=/etc/pihole/.useIPv6
if [[ -f ${piholeIPfile} ]];then if [[ -f ${piholeIPfile} ]]; then
# If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script # If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script
piholeIP=$(cat ${piholeIPfile}) piholeIP=$(cat ${piholeIPfile})
#rm $piholeIPfile #rm $piholeIPfile
else else
# Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script # Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script
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)}')
piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}') piholeIPCIDR=$(ip -o -f inet addr show dev "${IPv4dev}" | awk '{print $4}' | awk 'END {print}')
piholeIP=${piholeIPCIDR%/*} piholeIP=${piholeIPCIDR%/*}
fi fi
modifyHost=false modifyHost=false
# After setting defaults, check if there's local overrides # After setting defaults, check if there's local overrides
if [[ -r ${piholeDir}/pihole.conf ]];then if [[ -r ${piholeDir}/pihole.conf ]]; then
echo "::: Local calibration requested..." echo "::: Local calibration requested..."
. ${piholeDir}/pihole.conf . ${piholeDir}/pihole.conf
fi fi
if [[ -f ${piholeIPv6file} ]];then if [[ -f ${piholeIPv6file} ]]; then
# If the file exists, then the user previously chose to use IPv6 in the automated installer # If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi fi
HandleOther() { HandleOther() {
#check validity of domain #check validity of domain
validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/') validDomain=$(echo "$1" | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
if [ -z "$validDomain" ]; then if [ -z "${validDomain}" ]; then
echo "::: $1 is not a valid argument or domain name" echo "::: $1 is not a valid argument or domain name"
else else
domList=("${domList[@]}" ${validDomain}) domList=("${domList[@]}" ${validDomain})
fi fi
} }
PopWhitelistFile() { PopWhitelistFile() {
#check whitelist file exists, and if not, create it #check whitelist file exists, and if not, create it
if [[ ! -f ${whitelist} ]];then if [[ ! -f ${whitelist} ]]; then
touch ${whitelist} touch ${whitelist}
fi fi
for dom in "${domList[@]}" for dom in "${domList[@]}"; do
do if ${addmode}; then
if ${addmode}; then AddDomain "${dom}"
AddDomain "$dom" else
else RemoveDomain "${dom}"
RemoveDomain "$dom" fi
fi
done done
} }
AddDomain() { AddDomain() {
#| sed 's/\./\\./g' #| sed 's/\./\\./g'
bool=false bool=false
grep -Ex -q "$1" ${whitelist} || bool=true grep -Ex -q "$1" ${whitelist} || bool=true
if ${bool}; then if ${bool}; then
#domain not found in the whitelist file, add it! #domain not found in the whitelist file, add it!
if ${verbose}; then
echo -n "::: Adding $1 to $whitelist..."
fi
echo "$1" >> ${whitelist}
modifyHost=true
if ${verbose}; then if ${verbose}; then
echo " done!" echo -n "::: Adding ${1}to ${whitelist}..."
fi fi
echo "${1}" >> ${whitelist}
modifyHost=true
if ${verbose}; then
echo " done!"
fi
else else
if ${verbose}; then if ${verbose}; then
echo "::: $1 already exists in $whitelist, no need to add!" echo "::: ${1} already exists in ${whitelist}, no need to add!"
fi fi
fi fi
} }
RemoveDomain() { RemoveDomain() {
bool=false bool=false
grep -Ex -q "$1" ${whitelist} || bool=true grep -Ex -q "$1" ${whitelist} || bool=true
if ${bool}; then if ${bool}; then
#Domain is not in the whitelist file, no need to Remove #Domain is not in the whitelist file, no need to Remove
if ${verbose}; then if ${verbose}; then
echo "::: $1 is NOT whitelisted! No need to remove" echo "::: ${1} is NOT whitelisted! No need to remove"
fi fi
else else
#Domain is in the whitelist file, add to a temporary array and remove from whitelist file #Domain is in the whitelist file, add to a temporary array and remove from whitelist file
#if $verbose; then #if $verbose; then
#echo "::: Un-whitelisting $dom..." #echo "::: Un-whitelisting $dom..."
#fi #fi
domToRemoveList=("${domToRemoveList[@]}" $1) domToRemoveList=("${domToRemoveList[@]}" ${1})
modifyHost=true modifyHost=true
fi fi
} }
ModifyHostFile() { ModifyHostFile() {
if ${addmode}; then if ${addmode}; then
#remove domains in from hosts file #remove domains in from hosts file
if [[ -r ${whitelist} ]];then if [[ -r ${whitelist} ]]; then
# Remove whitelist entries # Remove whitelist entries
numberOf=$(cat ${whitelist} | sed '/^\s*$/d' | wc -l) numberOf=$(cat ${whitelist} | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s plural=; [[ "${numberOf}" != "1" ]] && plural=s
echo ":::" echo ":::"
echo -n "::: Modifying HOSTS file to whitelist $numberOf domain${plural}..." echo -n "::: Modifying HOSTS file to whitelist $numberOf domain${plural}..."
awk -F':' '{print $1}' ${whitelist} | while read -r line; do echo "$piholeIP $line"; done > /etc/pihole/whitelist.tmp awk -F':' '{print $1}' ${whitelist} | while read -r line; do echo "${piholeIP} ${line}"; done > /etc/pihole/whitelist.tmp
awk -F':' '{print $1}' ${whitelist} | while read -r line; do echo "$piholeIPv6 $line"; done >> /etc/pihole/whitelist.tmp awk -F':' '{print $1}' ${whitelist} | while read -r line; do echo "${piholeIPv6} ${line}"; done >> /etc/pihole/whitelist.tmp
echo "l" >> /etc/pihole/whitelist.tmp echo "l" >> /etc/pihole/whitelist.tmp
grep -F -x -v -f ${piholeDir}/whitelist.tmp ${adList} > ${piholeDir}/gravity.tmp grep -F -x -v -f ${piholeDir}/whitelist.tmp ${adList} > ${piholeDir}/gravity.tmp
rm ${adList} rm ${adList}
mv ${piholeDir}/gravity.tmp ${adList} mv ${piholeDir}/gravity.tmp ${adList}
rm ${piholeDir}/whitelist.tmp rm ${piholeDir}/whitelist.tmp
echo " done!" echo " done!"
fi fi
else else
#we need to add the removed domains to the hosts file #we need to add the removed domains to the hosts file
echo ":::" echo ":::"
echo "::: Modifying HOSTS file to un-whitelist domains..." echo "::: Modifying HOSTS file to un-whitelist domains..."
for rdom in "${domToRemoveList[@]}" for rdom in "${domToRemoveList[@]}"; do
do if grep -q "${rdom}" /etc/pihole/*.domains; then
if grep -q "$rdom" /etc/pihole/*.domains; then echo "::: AdLists contain ${rdom}, re-adding block"
echo "::: AdLists contain $rdom, re-adding block" if [[ -n ${piholeIPv6} ]]; then
if [[ -n ${piholeIPv6} ]];then echo -n "::: Restoring block for ${rdom} on IPv4 and IPv6..."
echo -n "::: Restoring block for $rdom on IPv4 and IPv6..." echo "${rdom}" | awk -v ipv4addr="${piholeIP}" -v ipv6addr="${piholeIPv6}" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${adList}
echo "$rdom" | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${adList} echo " done!"
echo " done!" else
else echo -n "::: Restoring block for ${rdom} on IPv4..."
echo -n "::: Restoring block for $rdom on IPv4..." echo "${rdom}" | awk -v ipv4addr="${piholeIP}" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList}
echo "$rdom" | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList} echo " done!"
echo " done!" fi
fi fi
fi echo -n "::: Removing $rdom from $whitelist..."
echo -n "::: Removing $rdom from $whitelist..." echo "$rdom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist}
echo "$rdom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist} echo " done!"
echo " done!" done
done fi
fi
} }
Reload() { Reload() {
# Reload hosts file # Reload hosts file
echo ":::" echo ":::"
echo -n "::: Refresh lists in dnsmasq..." echo -n "::: Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq) dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then if [[ ${dnsmasqPid} ]]; then
# service already running - reload config # service already running - reload config
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq systemctl restart dnsmasq
else else
service dnsmasq restart service dnsmasq restart
fi fi
else else
# service not running, start it up # service not running, start it up
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq systemctl start dnsmasq
else else
service dnsmasq start service dnsmasq start
fi fi
fi fi
echo " done!" echo " done!"
} }
@ -210,35 +208,33 @@ DisplayWlist() {
verbose=false verbose=false
echo -e " Displaying Gravity Resistant Domains \n" echo -e " Displaying Gravity Resistant Domains \n"
count=1 count=1
while IFS= read -r RD while IFS= read -r RD; do
do echo "${count}: ${RD}"
echo "${count}: $RD"
count=$((count+1)) count=$((count+1))
done < "$whitelist" done < "${whitelist}"
} }
################################################### ###################################################
for var in "$@" for var in "$@"; do
do case "${var}" in
case "$var" in "-nr"| "--noreload" ) reload=false;;
"-nr"| "--noreload" ) reload=false;; "-d" | "--delmode" ) addmode=false;;
"-d" | "--delmode" ) addmode=false;; "-f" | "--force" ) force=true;;
"-f" | "--force" ) force=true;; "-q" | "--quiet" ) verbose=false;;
"-q" | "--quiet" ) verbose=false;; "-h" | "--help" ) helpFunc;;
"-h" | "--help" ) helpFunc;; "-l" | "--list" ) DisplayWlist;;
"-l" | "--list" ) DisplayWlist;; * ) HandleOther "${var}";;
* ) HandleOther "$var";; esac
esac
done done
PopWhitelistFile PopWhitelistFile
if ${modifyHost} || ${force}; then if ${modifyHost} || ${force}; then
ModifyHostFile ModifyHostFile
else else
if ${verbose}; then if ${verbose}; then
echo ":::" echo ":::"
echo "::: No changes need to be made" echo "::: No changes need to be made"
fi fi
exit 1 exit 1

View file

@ -1,12 +1,11 @@
_pihole() _pihole() {
{ local cur prev opts
local cur prev opts COMPREPLY=()
COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}"
cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}"
prev="${COMP_WORDS[COMP_CWORD-1]}" opts="blacklist chronometer debug flush help query reconfigure setupLCD uninstall updateGravity updatePihole version whitelist"
opts="blacklist chronometer debug flush help query reconfigure setupLCD uninstall updateGravity updatePihole version whitelist"
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0 return 0
} }
complete -F _pihole pihole complete -F _pihole pihole

View file

@ -48,18 +48,19 @@ runUnattended=false
######## FIRST CHECK ######## ######## FIRST CHECK ########
# Must be root to install # Must be root to install
echo ":::" echo ":::"
if [[ $EUID -eq 0 ]];then if [[ ${EUID} -eq 0 ]]; then
echo "::: You are root." echo "::: You are root."
else else
echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures" 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 "::: 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 "::: any concerns with this requirement. Please be sure to download this script from a trusted source."
echo ":::" echo ":::"
echo "::: Detecting the presence of the sudo utility for continuation of this install..." echo "::: Detecting the presence of the sudo utility for continuation of this install..."
if [ -x "$(command -v sudo)" ];then
if [ -x "$(command -v sudo)" ]; then
echo "::: Utility sudo located." echo "::: Utility sudo located."
exec curl -sSL https://install.pi-hole.net | sudo bash "$@" exec curl -sSL https://install.pi-hole.net | sudo bash "$@"
exit $? exit $?
else else
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed." echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
exit 1 exit 1
@ -68,7 +69,7 @@ fi
# Compatibility # Compatibility
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="php5" phpVer="php5"
@ -76,11 +77,11 @@ if [ -x "$(command -v apt-get)" ];then
############################################# #############################################
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 update" UPDATE_PKG_CACHE="${PKG_MANAGER} update"
PKG_UPDATE="$PKG_MANAGER upgrade" PKG_UPDATE="${PKG_MANAGER} upgrade"
PKG_INSTALL="$PKG_MANAGER --yes --fix-missing install" PKG_INSTALL="${PKG_MANAGER} --yes --fix-missing install"
# grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE # 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" PKG_COUNT="${PKG_MANAGER} -s -o Debug::NoLocking=true upgrade | grep -c ^Inst || true"
INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5) INSTALLER_DEPS=( apt-utils whiptail git dhcpcd5)
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd ${phpVer}-common ${phpVer}-cgi curl unzip wget sudo netcat cron iproute2 ) 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"
@ -88,11 +89,11 @@ if [ -x "$(command -v apt-get)" ];then
LIGHTTPD_CFG="lighttpd.conf.debian" LIGHTTPD_CFG="lighttpd.conf.debian"
DNSMASQ_USER="dnsmasq" DNSMASQ_USER="dnsmasq"
package_check_install() { package_check_install() {
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "$1" 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
if [ -x "$(command -v dnf)" ];then if [ -x "$(command -v dnf)" ]; then
PKG_MANAGER="dnf" PKG_MANAGER="dnf"
else else
PKG_MANAGER="yum" PKG_MANAGER="yum"
@ -115,7 +116,7 @@ elif [ -x "$(command -v rpm)" ];then
LIGHTTPD_CFG="lighttpd.conf.fedora" LIGHTTPD_CFG="lighttpd.conf.fedora"
DNSMASQ_USER="nobody" DNSMASQ_USER="nobody"
package_check_install() { package_check_install() {
rpm -qa | grep ^"$1"- > /dev/null || ${PKG_INSTALL} "$1" rpm -qa | grep ^"${1}"- > /dev/null || ${PKG_INSTALL} "${1}"
} }
# v6 variants php is too old, install repo for php7.1 # v6 variants php is too old, install repo for php7.1
if grep -q -i "release 6." /etc/redhat-release; then if grep -q -i "release 6." /etc/redhat-release; then
@ -129,16 +130,16 @@ fi
####### FUNCTIONS ########## ####### FUNCTIONS ##########
spinner() { spinner() {
local pid=$1 local pid=$1
local delay=0.50 local delay=0.50
local spinstr='/-\|' local spinstr='/-\|'
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do
local temp=${spinstr#?} local temp=${spinstr#?}
printf " [%c] " "$spinstr" printf " [%c] " "${spinstr}"
local spinstr=${temp}${spinstr%"$temp"} local spinstr=${temp}${spinstr%"$temp"}
sleep ${delay} sleep ${delay}
printf "\b\b\b\b\b\b" printf "\b\b\b\b\b\b"
done done
printf " \b\b\b\b" printf " \b\b\b\b"
} }
find_IPv4_information() { find_IPv4_information() {
@ -149,7 +150,7 @@ find_IPv4_information() {
} }
get_available_interfaces() { get_available_interfaces() {
# Get available interfaces. Consider only getting UP interfaces in the future, and leaving DOWN interfaces out of list. # 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)
} }
@ -176,21 +177,21 @@ verifyFreeDiskSpace() {
local existing_free_kilobytes=$(df -Pk | grep -m1 '\/$' | awk '{print $4}') local existing_free_kilobytes=$(df -Pk | grep -m1 '\/$' | awk '{print $4}')
# - Unknown free disk space , not a integer # - Unknown free disk space , not a integer
if ! [[ "$existing_free_kilobytes" =~ ^([0-9])+$ ]]; then if ! [[ "${existing_free_kilobytes}" =~ ^([0-9])+$ ]]; then
echo "::: Unknown free disk space!" echo "::: Unknown free disk space!"
echo "::: We were unable to determine available free disk space on this system." 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" echo "::: You may override this check and force the installation, however, it is not recommended"
echo "::: To do so, pass the argument '--i_do_not_follow_recommendations' to the install script" 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" echo "::: eg. curl -L https://install.pi-hole.net | bash /dev/stdin --i_do_not_follow_recommendations"
exit 1 exit 1
# - Insufficient free disk space # - Insufficient free disk space
elif [[ ${existing_free_kilobytes} -lt ${required_free_kilobytes} ]]; then elif [[ ${existing_free_kilobytes} -lt ${required_free_kilobytes} ]]; then
echo "::: Insufficient Disk Space!" 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 "::: 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 "::: You only have ${existing_free_kilobytes} KiloBytes free."
echo "::: If this is a new install you may need to expand your disk." 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 "::: 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)" echo "::: After rebooting, run this installation again. (curl -L https://install.pi-hole.net | bash)"
echo "Insufficient free space, exiting..." echo "Insufficient free space, exiting..."
exit 1 exit 1
@ -212,23 +213,21 @@ chooseInterface() {
# Loop sentinel variable # Loop sentinel variable
local firstLoop=1 local firstLoop=1
while read -r line while read -r line; do
do
mode="OFF" mode="OFF"
if [[ ${firstLoop} -eq 1 ]]; then if [[ ${firstLoop} -eq 1 ]]; then
firstLoop=0 firstLoop=0
mode="ON" mode="ON"
fi fi
interfacesArray+=("$line" "available" "$mode") interfacesArray+=("${line}" "available" "${mode}")
done <<< "$availableInterfaces" done <<< "${availableInterfaces}"
# Find out how many interfaces are available to choose from # Find out how many interfaces are available to choose from
interfaceCount=$(echo "$availableInterfaces" | wc -l) interfaceCount=$(echo "${availableInterfaces}" | wc -l)
chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface (press space to select)" ${r} ${c} ${interfaceCount}) chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface (press space to select)" ${r} ${c} ${interfaceCount})
chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty)
if [[ $? = 0 ]]; then if [[ $? = 0 ]]; then
for desiredInterface in ${chooseInterfaceOptions} for desiredInterface in ${chooseInterfaceOptions}; do
do
piholeInterface=${desiredInterface} piholeInterface=${desiredInterface}
echo "::: Using interface: $piholeInterface" echo "::: Using interface: $piholeInterface"
done done
@ -262,15 +261,15 @@ use4andor6() {
esac esac
done done
if [[ ${useIPv4} ]]; then if [[ ${useIPv4} ]]; then
find_IPv4_information find_IPv4_information
getStaticIPv4Settings getStaticIPv4Settings
setStaticIPv4 setStaticIPv4
fi fi
if [[ ${useIPv6} ]]; then if [[ ${useIPv6} ]]; then
useIPv6dialog useIPv6dialog
fi fi
echo "::: IPv4 address: ${IPv4_address}" echo "::: IPv4 address: ${IPv4_address}"
echo "::: IPv6 address: ${IPv6_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"
@ -285,8 +284,8 @@ use4andor6() {
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: $IPv4_address 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.
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.
@ -296,20 +295,19 @@ It is also possible to use a DHCP reservation, but if you are going to do that,
# Otherwise, we need to ask the user to input their desired settings. # 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 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 # Start a loop to let the user enter their information with the chance to go back and edit it if necessary
until [[ ${ipSettingsCorrect} = True ]] until [[ ${ipSettingsCorrect} = True ]]; do
do
# Ask for the IPv4 address # Ask for the IPv4 address
IPv4_address=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "$IPv4_address" 3>&1 1>&2 2>&3) IPv4_address=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" ${r} ${c} "${IPv4_address}" 3>&1 1>&2 2>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]]; then
echo "::: Your static IPv4 address: $IPv4_address" 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: $IPv4_address 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
else else
@ -335,31 +333,31 @@ 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=$IPv4_address 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 IFCFG_FILE
local IPADDR local IPADDR
local CIDR local CIDR
if [[ -f /etc/dhcpcd.conf ]];then if [[ -f /etc/dhcpcd.conf ]]; then
# Debian Family # Debian Family
if grep -q "$IPv4_address" /etc/dhcpcd.conf; then if grep -q "${IPv4_address}" /etc/dhcpcd.conf; then
echo "::: Static IP already configured" echo "::: Static IP already configured"
else else
setDHCPCD setDHCPCD
ip addr replace dev "$piholeInterface" "$IPv4_address" ip addr replace dev "${piholeInterface}" "${IPv4_address}"
echo ":::" echo ":::"
echo "::: Setting IP to $IPv4_address. You may need to restart after the install is complete." echo "::: Setting IP to ${IPv4_address}. You may need to restart after the install is complete."
echo ":::" 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 "$IPv4_address" "${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 "${IPv4_address}" | cut -f1 -d/) IPADDR=$(echo "${IPv4_address}" | cut -f1 -d/)
@ -368,18 +366,18 @@ setStaticIPv4() {
cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig cp "${IFCFG_FILE}" "${IFCFG_FILE}".pihole.orig
# Build Interface configuration file: # Build Interface configuration file:
{ {
echo "# Configured via Pi-Hole installer" echo "# Configured via Pi-Hole installer"
echo "DEVICE=$piholeInterface" echo "DEVICE=$piholeInterface"
echo "BOOTPROTO=none" echo "BOOTPROTO=none"
echo "ONBOOT=yes" echo "ONBOOT=yes"
echo "IPADDR=$IPADDR" echo "IPADDR=$IPADDR"
echo "PREFIX=$CIDR" echo "PREFIX=$CIDR"
echo "GATEWAY=$IPv4gw" echo "GATEWAY=$IPv4gw"
echo "DNS1=$piholeDNS1" echo "DNS1=$piholeDNS1"
echo "DNS2=$piholeDNS2" echo "DNS2=$piholeDNS2"
echo "USERCTL=no" echo "USERCTL=no"
}>> "${IFCFG_FILE}" }>> "${IFCFG_FILE}"
ip addr replace dev "$piholeInterface" "$IPv4_address" 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
@ -395,8 +393,8 @@ setStaticIPv4() {
} }
valid_ip() { valid_ip() {
local ip=$1 local ip=${1}
local stat=1 local stat=1
if [[ ${ip} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then if [[ ${ip} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS OIFS=$IFS
@ -421,80 +419,81 @@ setDNS() {
DNSchoices=$("${DNSChooseCmd[@]}" "${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)
echo "::: Using Google DNS servers." echo "::: Using Google DNS servers."
piholeDNS1="8.8.8.8" piholeDNS1="8.8.8.8"
piholeDNS2="8.8.4.4" piholeDNS2="8.8.4.4"
;; ;;
OpenDNS) OpenDNS)
echo "::: Using OpenDNS servers." echo "::: Using OpenDNS servers."
piholeDNS1="208.67.222.222" piholeDNS1="208.67.222.222"
piholeDNS2="208.67.220.220" piholeDNS2="208.67.220.220"
;; ;;
Level3) Level3)
echo "::: Using Level3 servers." echo "::: Using Level3 servers."
piholeDNS1="4.2.2.1" piholeDNS1="4.2.2.1"
piholeDNS2="4.2.2.2" piholeDNS2="4.2.2.2"
;; ;;
Norton) Norton)
echo "::: Using Norton ConnectSafe servers." echo "::: Using Norton ConnectSafe servers."
piholeDNS1="199.85.126.10" piholeDNS1="199.85.126.10"
piholeDNS2="199.85.127.10" piholeDNS2="199.85.127.10"
;; ;;
Comodo) Comodo)
echo "::: Using Comodo Secure servers." echo "::: Using Comodo Secure servers."
piholeDNS1="8.26.56.26" piholeDNS1="8.26.56.26"
piholeDNS2="8.20.247.20" piholeDNS2="8.20.247.20"
;; ;;
Custom) Custom)
until [[ ${DNSSettingsCorrect} = True ]] until [[ ${DNSSettingsCorrect} = True ]]; do
do strInvalid="Invalid"
strInvalid="Invalid" if [ ! ${piholeDNS1} ]; then
if [ ! ${piholeDNS1} ]; then if [ ! ${piholeDNS2} ]; then
if [ ! ${piholeDNS2} ]; then prePopulate=""
prePopulate="" else
else prePopulate=", ${piholeDNS2}"
prePopulate=", $piholeDNS2" fi
fi elif [ ${piholeDNS1} ] && [ ! ${piholeDNS2} ]; then
elif [ ${piholeDNS1} ] && [ ! ${piholeDNS2} ]; then prePopulate="${piholeDNS1}"
prePopulate="$piholeDNS1" elif [ ${piholeDNS1} ] && [ ${piholeDNS2} ]; then
elif [ ${piholeDNS1} ] && [ ${piholeDNS2} ]; then prePopulate="${piholeDNS1}, ${piholeDNS2}"
prePopulate="$piholeDNS1, $piholeDNS2" fi
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) 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}') if [[ $? = 0 ]]; then
piholeDNS2=$(echo "$piholeDNS" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}') piholeDNS1=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}')
if ! valid_ip "$piholeDNS1" || [ ! "$piholeDNS1" ]; then piholeDNS2=$(echo "${piholeDNS}" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}')
piholeDNS1=${strInvalid} if ! valid_ip "${piholeDNS1}" || [ ! "${piholeDNS1}" ]; then
fi piholeDNS1=${strInvalid}
if ! valid_ip "$piholeDNS2" && [ "$piholeDNS2" ]; then fi
piholeDNS2=${strInvalid} if ! valid_ip "${piholeDNS2}" && [ "${piholeDNS2}" ]; then
fi piholeDNS2=${strInvalid}
else fi
echo "::: Cancel selected, exiting...." else
exit 1 echo "::: Cancel selected, exiting...."
fi exit 1
if [[ ${piholeDNS1} == "$strInvalid" ]] || [[ ${piholeDNS2} == "$strInvalid" ]]; then fi
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}" ]] || [[ ${piholeDNS2} == "${strInvalid}" ]]; then
if [[ ${piholeDNS1} == "$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}
piholeDNS1="" if [[ ${piholeDNS1} == "${strInvalid}" ]]; then
fi piholeDNS1=""
if [[ ${piholeDNS2} == "$strInvalid" ]]; then fi
piholeDNS2="" if [[ ${piholeDNS2} == "${strInvalid}" ]]; then
fi piholeDNS2=""
DNSSettingsCorrect=False fi
else DNSSettingsCorrect=False
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 else
DNSSettingsCorrect=True 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
else DNSSettingsCorrect=True
# If the settings are wrong, the loop continues else
DNSSettingsCorrect=False # If the settings are wrong, the loop continues
fi DNSSettingsCorrect=False
fi fi
done fi
;; done
esac ;;
esac
else else
echo "::: Cancel selected. Exiting..." echo "::: Cancel selected. Exiting..."
exit 1 exit 1
@ -533,12 +532,12 @@ version_check_dnsmasq() {
cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location} cp ${dnsmasq_pihole_01_snippet} ${dnsmasq_pihole_01_location}
echo " done." echo " done."
sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location} sed -i "s/@INT@/$piholeInterface/" ${dnsmasq_pihole_01_location}
if [[ "$piholeDNS1" != "" ]]; then if [[ "${piholeDNS1}" != "" ]]; then
sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location} sed -i "s/@DNS1@/$piholeDNS1/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location} sed -i '/^server=@DNS1@/d' ${dnsmasq_pihole_01_location}
fi fi
if [[ "$piholeDNS2" != "" ]]; then if [[ "${piholeDNS2}" != "" ]]; then
sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location} sed -i "s/@DNS2@/$piholeDNS2/" ${dnsmasq_pihole_01_location}
else else
sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location} sed -i '/^server=@DNS2@/d' ${dnsmasq_pihole_01_location}
@ -579,7 +578,7 @@ installConfigs() {
version_check_dnsmasq 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
mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
fi fi
cp /etc/.pihole/advanced/${LIGHTTPD_CFG} /etc/lighttpd/lighttpd.conf cp /etc/.pihole/advanced/${LIGHTTPD_CFG} /etc/lighttpd/lighttpd.conf
@ -603,8 +602,8 @@ stop_service() {
} }
start_service() { start_service() {
# Start/Restart service passed in as argument # Start/Restart service passed in as argument
# This should not fail, it's an error if it does # This should not fail, it's an error if it does
echo ":::" echo ":::"
echo -n "::: Starting ${1} service..." echo -n "::: Starting ${1} service..."
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
@ -616,7 +615,7 @@ start_service() {
} }
enable_service() { enable_service() {
# Enable service so that it will start with next reboot # Enable service so that it will start with next reboot
echo ":::" echo ":::"
echo -n "::: Enabling ${1} service to start on reboot..." echo -n "::: Enabling ${1} service to start on reboot..."
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
@ -634,13 +633,13 @@ update_pacakge_cache() {
#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")
if [ ! "$today" == "$timestampAsDate" ]; then if [ ! "${today}" == "${timestampAsDate}" ]; then
#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 & spinner $! ${UPDATE_PKG_CACHE} &> /dev/null & spinner $!
echo " done!" echo " done!"
fi fi
@ -650,23 +649,23 @@ notify_package_updates_available() {
# Let user know if they have outdated packages on their system and # Let user know if they have outdated packages on their system and
# advise them to run a package update at soonest possible. # 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 system 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 available for your system!" 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
} }
install_dependent_packages() { install_dependent_packages() {
# Install packages passed in via argument array # Install packages passed in via argument array
# No spinner - conflicts with set -e # No spinner - conflicts with set -e
declare -a argArray1=("${!1}") declare -a argArray1=("${!1}")
for i in "${argArray1[@]}"; do for i in "${argArray1[@]}"; do
echo -n "::: Checking for $i..." echo -n "::: Checking for $i..."
@ -684,37 +683,37 @@ getGitFiles() {
update_repo "${1}" update_repo "${1}"
else else
make_repo "${1}" "${2}" make_repo "${1}" "${2}"
fi fi
} }
is_repo() { is_repo() {
# Use git to check if directory is currently under VCS # Use git to check if directory is currently under VCS
echo -n "::: Checking $1 is a repo..." echo -n "::: Checking $1 is a repo..."
cd "${1}" &> /dev/null || return 1 cd "${1}" &> /dev/null || return 1
git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1 git status &> /dev/null && echo " OK!"; return 0 || echo " not found!"; return 1
} }
make_repo() { make_repo() {
# Remove the non-repod interface and clone the interface # Remove the non-repod interface and clone the interface
echo -n "::: Cloning $2 into $1..." echo -n "::: Cloning $2 into $1..."
rm -rf "${1}" rm -rf "${1}"
git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $! git clone -q --depth 1 "${2}" "${1}" > /dev/null & spinner $!
echo " done!" echo " done!"
} }
update_repo() { update_repo() {
# Pull the latest commits # Pull the latest commits
echo -n "::: Updating repo in $1..." echo -n "::: Updating repo in $1..."
cd "${1}" || exit 1 cd "${1}" || exit 1
git stash -q > /dev/null & spinner $! git stash -q > /dev/null & spinner $!
git pull -q > /dev/null & spinner $! git pull -q > /dev/null & spinner $!
echo " done!" echo " done!"
} }
CreateLogFile() { CreateLogFile() {
# Create logfiles if necessary # Create logfiles if necessary
echo ":::" echo ":::"
echo -n "::: Creating log file and changing owner to dnsmasq..." echo -n "::: Creating log file and changing owner to dnsmasq..."
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
@ -791,60 +790,59 @@ configureFirewall() {
} }
finalExports() { finalExports() {
#If it already exists, lets overwrite it with the new values. #If it already exists, lets overwrite it with the new values.
if [[ -f ${setupVars} ]];then if [[ -f ${setupVars} ]]; then
rm ${setupVars} rm ${setupVars}
fi fi
{ {
echo "piholeInterface=${piholeInterface}" echo "piholeInterface=${piholeInterface}"
echo "IPv4_address=${IPv4_address}" echo "IPv4_address=${IPv4_address}"
echo "IPv6_address=${IPv6_address}" echo "IPv6_address=${IPv6_address}"
echo "piholeDNS1=${piholeDNS1}" echo "piholeDNS1=${piholeDNS1}"
echo "piholeDNS2=${piholeDNS2}" echo "piholeDNS2=${piholeDNS2}"
}>> "${setupVars}" }>> "${setupVars}"
} }
installPihole() { installPihole() {
# Install base files and web interface # Install base files and web interface
create_pihole_user create_pihole_user
if [ ! -d "/var/www/html" ]; then if [ ! -d "/var/www/html" ]; then
mkdir -p /var/www/html mkdir -p /var/www/html
fi fi
chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html chown ${LIGHTTPD_USER}:${LIGHTTPD_GROUP} /var/www/html
chmod 775 /var/www/html chmod 775 /var/www/html
usermod -a -G ${LIGHTTPD_GROUP} pihole usermod -a -G ${LIGHTTPD_GROUP} pihole
if [ -x "$(command -v lighty-enable-mod)" ]; then if [ -x "$(command -v lighty-enable-mod)" ]; then
lighty-enable-mod fastcgi fastcgi-php > /dev/null || true lighty-enable-mod fastcgi fastcgi-php > /dev/null || true
else else
printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n" printf "\n:::\tWarning: 'lighty-enable-mod' utility not found. Please ensure fastcgi is enabled if you experience issues.\n"
fi fi
installScripts installScripts
installConfigs installConfigs
CreateLogFile CreateLogFile
configureSelinux configureSelinux
installPiholeWeb installPiholeWeb
installCron installCron
configureFirewall configureFirewall
finalExports finalExports
runGravity runGravity
} }
updatePihole() { updatePihole() {
# Refactoring of install script has changed the name of a couple of variables. Sort them out here. # Refactoring of install script has changed the name of a couple of variables. Sort them out here.
sed -i 's/IPv4addr/IPv4_address/g' ${setupVars} sed -i 's/IPv4addr/IPv4_address/g' ${setupVars}
sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars} sed -i 's/piholeIPv6/IPv6_address/g' ${setupVars}
# Source ${setupVars} for use in the rest of the functions. # Source ${setupVars} for use in the rest of the functions.
. ${setupVars} . ${setupVars}
# Install base files and web interface # Install base files and web interface
installScripts installScripts
installConfigs installConfigs
CreateLogFile CreateLogFile
configureSelinux configureSelinux
installPiholeWeb installPiholeWeb
installCron installCron
configureFirewall configureFirewall
runGravity runGravity
} }
configureSelinux() { configureSelinux() {
@ -875,7 +873,7 @@ displayFinalMessage() {
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: ${IPv4_address%/*} IPv4: ${IPv4_address%/*}
IPv6: $IPv6_address 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.
@ -884,142 +882,141 @@ View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admi
} }
update_dialogs() { update_dialogs() {
# reconfigure # reconfigure
if [ "$reconfigure" = true ]; then if [ "${reconfigure}" = true ]; then
opt1a="Repair" opt1a="Repair"
opt1b="This will retain existing settings" opt1b="This will retain existing settings"
strAdd="You will remain on the same version" strAdd="You will remain on the same version"
else else
opt1a="Update" opt1a="Update"
opt1b="This will retain existing settings." opt1b="This will retain existing settings."
strAdd="You will be updated to the latest version." strAdd="You will be updated to the latest version."
fi fi
opt2a="Reconfigure" opt2a="Reconfigure"
opt2b="This will allow you to enter new settings" opt2b="This will allow you to enter new settings"
UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \ UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\n\nWe have detected an existing install.\n\nPlease choose from the following options: \n($strAdd)" ${r} ${c} 2 \
"$opt1a" "$opt1b" \ "${opt1a}" "${opt1b}" \
"$opt2a" "$opt2b" 3>&2 2>&1 1>&3) "${opt2a}" "${opt2b}" 3>&2 2>&1 1>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
case ${UpdateCmd} in case ${UpdateCmd} in
${opt1a}) ${opt1a})
echo "::: $opt1a option selected." echo "::: ${opt1a} option selected."
useUpdateVars=true useUpdateVars=true
;; ;;
${opt2a}) ${opt2a})
echo "::: $opt2a option selected" echo "::: ${opt2a} option selected"
useUpdateVars=false useUpdateVars=false
;; ;;
esac esac
else else
echo "::: Cancel selected. Exiting..." echo "::: Cancel selected. Exiting..."
exit 1 exit 1
fi fi
} }
main() { main() {
# Check arguments for the undocumented flags # Check arguments for the undocumented flags
for var in "$@" for var in "$@"; do
do case "$var" in
case "$var" in "--reconfigure" ) reconfigure=true;;
"--reconfigure" ) reconfigure=true;; "--i_do_not_follow_recommendations" ) skipSpaceCheck=false;;
"--i_do_not_follow_recommendations" ) skipSpaceCheck=false;; "--unattended" ) runUnattended=true;;
"--unattended" ) runUnattended=true;; esac
esac done
done
if [[ -f ${setupVars} ]];then if [[ -f ${setupVars} ]]; then
if [[ "${runUnattended}" == true ]]; then if [[ "${runUnattended}" == true ]]; then
echo "::: --unattended passed to install script, no whiptail dialogs will be displayed" echo "::: --unattended passed to install script, no whiptail dialogs will be displayed"
useUpdateVars=true useUpdateVars=true
else else
update_dialogs update_dialogs
fi fi
fi fi
# Start the installer # Start the installer
# Verify there is enough disk space for the install # Verify there is enough disk space for the install
if [[ "${skipSpaceCheck}" == true ]]; then if [[ "${skipSpaceCheck}" == true ]]; then
echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!" echo "::: --i_do_not_follow_recommendations passed to script, skipping free disk space verification!"
else else
verifyFreeDiskSpace verifyFreeDiskSpace
fi fi
# Update package cache # Update package cache
update_pacakge_cache update_pacakge_cache
# Notify user of package availability # Notify user of package availability
notify_package_updates_available notify_package_updates_available
# Install packages used by this installation script # Install packages used by this installation script
install_dependent_packages INSTALLER_DEPS[@] install_dependent_packages INSTALLER_DEPS[@]
# Install packages used by the Pi-hole # Install packages used by the Pi-hole
install_dependent_packages PIHOLE_DEPS[@] install_dependent_packages PIHOLE_DEPS[@]
if [[ "${reconfigure}" == true ]]; then if [[ "${reconfigure}" == true ]]; then
echo "::: --reconfigure passed to install script. Not downloading/updating local repos" echo "::: --reconfigure passed to install script. Not downloading/updating local repos"
else else
# Get Git files for Core and Admin # Get Git files for Core and Admin
getGitFiles ${piholeFilesDir} ${piholeGitUrl} getGitFiles ${piholeFilesDir} ${piholeGitUrl}
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl}
fi fi
if [[ ${useUpdateVars} == false ]]; then if [[ ${useUpdateVars} == false ]]; then
# Display welcome dialogs # Display welcome dialogs
welcomeDialogs welcomeDialogs
# Create directory for Pi-hole storage # Create directory for Pi-hole storage
mkdir -p /etc/pihole/ mkdir -p /etc/pihole/
# Remove legacy scripts from previous storage location # Remove legacy scripts from previous storage location
remove_legacy_scripts remove_legacy_scripts
# 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
# Determine available interfaces # Determine available interfaces
get_available_interfaces 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
use4andor6 use4andor6
# Decide what upstream DNS Servers to use # Decide what upstream DNS Servers to use
setDNS setDNS
# Install and log everything to a file # Install and log everything to a file
installPihole | tee ${tmpLog} installPihole | tee ${tmpLog}
else else
updatePihole | tee ${tmpLog} updatePihole | tee ${tmpLog}
fi fi
# Move the log file into /etc/pihole for storage # Move the log file into /etc/pihole for storage
mv ${tmpLog} ${instalLogLoc} mv ${tmpLog} ${instalLogLoc}
if [[ "${useUpdateVars}" == false ]]; then if [[ "${useUpdateVars}" == false ]]; then
displayFinalMessage displayFinalMessage
fi fi
echo "::: Restarting services..." echo "::: Restarting services..."
# Start services # Start services
start_service dnsmasq start_service dnsmasq
enable_service dnsmasq enable_service dnsmasq
start_service lighttpd start_service lighttpd
enable_service lighttpd enable_service lighttpd
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 "::: ${IPv4_address%/*}" echo "::: ${IPv4_address%/*}"
echo "::: $IPv6_address" 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
echo "::: Update complete!" echo "::: Update complete!"
fi 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://${IPv4_address%/*}/admin" echo "::: View the web interface at http://pi.hole/admin or http://${IPv4_address%/*}/admin"
} }
main "$@" main "$@"

View file

@ -11,29 +11,29 @@
# (at your option) any later version. # (at your option) any later version.
# Must be root to uninstall # Must be root to uninstall
if [[ $EUID -eq 0 ]];then if [[ ${EUID} -eq 0 ]]; then
echo "::: You are root." echo "::: You are root."
else else
echo "::: Sudo will be used for the uninstall." echo "::: Sudo will be used for the uninstall."
# Check if it is actually installed # Check if it is actually installed
# If it isn't, exit because the unnstall cannot complete # If it isn't, exit because the unnstall cannot complete
if [ -x "$(command -v sudo)" ];then if [ -x "$(command -v sudo)" ]; then
export SUDO="sudo" export SUDO="sudo"
else else
echo "::: Please install sudo or run this as root." echo "::: Please install sudo or run this as root."
exit 1 exit 1
fi fi
fi fi
# Compatability # Compatability
if [ -x "$(command -v rpm)" ];then if [ -x "$(command -v rpm)" ]; then
# Fedora Family # Fedora Family
if [ -x "$(command -v dnf)" ];then if [ -x "$(command -v dnf)" ]; then
PKG_MANAGER="dnf" PKG_MANAGER="dnf"
else else
PKG_MANAGER="yum" PKG_MANAGER="yum"
fi fi
PKG_REMOVE="$PKG_MANAGER remove -y" PKG_REMOVE="${PKG_MANAGER} remove -y"
PIHOLE_DEPS=( bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common git curl unzip wget findutils ) PIHOLE_DEPS=( bind-utils bc dnsmasq lighttpd lighttpd-fastcgi php-common git curl unzip wget findutils )
package_check() { package_check() {
rpm -qa | grep ^$1- > /dev/null rpm -qa | grep ^$1- > /dev/null
@ -41,10 +41,10 @@ if [ -x "$(command -v rpm)" ];then
package_cleanup() { package_cleanup() {
${SUDO} ${PKG_MANAGER} -y autoremove ${SUDO} ${PKG_MANAGER} -y autoremove
} }
elif [ -x "$(command -v apt-get)" ];then elif [ -x "$(command -v apt-get)" ]; then
# Debian Family # Debian Family
PKG_MANAGER="apt-get" PKG_MANAGER="apt-get"
PKG_REMOVE="$PKG_MANAGER -y remove --purge" PKG_REMOVE="${PKG_MANAGER} -y remove --purge"
PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd php5-common git curl unzip wget ) PIHOLE_DEPS=( dnsutils bc dnsmasq lighttpd php5-common git curl unzip wget )
package_check() { package_check() {
dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed" dpkg-query -W -f='${Status}' "$1" 2>/dev/null | grep -c "ok installed"
@ -59,17 +59,17 @@ else
fi fi
spinner() { spinner() {
local pid=$1 local pid=$1
local delay=0.50 local delay=0.50
local spinstr='/-\|' local spinstr='/-\|'
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do while [ "$(ps a | awk '{print $1}' | grep "${pid}")" ]; do
local temp=${spinstr#?} local temp=${spinstr#?}
printf " [%c] " "$spinstr" printf " [%c] " "${spinstr}"
local spinstr=${temp}${spinstr%"$temp"} local spinstr=${temp}${spinstr%"$temp}"}
sleep ${delay} sleep ${delay}
printf "\b\b\b\b\b\b" printf "\b\b\b\b\b\b"
done done
printf " \b\b\b\b" printf " \b\b\b\b"
} }
removeAndPurge() { removeAndPurge() {
@ -79,15 +79,15 @@ removeAndPurge() {
package_check ${i} > /dev/null package_check ${i} > /dev/null
if [ $? -eq 0 ]; then if [ $? -eq 0 ]; then
while true; do while true; do
read -rp "::: Do you wish to remove $i from your system? [y/n]: " yn read -rp "::: Do you wish to remove ${i} from your system? [y/n]: " yn
case ${yn} in case ${yn} in
[Yy]* ) printf ":::\tRemoving %s..." "$i"; ${SUDO} ${PKG_REMOVE} "$i" &> /dev/null & spinner $!; printf "done!\n"; break;; [Yy]* ) printf ":::\tRemoving %s..." "${i}"; ${SUDO} ${PKG_REMOVE} "${i}" &> /dev/null & spinner $!; printf "done!\n"; break;;
[Nn]* ) printf ":::\tSkipping %s" "$i\n"; break;; [Nn]* ) printf ":::\tSkipping %s" "${i}\n"; break;;
* ) printf "::: You must answer yes or no!\n";; * ) printf "::: You must answer yes or no!\n";;
esac esac
done done
else else
printf ":::\tPackage %s not installed... Not removing.\n" "$i" printf ":::\tPackage %s not installed... Not removing.\n" "${i}"
fi fi
done done

View file

@ -35,11 +35,11 @@ blacklistScript=/opt/pihole/blacklist.sh
#Source the setupVars from install script for the IP #Source the setupVars from install script for the IP
setupVars=/etc/pihole/setupVars.conf setupVars=/etc/pihole/setupVars.conf
if [[ -f ${setupVars} ]];then if [[ -f ${setupVars} ]];then
. /etc/pihole/setupVars.conf . /etc/pihole/setupVars.conf
else else
echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure."
echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure." echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure."
exit 1 exit 1
fi fi
#Remove the /* from the end of the IPv4addr. #Remove the /* from the end of the IPv4addr.
@ -56,8 +56,8 @@ eventHorizon=${basename}.2.eventHorizon.txt
accretionDisc=${basename}.3.accretionDisc.txt accretionDisc=${basename}.3.accretionDisc.txt
# Warn users still using pihole.conf that it no longer has any effect (I imagine about 2 people use it) # Warn users still using pihole.conf that it no longer has any effect (I imagine about 2 people use it)
if [[ -r ${piholeDir}/pihole.conf ]];then if [[ -r ${piholeDir}/pihole.conf ]]; then
echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored." echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored."
fi fi
########################### ###########################
@ -95,17 +95,17 @@ gravity_collapse() {
fi fi
# Create the pihole resource directory if it doesn't exist. Future files will be stored here # Create the pihole resource directory if it doesn't exist. Future files will be stored here
if [[ -d ${piholeDir} ]];then if [[ -d ${piholeDir} ]]; then
# Temporary hack to allow non-root access to pihole directory # Temporary hack to allow non-root access to pihole directory
# Will update later, needed for existing installs, new installs should # Will update later, needed for existing installs, new installs should
# create this directory as non-root # create this directory as non-root
chmod 777 ${piholeDir} chmod 777 ${piholeDir}
echo ":::" echo ":::"
echo "::: Existing pihole directory found" echo "::: Existing pihole directory found"
else else
echo "::: Creating pihole directory..." echo "::: Creating pihole directory..."
mkdir ${piholeDir} mkdir ${piholeDir}
chmod 777 ${piholeDir} chmod 777 ${piholeDir}
fi fi
} }
@ -113,11 +113,11 @@ gravity_collapse() {
gravity_patternCheck() { gravity_patternCheck() {
patternBuffer=$1 patternBuffer=$1
# check if the patternbuffer is a non-zero length file # check if the patternbuffer is a non-zero length file
if [[ -s "$patternBuffer" ]];then if [[ -s "${patternBuffer}" ]]; then
# Some of the blocklists are copyright, they need to be downloaded # Some of the blocklists are copyright, they need to be downloaded
# and stored as is. They can be processed for content after they # and stored as is. They can be processed for content after they
# have been saved. # have been saved.
cp "$patternBuffer" "$saveLocation" cp "${patternBuffer}" "${saveLocation}"
echo " List updated, transport successful!" echo " List updated, transport successful!"
else else
# curl didn't download any host files, probably because of the date check # curl didn't download any host files, probably because of the date check
@ -136,51 +136,50 @@ gravity_transport() {
heisenbergCompensator="" heisenbergCompensator=""
if [[ -r ${saveLocation} ]]; then if [[ -r ${saveLocation} ]]; then
# if domain has been saved, add file for date check to only download newer # if domain has been saved, add file for date check to only download newer
heisenbergCompensator="-z $saveLocation" heisenbergCompensator="-z ${saveLocation}"
fi fi
# Silently curl url # Silently curl url
curl -s -L ${cmd_ext} ${heisenbergCompensator} -A "$agent" ${url} > ${patternBuffer} curl -s -L ${cmd_ext} ${heisenbergCompensator} -A "${agent}" ${url} > ${patternBuffer}
# Check for list updates # Check for list updates
gravity_patternCheck "$patternBuffer" gravity_patternCheck "${patternBuffer}"
# Cleanup # Cleanup
rm -f "$patternBuffer" rm -f "${patternBuffer}"
} }
# spinup - main gravity function # spinup - main gravity function
gravity_spinup() { gravity_spinup() {
echo ":::" echo ":::"
# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines # Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines
for ((i = 0; i < "${#sources[@]}"; i++)) for ((i = 0; i < "${#sources[@]}"; i++)); do
do url=${sources[$i]}
url=${sources[$i]} # Get just the domain from the URL
# Get just the domain from the URL domain=$(echo "${url}" | cut -d'/' -f3)
domain=$(echo "$url" | cut -d'/' -f3)
# Save the file as list.#.domain # Save the file as list.#.domain
saveLocation=${piholeDir}/list.${i}.${domain}.${justDomainsExtension} saveLocation=${piholeDir}/list.${i}.${domain}.${justDomainsExtension}
activeDomains[$i]=${saveLocation} activeDomains[$i]=${saveLocation}
agent="Mozilla/10.0" agent="Mozilla/10.0"
echo -n "::: Getting $domain list..." echo -n "::: Getting ${domain} list..."
# Use a case statement to download lists that need special cURL commands # Use a case statement to download lists that need special cURL commands
# to complete properly and reset the user agent when required # to complete properly and reset the user agent when required
case "$domain" in case "${domain}" in
"adblock.mahakala.is") "adblock.mahakala.is")
agent='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36' agent='Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
cmd_ext="-e http://forum.xda-developers.com/" cmd_ext="-e http://forum.xda-developers.com/"
;; ;;
"pgl.yoyo.org") "pgl.yoyo.org")
cmd_ext="-d mimetype=plaintext -d hostformat=hosts" cmd_ext="-d mimetype=plaintext -d hostformat=hosts"
;; ;;
# Default is a simple request # Default is a simple request
*) cmd_ext="" *) cmd_ext=""
esac esac
gravity_transport "$url" "$cmd_ext" "$agent" gravity_transport "${url}" "${cmd_ext}" "${agent}"
done done
} }
@ -190,9 +189,8 @@ gravity_Schwarzchild() {
# Find all active domains and compile them into one file and remove CRs # Find all active domains and compile them into one file and remove CRs
echo -n "::: Aggregating list of domains..." echo -n "::: Aggregating list of domains..."
truncate -s 0 ${piholeDir}/${matterAndLight} truncate -s 0 ${piholeDir}/${matterAndLight}
for i in "${activeDomains[@]}" for i in "${activeDomains[@]}"; do
do cat "${i}" | tr -d '\r' >> ${piholeDir}/${matterAndLight}
cat "$i" | tr -d '\r' >> ${piholeDir}/${matterAndLight}
done done
echo " done!" echo " done!"
} }
@ -203,8 +201,8 @@ gravity_Blacklist() {
${blacklistScript} -f -nr -q > /dev/null ${blacklistScript} -f -nr -q > /dev/null
numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt") numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt")
plural=; [[ "$numBlacklisted" != "1" ]] && plural=s plural=; [[ "${numBlacklisted}" != "1" ]] && plural=s
echo " $numBlacklisted domain${plural} blacklisted!" echo " ${numBlacklisted} domain${plural} blacklisted!"
} }
gravity_Whitelist() { gravity_Whitelist() {
@ -214,18 +212,17 @@ gravity_Whitelist() {
echo -n "::: Adding ${#sources[@]} adlist source${plural} to the whitelist..." echo -n "::: Adding ${#sources[@]} adlist source${plural} to the whitelist..."
urls=() urls=()
for url in "${sources[@]}" for url in "${sources[@]}"; do
do tmp=$(echo "${url}" | awk -F '/' '{print $3}')
tmp=$(echo "$url" | awk -F '/' '{print $3}') urls=("${urls[@]}" ${tmp})
urls=("${urls[@]}" ${tmp})
done done
echo " done!" echo " done!"
echo -n "::: Running whitelist script to update HOSTS file...." echo -n "::: Running whitelist script to update HOSTS file...."
${whitelistScript} -f -nr -q "${urls[@]}" > /dev/null ${whitelistScript} -f -nr -q "${urls[@]}" > /dev/null
numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt") numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt")
plural=; [[ "$numWhitelisted" != "1" ]] && plural=s plural=; [[ "${numWhitelisted}" != "1" ]] && plural=s
echo " $numWhitelisted domain${plural} whitelisted!" echo " ${numWhitelisted} domain${plural} whitelisted!"
} }
gravity_unique() { gravity_unique() {
@ -234,7 +231,7 @@ gravity_unique() {
sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon} sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon}
echo " done!" echo " done!"
numberOf=$(wc -l < ${piholeDir}/${eventHorizon}) numberOf=$(wc -l < ${piholeDir}/${eventHorizon})
echo "::: $numberOf unique domains trapped in the event horizon." echo "::: ${numberOf} unique domains trapped in the event horizon."
} }
gravity_hostFormat() { gravity_hostFormat() {
@ -248,15 +245,15 @@ 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 "${IPv6_address}" ]];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$IPv6_address $hostname\n$IPv4addr pi.hole\n$IPv6_address 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="$IPv6_address" '{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)
echo -e "$IPv4addr $hostname\n$IPv4addr pi.hole" > ${piholeDir}/${accretionDisc} echo -e "${IPv4addr} ${hostname}\n${IPv4addr} pi.hole" > ${piholeDir}/${accretionDisc}
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4addr" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc} cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="${IPv4addr}" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc}
fi fi
# Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it
@ -266,13 +263,12 @@ gravity_hostFormat() {
# blackbody - remove any remnant files from script processes # blackbody - remove any remnant files from script processes
gravity_blackbody() { gravity_blackbody() {
# Loop through list files # Loop through list files
for file in ${piholeDir}/*.${justDomainsExtension} for file in ${piholeDir}/*.${justDomainsExtension}; do
do
# If list is in active array then leave it (noop) else rm the list # If list is in active array then leave it (noop) else rm the list
if [[ " ${activeDomains[@]} " =~ ${file} ]]; then if [[ " ${activeDomains[@]} " =~ ${file} ]]; then
: :
else else
rm -f "$file" rm -f "${file}"
fi fi
done done
} }
@ -290,7 +286,7 @@ gravity_advanced() {
echo " done!" echo " done!"
numberOf=$(wc -l < ${piholeDir}/${supernova}) numberOf=$(wc -l < ${piholeDir}/${supernova})
echo "::: $numberOf domains being pulled in by gravity..." echo "::: ${numberOf} domains being pulled in by gravity..."
gravity_unique gravity_unique
} }
@ -310,35 +306,34 @@ gravity_reload() {
#First escape forward slashes in the path: #First escape forward slashes in the path:
adList=${adList//\//\\\/} adList=${adList//\//\\\/}
#Now replace the line in dnsmasq file #Now replace the line in dnsmasq file
sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf sed -i "s/^addn-hosts.*/addn-hosts=${adList}/" /etc/dnsmasq.d/01-pihole.conf
find "$piholeDir" -type f -exec chmod 666 {} \; find "${piholeDir}" -type f -exec chmod 666 {} \;
dnsmasqPid=$(pidof dnsmasq) dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then if [[ ${dnsmasqPid} ]]; then
# service already running - reload config # service already running - reload config
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq systemctl restart dnsmasq
else else
service dnsmasq restart service dnsmasq restart
fi fi
else else
# service not running, start it up # service not running, start it up
if [ -x "$(command -v systemctl)" ]; then if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq systemctl start dnsmasq
else else
service dnsmasq start service dnsmasq start
fi fi
fi fi
} }
for var in "$@" for var in "$@"; do
do case "${var}" in
case "$var" in "-f" | "--force" ) forceGrav=true;;
"-f" | "--force" ) forceGrav=true;; "-h" | "--help" ) helpFunc;;
"-h" | "--help" ) helpFunc;; esac
esac
done done
if [[ ${forceGrav} == true ]]; then if [[ ${forceGrav} == true ]]; then

159
pihole
View file

@ -12,130 +12,131 @@
# Must be root to use this tool # Must be root to use this tool
if [[ ! $EUID -eq 0 ]];then if [[ ! $EUID -eq 0 ]];then
if [ -x "$(command -v sudo)" ];then if [ -x "$(command -v sudo)" ];then
exec sudo bash "$0" "$@" exec sudo bash "$0" "$@"
exit $? exit $?
else else
echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo." echo "::: sudo is needed to run pihole commands. Please run this script as root or install sudo."
exit 1 exit 1
fi fi
fi fi
whitelistFunc() { whitelistFunc() {
shift shift
/opt/pihole/whitelist.sh "$@" /opt/pihole/whitelist.sh "$@"
exit 0 exit 0
} }
blacklistFunc() { blacklistFunc() {
shift shift
/opt/pihole/blacklist.sh "$@" /opt/pihole/blacklist.sh "$@"
exit 0 exit 0
} }
debugFunc() { debugFunc() {
/opt/pihole/piholeDebug.sh /opt/pihole/piholeDebug.sh
exit 0 exit 0
} }
flushFunc() { flushFunc() {
/opt/pihole/piholeLogFlush.sh /opt/pihole/piholeLogFlush.sh
exit 0 exit 0
} }
updatePiholeFunc() { updatePiholeFunc() {
/opt/pihole/update.sh /opt/pihole/update.sh
exit 0 exit 0
} }
reconfigurePiholeFunc() { reconfigurePiholeFunc() {
/etc/.pihole/automated\ install/basic-install.sh --reconfigure /etc/.pihole/automated\ install/basic-install.sh --reconfigure
exit 0; exit 0;
} }
updateGravityFunc() { updateGravityFunc() {
/opt/pihole/gravity.sh "$@" /opt/pihole/gravity.sh "$@"
exit 0 exit 0
} }
setupLCDFunction() { setupLCDFunction() {
/opt/pihole/setupLCD.sh /opt/pihole/setupLCD.sh
exit 0 exit 0
} }
queryFunc() { queryFunc() {
domain=$2 domain=$2
for list in /etc/pihole/list.* for list in /etc/pihole/list.*; do
do count=$(grep ${domain} $list | wc -l)
count=$(grep ${domain} $list | wc -l) echo "::: ${list} (${count} results)"
echo "::: ${list} (${count} results)" if [[ ${count} > 0 ]]; then
if [[ ${count} > 0 ]]; then grep ${domain} ${list}
grep ${domain} ${list} fi
fi echo ""
echo "" done
done exit 0
exit 0
} }
chronometerFunc() { chronometerFunc() {
shift shift
/opt/pihole/chronometer.sh "$@" /opt/pihole/chronometer.sh "$@"
exit 0 exit 0
} }
uninstallFunc() { uninstallFunc() {
/opt/pihole/uninstall.sh /opt/pihole/uninstall.sh
exit 0 exit 0
} }
versionFunc() { versionFunc() {
shift shift
/opt/pihole/version.sh "$@" /opt/pihole/version.sh "$@"
exit 0 exit 0
} }
helpFunc() { helpFunc() {
echo "::: Control all PiHole specific functions!" cat << EOM
echo ":::" ::: Control all PiHole specific functions!
echo "::: Usage: pihole [options]" :::
echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer) for more information on usage" ::: Usage: pihole [options]
echo ":::" ::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer) for more information on usage
echo "::: Options:" :::
echo "::: -w, whitelist Whitelist domains" ::: Options:
echo "::: -b, blacklist Blacklist domains" ::: -w, whitelist Whitelist domains
echo "::: -d, debug Start a debugging session if having trouble" ::: -b, blacklist Blacklist domains
echo "::: -f, flush Flush the pihole.log file" ::: -d, debug Start a debugging session if having trouble
echo "::: -up, updatePihole Update Pi-hole" ::: -f, flush Flush the pihole.log file
echo "::: -g, updateGravity Update the list of ad-serving domains" ::: -up, updatePihole Update Pi-hole
echo "::: -s, setupLCD Automatically configures the Pi to use the 2.8 LCD screen to display stats on it" ::: -g, updateGravity Update the list of ad-serving domains
echo "::: -c, chronometer Calculates stats and displays to an LCD" ::: -s, setupLCD Automatically configures the Pi to use the 2.8 LCD screen to display stats on it
echo "::: -h, help Show this help dialog" ::: -c, chronometer Calculates stats and displays to an LCD
echo "::: -v, version Show current versions" ::: -h, help Show this help dialog
echo "::: -q, query Query the adlists for a specific domain" ::: -v, version Show current versions
echo "::: uninstall Uninstall Pi-Hole from your system :(!" ::: -q, query Query the adlists for a specific domain
exit 0 ::: uninstall Uninstall Pi-Hole from your system :(!
EOM
exit 1
} }
if [[ $# = 0 ]]; then if [[ $# = 0 ]]; then
helpFunc helpFunc
fi fi
# Handle redirecting to specific functions based on arguments # Handle redirecting to specific functions based on arguments
case "$1" in case "${1}" in
"-w" | "whitelist" ) whitelistFunc "$@";; "-w" | "whitelist" ) whitelistFunc "$@";;
"-b" | "blacklist" ) blacklistFunc "$@";; "-b" | "blacklist" ) blacklistFunc "$@";;
"-d" | "debug" ) debugFunc;; "-d" | "debug" ) debugFunc;;
"-f" | "flush" ) flushFunc;; "-f" | "flush" ) flushFunc;;
"-up" | "updatePihole" ) updatePiholeFunc;; "-up" | "updatePihole" ) updatePiholeFunc;;
"-r" | "reconfigure" ) reconfigurePiholeFunc;; "-r" | "reconfigure" ) reconfigurePiholeFunc;;
"-g" | "updateGravity" ) updateGravityFunc "$@";; "-g" | "updateGravity" ) updateGravityFunc "$@";;
"-s" | "setupLCD" ) setupLCDFunction;; "-s" | "setupLCD" ) setupLCDFunction;;
"-c" | "chronometer" ) chronometerFunc "$@";; "-c" | "chronometer" ) chronometerFunc "$@";;
"-h" | "help" ) helpFunc;; "-h" | "help" ) helpFunc;;
"-v" | "version" ) versionFunc "$@";; "-v" | "version" ) versionFunc "$@";;
"-q" | "query" ) queryFunc "$@";; "-q" | "query" ) queryFunc "$@";;
"uninstall" ) uninstallFunc;; "uninstall" ) uninstallFunc;;
* ) helpFunc;; * ) helpFunc;;
esac esac