diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index e265f6d0..53f5b429 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -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). - [] The issue I am reporting can be *replicated* diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 5f55e443..7291be41 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -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 checked that [another pull request](https://github.com/pi-hole/pi-hole/pulls) for this purpose does not exist. diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index 46c6833e..acf0cf60 100755 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -19,7 +19,6 @@ helpFunc() { ::: Options: ::: -d, --delmode Remove domains from the blacklist ::: -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 ::: -h, --help Show this help dialog ::: -l, --list Display your blacklisted domains @@ -36,192 +35,106 @@ basename=pihole piholeDir=/etc/${basename} adList=${piholeDir}/gravity.list blacklist=${piholeDir}/blacklist.txt -reload=true +reload=false addmode=true -force=false verbose=true domList=() 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() { - #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/') - if [ -z "${validDomain}" ]; then - echo "::: ${1} is not a valid argument or domain name" +HandleOther(){ + #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/') + if [ -z "$validDomain" ]; then + echo "::: $1 is not a valid argument or domain name" else - domList=("${domList[@]}" ${validDomain}) + domList=("${domList[@]}" ${validDomain}) fi } PopBlacklistFile() { #check blacklist file exists, and if not, create it - if [[ ! -f ${blacklist} ]]; then - touch ${blacklist} + if [[ ! -f ${blacklist} ]];then + touch ${blacklist} fi for dom in "${domList[@]}"; do - if "${addmode}"; then - AddDomain "${dom}" - else - RemoveDomain "${dom}" - fi + if "$addmode"; then + AddDomain "$dom" + else + RemoveDomain "$dom" + fi done } AddDomain() { - #| sed 's/\./\\./g' +#| sed 's/\./\\./g' bool=false grep -Ex -q "$1" ${blacklist} || bool=true if ${bool}; then - #domain not found in the blacklist file, add it! - if ${verbose}; then - echo -n "::: Adding $1 to blacklist file..." - fi - echo "${1}" >> ${blacklist} - modifyHost=true + #domain not found in the blacklist file, add it! + if ${verbose}; then + echo -n "::: Adding $1 to blacklist file..." + fi + echo "$1" >> ${blacklist} + reload=true echo " done!" else 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 } RemoveDomain() { - bool=false - grep -Ex -q "$1" ${blacklist} || bool=true - if ${bool}; then - #Domain is not in the blacklist file, no need to Remove - if ${verbose}; then - echo "::: $1 is NOT blacklisted! No need to remove" - fi - else - #Domain is in the blacklist file, add to a temporary array - if ${verbose}; then - echo "::: Un-blacklisting ${dom}..." - fi - domToRemoveList=("${domToRemoveList[@]}" $1) - modifyHost=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 + bool=false + grep -Ex -q "$1" ${blacklist} || bool=true + if ${bool}; then + #Domain is not in the blacklist file, no need to Remove + if ${verbose}; then + echo "::: $1 is NOT blacklisted! No need to remove" + fi + else + #Domain is in the blacklist file,remove it + if ${verbose}; then + echo "::: Un-blacklisting $dom..." + fi + echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${blacklist} + reload=true + fi } Reload() { - # Reload hosts file - 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!" + pihole -g -sd } DisplayBlist() { verbose=false echo -e " Displaying Gravity Affected Domains \n" count=1 - while IFS= read -r AD; do - echo "${count}: ${AD}" + while IFS= read -r AD + do + echo "${count}: $AD" count=$((count+1)) - done < "${blacklist}" + done < "$blacklist" } ################################################### -for var in "$@"; do - case "$var" in - "-nr"| "--noreload" ) reload=false;; - "-d" | "--delmode" ) addmode=false;; - "-f" | "--force" ) force=true;; - "-q" | "--quiet" ) verbose=false;; - "-h" | "--help" ) helpFunc;; - "-l" | "--list" ) DisplayBlist;; - * ) HandleOther "$var";; - esac +for var in "$@" +do + case "$var" in + "-nr"| "--noreload" ) reload=false;; + "-d" | "--delmode" ) addmode=false;; + "-q" | "--quiet" ) verbose=false;; + "-h" | "--help" ) helpFunc;; + "-l" | "--list" ) DisplayBlist;; + * ) HandleOther "$var";; + esac done PopBlacklistFile -if ${modifyHost} || ${force}; then - ModifyHostFile -else - if ${verbose}; then - echo "::: No changes need to be made" - fi - exit 1 -fi - if ${reload}; then Reload fi diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index f1a9fb73..82ff3bb3 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -20,7 +20,6 @@ helpFunc() { ::: Options: ::: -d, --delmode Remove domains from the whitelist ::: -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 ::: -h, --help Show this help dialog ::: -l, --list Display your whitelisted domains @@ -37,43 +36,15 @@ basename=pihole piholeDir=/etc/${basename} adList=${piholeDir}/gravity.list whitelist=${piholeDir}/whitelist.txt -reload=true +reload=false addmode=true -force=false verbose=true domList=() 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() { - #check validity of domain +HandleOther(){ + #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/') if [ -z "${validDomain}" ]; then echo "::: $1 is not a valid argument or domain name" @@ -102,15 +73,15 @@ AddDomain() { grep -Ex -q "$1" ${whitelist} || bool=true if ${bool}; then - #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 - echo " done!" - fi + #domain not found in the whitelist file, add it! + if ${verbose}; then + echo -n "::: Adding $1 to $whitelist..." + fi + reload=true + echo "$1" >> ${whitelist} + if ${verbose}; then + echo " done!" + fi else if ${verbose}; then echo "::: ${1} already exists in ${whitelist}, no need to add!" @@ -120,88 +91,22 @@ AddDomain() { RemoveDomain() { - bool=false - grep -Ex -q "$1" ${whitelist} || bool=true - if ${bool}; then - #Domain is not in the whitelist file, no need to Remove - if ${verbose}; then - echo "::: ${1} is NOT whitelisted! No need to remove" - fi - else - #Domain is in the whitelist file, add to a temporary array and remove from whitelist file - #if $verbose; then - #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 + bool=false + grep -Ex -q "$1" ${whitelist} || bool=true + if ${bool}; then + #Domain is not in the whitelist file, no need to Remove + if ${verbose}; then + echo "::: $1 is NOT whitelisted! No need to remove" + fi + else + echo "$1" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' ${whitelist} + reload=true + fi } Reload() { # Reload hosts file - 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!" + pihole -g -sd } DisplayWlist() { @@ -212,6 +117,7 @@ DisplayWlist() { echo "${count}: ${RD}" count=$((count+1)) done < "${whitelist}" + exit 0; } ################################################### @@ -230,16 +136,6 @@ done 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 Reload fi diff --git a/advanced/pihole.cron b/advanced/pihole.cron index fd557fbd..77b7c1ca 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -21,10 +21,6 @@ # Pi-hole: Update Pi-hole! Uncomment to enable auto update #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 # Stats will be viewable in the Web interface thanks to the cron job above 00 00 * * * root /usr/local/bin/pihole flush diff --git a/gravity.sh b/gravity.sh index da1009e6..03aafabb 100755 --- a/gravity.sh +++ b/gravity.sh @@ -31,6 +31,8 @@ adListFile=/etc/pihole/adlists.list adListDefault=/etc/pihole/adlists.default whitelistScript=/opt/pihole/whitelist.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 setupVars=/etc/pihole/setupVars.conf @@ -43,7 +45,7 @@ else fi #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 basename=pihole @@ -52,9 +54,12 @@ adList=${piholeDir}/gravity.list justDomainsExtension=domains matterAndLight=${basename}.0.matterandlight.txt supernova=${basename}.1.supernova.txt -eventHorizon=${basename}.2.eventHorizon.txt +preEventHorizon=list.preEventHorizon +eventHorizon=${basename}.2.supernova.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) if [[ -r ${piholeDir}/pihole.conf ]]; then echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored." @@ -93,20 +98,6 @@ gravity_collapse() { done < ${adListDefault} echo " done!" 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. @@ -117,7 +108,7 @@ gravity_patternCheck() { # Some of the blocklists are copyright, they need to be downloaded # and stored as is. They can be processed for content after they # have been saved. - cp "${patternBuffer}" "${saveLocation}" + mv "${patternBuffer}" "${saveLocation}" echo " List updated, transport successful!" else # 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} # Check for list updates gravity_patternCheck "${patternBuffer}" - # Cleanup - rm -f "${patternBuffer}" } # spinup - main gravity function @@ -162,8 +151,6 @@ gravity_spinup() { agent="Mozilla/10.0" - echo -n "::: Getting ${domain} list..." - # Use a case statement to download lists that need special cURL commands # to complete properly and reset the user agent when required case "${domain}" in @@ -176,10 +163,13 @@ gravity_spinup() { cmd_ext="-d mimetype=plaintext -d hostformat=hosts" ;; - # Default is a simple request - *) cmd_ext="" - esac - gravity_transport "${url}" "${cmd_ext}" "${agent}" + # Default is a simple request + *) cmd_ext="" + esac + if [[ "${skipDownload}" == false ]]; then + echo -n "::: Getting $domain list..." + gravity_transport "$url" "$cmd_ext" "$agent" + fi done } @@ -197,19 +187,20 @@ gravity_Schwarzchild() { gravity_Blacklist() { # Append blacklist entries if they exist - echo -n "::: Running blacklist script to update HOSTS file...." - ${blacklistScript} -f -nr -q > /dev/null + numBlacklisted=$(wc -l < "${blacklistFile}") + plural=; [[ "$numBlacklisted" != "1" ]] && plural=s - numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt") - plural=; [[ "${numBlacklisted}" != "1" ]] && plural=s - echo " ${numBlacklisted} domain${plural} blacklisted!" + echo -n "::: BlackListing $numBlacklisted domain${plural}..." + cat ${blacklistFile} >> ${piholeDir}/${eventHorizon} + echo " done!" } gravity_Whitelist() { + #${piholeDir}/${eventHorizon}) echo ":::" # Prevent our sources from being pulled into the hole 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=() for url in "${sources[@]}"; do @@ -218,20 +209,24 @@ gravity_Whitelist() { done echo " done!" - echo -n "::: Running whitelist script to update HOSTS file...." - ${whitelistScript} -f -nr -q "${urls[@]}" > /dev/null - numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt") - plural=; [[ "${numWhitelisted}" != "1" ]] && plural=s - echo " ${numWhitelisted} domain${plural} whitelisted!" + # Ensure adlist domains are in whitelist.txt + ${whitelistScript} -nr -q "${urls[@]}" > /dev/null + + # Remove anything in whitelist.txt from the Event Horizon + 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() { # Sort and remove duplicates echo -n "::: Removing duplicate domains...." - sort -u ${piholeDir}/${supernova} > ${piholeDir}/${eventHorizon} + sort -u ${piholeDir}/${supernova} > ${piholeDir}/${preEventHorizon} echo " done!" - numberOf=$(wc -l < ${piholeDir}/${eventHorizon}) - echo "::: ${numberOf} unique domains trapped in the event horizon." + numberOf=$(wc -l < ${piholeDir}/${preEventHorizon}) + echo "::: $numberOf unique domains trapped in the event horizon." } gravity_hostFormat() { @@ -244,17 +239,30 @@ gravity_hostFormat() { else echo "::: Error: Unable to determine fully qualified domain name of host" 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 - # 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} - cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="${IPv4addr}" -v ipv6addr="${IPv6_address}" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} - else - # 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) - echo -e "${IPv4addr} ${hostname}\n${IPv4addr} pi.hole" > ${piholeDir}/${accretionDisc} - cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="${IPv4addr}" '{sub(/\r$/,""); print ipv4addr" "$0}' >> ${piholeDir}/${accretionDisc} - fi + + # Check vars from setupVars.conf to see if we're using IPv4, IPv6, Or both. + if [[ -n "${IPv4_address}" && -n "${IPv6_address}" ]];then + + # Both IPv4 and IPv6 + echo -e "$IPv4_address $hostname\n$IPv6_address $hostname\n$IPv4_address pi.hole\n$IPv6_address pi.hole" > ${piholeDir}/${accretionDisc} + cat ${piholeDir}/${eventHorizon} | awk -v ipv4addr="$IPv4_address" -v ipv6addr="$IPv6_address" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> ${piholeDir}/${accretionDisc} + + elif [[ -n "${IPv4_address}" && -z "${IPv6_address}" ]];then + + # 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 # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp ${piholeDir}/${accretionDisc} ${adList} @@ -300,43 +308,26 @@ gravity_reload() { # Reload hosts file 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! #First escape forward slashes in the path: adList=${adList//\//\\\/} #Now replace the line in dnsmasq file - sed -i "s/^addn-hosts.*/addn-hosts=${adList}/" /etc/dnsmasq.d/01-pihole.conf - find "${piholeDir}" -type f -exec chmod 666 {} \; +# sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf - 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 + pihole restartdns } - for var in "$@"; do case "${var}" in "-f" | "--force" ) forceGrav=true;; "-h" | "--help" ) helpFunc;; + "-sd" | "--skip-download" ) skipDownload=true;; esac done -if [[ ${forceGrav} == true ]]; then +if [[ "${forceGrav}" == true ]]; then echo -n "::: Deleting exising list cache..." rm /etc/pihole/list.* echo " done!" @@ -346,10 +337,19 @@ fi cp /etc/.pihole/adlists.default /etc/pihole/adlists.default gravity_collapse gravity_spinup -gravity_Schwarzchild -gravity_advanced -gravity_hostFormat -gravity_blackbody +if [[ "${skipDownload}" == false ]]; then + gravity_Schwarzchild + gravity_advanced +else + echo "::: Using cached Event Horizon list..." + numberOf=$(wc -l < ${piholeDir}/${preEventHorizon}) + echo "::: $numberOf unique domains trapped in the event horizon." +fi gravity_Whitelist gravity_Blacklist + +gravity_hostFormat +gravity_blackbody + gravity_reload +pihole status diff --git a/pihole b/pihole index 42a390f2..9a678393 100755 --- a/pihole +++ b/pihole @@ -95,6 +95,67 @@ versionFunc() { 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() { cat << EOM ::: Control all PiHole specific functions! @@ -115,6 +176,10 @@ helpFunc() { ::: -v, version Show current versions ::: -q, query Query the adlists for a specific domain ::: 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 exit 1 } @@ -138,5 +203,9 @@ case "${1}" in "-v" | "version" ) versionFunc "$@";; "-q" | "query" ) queryFunc "$@";; "uninstall" ) uninstallFunc;; + "enable" ) piholeEnable 1;; + "disable" ) piholeEnable 0;; + "status" ) piholeStatus "$2";; + "restartdns" ) restartDNS;; * ) helpFunc;; esac