Merge branch 'development' of https://github.com/pi-hole/pi-hole into development

This commit is contained in:
Eric Warnke 2016-10-25 10:09:00 -04:00
commit 38a1b0c05b
7 changed files with 225 additions and 351 deletions

View file

@ -1,4 +1,4 @@
**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]) Failure to fill the template will close your issue:**
- [] 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*

View file

@ -1,4 +1,4 @@
**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])Failure to fill the template will close your PR:**
- [] 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.

View file

@ -19,7 +19,6 @@ helpFunc() {
::: Options: ::: Options:
::: -d, --delmode Remove domains from the blacklist ::: -d, --delmode Remove domains from the blacklist
::: -nr, --noreload Update blacklist without refreshing dnsmasq ::: -nr, --noreload Update blacklist without refreshing dnsmasq
::: -f, --force Force updating of the hosts files, even if there are no changes
::: -q, --quiet output is less verbose ::: -q, --quiet output is less verbose
::: -h, --help Show this help dialog ::: -h, --help Show this help dialog
::: -l, --list Display your blacklisted domains ::: -l, --list Display your blacklisted domains
@ -36,47 +35,18 @@ basename=pihole
piholeDir=/etc/${basename} piholeDir=/etc/${basename}
adList=${piholeDir}/gravity.list adList=${piholeDir}/gravity.list
blacklist=${piholeDir}/blacklist.txt blacklist=${piholeDir}/blacklist.txt
reload=true reload=false
addmode=true addmode=true
force=false
verbose=true verbose=true
domList=() domList=()
domToRemoveList=() domToRemoveList=()
piholeIPfile=/etc/pihole/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6
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
piholeIP=$(cat ${piholeIPfile})
#rm $piholeIPfile
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
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}')
piholeIP=${piholeIPCIDR%/*}
fi
modifyHost=false
# After setting defaults, check if there's local overrides
if [[ -r ${piholeDir}/pihole.conf ]]; then
echo "::: Local calibration requested..."
. ${piholeDir}/pihole.conf
fi
if [[ -f ${piholeIPv6file} ]]; then
# 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) }')
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
@ -88,10 +58,10 @@ PopBlacklistFile() {
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
} }
@ -105,17 +75,18 @@ AddDomain() {
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 reload=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
@ -124,86 +95,37 @@ RemoveDomain() {
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,remove it
if ${verbose}; then if ${verbose}; then
echo "::: Un-blacklisting ${dom}..." echo "::: Un-blacklisting $dom..."
fi fi
domToRemoveList=("${domToRemoveList[@]}" $1) echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist}
modifyHost=true reload=true
fi
}
ModifyHostFile() {
if ${addmode}; then
#add domains to the hosts file
if [[ -r ${blacklist} ]]; then
numberOf=$(cat ${blacklist} | sed '/^\s*$/d' | wc -l)
plural=; [[ "${numberOf}" != "1" ]] && plural=s
echo ":::"
echo -n "::: Modifying HOSTS file to blacklist $numberOf domain${plural}..."
if [[ -n ${piholeIPv6} ]]; then
cat ${blacklist} | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${adList}
else
cat ${blacklist} | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList}
fi
fi
else
echo ":::"
for dom in "${domToRemoveList[@]}"; do
#we need to remove the domains from the blacklist file and the host file
echo "::: ${dom}"
echo -n "::: removing from HOSTS file..."
echo "${dom}" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' ${adList}
echo " done!"
echo -n "::: removing from blackist.txt..."
echo "${dom}" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist}
echo " done!"
done
fi fi
} }
Reload() { Reload() {
# Reload hosts file pihole -g -sd
echo ":::"
echo -n "::: Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then
# service already running - reload config
if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq
else
service dnsmasq restart
fi
else
# service not running, start it up
if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq
else
service dnsmasq start
fi
fi
echo " done!"
} }
DisplayBlist() { 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; do while IFS= read -r AD
echo "${count}: ${AD}" do
echo "${count}: $AD"
count=$((count+1)) count=$((count+1))
done < "${blacklist}" done < "$blacklist"
} }
################################################### ###################################################
for var in "$@"; do for var in "$@"
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;;
"-q" | "--quiet" ) verbose=false;; "-q" | "--quiet" ) verbose=false;;
"-h" | "--help" ) helpFunc;; "-h" | "--help" ) helpFunc;;
"-l" | "--list" ) DisplayBlist;; "-l" | "--list" ) DisplayBlist;;
@ -213,15 +135,6 @@ done
PopBlacklistFile PopBlacklistFile
if ${modifyHost} || ${force}; then
ModifyHostFile
else
if ${verbose}; then
echo "::: No changes need to be made"
fi
exit 1
fi
if ${reload}; then if ${reload}; then
Reload Reload
fi fi

View file

@ -20,7 +20,6 @@ helpFunc() {
::: Options: ::: Options:
::: -d, --delmode Remove domains from the whitelist ::: -d, --delmode Remove domains from the whitelist
::: -nr, --noreload Update Whitelist without refreshing dnsmasq ::: -nr, --noreload Update Whitelist without refreshing dnsmasq
::: -f, --force Force updating of the hosts files, even if there are no changes
::: -q, --quiet output is less verbose ::: -q, --quiet output is less verbose
::: -h, --help Show this help dialog ::: -h, --help Show this help dialog
::: -l, --list Display your whitelisted domains ::: -l, --list Display your whitelisted domains
@ -37,41 +36,13 @@ basename=pihole
piholeDir=/etc/${basename} piholeDir=/etc/${basename}
adList=${piholeDir}/gravity.list adList=${piholeDir}/gravity.list
whitelist=${piholeDir}/whitelist.txt whitelist=${piholeDir}/whitelist.txt
reload=true reload=false
addmode=true addmode=true
force=false
verbose=true verbose=true
domList=() domList=()
domToRemoveList=() domToRemoveList=()
piholeIPfile=/etc/pihole/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6
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
piholeIP=$(cat ${piholeIPfile})
#rm $piholeIPfile
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
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}')
piholeIP=${piholeIPCIDR%/*}
fi
modifyHost=false
# After setting defaults, check if there's local overrides
if [[ -r ${piholeDir}/pihole.conf ]]; then
echo "::: Local calibration requested..."
. ${piholeDir}/pihole.conf
fi
if [[ -f ${piholeIPv6file} ]]; then
# 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) }')
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/')
@ -104,10 +75,10 @@ AddDomain() {
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 if ${verbose}; then
echo -n "::: Adding ${1}to ${whitelist}..." echo -n "::: Adding $1 to $whitelist..."
fi fi
echo "${1}" >> ${whitelist} reload=true
modifyHost=true echo "$1" >> ${whitelist}
if ${verbose}; then if ${verbose}; then
echo " done!" echo " done!"
fi fi
@ -125,83 +96,17 @@ RemoveDomain() {
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 echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist}
#if $verbose; then reload=true
#echo "::: Un-whitelisting $dom..."
#fi
domToRemoveList=("${domToRemoveList[@]}" ${1})
modifyHost=true
fi
}
ModifyHostFile() {
if ${addmode}; then
#remove domains in from hosts file
if [[ -r ${whitelist} ]]; then
# Remove whitelist entries
numberOf=$(cat ${whitelist} | sed '/^\s*$/d' | wc -l)
plural=; [[ "${numberOf}" != "1" ]] && plural=s
echo ":::"
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 "${piholeIPv6} ${line}"; done >> /etc/pihole/whitelist.tmp
echo "l" >> /etc/pihole/whitelist.tmp
grep -F -x -v -f ${piholeDir}/whitelist.tmp ${adList} > ${piholeDir}/gravity.tmp
rm ${adList}
mv ${piholeDir}/gravity.tmp ${adList}
rm ${piholeDir}/whitelist.tmp
echo " done!"
fi
else
#we need to add the removed domains to the hosts file
echo ":::"
echo "::: Modifying HOSTS file to un-whitelist domains..."
for rdom in "${domToRemoveList[@]}"; do
if grep -q "${rdom}" /etc/pihole/*.domains; then
echo "::: AdLists contain ${rdom}, re-adding block"
if [[ -n ${piholeIPv6} ]]; then
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 " done!"
else
echo -n "::: Restoring block for ${rdom} on IPv4..."
echo "${rdom}" | awk -v ipv4addr="${piholeIP}" '{sub(/\r$/,""); print ipv4addr" "$0}' >>${adList}
echo " done!"
fi
fi
echo -n "::: Removing $rdom from $whitelist..."
echo "$rdom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist}
echo " done!"
done
fi fi
} }
Reload() { Reload() {
# Reload hosts file # Reload hosts file
echo ":::" pihole -g -sd
echo -n "::: Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then
# service already running - reload config
if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq
else
service dnsmasq restart
fi
else
# service not running, start it up
if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq
else
service dnsmasq start
fi
fi
echo " done!"
} }
DisplayWlist() { DisplayWlist() {
@ -212,6 +117,7 @@ DisplayWlist() {
echo "${count}: ${RD}" echo "${count}: ${RD}"
count=$((count+1)) count=$((count+1))
done < "${whitelist}" done < "${whitelist}"
exit 0;
} }
################################################### ###################################################
@ -230,16 +136,6 @@ done
PopWhitelistFile PopWhitelistFile
if ${modifyHost} || ${force}; then
ModifyHostFile
else
if ${verbose}; then
echo ":::"
echo "::: No changes need to be made"
fi
exit 1
fi
if ${reload}; then if ${reload}; then
Reload Reload
fi fi

View file

@ -21,10 +21,6 @@
# Pi-hole: Update Pi-hole! Uncomment to enable auto update # Pi-hole: Update Pi-hole! Uncomment to enable auto update
#30 2 * * 7 root /usr/local/bin/pihole updatePihole #30 2 * * 7 root /usr/local/bin/pihole updatePihole
# Pi-hole: Parse the log file before it is flushed and save the stats to a database
# This will be used for a historical view of your Pi-hole's performance
#50 23 * * * root /usr/local/bin/dailyLog.sh # note: this is outdated
# Pi-hole: Flush the log daily at 00:00 so it doesn't get out of control # Pi-hole: Flush the log daily at 00:00 so it doesn't get out of control
# Stats will be viewable in the Web interface thanks to the cron job above # Stats will be viewable in the Web interface thanks to the cron job above
00 00 * * * root /usr/local/bin/pihole flush 00 00 * * * root /usr/local/bin/pihole flush

View file

@ -31,6 +31,8 @@ adListFile=/etc/pihole/adlists.list
adListDefault=/etc/pihole/adlists.default adListDefault=/etc/pihole/adlists.default
whitelistScript=/opt/pihole/whitelist.sh whitelistScript=/opt/pihole/whitelist.sh
blacklistScript=/opt/pihole/blacklist.sh blacklistScript=/opt/pihole/blacklist.sh
whitelistFile=/etc/pihole/whitelist.txt
blacklistFile=/etc/pihole/blacklist.txt
#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
@ -43,7 +45,7 @@ else
fi fi
#Remove the /* from the end of the IPv4addr. #Remove the /* from the end of the IPv4addr.
IPv4addr=${IPv4_address%/*} IPv4_address=${IPv4_address%/*}
# Variables for various stages of downloading and formatting the list # Variables for various stages of downloading and formatting the list
basename=pihole basename=pihole
@ -52,9 +54,12 @@ adList=${piholeDir}/gravity.list
justDomainsExtension=domains justDomainsExtension=domains
matterAndLight=${basename}.0.matterandlight.txt matterAndLight=${basename}.0.matterandlight.txt
supernova=${basename}.1.supernova.txt supernova=${basename}.1.supernova.txt
eventHorizon=${basename}.2.eventHorizon.txt preEventHorizon=list.preEventHorizon
eventHorizon=${basename}.2.supernova.txt
accretionDisc=${basename}.3.accretionDisc.txt accretionDisc=${basename}.3.accretionDisc.txt
skipDownload=false
# 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."
@ -93,20 +98,6 @@ gravity_collapse() {
done < ${adListDefault} done < ${adListDefault}
echo " done!" echo " done!"
fi fi
# Create the pihole resource directory if it doesn't exist. Future files will be stored here
if [[ -d ${piholeDir} ]]; then
# Temporary hack to allow non-root access to pihole directory
# Will update later, needed for existing installs, new installs should
# create this directory as non-root
chmod 777 ${piholeDir}
echo ":::"
echo "::: Existing pihole directory found"
else
echo "::: Creating pihole directory..."
mkdir ${piholeDir}
chmod 777 ${piholeDir}
fi
} }
# patternCheck - check to see if curl downloaded any new files. # patternCheck - check to see if curl downloaded any new files.
@ -117,7 +108,7 @@ gravity_patternCheck() {
# 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}" mv "${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
@ -143,8 +134,6 @@ gravity_transport() {
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
rm -f "${patternBuffer}"
} }
# spinup - main gravity function # spinup - main gravity function
@ -162,8 +151,6 @@ gravity_spinup() {
agent="Mozilla/10.0" agent="Mozilla/10.0"
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
@ -179,7 +166,10 @@ gravity_spinup() {
# Default is a simple request # Default is a simple request
*) cmd_ext="" *) cmd_ext=""
esac esac
gravity_transport "${url}" "${cmd_ext}" "${agent}" if [[ "${skipDownload}" == false ]]; then
echo -n "::: Getting $domain list..."
gravity_transport "$url" "$cmd_ext" "$agent"
fi
done done
} }
@ -197,19 +187,20 @@ gravity_Schwarzchild() {
gravity_Blacklist() { gravity_Blacklist() {
# Append blacklist entries if they exist # Append blacklist entries if they exist
echo -n "::: Running blacklist script to update HOSTS file...." numBlacklisted=$(wc -l < "${blacklistFile}")
${blacklistScript} -f -nr -q > /dev/null plural=; [[ "$numBlacklisted" != "1" ]] && plural=s
numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt") echo -n "::: BlackListing $numBlacklisted domain${plural}..."
plural=; [[ "${numBlacklisted}" != "1" ]] && plural=s cat ${blacklistFile} >> ${piholeDir}/${eventHorizon}
echo " ${numBlacklisted} domain${plural} blacklisted!" echo " done!"
} }
gravity_Whitelist() { gravity_Whitelist() {
#${piholeDir}/${eventHorizon})
echo ":::" echo ":::"
# Prevent our sources from being pulled into the hole # Prevent our sources from being pulled into the hole
plural=; [[ "${sources[@]}" != "1" ]] && plural=s plural=; [[ "${sources[@]}" != "1" ]] && plural=s
echo -n "::: Adding ${#sources[@]} adlist source${plural} to the whitelist..." echo -n "::: Adding adlist source${plural} to the whitelist..."
urls=() urls=()
for url in "${sources[@]}"; do for url in "${sources[@]}"; do
@ -218,20 +209,24 @@ gravity_Whitelist() {
done done
echo " done!" echo " done!"
echo -n "::: Running whitelist script to update HOSTS file...." # Ensure adlist domains are in whitelist.txt
${whitelistScript} -f -nr -q "${urls[@]}" > /dev/null ${whitelistScript} -nr -q "${urls[@]}" > /dev/null
numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt")
plural=; [[ "${numWhitelisted}" != "1" ]] && plural=s # Remove anything in whitelist.txt from the Event Horizon
echo " ${numWhitelisted} domain${plural} whitelisted!" numWhitelisted=$(wc -l < "${whitelistFile}")
plural=; [[ "$numWhitelisted" != "1" ]] && plural=s
echo -n "::: Whitelisting $numWhitelisted domain${plural}..."
grep -F -x -v -f ${whitelistFile} ${piholeDir}/${preEventHorizon} > ${piholeDir}/${eventHorizon}
echo " done!"
} }
gravity_unique() { gravity_unique() {
# Sort and remove duplicates # Sort and remove duplicates
echo -n "::: Removing duplicate domains...." echo -n "::: Removing duplicate domains...."
sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon} sort -u ${piholeDir}/${supernova} > ${piholeDir}/${preEventHorizon}
echo " done!" echo " done!"
numberOf=$(wc -l < ${piholeDir}/${eventHorizon}) numberOf=$(wc -l < ${piholeDir}/${preEventHorizon})
echo "::: ${numberOf} unique domains trapped in the event horizon." echo "::: $numberOf unique domains trapped in the event horizon."
} }
gravity_hostFormat() { gravity_hostFormat() {
@ -244,16 +239,29 @@ gravity_hostFormat() {
else else
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 [[ -n "${IPv6_address}" ]]; then # Check vars from setupVars.conf to see if we're using IPv4, IPv6, Or both.
# 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) if [[ -n "${IPv4_address}" && -n "${IPv6_address}" ]];then
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} # Both IPv4 and IPv6
else echo -e "$IPv4_address $hostname\n$IPv6_address $hostname\n$IPv4_address pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc}
# Otherwise, just create gravity.list as normal using IPv4 cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
# 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} elif [[ -n "${IPv4_address}" && -z "${IPv6_address}" ]];then
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="${IPv4addr}" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc}
# Only IPv4
echo -e "$IPv4_address $hostname\n$IPv4_address pi.hole" > ${piholeDir}/${accretionDisc}
cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc}
elif [[ -z "${IPv4_address}" && -n "${IPv6_address}" ]];then
# Only IPv6
echo -e "$IPv6_address $hostname\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc}
cat ${piholeDir}/${eventHorizon} | awk -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc}
elif [[ -z "${IPv4_address}" && -z "${IPv6_address}" ]];then
echo "::: No IP Values found! Please run 'pihole -r' and choose reconfigure to restore values"
exit 1
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
@ -300,43 +308,26 @@ gravity_reload() {
# Reload hosts file # Reload hosts file
echo ":::" echo ":::"
echo -n "::: Refresh lists in dnsmasq..." echo "::: Refresh lists in dnsmasq..."
#ensure /etc/dnsmasq.d/01-pihole.conf is pointing at the correct list! #ensure /etc/dnsmasq.d/01-pihole.conf is pointing at the correct list!
#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 {} \;
dnsmasqPid=$(pidof dnsmasq) pihole restartdns
if [[ ${dnsmasqPid} ]]; then
# service already running - reload config
if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq
else
service dnsmasq restart
fi
else
# service not running, start it up
if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq
else
service dnsmasq start
fi
fi
} }
for var in "$@"; do for var in "$@"; do
case "${var}" in case "${var}" in
"-f" | "--force" ) forceGrav=true;; "-f" | "--force" ) forceGrav=true;;
"-h" | "--help" ) helpFunc;; "-h" | "--help" ) helpFunc;;
"-sd" | "--skip-download" ) skipDownload=true;;
esac esac
done done
if [[ ${forceGrav} == true ]]; then if [[ "${forceGrav}" == true ]]; then
echo -n "::: Deleting exising list cache..." echo -n "::: Deleting exising list cache..."
rm /etc/pihole/list.* rm /etc/pihole/list.*
echo " done!" echo " done!"
@ -346,10 +337,19 @@ fi
cp /etc/.pihole/adlists.default /etc/pihole/adlists.default cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
gravity_collapse gravity_collapse
gravity_spinup gravity_spinup
if [[ "${skipDownload}" == false ]]; then
gravity_Schwarzchild gravity_Schwarzchild
gravity_advanced gravity_advanced
gravity_hostFormat else
gravity_blackbody echo "::: Using cached Event Horizon list..."
numberOf=$(wc -l < ${piholeDir}/${preEventHorizon})
echo "::: $numberOf unique domains trapped in the event horizon."
fi
gravity_Whitelist gravity_Whitelist
gravity_Blacklist gravity_Blacklist
gravity_hostFormat
gravity_blackbody
gravity_reload gravity_reload
pihole status

69
pihole
View file

@ -95,6 +95,67 @@ versionFunc() {
exit 0 exit 0
} }
restartDNS() {
dnsmasqPid=$(pidof dnsmasq)
if [[ ${dnsmasqPid} ]]; then
# service already running - reload config
if [ -x "$(command -v systemctl)" ]; then
systemctl restart dnsmasq
else
service dnsmasq restart
fi
else
# service not running, start it up
if [ -x "$(command -v systemctl)" ]; then
systemctl start dnsmasq
else
service dnsmasq start
fi
fi
}
piholeEnable() {
if [[ "${1}" == "0" ]] ; then
#Disable Pihole
sed -i 's/^addn-hosts/#addn-hosts/' /etc/dnsmasq.d/01-pihole.conf
echo "::: Blocking has been disabled!"
else
#Enable pihole
echo "::: Blocking has been enabled!"
sed -i 's/^#addn-hosts/addn-hosts/' /etc/dnsmasq.d/01-pihole.conf
fi
restartDNS
}
piholeStatus() {
if [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "#addn-hosts=/") ]] ; then
#list is commented out
if [[ "${1}" == "web" ]] ; then
echo 0;
else
echo "::: Pi-hole blocking is Disabled";
fi
elif [[ $(cat /etc/dnsmasq.d/01-pihole.conf | grep "addn-hosts=/") ]] ; then
#list set
if [[ "${1}" == "web" ]] ; then
echo 1;
else
echo "::: Pi-hole blocking is Enabled";
fi
else
#addn-host not found
if [[ "${1}" == "web" ]] ; then
echo 99
else
echo "::: No hosts file linked to dnsmasq, adding it in enabled state"
fi
#add addn-host= to dnsmasq
echo "addn-hosts=/etc/pihole/gravity.list" >> /etc/dnsmasq.d/01-pihole.conf
restartDNS
fi
}
helpFunc() { helpFunc() {
cat << EOM cat << EOM
::: Control all PiHole specific functions! ::: Control all PiHole specific functions!
@ -115,6 +176,10 @@ helpFunc() {
::: -v, version Show current versions ::: -v, version Show current versions
::: -q, query Query the adlists for a specific domain ::: -q, query Query the adlists for a specific domain
::: uninstall Uninstall Pi-Hole from your system :(! ::: uninstall Uninstall Pi-Hole from your system :(!
::: status Is Pi-Hole Enabled or Disabled
::: enable Enable Pi-Hole DNS Blocking
::: disable Disable Pi-Hole DNS Blocking
::: restartdns Restart dnsmasq
EOM EOM
exit 1 exit 1
} }
@ -138,5 +203,9 @@ case "${1}" in
"-v" | "version" ) versionFunc "$@";; "-v" | "version" ) versionFunc "$@";;
"-q" | "query" ) queryFunc "$@";; "-q" | "query" ) queryFunc "$@";;
"uninstall" ) uninstallFunc;; "uninstall" ) uninstallFunc;;
"enable" ) piholeEnable 1;;
"disable" ) piholeEnable 0;;
"status" ) piholeStatus "$2";;
"restartdns" ) restartDNS;;
* ) helpFunc;; * ) helpFunc;;
esac esac