diff options
Diffstat (limited to 'gravity.sh')
-rwxr-xr-x | gravity.sh | 272 |
1 files changed, 133 insertions, 139 deletions
@@ -13,36 +13,38 @@ # Run this script as root or under sudo echo ":::" -helpFunc() -{ - echo "::: Pull in domains from adlists" - echo ":::" - echo "::: Usage: pihole -g" - echo ":::" - echo "::: Options:" - echo "::: -f, --force Force lists to be downloaded, even if they don't need updating." - echo "::: -h, --help Show this help dialog" +helpFunc() { + cat << EOM +::: Pull in domains from adlists +::: +::: Usage: pihole -g +::: +::: Options: +::: -f, --force Force lists to be downloaded, even if they don't need updating. +::: -h, --help Show this help dialog +EOM exit 1 } adListFile=/etc/pihole/adlists.list adListDefault=/etc/pihole/adlists.default -whitelistScript=/opt/pihole/whitelist.sh -blacklistScript=/opt/pihole/blacklist.sh +whitelistScript="pihole -w" +whitelistFile=/etc/pihole/whitelist.txt +blacklistFile=/etc/pihole/blacklist.txt #Source the setupVars from install script for the IP setupVars=/etc/pihole/setupVars.conf if [[ -f ${setupVars} ]];then - . /etc/pihole/setupVars.conf + . /etc/pihole/setupVars.conf else - echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." - echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure." - exit 1 + echo "::: WARNING: /etc/pihole/setupVars.conf missing. Possible installation failure." + echo "::: Please run 'pihole -r', and choose the 'reconfigure' option to reconfigure." + exit 1 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 @@ -51,12 +53,15 @@ 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." +if [[ -r ${piholeDir}/pihole.conf ]]; then + echo "::: pihole.conf file no longer supported. Over-rides in this file are ignored." fi ########################### @@ -92,31 +97,17 @@ 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. gravity_patternCheck() { patternBuffer=$1 # 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 # 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 @@ -135,51 +126,49 @@ gravity_transport() { heisenbergCompensator="" if [[ -r ${saveLocation} ]]; then # if domain has been saved, add file for date check to only download newer - heisenbergCompensator="-z $saveLocation" + heisenbergCompensator="-z ${saveLocation}" fi # 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 - gravity_patternCheck "$patternBuffer" - # Cleanup - rm -f "$patternBuffer" + gravity_patternCheck "${patternBuffer}" } # spinup - main gravity function gravity_spinup() { echo ":::" # Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines - for ((i = 0; i < "${#sources[@]}"; i++)) - do - url=${sources[$i]} - # Get just the domain from the URL - domain=$(echo "$url" | cut -d'/' -f3) - - # Save the file as list.#.domain - saveLocation=${piholeDir}/list.${i}.${domain}.${justDomainsExtension} - activeDomains[$i]=${saveLocation} + for ((i = 0; i < "${#sources[@]}"; i++)); do + url=${sources[$i]} + # Get just the domain from the URL + domain=$(echo "${url}" | cut -d'/' -f3) - agent="Mozilla/10.0" + # Save the file as list.#.domain + saveLocation=${piholeDir}/list.${i}.${domain}.${justDomainsExtension} + activeDomains[$i]=${saveLocation} - echo -n "::: Getting $domain list..." + agent="Mozilla/10.0" - # 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 - "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' - cmd_ext="-e http://forum.xda-developers.com/" - ;; + # 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 + "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' + cmd_ext="-e http://forum.xda-developers.com/" + ;; - "pgl.yoyo.org") - cmd_ext="-d mimetype=plaintext -d hostformat=hosts" - ;; + "pgl.yoyo.org") + cmd_ext="-d mimetype=plaintext -d hostformat=hosts" + ;; # Default is a simple request *) cmd_ext="" esac - gravity_transport "$url" "$cmd_ext" "$agent" + if [[ "${skipDownload}" == false ]]; then + echo -n "::: Getting $domain list..." + gravity_transport "$url" "$cmd_ext" "$agent" + fi done } @@ -189,74 +178,89 @@ gravity_Schwarzchild() { # Find all active domains and compile them into one file and remove CRs echo -n "::: Aggregating list of domains..." truncate -s 0 ${piholeDir}/${matterAndLight} - for i in "${activeDomains[@]}" - do - cat "$i" | tr -d '\r' >> ${piholeDir}/${matterAndLight} + for i in "${activeDomains[@]}"; do + cat "${i}" | tr -d '\r' >> ${piholeDir}/${matterAndLight} done echo " done!" } -gravity_Blacklist(){ - # Append blacklist entries if they exist - echo -n "::: Running blacklist script to update HOSTS file...." - ${blacklistScript} -f -nr -q > /dev/null +gravity_Blacklist() { + # Append blacklist entries to eventHorizon if they exist + if [[ -f "${blacklistFile}" ]]; then + numBlacklisted=$(wc -l < "${blacklistFile}") + plural=; [[ "$numBlacklisted" != "1" ]] && plural=s + echo -n "::: BlackListing $numBlacklisted domain${plural}..." + cat ${blacklistFile} >> ${piholeDir}/${eventHorizon} + echo " done!" + else + echo "::: Nothing to blacklist!" + fi - numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt") - plural=; [[ "$numBlacklisted" != "1" ]] && plural=s - echo " $numBlacklisted domain${plural} blacklisted!" } 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 - tmp=$(echo "$url" | awk -F '/' '{print $3}') - urls=("${urls[@]}" ${tmp}) + for url in "${sources[@]}"; do + tmp=$(echo "${url}" | awk -F '/' '{print $3}') + urls=("${urls[@]}" ${tmp}) 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 + + # Check whitelist.txt exists. + if [[ -f "${whitelistFile}" ]]; then + # Remove anything in whitelist.txt from the Event Horizon + numWhitelisted=$(wc -l < "${whitelistFile}") + plural=; [[ "$numWhitelisted" != "1" ]] && plural=s + echo -n "::: Whitelisting $numWhitelisted domain${plural}..." + #print everything from preEventHorizon into eventHorizon EXCEPT domains in whitelist.txt + grep -F -x -v -f ${whitelistFile} ${piholeDir}/${preEventHorizon} > ${piholeDir}/${eventHorizon} + echo " done!" + else + echo "::: Nothing to whitelist!" + fi } 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}) + numberOf=$(wc -l < ${piholeDir}/${preEventHorizon}) echo "::: $numberOf unique domains trapped in the event horizon." } gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "::: Formatting domains into a HOSTS file..." - if [[ -f /etc/hostname ]]; then - hostname=$(</etc/hostname) - elif [ -x "$(command -v hostname)" ]; then - hostname=$(hostname -f) - 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 + 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 + 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 + 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} @@ -265,13 +269,12 @@ gravity_hostFormat() { # blackbody - remove any remnant files from script processes gravity_blackbody() { # Loop through list files - for file in ${piholeDir}/*.${justDomainsExtension} - do + for file in ${piholeDir}/*.${justDomainsExtension}; do # If list is in active array then leave it (noop) else rm the list if [[ " ${activeDomains[@]} " =~ ${file} ]]; then : else - rm -f "$file" + rm -f "${file}" fi done } @@ -289,7 +292,7 @@ gravity_advanced() { echo " done!" numberOf=$(wc -l < ${piholeDir}/${supernova}) - echo "::: $numberOf domains being pulled in by gravity..." + echo "::: ${numberOf} domains being pulled in by gravity..." gravity_unique } @@ -303,44 +306,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 {} \; - - dnsmasqPid=$(pidof dnsmasq) +# sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf - 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;; - esac +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!" @@ -350,10 +335,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 |