diff --git a/README.md b/README.md index 1b7faffc..05bb47ba 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei [![Pi-hole exlplained](http://i.imgur.com/qNybJDX.png)](https://vimeo.com/135965232) ## Pi-hole Projects +- [Go Bananas for CHiP-hole ad blocking](https://www.hackster.io/jacobsalmela/chip-hole-network-wide-ad-blocker-98e037) - [Sky-Hole](http://dlaa.me/blog/post/skyhole) - [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/) - [unRaid-hole](https://github.com/spants/unraidtemplates/blob/master/Spants/unRaid-hole.xml#L13)--[Repo and more info](http://lime-technology.com/forum/index.php?PHPSESSID=c0eae3e5ef7e521f7866034a3336489d&topic=38486.0) @@ -24,6 +25,7 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei - [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole) ## Coverage +- [MacObserver Podcast 585](http://www.macobserver.com/tmo/podcast/macgeekgab-585) - [Medium: Block All Ads For $53](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) - [MakeUseOf: Adblock Everywhere, The Pi-hole Way](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) - [Lifehacker: Turn Your Pi Into An Ad Blocker With A Single Command](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index 3c3c78c6..11c3852c 100644 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -1,182 +1,182 @@ -#!/usr/bin/env bash -# (c) 2015 by Jacob Salmela -# This file is part of Pi-hole. -# -# Pi-hole is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 2 of the License, or -# (at your option) any later version. - -if [[ $# = 0 ]]; then - echo "Immediately blacklists one or more domains in the hosts file" - echo " " - echo "Usage: blacklist.sh domain1 [domain2 ...]" - echo " " - echo "Options:" - echo " -d, --delmode Remove domains from the blacklist" - echo " -nr, --noreload Update blacklist without refreshing dnsmasq" - echo " -f, --force Force updating of the hosts files, even if there are no changes" - echo " -q, --quiet output is less verbose" - exit 1 -fi - -#globals -blacklist=/etc/pihole/blacklist.txt -adList=/etc/pihole/gravity.list -reload=true -addmode=true -force=false -versbose=true -domList=() -domToRemoveList=() - - -piholeIPfile=/tmp/piholeIP -piholeIPv6file=/etc/pihole/.useIPv6 - -# 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%/*} - -modifyHost=false - - -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 - - -function 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) - fi -} - -function PopBlacklistFile(){ - #check blacklist file exists, and if not, create it - if [[ ! -f $blacklist ]];then - touch $blacklist - fi - for dom in "${domList[@]}" - do - if $addmode; then - AddDomain $dom - else - RemoveDomain $dom - fi - done -} - -function AddDomain(){ -#| 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 $versbose; then - echo "** Adding $1 to blacklist file" - fi - echo $1 >> $blacklist - modifyHost=true - else - if $versbose; then - echo "** $1 already blacklisted! No need to add" - fi - fi -} - -function 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 $versbose; then - echo "** $1 is NOT blacklisted! No need to remove" - fi - else - #Domain is in the blacklist file, add to a temporary array - if $versbose; then - echo "** Un-blacklisting $dom..." - fi - domToRemoveList=("${domToRemoveList[@]}" $1) - modifyHost=true - fi -} - -function 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 "** blacklisting a total of $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 - - for dom in "${domToRemoveList[@]}" - do - #we need to remove the domains from the blacklist file and the host 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 /'{}'(?!.)/;' $blacklist - done - fi - -} - -function Reload() { - # Reload hosts file - echo "** Refresh lists in dnsmasq..." - - dnsmasqPid=$(pidof dnsmasq) - - if [[ $dnsmasqPid ]]; then - # service already running - reload config - sudo kill -HUP $dnsmasqPid - else - # service not running, start it up - sudo service dnsmasq start - fi -} - -################################################### - -for var in "$@" -do - case "$var" in - "-nr"| "--noreload" ) reload=false;; - "-d" | "--delmode" ) addmode=false;; - "-f" | "--force" ) force=true;; - "-q" | "--quiet" ) versbose=false;; - * ) HandleOther $var;; - esac -done - -PopBlacklistFile - -if $modifyHost || $force; then - echo "** Modifying Hosts File" - ModifyHostFile -else - if $versbose; then - echo "** No changes need to be made" - fi - exit 1 -fi - -if $reload; then - Reload -fi +#!/usr/bin/env bash +# (c) 2015 by Jacob Salmela +# This file is part of Pi-hole. +# +# Pi-hole is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 2 of the License, or +# (at your option) any later version. + +if [[ $# = 0 ]]; then + echo "Immediately blacklists one or more domains in the hosts file" + echo " " + echo "Usage: blacklist.sh domain1 [domain2 ...]" + echo " " + echo "Options:" + echo " -d, --delmode Remove domains from the blacklist" + echo " -nr, --noreload Update blacklist without refreshing dnsmasq" + echo " -f, --force Force updating of the hosts files, even if there are no changes" + echo " -q, --quiet output is less verbose" + exit 1 +fi + +#globals +blacklist=/etc/pihole/blacklist.txt +adList=/etc/pihole/gravity.list +reload=true +addmode=true +force=false +versbose=true +domList=() +domToRemoveList=() + + +piholeIPfile=/tmp/piholeIP +piholeIPv6file=/etc/pihole/.useIPv6 + +# 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%/*} + +modifyHost=false + + +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 + + +function 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) + fi +} + +function PopBlacklistFile(){ + #check blacklist file exists, and if not, create it + if [[ ! -f $blacklist ]];then + touch $blacklist + fi + for dom in "${domList[@]}" + do + if $addmode; then + AddDomain $dom + else + RemoveDomain $dom + fi + done +} + +function AddDomain(){ +#| 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 $versbose; then + echo "** Adding $1 to blacklist file" + fi + echo $1 >> $blacklist + modifyHost=true + else + if $versbose; then + echo "** $1 already blacklisted! No need to add" + fi + fi +} + +function 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 $versbose; then + echo "** $1 is NOT blacklisted! No need to remove" + fi + else + #Domain is in the blacklist file, add to a temporary array + if $versbose; then + echo "** Un-blacklisting $dom..." + fi + domToRemoveList=("${domToRemoveList[@]}" $1) + modifyHost=true + fi +} + +function 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 "** blacklisting a total of $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 + + for dom in "${domToRemoveList[@]}" + do + #we need to remove the domains from the blacklist file and the host 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 /'{}'(?!.)/;' $blacklist + done + fi + +} + +function Reload() { + # Reload hosts file + echo "** Refresh lists in dnsmasq..." + + dnsmasqPid=$(pidof dnsmasq) + + if [[ $dnsmasqPid ]]; then + # service already running - reload config + sudo kill -HUP $dnsmasqPid + else + # service not running, start it up + sudo service dnsmasq start + fi +} + +################################################### + +for var in "$@" +do + case "$var" in + "-nr"| "--noreload" ) reload=false;; + "-d" | "--delmode" ) addmode=false;; + "-f" | "--force" ) force=true;; + "-q" | "--quiet" ) versbose=false;; + * ) HandleOther $var;; + esac +done + +PopBlacklistFile + +if $modifyHost || $force; then + echo "** Modifying Hosts File" + ModifyHostFile +else + if $versbose; then + echo "** No changes need to be made" + fi + exit 1 +fi + +if $reload; then + Reload +fi diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index d3ce783d..b29480a9 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -1,6 +1,4 @@ #!/usr/bin/env bash -# Displays Pi-hole stats on the Adafruit PiTFT 2.8" touch screen -# Set the pi user to log in automatically and run this script from /etc/profile # (c) 2015 by Jacob Salmela # This file is part of Pi-hole. # @@ -8,28 +6,130 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. -for (( ; ; )) + + +#Functions############################################################################################################## +piLog="/var/log/pihole.log" +gravity="/etc/pihole/gravity.list" + +today=$(date "+%b %e") + +function CalcBlockedDomains(){ + if [ -e "$gravity" ]; then + #Are we IPV6 or IPV4? + if [[ -n $piholeIPv6 ]];then + #We are IPV6 + blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1/2}') + else + #We are IPV4 + blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1}') + fi + else + blockedDomainsTotal="Err." + fi +} + +function CalcQueriesToday(){ + if [ -e "$piLog" ];then + queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l) + else + queriesToday="Err." + fi +} + +function CalcblockedToday(){ + if [ -e "$piLog" ] && [ -e "$gravity" ];then + blockedToday=$(cat $piLog | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l) + else + blockedToday="Err." + fi +} + +function CalcPercentBlockedToday(){ + if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then + #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=$(sed 's/.\{2\}$//' <<< "$percentBlockedToday") + fi +} + +function CheckIPv6(){ + piholeIPv6file="/etc/pihole/.useIPv6" + 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 +} + +function outputJSON(){ + CalcQueriesToday + CalcblockedToday + CalcPercentBlockedToday + + CheckIPv6 + CalcBlockedDomains + + printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday" +} + +function normalChrono(){ + for (( ; ; )) + do + clear + # Displays a colorful Pi-hole logo + toilet -f small -F gay Pi-hole + echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)" + echo "" + uptime | cut -d' ' -f11- + echo "-------------------------------" + # Uncomment to continually read the log file and display the current domain being blocked + #tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}' + + #uncomment next 4 lines to use original query count calculation + #today=$(date "+%b %e") + #todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l) + #todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l) + #todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l) + + + CalcQueriesToday + CalcblockedToday + CalcPercentBlockedToday + + CalcBlockedDomains + + echo "Blocking: $blockedDomainsTotal" + #below commented line does not add up to todaysQueryCount + #echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6" + echo "Queries: $queriesToday" #same total calculation as dashboard + echo "Pi-holed: $blockedToday ($percentBlockedToday%)" + + sleep 5 + done +} + +function displayHelp(){ + echo "Displays stats about your piHole!" + echo " " + echo "Usage: chronometer.sh [optional:-j]" + echo "Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds" + echo " " + echo "Options:" + echo " -j, --json output stats as JSON formatted string" + echo " -h, --help display this help text" + + exit 1 +} + +if [[ $# = 0 ]]; then + normalChrono +fi + +for var in "$@" do - clear - # Displays a colorful Pi-hole logo - toilet -f small -F gay Pi-hole - echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)" - echo "" - uptime | cut -d' ' -f11- - echo "-------------------------------" - # Uncomment to continually read the log file and display the current domain being blocked - #tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}' - - today=$(date "+%b %e") - todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l) - todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l) - todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l) - todaysAdsEliminated=$(cat /var/log/pihole.log | grep "$today" | awk '/\/etc\/pihole\/gravity.list/ {print $7}' | wc -l) - dividend=$(echo "$todaysAdsEliminated/$todaysQueryCount" | bc -l) - fp=$(echo "$dividend*100" | bc -l) - percentAds=$(echo ${fp:0:4}) - - echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6" - echo "Pi-holed: $todaysAdsEliminated ($percentAds%)" - sleep 5 + case "$var" in + "-j" | "--json" ) outputJSON;; + "-h" | "--help" ) displayHelp;; + * ) exit 1;; + esac done