From dfbf1a952feaeab5f2d6aeabef6ba3fcd79a5446 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 10 Oct 2015 13:51:21 -0500 Subject: [PATCH 001/148] deleting tabs and spaces --- gravity.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/gravity.sh b/gravity.sh index 1f5e3fb6..7e41dd94 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,6 +1,6 @@ #!/bin/bash # http://pi-hole.net -# Compiles a list of ad-serving domains by downloading them from multiple sources +# Compiles a list of ad-serving domains by downloading them from multiple sources # This script should only be run after you have a static IP address set on the Pi piholeIP=$(hostname -I) @@ -58,7 +58,7 @@ function createSwapFile() sudo dphys-swapfile setup sudo dphys-swapfile swapon } - + if [[ -n "$noSwap" ]]; then # if $noSwap is set, don't do anything @@ -83,20 +83,20 @@ do url=${sources[$i]} # Get just the domain from the URL domain=$(echo "$url" | cut -d'/' -f3) - + # Save the file as list.#.domain saveLocation=$origin/list.$i.$domain.$justDomainsExtension - + echo -n "Getting $domain list... " # Use a case statement to download lists that need special cURL commands to complete properly case "$domain" in "adblock.mahakala.is") data=$(curl -s -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' -e http://forum.xda-developers.com/ -z $saveLocation $url);; - + "pgl.yoyo.org") data=$(curl -s -d mimetype=plaintext -d hostformat=hosts -z $saveLocation $url);; *) data=$(curl -s -z $saveLocation -A "Mozilla/10.0" $url);; esac - + if [[ -n "$data" ]];then # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious @@ -127,7 +127,7 @@ function gravity_advanced() ########################### { numberOf=$(cat $origin/$andLight | sed '/^\s*$/d' | wc -l) - echo "** $numberOf domains being pulled in by gravity..." + echo "** $numberOf domains being pulled in by gravity..." # Remove carriage returns and preceding whitespace cat $origin/$andLight | sed $'s/\r$//' | sed '/^\s*$/d' > $origin/$supernova # Sort and remove duplicates @@ -141,7 +141,7 @@ function gravity_advanced() sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) } - + # Whitelist (if applicable) then remove duplicates and format for dnsmasq if [[ -f $whitelist ]];then # Remove whitelist entries From e3c0fdfeb77d7f5fa8479a27aa87222141fc14c8 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 10 Oct 2015 13:52:54 -0500 Subject: [PATCH 002/148] new variables for IPv4 and IPv6 The IPv6 address looks for the one created from the MAC address. --- gravity.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 7e41dd94..55185954 100755 --- a/gravity.sh +++ b/gravity.sh @@ -3,7 +3,8 @@ # Compiles a list of ad-serving domains by downloading them from multiple sources # This script should only be run after you have a static IP address set on the Pi -piholeIP=$(hostname -I) +piholeIPv4=$(ip addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") +piholeIPv6=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) # Ad-list sources--one per line in single quotes sources=('https://adaway.org/hosts.txt' From 88e6ce041d112be9ccae654bad3309c7f59a308e Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 10 Oct 2015 13:55:49 -0500 Subject: [PATCH 003/148] new command to print both the IPv4 and IPv6 address on their own line I'm not 100% sure if you can add multiple IP addresses to one domain on a single line, so I just broke it up into two. It makes the file bigger and longer, but I'll have to see how it works --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 55185954..06f41eef 100755 --- a/gravity.sh +++ b/gravity.sh @@ -137,7 +137,7 @@ function gravity_advanced() echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIPv4 "'" $0"\n""'"$piholeIPv6 "'" $0}' # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From 428d5e9a060d889b2d43e5caca27c56f65d53f9b Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 10 Oct 2015 14:01:10 -0500 Subject: [PATCH 004/148] Revert "new command to print both the IPv4 and IPv6 address on their own line" This reverts commit 88e6ce041d112be9ccae654bad3309c7f59a308e. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 06f41eef..55185954 100755 --- a/gravity.sh +++ b/gravity.sh @@ -137,7 +137,7 @@ function gravity_advanced() echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIPv4 "'" $0"\n""'"$piholeIPv6 "'" $0}' + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From ee40bc04231fb34d7819a07ff20f7c324b94f319 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 10 Oct 2015 14:02:18 -0500 Subject: [PATCH 005/148] forgot to redirect it to the file --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 55185954..9ca3394b 100755 --- a/gravity.sh +++ b/gravity.sh @@ -137,7 +137,7 @@ function gravity_advanced() echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIPv4 "'" $0"\n""'"$piholeIPv6 "'" $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From 28dd956449bb2eef268846ef77d2d4db50e24a3f Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 17 Oct 2015 12:04:49 -0500 Subject: [PATCH 006/148] changing web server root folder Since the version of lighted in Jessie moved the default folder to /var/www/html, I am going to make it the same for wheezy for better compatibility. Also removed spaces --- advanced/lighttpd.conf | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index 1c3ed076..a103c3ee 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -4,35 +4,35 @@ server.modules = ( "mod_redirect", "mod_rewrite" ) - -server.document-root = "/var/www" + +server.document-root = "/var/www/html" server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) server.errorlog = "/var/log/lighttpd/error.log" server.pid-file = "/var/run/lighttpd.pid" server.username = "www-data" server.groupname = "www-data" server.port = 80 - - + + index-file.names = ( "index.php", "index.html", "index.lighttpd.html" ) url.access-deny = ( "~", ".inc" ) static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" ) - + compress.cache-dir = "/var/cache/lighttpd/compress/" compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" ) - + # default listening port for IPv6 falls back to the IPv4 port include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port include_shell "/usr/share/lighttpd/create-mime.assign.pl" include_shell "/usr/share/lighttpd/include-conf-enabled.pl" - + # Set access to 1 day for better query performance when the list gets so large # http://jacobsalmela.com/raspberry-pi-block-ads-adtrap/#comment-2013820434 $HTTP["url"] =~ "^/pihole/" { expire.url = ("" => "access plus 1 days") } - + # Rewrites all URLs to the /var/www/pihole/index.html $HTTP["host"] =~ ".*" { url.rewrite = (".*" => "pihole/index.html") -} \ No newline at end of file +} From 7b16a42f311e87532d9bc8cf13d4d6adccab419b Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 17 Oct 2015 12:11:03 -0500 Subject: [PATCH 007/148] conditionals for accessing the web interface This adds in some back end improvements for better debugging. It also allows you to access the Web interface, while you are connected to the Pi-hole, which resolves #31 --- advanced/lighttpd.conf | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index a103c3ee..37763f97 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -2,6 +2,7 @@ server.modules = ( "mod_expire", "mod_compress", "mod_redirect", + "mod_setenv", "mod_rewrite" ) @@ -26,13 +27,20 @@ include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port include_shell "/usr/share/lighttpd/create-mime.assign.pl" include_shell "/usr/share/lighttpd/include-conf-enabled.pl" -# Set access to 1 day for better query performance when the list gets so large -# http://jacobsalmela.com/raspberry-pi-block-ads-adtrap/#comment-2013820434 -$HTTP["url"] =~ "^/pihole/" { - expire.url = ("" => "access plus 1 days") +# If the URL starts with /admin, it is the Web interface +$HTTP["url"] =~ "^/admin/" { + # Create a response header for debugging using curl -I + setenv.add-response-header = ( "X-Pi-hole" => "The Pi-hole Web interface is working!" ) } -# Rewrites all URLs to the /var/www/pihole/index.html -$HTTP["host"] =~ ".*" { - url.rewrite = (".*" => "pihole/index.html") +# If the URL does not start with /admin, then it is a query for an ad domain +$HTTP["url"] =~ "^(?!/admin)/.*" { + # Create a response header for debugging using curl -I + setenv.add-response-header = ( "X-Pi-hole" => "A black hole for Internet advertisements." ) + + # Set the cache to 1 day for better performance + expire.url = ("" => "access plus 1 days") + + # Send the query into the black hole + url.rewrite = (".*" => "pihole/index.html" ) } From 17904b31063931adc2d0a79a3a1b78424b6ec1c2 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 17 Oct 2015 12:12:51 -0500 Subject: [PATCH 008/148] ads still get blocked when a 404 happens --- advanced/lighttpd.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index 37763f97..a4253a0e 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -7,6 +7,7 @@ server.modules = ( ) server.document-root = "/var/www/html" +server.error-handler-404 = "pihole/index.html" server.upload-dirs = ( "/var/cache/lighttpd/uploads" ) server.errorlog = "/var/log/lighttpd/error.log" server.pid-file = "/var/run/lighttpd.pid" From d5ffec64f25847197c082e37f18e78a194923523 Mon Sep 17 00:00:00 2001 From: Sven Giermann Date: Thu, 22 Oct 2015 15:17:44 +0200 Subject: [PATCH 009/148] add whitespace after $piholeIP In my case there had been no whitespace in piholeIP (I configured it statically because 'hostname -I' returns multiple IP addresses, which ends in errornous hosts file), so it's more safe to add one between IP and hostname. Further, I removed the obsolete latentBlacklist variable. --- gravity.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 12c8b0fd..d8c81809 100755 --- a/gravity.sh +++ b/gravity.sh @@ -27,7 +27,6 @@ eventHorizon=pihole.3.eventHorizon.txt accretionDisc=pihole.4.accretionDisc.txt eyeOfTheNeedle=pihole.5.wormhole.txt blacklist=$piholeDir/blacklist.txt -latentBlacklist=$origin/latentBlacklist.txt whitelist=$piholeDir/whitelist.txt latentWhitelist=$origin/latentWhitelist.txt @@ -136,7 +135,7 @@ function gravity_advanced() echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From deb48c124fca132cbd81bd3b17eacd3f51c4ec44 Mon Sep 17 00:00:00 2001 From: Nathan Jones Date: Sun, 25 Oct 2015 16:53:20 -0700 Subject: [PATCH 010/148] Improve whitelisting script Match domain exactly instead of partially. Gather list of domains to minimize number of times that hosts file must be enumerated. Only add domain to whitelist if it isn't already present. --- advanced/Scripts/whitelist.sh | 47 +++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index aed6bd0f..d610d0a5 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,13 +1,44 @@ #!/bin/bash + +if [ $# = 0 ]; then + echo "Immediately whitelists one or more domains." + echo "Usage: whitelist.sh domain1 [domain2 ...]" +fi + +combopattern="" + # For each argument passed to this script for var in "$@" do - echo "Whitelisting $var..." - # Use sed to search for the domain in /etc/pihole/gravity.list and remove it using an in-place edit - sed -i "/$var/d" /etc/pihole/gravity.list - # Also add the domain to the whitelist.txt in /etc/pihole - echo "$var" >> /etc/pihole/whitelist.txt + echo "Whitelisting $var..." + + # Construct basic pattern to match domain name. + basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') + + if [ "$basicpattern" != "" ]; then + # Add to the combination pattern that will be used below + if [ "$combopattern" != "" ]; then combopattern="$combopattern|"; fi + combopattern="$combopattern$basicpattern" + + # Also add the domain to the whitelist but only if it's not already present + grep -E -q "^$basicpattern$" /etc/pihole/whitelist.txt \ + || echo "$var" >> /etc/pihole/whitelist.txt + fi done -echo "** $# domain(s) whitelisted." -# Force dnsmasq to reload /etc/pihole/gravity.list -kill -HUP $(pidof dnsmasq) \ No newline at end of file + +# Now report on and remove matched domains +if [ "$combopattern" != "" ]; then + echo "Modifying hosts file..." + + # Construct pattern to match entry in hosts file. + # This consists of one or more IP addresses followed by the domain name. + pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') + + # Output what will be removed and then actually remove + sed -r -n 's/'"$pattern"'/ Removed: \3/p' /etc/pihole/gravity.list + sed -r -i '/'"$pattern"'/d' /etc/pihole/gravity.list + + echo "** $# domain(s) whitelisted." + # Force dnsmasq to reload /etc/pihole/gravity.list + kill -HUP $(pidof dnsmasq) +fi From 4ad2b68ee18923ddda438fad4e5d016b71eecce0 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 27 Oct 2015 17:16:17 -0500 Subject: [PATCH 011/148] reverting IPv6 so I can merge lighttpd.conf --- gravity.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/gravity.sh b/gravity.sh index 9ca3394b..f1b7aea0 100755 --- a/gravity.sh +++ b/gravity.sh @@ -3,13 +3,12 @@ # Compiles a list of ad-serving domains by downloading them from multiple sources # This script should only be run after you have a static IP address set on the Pi -piholeIPv4=$(ip addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") -piholeIPv6=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +piholeIP=$(hostname -I) # Ad-list sources--one per line in single quotes sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' -'http://adblock.mahakala.is/' +#'http://adblock.mahakala.is/' 'http://hosts-file.net/.%5Cad_servers.txt' 'http://www.malwaredomainlist.com/hostslist/hosts.txt' 'http://pgl.yoyo.org/adservers/serverlist.php?' @@ -137,7 +136,7 @@ function gravity_advanced() echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIPv4 "'" $0"\n""'"$piholeIPv6 "'" $0}' > $origin/$accretionDisc + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From 58e4fbd0fba3c032bc2fa40b2f7397fc1df82b0f Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 27 Oct 2015 17:59:01 -0500 Subject: [PATCH 012/148] New, easier-to-remember installation command Also a picture of the Web interface and how to access it since it is now included in the automated installer. --- README.md | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index be0d4369..2c8a756e 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,15 @@ +# Automated Install + +1. Install Raspbian +2. Set a **static** IP address +3. Run the command below + +```curl -L install.pi-hole.net | bash``` + +Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. + +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") + # Raspberry Pi Ad Blocker **A black hole for ads, hence Pi-hole** @@ -8,20 +20,8 @@ The Pi-hole is a DNS/Web server that will **block ads for any device on your net ## Coverage Featured on [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) and [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! -## Automated Install - -1. Install Raspbian -2. Set a **static** IP address -3. Run the command below - -```curl -s "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/automated%20install/basic-install.sh" | bash``` - -Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. - A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") - ## Gravity The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). @@ -29,7 +29,11 @@ The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. ## Web Interface -I am also working on a [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) so you can view stats and change settings. +The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at: + +`http://192.168.1.x/admin/index.php` + +![Web](http://i.imgur.com/m114SCn.png) ## Custom Config File If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below: From d9aa19d2cdfd9254904f1017ae8b954431cfd159 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 27 Oct 2015 18:22:54 -0500 Subject: [PATCH 013/148] Link to Security Now! mention --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index 2c8a756e..ca6b5286 100644 --- a/README.md +++ b/README.md @@ -18,8 +18,17 @@ Once installed, **configure any device to use the Raspberry Pi as its DNS server The Pi-hole is a DNS/Web server that will **block ads for any device on your network**. ## Coverage + +### Security Now! Podcast +Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there) +[![Pi-hole on Security Now!](http://img.youtube.com/vi/p7-osq_y8i8/0.jpg)](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) + +### Tech Blogs + Featured on [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) and [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! +## Technical Details + A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). ## Gravity From 3290dbbe486460dd582fc4f5d7695008fdbd9719 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 17:09:21 -0500 Subject: [PATCH 014/148] link to Sky-Hole fork Pi-hole in the cloud with Sky-Hole. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index ca6b5286..09b88524 100644 --- a/README.md +++ b/README.md @@ -60,4 +60,7 @@ A technical and detailed description can be found [here](http://jacobsalmela.com ## Other Operating Systems This script will work for other UNIX-like systems with some slight **modifications**. As long as you can install `dnsmasq` and a Webserver, it should work OK. The automated install only works for a clean install of Raspiban right now since that is how the project originated. +### Examples Of The Pi-hole On Other Operating Systems +- [Sky-Hole](http://dlaa.me/blog/post/skyhole) + [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From 1b51b9ade358bcf6995a83d7a40e5ddb172d36a7 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 5 Nov 2015 14:31:38 -0600 Subject: [PATCH 015/148] for use as a cron job The log will be flushed daily and stats will be stored in a DB for displaying on the Web interface. --- advanced/Scripts/piholeLogFlush.sh | 3 +++ 1 file changed, 3 insertions(+) create mode 100755 advanced/Scripts/piholeLogFlush.sh diff --git a/advanced/Scripts/piholeLogFlush.sh b/advanced/Scripts/piholeLogFlush.sh new file mode 100755 index 00000000..9647fe2c --- /dev/null +++ b/advanced/Scripts/piholeLogFlush.sh @@ -0,0 +1,3 @@ +#!/bin/bash +# Flushes /var/log/pihole.log +truncate -s 0 /var/log/pihole.log From 23eece944308e75ca340b709d259cb15aabc28ad Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 5 Nov 2015 18:11:34 -0800 Subject: [PATCH 016/148] Upstream Branch pseudo-rebase --- gravity.sh | 100 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 61 insertions(+), 39 deletions(-) diff --git a/gravity.sh b/gravity.sh index f5bf6e8d..8e8da8e2 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,6 +1,6 @@ #!/bin/bash # http://pi-hole.net -# Compiles a list of ad-serving domains by downloading them from multiple sources +# Compiles a list of ad-serving domains by downloading them from multiple sources # This script should only be run after you have a static IP address set on the Pi piholeIP=$(hostname -I) @@ -8,7 +8,7 @@ piholeIP=$(hostname -I) # Ad-list sources--one per line in single quotes sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' -#'http://adblock.mahakala.is/' +'http://adblock.mahakala.is/' 'http://hosts-file.net/.%5Cad_servers.txt' 'http://www.malwaredomainlist.com/hostslist/hosts.txt' 'http://pgl.yoyo.org/adservers/serverlist.php?' @@ -19,6 +19,9 @@ sources=('https://adaway.org/hosts.txt' adList=/etc/pihole/gravity.list origin=/etc/pihole piholeDir=/etc/pihole +if [[ -f $piholeDir/pihole.conf ]];then + . $piholeDir/pihole.conf +fi justDomainsExtension=domains matter=pihole.0.matter.txt andLight=pihole.1.andLight.txt @@ -27,16 +30,10 @@ eventHorizon=pihole.3.eventHorizon.txt accretionDisc=pihole.4.accretionDisc.txt eyeOfTheNeedle=pihole.5.wormhole.txt blacklist=$piholeDir/blacklist.txt +latentBlacklist=$origin/latentBlacklist.txt whitelist=$piholeDir/whitelist.txt latentWhitelist=$origin/latentWhitelist.txt -# After setting defaults, check if there's local overrides -if [[ -r $piholeDir/pihole.conf ]];then - echo "** Local calibration requested..." - . $piholeDir/pihole.conf -fi - - echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here @@ -57,12 +54,8 @@ function createSwapFile() sudo dphys-swapfile setup sudo dphys-swapfile swapon } - - -if [[ -n "$noSwap" ]]; then - # if $noSwap is set, don't do anything - : -elif [[ -f /etc/dphys-swapfile ]];then + +if [[ -f /etc/dphys-swapfile ]];then swapSize=$(cat /etc/dphys-swapfile | grep -m1 CONF_SWAPSIZE | cut -d'=' -f2) if [[ $swapSize != 500 ]];then mv /etc/dphys-swapfile /etc/dphys-swapfile.orig @@ -82,31 +75,55 @@ do url=${sources[$i]} # Get just the domain from the URL domain=$(echo "$url" | cut -d'/' -f3) - + # Save the file as list.#.domain saveLocation=$origin/list.$i.$domain.$justDomainsExtension - echo -n "Getting $domain list... " - # Use a case statement to download lists that need special cURL commands to complete properly + 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 - "adblock.mahakala.is") data=$(curl -s -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' -e http://forum.xda-developers.com/ -z $saveLocation $url);; + "adblock.mahakala.is") + agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' + cmd="curl -e http://forum.xda-developers.com/" + ;; + + "pgl.yoyo.org") + cmd="curl -d mimetype=plaintext -d hostformat=hosts" + ;; - "pgl.yoyo.org") data=$(curl -s -d mimetype=plaintext -d hostformat=hosts -z $saveLocation $url);; - - *) data=$(curl -s -z $saveLocation -A "Mozilla/10.0" $url);; + # Default is a simple curl request + *) cmd="curl" esac - if [[ -n "$data" ]];then + # tmp file, so we don't have to store the (long!) lists in RAM + tmpfile=`mktemp` + timeCheck="" + if [ -r $saveLocation ]; then + timeCheck="-z $saveLocation" + fi + CMD="$cmd -s $timeCheck -A '$agent' $url > $tmpfile" + echo "running [$CMD]" + $cmd -s $timeCheck -A "$agent" $url > $tmpfile + + + if [[ -s "$tmpfile" ]];then # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read # It also helps with debugging so each stage of the script can be researched more in depth - echo "$data" | awk 'NF {if ($1 !~ "#") { if (NF>1) {print $2} else {print $1}}}' | \ - sed -e 's/^[. \t]*//' -e 's/\.\.\+/./g' -e 's/[. \t]*$//' | grep "\." > $saveLocation + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $tmpfile | \ + sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation echo "Done." else echo "Skipping list because it does not have any new entries." fi + + # cleanup + rm -f $tmpfile done # Find all files with the .domains extension and compile them into one file and remove CRs @@ -114,39 +131,43 @@ echo "** Aggregating list of domains..." find $origin/ -type f -name "*.$justDomainsExtension" -exec cat {} \; | tr -d '\r' > $origin/$matter # Append blacklist entries if they exist -if [[ -f $blacklist ]];then +if [[ -r $blacklist ]];then numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) echo "** Blacklisting $numberOf domain(s)..." cat $blacklist >> $origin/$matter -else - : fi -function gravity_advanced() ########################### - { - numberOf=$(cat $origin/$andLight | sed '/^\s*$/d' | wc -l) - echo "** $numberOf domains being pulled in by gravity..." +function gravity_advanced() { + + numberOf=$(wc -l $origin/$andLight) + echo "** $numberOf domains being pulled in by gravity..." + # Remove carriage returns and preceding whitespace - cat $origin/$andLight | sed $'s/\r$//' | sed '/^\s*$/d' > $origin/$supernova + # not really needed anymore? + cp $origin/$andLight $origin/$supernova + # Sort and remove duplicates - cat $origin/$supernova | sort | uniq > $origin/$eventHorizon - numberOf=$(cat $origin/$eventHorizon | sed '/^\s*$/d' | wc -l) + sort -u $origin/$supernova > $origin/$eventHorizon + numberOf=$(wc -l $origin/$eventHorizon) echo "** $numberOf unique domains trapped in the event horizon." + # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $origin/$accretionDisc + awk '{print "'"$piholeIP"'" $1}' $origin/$eventHorizon > $origin/$accretionDisc + # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) - } - +} + # Whitelist (if applicable) then remove duplicates and format for dnsmasq -if [[ -f $whitelist ]];then +if [[ -r $whitelist ]];then # Remove whitelist entries numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) plural=; [[ "$numberOf" != "1" ]] && plural=s echo "** Whitelisting $numberOf domain${plural}..." + # Append a "$" to the end, prepend a "^" to the beginning, and # replace "." with "\." of each line to turn each entry into a # regexp so it can be parsed out with grep -x @@ -163,6 +184,7 @@ do echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist done +# Remove whitelist entries from deduped list grep -vxf $latentWhitelist $origin/$matter > $origin/$andLight gravity_advanced From 8e21488542c2bbe32d6663243248b6d0f6ef56fe Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 5 Nov 2015 18:22:17 -0800 Subject: [PATCH 017/148] hawson memory reductions --- gravity.sh | 47 +++++++++++------------------------------------ 1 file changed, 11 insertions(+), 36 deletions(-) diff --git a/gravity.sh b/gravity.sh index 8e8da8e2..8ca34bb9 100755 --- a/gravity.sh +++ b/gravity.sh @@ -44,31 +44,6 @@ else sudo mkdir $piholeDir fi -# Add additional swap to prevent the "Error fork: unable to allocate memory" message: https://github.com/jacobsalmela/pi-hole/issues/37 -function createSwapFile() -######################### - { - echo "** Creating more swap space to accomodate large solar masses..." - sudo dphys-swapfile swapoff - sudo curl -s -o /etc/dphys-swapfile https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dphys-swapfile - sudo dphys-swapfile setup - sudo dphys-swapfile swapon - } - -if [[ -f /etc/dphys-swapfile ]];then - swapSize=$(cat /etc/dphys-swapfile | grep -m1 CONF_SWAPSIZE | cut -d'=' -f2) - if [[ $swapSize != 500 ]];then - mv /etc/dphys-swapfile /etc/dphys-swapfile.orig - echo "** Current swap size is $swapSize" - createSwapFile - else - : - fi -else - echo "** No swap file found. Creating one..." - createSwapFile -fi - # 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 @@ -100,22 +75,22 @@ do esac # tmp file, so we don't have to store the (long!) lists in RAM - tmpfile=`mktemp` - timeCheck="" + patternBuffer=`mktemp` + heisenbergCompensator="" if [ -r $saveLocation ]; then - timeCheck="-z $saveLocation" + heisenbergCompensator="-z $saveLocation" fi - CMD="$cmd -s $timeCheck -A '$agent' $url > $tmpfile" - echo "running [$CMD]" - $cmd -s $timeCheck -A "$agent" $url > $tmpfile + CMD="$cmd -s $heisenbergCompensator -A '$agent' $url > $patternBuffer" + echo "** Engaging pattern transference..." + $cmd -s $heisenbergCompensator -A "$agent" $url > $patternBuffer - if [[ -s "$tmpfile" ]];then + if [[ -s "$patternBuffer" ]];then # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $tmpfile | \ + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $patternBuffer | \ sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation echo "Done." else @@ -123,7 +98,7 @@ do fi # cleanup - rm -f $tmpfile + rm -f $patternBuffer done # Find all files with the .domains extension and compile them into one file and remove CRs @@ -141,7 +116,7 @@ fi function gravity_advanced() { numberOf=$(wc -l $origin/$andLight) - echo "** $numberOf domains being pulled in by gravity..." + echo "** $numberOf $origin/$andLight domains being pulled in by gravity..." # Remove carriage returns and preceding whitespace # not really needed anymore? @@ -166,7 +141,7 @@ if [[ -r $whitelist ]];then # Remove whitelist entries numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) plural=; [[ "$numberOf" != "1" ]] && plural=s - echo "** Whitelisting $numberOf domain${plural}..." + echo "** Whitelisting $numberOf $whitelist domain${plural}..." # Append a "$" to the end, prepend a "^" to the beginning, and # replace "." with "\." of each line to turn each entry into a From 642c31c361acc6d3e433409322e018909ce51035 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 5 Nov 2015 18:33:05 -0800 Subject: [PATCH 018/148] Theme changes --- gravity.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 8ca34bb9..e8c0acb7 100755 --- a/gravity.sh +++ b/gravity.sh @@ -94,7 +94,7 @@ do sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation echo "Done." else - echo "Skipping list because it does not have any new entries." + echo "Skipping pattern because transporter logic detected no changes..." fi # cleanup @@ -116,7 +116,7 @@ fi function gravity_advanced() { numberOf=$(wc -l $origin/$andLight) - echo "** $numberOf $origin/$andLight domains being pulled in by gravity..." + echo "** $numberOf domains being pulled in by gravity..." # Remove carriage returns and preceding whitespace # not really needed anymore? From 15b9fb68d7e86dcbc091a204ff862cabca02e312 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Fri, 6 Nov 2015 10:24:12 -0800 Subject: [PATCH 019/148] Remove filename from wc Line 118 and Line 127 changed wc to remove filename from output. --- gravity.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index e8c0acb7..a4400a50 100755 --- a/gravity.sh +++ b/gravity.sh @@ -115,7 +115,7 @@ fi ########################### function gravity_advanced() { - numberOf=$(wc -l $origin/$andLight) + numberOf=$(wc -l < $origin/$andLight) echo "** $numberOf domains being pulled in by gravity..." # Remove carriage returns and preceding whitespace @@ -124,7 +124,7 @@ function gravity_advanced() { # Sort and remove duplicates sort -u $origin/$supernova > $origin/$eventHorizon - numberOf=$(wc -l $origin/$eventHorizon) + numberOf=$(wc -l < $origin/$eventHorizon) echo "** $numberOf unique domains trapped in the event horizon." # Format domain list as "192.168.x.x domain.com" From a06098bb1699b41b446892dba152b4751f807c34 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:03:55 -0600 Subject: [PATCH 020/148] remove filename from whitelist output I also cleared the whitespace (or rather, Atom did). I moved the pinhole.conf to it's current location I commented out mahakala --- gravity.sh | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/gravity.sh b/gravity.sh index a4400a50..33bf226e 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,6 +1,6 @@ #!/bin/bash # http://pi-hole.net -# Compiles a list of ad-serving domains by downloading them from multiple sources +# Compiles a list of ad-serving domains by downloading them from multiple sources # This script should only be run after you have a static IP address set on the Pi piholeIP=$(hostname -I) @@ -8,7 +8,7 @@ piholeIP=$(hostname -I) # Ad-list sources--one per line in single quotes sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' -'http://adblock.mahakala.is/' +#'http://adblock.mahakala.is/' 'http://hosts-file.net/.%5Cad_servers.txt' 'http://www.malwaredomainlist.com/hostslist/hosts.txt' 'http://pgl.yoyo.org/adservers/serverlist.php?' @@ -19,9 +19,6 @@ sources=('https://adaway.org/hosts.txt' adList=/etc/pihole/gravity.list origin=/etc/pihole piholeDir=/etc/pihole -if [[ -f $piholeDir/pihole.conf ]];then - . $piholeDir/pihole.conf -fi justDomainsExtension=domains matter=pihole.0.matter.txt andLight=pihole.1.andLight.txt @@ -30,10 +27,14 @@ eventHorizon=pihole.3.eventHorizon.txt accretionDisc=pihole.4.accretionDisc.txt eyeOfTheNeedle=pihole.5.wormhole.txt blacklist=$piholeDir/blacklist.txt -latentBlacklist=$origin/latentBlacklist.txt whitelist=$piholeDir/whitelist.txt latentWhitelist=$origin/latentWhitelist.txt +# After setting defaults, check if there's local overrides +if [[ -r $piholeDir/pihole.conf ]];then + echo "** Local calibration requested..." + . $piholeDir/pihole.conf +fi echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here @@ -50,23 +51,23 @@ do url=${sources[$i]} # Get just the domain from the URL domain=$(echo "$url" | cut -d'/' -f3) - + # Save the file as list.#.domain saveLocation=$origin/list.$i.$domain.$justDomainsExtension 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 case "$domain" in - "adblock.mahakala.is") + "adblock.mahakala.is") agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' cmd="curl -e http://forum.xda-developers.com/" ;; - - "pgl.yoyo.org") + + "pgl.yoyo.org") cmd="curl -d mimetype=plaintext -d hostformat=hosts" ;; @@ -77,14 +78,14 @@ do # tmp file, so we don't have to store the (long!) lists in RAM patternBuffer=`mktemp` heisenbergCompensator="" - if [ -r $saveLocation ]; then + if [ -r $saveLocation ]; then heisenbergCompensator="-z $saveLocation" fi CMD="$cmd -s $heisenbergCompensator -A '$agent' $url > $patternBuffer" echo "** Engaging pattern transference..." $cmd -s $heisenbergCompensator -A "$agent" $url > $patternBuffer - + if [[ -s "$patternBuffer" ]];then # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious @@ -116,11 +117,11 @@ fi function gravity_advanced() { numberOf=$(wc -l < $origin/$andLight) - echo "** $numberOf domains being pulled in by gravity..." + echo "** $numberOf domains being pulled in by gravity..." # Remove carriage returns and preceding whitespace # not really needed anymore? - cp $origin/$andLight $origin/$supernova + cp $origin/$andLight $origin/$supernova # Sort and remove duplicates sort -u $origin/$supernova > $origin/$eventHorizon @@ -135,13 +136,13 @@ function gravity_advanced() { sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) } - + # Whitelist (if applicable) then remove duplicates and format for dnsmasq if [[ -r $whitelist ]];then # Remove whitelist entries numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) plural=; [[ "$numberOf" != "1" ]] && plural=s - echo "** Whitelisting $numberOf $whitelist domain${plural}..." + echo "** Whitelisting $numberOf domain${plural}..." # Append a "$" to the end, prepend a "^" to the beginning, and # replace "." with "\." of each line to turn each entry into a From 1b65193fe40e9f1efe79765f0f762e3386d873d5 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:05:04 -0600 Subject: [PATCH 021/148] new hostsfile url This seems to be the more appropriate URL: http://hosts-file.net/ad_servers.txt. I compared it to the original URL using opendiff and they are exactly the same. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 33bf226e..2715ddd7 100755 --- a/gravity.sh +++ b/gravity.sh @@ -9,7 +9,7 @@ piholeIP=$(hostname -I) sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' -'http://hosts-file.net/.%5Cad_servers.txt' +'http://hosts-file.net/ad_servers.txt' 'http://www.malwaredomainlist.com/hostslist/hosts.txt' 'http://pgl.yoyo.org/adservers/serverlist.php?' 'http://someonewhocares.org/hosts/hosts' From c297a86211c69557f72bee3241422e3feceb5f67 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:10:17 -0600 Subject: [PATCH 022/148] decluttering output I love the adherence to the theme, but this line makes it difficult to quickly read what is happening. --- gravity.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 2715ddd7..b157adb7 100755 --- a/gravity.sh +++ b/gravity.sh @@ -82,7 +82,6 @@ do heisenbergCompensator="-z $saveLocation" fi CMD="$cmd -s $heisenbergCompensator -A '$agent' $url > $patternBuffer" - echo "** Engaging pattern transference..." $cmd -s $heisenbergCompensator -A "$agent" $url > $patternBuffer From 932d410b66e0fda80ea78b894c9427121d3d8b4a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:14:05 -0600 Subject: [PATCH 023/148] anal retentive changes OCD --- gravity.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gravity.sh b/gravity.sh index b157adb7..4c191c39 100755 --- a/gravity.sh +++ b/gravity.sh @@ -76,9 +76,9 @@ do esac # tmp file, so we don't have to store the (long!) lists in RAM - patternBuffer=`mktemp` + patternBuffer=$(mktemp) heisenbergCompensator="" - if [ -r $saveLocation ]; then + if [[ -r $saveLocation ]]; then heisenbergCompensator="-z $saveLocation" fi CMD="$cmd -s $heisenbergCompensator -A '$agent' $url > $patternBuffer" @@ -97,7 +97,7 @@ do echo "Skipping pattern because transporter logic detected no changes..." fi - # cleanup + # Cleanup rm -f $patternBuffer done From e1b8419a07a8a6feea408815c97986ecb44e9877 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:16:14 -0600 Subject: [PATCH 024/148] theme addition Further adherence to the science/star trek theme --- gravity.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 4c191c39..b1024b09 100755 --- a/gravity.sh +++ b/gravity.sh @@ -75,7 +75,8 @@ do *) cmd="curl" esac - # tmp file, so we don't have to store the (long!) lists in RAM + echo "Narrowing the annular confinment beam..." + # Create a tmp file so we don't have to store the (long!) lists in RAM patternBuffer=$(mktemp) heisenbergCompensator="" if [[ -r $saveLocation ]]; then From a7d1b0b42c9dcc86b8ff274a4185d1ca78d47b50 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:17:14 -0600 Subject: [PATCH 025/148] Revert "theme addition" This reverts commit e1b8419a07a8a6feea408815c97986ecb44e9877. --- gravity.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index b1024b09..4c191c39 100755 --- a/gravity.sh +++ b/gravity.sh @@ -75,8 +75,7 @@ do *) cmd="curl" esac - echo "Narrowing the annular confinment beam..." - # Create a tmp file so we don't have to store the (long!) lists in RAM + # tmp file, so we don't have to store the (long!) lists in RAM patternBuffer=$(mktemp) heisenbergCompensator="" if [[ -r $saveLocation ]]; then From ce0ca3cc61a138a37e1f285eb2f14a5e15ca603a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 07:58:35 -0600 Subject: [PATCH 026/148] for use with /etc/crontab Adding a system-wide crontab to update the ad source lists, flush the log daily, and (eventually) record the stats for historical purposes. --- advanced/pihole.cron | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/advanced/pihole.cron b/advanced/pihole.cron index a707607e..47bc61fb 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -1 +1,26 @@ -@weekly sudo /usr/local/bin/gravity.sh +# /etc/crontab: system-wide crontab +# Unlike any other crontab you don't have to run the `crontab' +# command to install the new version when you edit this file +# and files in /etc/cron.d. These files also have username fields, +# that none of the other crontabs do. + +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# m h dom mon dow user command +17 * * * * root cd / && run-parts --report /etc/cron.hourly +25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) +47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) +52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) + +# Pi-hole: Update the ad sources once a week on Sunday at 01:59 +# Download any updates from the ad lists +59 1 * * 7 root /usr/local/bin/gravity.sh + +# 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 11 * * * root /usr/local/bin/dailyLog.sh + +# Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control +# Stats will be viewable in the Web interface thanks to the cron job above +58 11 * * * root /usr/local/bin/piholeLogFlush.sh From 763aa6aa5c6c3fc194fa8c2df6a258c4a7adf41e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 11 Nov 2015 00:43:00 -0800 Subject: [PATCH 027/148] Change shebang to environment Find bash in the environment, not hard coded to path --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 4c191c39..93793196 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources From 4229a3e5e9835a38c3c19b2e4ad483c03706fd11 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 28 Oct 2015 17:29:34 -0500 Subject: [PATCH 028/148] whiptail revamp of install script This is a large update that helps users install the Pi-hole a bit easier by using some dialog windows and also letting the user set a static IP (I still need to figure out how to actually set the address in the system, but everything else having to do with the install script works). --- automated install/basic-install.sh | 229 +++++++++++++++++++++-------- 1 file changed, 164 insertions(+), 65 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7c48fdba..416c4217 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,29 +1,37 @@ #!/bin/bash -# Pi-hole automated install -# Raspberry Pi Ad-blocker +# Pi-hole: A black hole for Internet advertisements +# by Jacob Salmela +# Network-wide ad blocking via your Raspberry Pi # -# Install with this command (from the Pi): +# pi-hole.net/donate # -# curl -s "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/automated%20install/basic-install.sh" | bash +# Install with this command (from your Pi): # -# Or run the commands below in order +# curl -L install.pi-hole.net | bash -clear -echo " _____ _ _ _ " -echo " | __ (_) | | | | " -echo " | |__) | __ | |__ ___ | | ___ " -echo " | ___/ | |__| | '_ \ / _ \| |/ _ \ " -echo " | | | | | | | | (_) | | __/ " -echo " |_| |_| |_| |_|\___/|_|\___| " -echo " " -echo " Raspberry Pi Ad-blocker " -echo " " -echo "Set a static IP before running this!" -echo " " -echo " Press Enter when ready " -echo " " -read +######## VARIABLES ######### +# Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely +screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) +# Find the rows and columns +rows=$(stty -a | tr \; \\012 | egrep 'rows' | cut -d' ' -f3) +columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) + +# Divide by two so the dialogs take up half of the screen, which looks nice. +r=$(( rows / 2 )) +c=$(( columns / 2 )) + +# Get the current network settings +IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") +IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') +IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') + +# IPv6 support to be added later +IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) + +####### FUCNTIONS ########## +backupLegacyPihole() +{ if [[ -f /etc/dnsmasq.d/adList.conf ]];then echo "Original Pi-hole detected. Initiating sub space transport..." sudo mkdir -p /etc/pihole/original/ @@ -36,58 +44,149 @@ if [[ -f /etc/dnsmasq.d/adList.conf ]];then else : fi +} -echo "Updating the Pi..." -sudo apt-get update -sudo apt-get -y upgrade +######## SCRIPT ############ +# Just back up the original Pi-hole right away since it won't take long and it gets it out of the way +backupLegacyPihole -echo "Installing tools..." -sudo apt-get -y install dnsutils -sudo apt-get -y install bc -sudo apt-get -y install toilet +# Display the welcome dialog +whiptail --msgbox --backtitle "Welcome..." --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c -echo "Installing DNS..." -sudo apt-get -y install dnsmasq -sudo update-rc.d dnsmasq enable +# Explain the need for a static address +whiptail --msgbox --backtitle "Initating network interface..." --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. -echo "Installing a Web server" -sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi +In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c -echo "Stopping services to modify them..." -sudo service dnsmasq stop -sudo service lighttpd stop +# Ask if the user wannts to use DHCP settings as their static IP +if (whiptail --title "Static IP Address" --yesno "Do you want to use your current network settings as a static address? -echo "Backing up original config files and downloading Pi-hole ones..." -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo curl -o /etc/dnsmasq.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf" -sudo curl -o /etc/lighttpd/lighttpd.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf" -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html" + IP address: $IPv4addr + Subnet mask: $IPv4mask + 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. + 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. -echo "Installing the Web interface..." -sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip /var/www/master.zip -d /var/www/html/ -sudo mv /var/www/html/AdminLTE-master /var/www/html/admin -sudo rm /var/www/master.zip 2>/dev/null -sudo touch /var/log/pihole.log -sudo chmod 644 /var/log/pihole.log -sudo chown dnsmasq:root /var/log/pihole.log +If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. -echo "Locating the Pi-hole..." -sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh" -sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh" -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh +It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c + # Nothing else to do since the variables are already set above +else + # 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 a loop to let the user enter their information with the chance to go back and edit it if necessary + until [[ $ipSettingsCorrect = True ]] + do + # Ask for the IPv4 address + IPv4addr=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 address: $IPv4addr" + # Ask for the subnet mask + IPv4mask=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 netmask: $IPv4mask" + # 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) + if [[ $? = 0 ]];then + echo "Your static IPv4 gateway: $IPv4gw" + # Give the user a chance to review their settings before moving on + if (whiptail --title "Static IP Address" --yesno "Are these settings correct? + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c)then + # If the settings are correct, then we need to set the piholeIP + # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script + echo $IPv4addr > /tmp/piholeIP + # After that's done, the loop ends and we move on + ipSettingsCorrect=True -echo "Entering the event horizon..." -sudo /usr/local/bin/gravity.sh + else + # If the settings are wrong, the loop continues + ipSettingsCorrect=False + fi + else + # Cancelling gateway settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling subnet mask settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling IPv4 settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + done +# End the if statement for DHCP vs. static +fi -echo "Restarting..." -sudo reboot +# These are the commands to actually install the Pi-hole +# Create an associative array so we can display text to the user but run the associated command in the background. +declare -A cmdsAndEchoes=([sudo apt-get update]='Updating...' +[sudo apt-get -y upgrade]='Upgrading...' +[sudo apt-get -y install dnsutils bc toilet]='Installing chronomoter tools...' +[sudo apt-get -y install dnsmasq]='Installing a DNS server...' +[sudo apt-get -y install lighttpd php5-common php5-cgi php5]='Instaling a Web server and PHP...' +[sudo mkdir /var/www/html]='Making an HTML folder...' +[sudo chown www-data:www-data /var/www/html]='Setting permissions for the Web server...' +[sudo chmod 775 /var/www/html]='Setting permissions for the Web server...' +[sudo usermod -a -G www-data pi]='Setting permissions for the Web server...' +[sudo service dnsmasq stop]='Stopping dnsmasq to modify it...' +[sudo service lighttpd stop]='Stopping lighttpd to modify it...' +[sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig]='Backing up the dnsmasq config file...' +[sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig]='Backing up the lighttpd config file...' +[sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig]='Backing up the default Web page...' +[sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf]='Installing the dnsmasq config file...' +[sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf]='Installing the lighttpd config file...' +[sudo lighty-enable-mod fastcgi fastcgi-php]='Enabling PHP...' +[sudo mkdir /var/www/html/pihole]='Making a directory for the Web interface...' +[sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html]='Installing a blank HTML page to take place of ads...' +[sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip]='Downloading the Pi-hole dashboard...' +[sudo unzip /var/www/master.zip -d /var/www/html/]='Unpacking the dashboard...' +[sudo mv /var/www/html/AdminLTE-master /var/www/html/admin]='Renaming the dashboard...' +[sudo rm /var/www/master.zip 2>/dev/null]='Cleaning up the dashboard temp files...' +[sudo touch /var/log/pihole.log]='Creating a log file for the Pi-hole...' +[sudo chmod 644 /var/log/pihole.log]='Making sure the log is readable...' +[sudo chown dnsmasq:root /var/log/pihole.log]='Letting dnsmasq see the log file so stats can be displayed...' +[sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"]='Initating sub-space transport...' +[sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"]='Initating sub-space transport...' +[sudo chmod 755 /usr/local/bin/gravity.sh]='Making the scripts executable...' +[sudo chmod 755 /usr/local/bin/chronometer.sh]='Making the scripts executable...' +[sudo /usr/local/bin/gravity.sh]='Entering the event horizion...' +[sudo reboot]='Restarting...') + +# Everything in the parentheses is part of displaying the progress bar +( +# Get total number of commands to be run from the array +n=${#cmdsAndEchoes[*]}; + +# Set counter to increase every time a loop completes +i=0 + +# For each key in the array +for key in "${!cmdsAndEchoes[@]}" +do + +# Calculate the overall progress +percent=$(( 100*(++i)/n )) + +# Update dialog box using the value of each key in the array +# Show the percentage and the echo messages from the array +cat < Date: Thu, 29 Oct 2015 20:10:30 -0500 Subject: [PATCH 029/148] progress dialog working The ellipses cause errors, so they were removed. I was on the right track with the associate array, but it would previously execute the commands out of order. Following directions from the URL in the comments, I made another array that helps keep the array in the order. --- automated install/basic-install.sh | 96 ++++++++++++++++-------------- 1 file changed, 50 insertions(+), 46 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 416c4217..56beee85 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -33,7 +33,7 @@ IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/ backupLegacyPihole() { if [[ -f /etc/dnsmasq.d/adList.conf ]];then - echo "Original Pi-hole detected. Initiating sub space transport..." + echo "Original Pi-hole detected. Initiating sub space transport" sudo mkdir -p /etc/pihole/original/ sudo mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d") sudo mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d") @@ -51,10 +51,10 @@ fi backupLegacyPihole # Display the welcome dialog -whiptail --msgbox --backtitle "Welcome..." --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c +whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c # Explain the need for a static address -whiptail --msgbox --backtitle "Initating network interface..." --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. +whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c @@ -65,7 +65,7 @@ if (whiptail --title "Static IP Address" --yesno "Do you want to use your curren Subnet mask: $IPv4mask 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. - 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. @@ -78,15 +78,15 @@ else until [[ $ipSettingsCorrect = True ]] do # Ask for the IPv4 address - IPv4addr=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 netmask: $IPv4mask" # 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 echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on @@ -127,50 +127,52 @@ else fi # These are the commands to actually install the Pi-hole -# Create an associative array so we can display text to the user but run the associated command in the background. -declare -A cmdsAndEchoes=([sudo apt-get update]='Updating...' -[sudo apt-get -y upgrade]='Upgrading...' -[sudo apt-get -y install dnsutils bc toilet]='Installing chronomoter tools...' -[sudo apt-get -y install dnsmasq]='Installing a DNS server...' -[sudo apt-get -y install lighttpd php5-common php5-cgi php5]='Instaling a Web server and PHP...' -[sudo mkdir /var/www/html]='Making an HTML folder...' -[sudo chown www-data:www-data /var/www/html]='Setting permissions for the Web server...' -[sudo chmod 775 /var/www/html]='Setting permissions for the Web server...' -[sudo usermod -a -G www-data pi]='Setting permissions for the Web server...' -[sudo service dnsmasq stop]='Stopping dnsmasq to modify it...' -[sudo service lighttpd stop]='Stopping lighttpd to modify it...' -[sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig]='Backing up the dnsmasq config file...' -[sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig]='Backing up the lighttpd config file...' -[sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig]='Backing up the default Web page...' -[sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf]='Installing the dnsmasq config file...' -[sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf]='Installing the lighttpd config file...' -[sudo lighty-enable-mod fastcgi fastcgi-php]='Enabling PHP...' -[sudo mkdir /var/www/html/pihole]='Making a directory for the Web interface...' -[sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html]='Installing a blank HTML page to take place of ads...' -[sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip]='Downloading the Pi-hole dashboard...' -[sudo unzip /var/www/master.zip -d /var/www/html/]='Unpacking the dashboard...' -[sudo mv /var/www/html/AdminLTE-master /var/www/html/admin]='Renaming the dashboard...' -[sudo rm /var/www/master.zip 2>/dev/null]='Cleaning up the dashboard temp files...' -[sudo touch /var/log/pihole.log]='Creating a log file for the Pi-hole...' -[sudo chmod 644 /var/log/pihole.log]='Making sure the log is readable...' -[sudo chown dnsmasq:root /var/log/pihole.log]='Letting dnsmasq see the log file so stats can be displayed...' -[sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"]='Initating sub-space transport...' -[sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"]='Initating sub-space transport...' -[sudo chmod 755 /usr/local/bin/gravity.sh]='Making the scripts executable...' -[sudo chmod 755 /usr/local/bin/chronometer.sh]='Making the scripts executable...' -[sudo /usr/local/bin/gravity.sh]='Entering the event horizion...' -[sudo reboot]='Restarting...') +# This is pretty ugly, but it works to present a nice front-end +# http://stackoverflow.com/questions/29161323/how-to-keep-associative-array-order-in-bash +# Maybe it would be better to just show the command output instead of the progress bar +declare -A commands; declare -a echoes; +commands["Updating"]="sudo apt-get update"; echoes+=( "Updating" ) +commands["Upgrading"]="sudo apt-get -y upgrade"; echoes+=( "Upgrading" ) +commands["Installing chronomoter tools"]="sudo apt-get -y install dnsutils bc toilet"; echoes+=( "Installing chronomoter tools" ) +commands["Installing a DNS server"]="sudo apt-get -y install dnsmasq"; echoes+=( "Installing a DNS server" ) +commands["Instaling a Web server and PHP"]="sudo apt-get -y install lighttpd php5-common php5-cgi php5"; echoes+=( "Instaling a Web server and PHP" ) +commands["Making an HTML folder"]="sudo mkdir /var/www/html"; echoes+=( "Making an HTML folder" ) +commands["chowning the Web server"]="sudo chown www-data:www-data /var/www/html"; echoes+=( "chowning the Web server" ) +commands["chmodding the Web server"]="sudo chmod 775 /var/www/html"; echoes+=( "chmodding the Web server" ) +commands["Giving pi access to the Web server"]="sudo usermod -a -G www-data pi"; echoes+=( "Giving pi access to the Web server" ) +commands["Stopping dnsmasq to modify it"]="sudo service dnsmasq stop"; echoes+=( "Stopping dnsmasq to modify it" ) +commands["Stopping lighttpd to modify it"]="sudo service lighttpd stop"; echoes+=( "Stopping lighttpd to modify it" ) +commands["Backing up the dnsmasq config file"]="sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig"; echoes+=( "Backing up the dnsmasq config file" ) +commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig"; echoes+=( "Backing up the lighttpd config file" ) +commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) +commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) +commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) +commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) +commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) +commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) +commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) +commands["Unpacking the dashboard"]="sudo unzip /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) +commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) +commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) +commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) +commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) +commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) +commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) +commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) +commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) +commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) +commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) +commands["Rebooting"]="sudo reboot"; echoes+=( "Rebooting" ) # Everything in the parentheses is part of displaying the progress bar ( # Get total number of commands to be run from the array -n=${#cmdsAndEchoes[*]}; - +n=${#commands[*]}; # Set counter to increase every time a loop completes i=0 -# For each key in the array -for key in "${!cmdsAndEchoes[@]}" +# For each item in the array +for k in "${!echoes[@]}" do # Calculate the overall progress @@ -181,11 +183,13 @@ percent=$(( 100*(++i)/n )) cat < Date: Sat, 31 Oct 2015 09:11:29 -0500 Subject: [PATCH 030/148] set static ip and suppress more output Created a function to set a static IP address. I also sent STDOUT and STDERR to /dev/null so it doesn't mangle the progress bar. When the device reboots, it still gets mangled a bit (via ssh). --- automated install/basic-install.sh | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 56beee85..ea513060 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -27,7 +27,10 @@ IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') # IPv6 support to be added later -IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) + +ethernetDevice="eth0" +dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## backupLegacyPihole() @@ -46,6 +49,15 @@ else fi } +set_static_ip() +{ +# Append these lines to /etc/dhcpcd.conf to enable a static IP +echo "interface $ethernetDevice +static ip_address=$IPv4addr/24 +static routers=$IPv4gw +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +} + ######## SCRIPT ############ # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole @@ -59,7 +71,7 @@ whiptail --msgbox --backtitle "Initating network interface" --title "Static IP N In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c # Ask if the user wannts to use DHCP settings as their static IP -if (whiptail --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: $IPv4addr Subnet mask: $IPv4mask @@ -90,7 +102,7 @@ else if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # Give the user a chance to review their settings before moving on - if (whiptail --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: $IPv4addr Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then @@ -125,6 +137,8 @@ else done # End the if statement for DHCP vs. static fi +# Set the static address +set_static_ip # These are the commands to actually install the Pi-hole # This is pretty ugly, but it works to present a nice front-end @@ -186,11 +200,11 @@ $percent Step $i of $n: ${echoes[$k]} XXX EOF + # Execute the command in the background (hidden from the user, not actually a background process) -#${echoes[$k]} -${commands[${echoes[$k]}]} -sleep 1 +${commands[${echoes[$k]}]} > /dev/null 2>&1 done + # As the loop is progressing, the output is sent to whiptail to be displayed to the user ) | whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 From 37f255d761be78b9682eb4f28991fb5e198caadd Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:15:57 -0500 Subject: [PATCH 031/148] save output to log file instead Since the progress bar hides the output now. Instead of destroying it, send it to a log file instead so users who want to see it still can. --- automated install/basic-install.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ea513060..98935a87 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -10,6 +10,8 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +instalLogLoc=/etc/pihole/install.log + # Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) @@ -202,7 +204,7 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > /dev/null 2>&1 +${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 done # As the loop is progressing, the output is sent to whiptail to be displayed to the user From a44591ca6be363d40d6c4c13f38021765ce2ce30 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:19:57 -0500 Subject: [PATCH 032/148] fix permission denied for log file Just use a temporary file and then move it over once the install is complete. --- automated install/basic-install.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 98935a87..9e36448d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -10,6 +10,7 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log # Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely @@ -206,6 +207,7 @@ EOF # Execute the command in the background (hidden from the user, not actually a background process) ${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 done +sudo mv $tmpLog $instalLogLoc$instalLogLoc # As the loop is progressing, the output is sent to whiptail to be displayed to the user ) | From f37990351e7f9c5e47072450bcabb1dfca099cae Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 31 Oct 2015 09:21:19 -0500 Subject: [PATCH 033/148] dumb mistake fixed the variable name --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9e36448d..f39009b5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -205,7 +205,7 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > $instalLogLoc 2>&1 +${commands[${echoes[$k]}]} > $tmpLog 2>&1 done sudo mv $tmpLog $instalLogLoc$instalLogLoc From 6d989f9160c451e56f64c37728ccf3b18d941f24 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 1 Nov 2015 12:54:19 -0600 Subject: [PATCH 034/148] overwrite html folder If the files already exist, the installer stalls out because it asks if you want to replace the existing files. the -o option forces an overwrite. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f39009b5..0db4c025 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -168,7 +168,7 @@ commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) -commands["Unpacking the dashboard"]="sudo unzip /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) +commands["Unpacking the dashboard"]="sudo unzip -o /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) From 1482b9563c594e5b9ee3a6c08264f816fc5644c5 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 1 Nov 2015 13:00:55 -0600 Subject: [PATCH 035/148] does gravity use static IP? The changes to the gravity script check for a temp file containing the static address set during the install. I need to verify it works so I have to change the URL. I will change it back before merging with master. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 0db4c025..79d64099 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -174,7 +174,7 @@ commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2> commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) -commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) +commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) From fb3fde3d19a1a5d44c1df0b480fb7209e239f2f9 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 6 Nov 2015 17:45:00 -0600 Subject: [PATCH 036/148] testing with no reboot --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 79d64099..68fe9fc1 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -179,7 +179,7 @@ commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/loca commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) -commands["Rebooting"]="sudo reboot"; echoes+=( "Rebooting" ) +commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) # Everything in the parentheses is part of displaying the progress bar ( From eec0a31216287b1b81172e3287ddfa788f153678 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 09:43:04 -0600 Subject: [PATCH 037/148] trying text output I commented out the whiptail dialog at the end in place of text so you can see what is going on. I also install the crontab. --- automated install/basic-install.sh | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 68fe9fc1..9fdd055f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -24,7 +24,6 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -# Get the current network settings IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') @@ -164,6 +163,8 @@ commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd. commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) +commands["Initating auto-pilot"]="sudo mv /etc/crontab /etc/crontab.orig"; echoes+=( "Initiating auto-pilot" ) +commands["Engaging auto-pilot"]="curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron"; echoes+=( "Engaging auto-pilot" ) commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) @@ -182,7 +183,7 @@ commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) # Everything in the parentheses is part of displaying the progress bar -( +#( # Get total number of commands to be run from the array n=${#commands[*]}; # Set counter to increase every time a loop completes @@ -205,10 +206,10 @@ XXX EOF # Execute the command in the background (hidden from the user, not actually a background process) -${commands[${echoes[$k]}]} > $tmpLog 2>&1 +${commands[${echoes[$k]}]} | tee $tmpLog +clear done sudo mv $tmpLog $instalLogLoc$instalLogLoc # As the loop is progressing, the output is sent to whiptail to be displayed to the user -) | -whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 +#) |whiptail --title "Opening your Pi-hole..." --gauge "Please wait..." $r $c 0 From 8df376860cdd6ec5a5382aed5181a56cc0311a40 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 12:07:50 -0600 Subject: [PATCH 038/148] simple function to run install commands The arrays were cool, but I think this just works easier. --- automated install/basic-install.sh | 113 +++++++++++------------------ 1 file changed, 43 insertions(+), 70 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 9fdd055f..938cc31f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -60,6 +60,44 @@ static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } +installPihole() +{ +sudo apt-get update +sudo apt-get -y upgrade +sudo apt-get -y install dnsutils bc toilet +sudo apt-get -y install dnsmasq +sudo apt-get -y install lighttpd php5-common php5-cgi php5 +sudo mkdir /var/www/html +sudo chown www-data:www-data /var/www/html +sudo chmod 775 /var/www/html +sudo usermod -a -G www-data pi +sudo service dnsmasq stop +sudo service lighttpd stop +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +sudo lighty-enable-mod fastcgi fastcgi-php +sudo mkdir /var/www/html/pihole +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip +sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo mv /var/www/html/AdminLTE-master /var/www/html/admin +sudo rm /var/www/master.zip 2>/dev/null +sudo touch /var/log/pihole.log +sudo chmod 644 /var/log/pihole.log +sudo chown dnsmasq:root /var/log/pihole.log +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo chmod 755 /usr/local/bin/gravity.sh +sudo chmod 755 /usr/local/bin/chronometer.sh +sudo /usr/local/bin/gravity.sh +sudo service networking restart +} + ######## SCRIPT ############ # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole @@ -139,77 +177,12 @@ else done # End the if statement for DHCP vs. static fi + # Set the static address set_static_ip -# These are the commands to actually install the Pi-hole -# This is pretty ugly, but it works to present a nice front-end -# http://stackoverflow.com/questions/29161323/how-to-keep-associative-array-order-in-bash -# Maybe it would be better to just show the command output instead of the progress bar -declare -A commands; declare -a echoes; -commands["Updating"]="sudo apt-get update"; echoes+=( "Updating" ) -commands["Upgrading"]="sudo apt-get -y upgrade"; echoes+=( "Upgrading" ) -commands["Installing chronomoter tools"]="sudo apt-get -y install dnsutils bc toilet"; echoes+=( "Installing chronomoter tools" ) -commands["Installing a DNS server"]="sudo apt-get -y install dnsmasq"; echoes+=( "Installing a DNS server" ) -commands["Instaling a Web server and PHP"]="sudo apt-get -y install lighttpd php5-common php5-cgi php5"; echoes+=( "Instaling a Web server and PHP" ) -commands["Making an HTML folder"]="sudo mkdir /var/www/html"; echoes+=( "Making an HTML folder" ) -commands["chowning the Web server"]="sudo chown www-data:www-data /var/www/html"; echoes+=( "chowning the Web server" ) -commands["chmodding the Web server"]="sudo chmod 775 /var/www/html"; echoes+=( "chmodding the Web server" ) -commands["Giving pi access to the Web server"]="sudo usermod -a -G www-data pi"; echoes+=( "Giving pi access to the Web server" ) -commands["Stopping dnsmasq to modify it"]="sudo service dnsmasq stop"; echoes+=( "Stopping dnsmasq to modify it" ) -commands["Stopping lighttpd to modify it"]="sudo service lighttpd stop"; echoes+=( "Stopping lighttpd to modify it" ) -commands["Backing up the dnsmasq config file"]="sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig"; echoes+=( "Backing up the dnsmasq config file" ) -commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig"; echoes+=( "Backing up the lighttpd config file" ) -commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" ) -commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" ) -commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" ) -commands["Initating auto-pilot"]="sudo mv /etc/crontab /etc/crontab.orig"; echoes+=( "Initiating auto-pilot" ) -commands["Engaging auto-pilot"]="curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron"; echoes+=( "Engaging auto-pilot" ) -commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" ) -commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" ) -commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" ) -commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" ) -commands["Unpacking the dashboard"]="sudo unzip -o /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" ) -commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" ) -commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" ) -commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" ) -commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" ) -commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" ) -commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" ) -commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" ) -commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" ) -commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" ) -commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" ) -commands["Rebooting"]="sudo service networking restart"; echoes+=( "Restarting networking..." ) +# Install and log everything to a file +installPihole | tee $tmpLog -# Everything in the parentheses is part of displaying the progress bar -#( -# Get total number of commands to be run from the array -n=${#commands[*]}; -# Set counter to increase every time a loop completes -i=0 - -# For each item in the array -for k in "${!echoes[@]}" -do - -# Calculate the overall progress -percent=$(( 100*(++i)/n )) - -# Update dialog box using the value of each key in the array -# Show the percentage and the echo messages from the array -cat < Date: Sat, 7 Nov 2015 12:35:08 -0600 Subject: [PATCH 039/148] Closing dialog Also starting the Pi-hole and restarting networking. --- automated install/basic-install.sh | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 938cc31f..34a5d24c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -186,3 +186,12 @@ installPihole | tee $tmpLog # Move the log file into /etc/pihole for storage sudo mv $tmpLog $instalLogLoc + +whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. + +The networking service will restart after you close this dialog. If you are using SSH, you may need to reconnect." $r $c + +# Start the services and restart networking +sudo service dnsmasq start +sudo service lighttpd start +sudo ifdown eth0;sudo ifup eth0 From 46b4000e75882e339f5b80b4f509aaaf32daba4a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 7 Nov 2015 13:09:23 -0600 Subject: [PATCH 040/148] reboot works better --- automated install/basic-install.sh | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 34a5d24c..83361cb4 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -189,9 +189,9 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -The networking service will restart after you close this dialog. If you are using SSH, you may need to reconnect." $r $c +Your Pi will restart when you close this dialog. If you are using SSH, reconnect using the IP address above. -# Start the services and restart networking -sudo service dnsmasq start -sudo service lighttpd start -sudo ifdown eth0;sudo ifup eth0 +The install log is in /etc/phole." $r $c + + +sudo reboot From 76c217d9cc4ad1952d0f02f63452c4084a4b9384 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 8 Nov 2015 17:21:02 -0600 Subject: [PATCH 041/148] moving to functions Also download the whitelist script. Ask for donations for IPv6 support. --- automated install/basic-install.sh | 214 ++++++++++++++++++----------- 1 file changed, 137 insertions(+), 77 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 83361cb4..73e7f1fb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -29,9 +29,10 @@ IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') # IPv6 support to be added later -#IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) +#IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) -ethernetDevice="eth0" +availableInterfaces=$(ip link show | awk -F' ' '/[0-9]: [a-z]/ {print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## @@ -51,7 +52,113 @@ else fi } -set_static_ip() +welcomeDialogs() +{ +# Display the welcome dialog +whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c + +# Explain the need for a static address +whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. + +In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c +} + +use4andor6() +{ +# Let use select IPv4 and/or IPv6 +cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) +options=(IPv4 "Block ads over IPv4" on + IPv6 "Block ads over IPv4" off) +choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) +clear +for choice in $choices +do + case $choice in + IPv4) + echo "IPv4 selected." + useIPv4=true + ;; + IPv6) + echo "IPv6 selected." + useIPv6=true + ;; + esac +done +} + + +getStaticIPv4Settings() +{ +# Ask if the user wannts 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? + + IP address: $IPv4addr + Subnet mask: $IPv4mask + 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. + 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. + + It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c + # Nothing else to do since the variables are already set above +else + # 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 a loop to let the user enter their information with the chance to go back and edit it if necessary + until [[ $ipSettingsCorrect = True ]] + do + # Ask for the IPv4 address + IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 address: $IPv4addr" + # Ask for the subnet mask + IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) + if [[ $? = 0 ]];then + echo "Your static IPv4 netmask: $IPv4mask" + # 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) + if [[ $? = 0 ]];then + echo "Your static IPv4 gateway: $IPv4gw" + # 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? + IP address: $IPv4addr + Subnet mask: $IPv4mask + Gateway: $IPv4gw" $r $c)then + # If the settings are correct, then we need to set the piholeIP + # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script + echo $IPv4addr > /tmp/piholeIP + # After that's done, the loop ends and we move on + ipSettingsCorrect=True + else + # If the settings are wrong, the loop continues + ipSettingsCorrect=False + fi + else + # Cancelling gateway settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling subnet mask settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi + else + # Cancelling IPv4 settings window + ipSettingsCorrect=False + echo "User canceled." + exit + fi +done +# End the if statement for DHCP vs. static +fi +} + + +setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $ethernetDevice @@ -76,6 +183,7 @@ sudo service lighttpd stop sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo mv /etc/crontab /etc/crontab.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf sudo mv /etc/crontab /etc/crontab.orig @@ -92,94 +200,46 @@ sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh +sudo chmod 755 /usr/local/bin/whitelist.sh sudo /usr/local/bin/gravity.sh sudo service networking restart } ######## SCRIPT ############ +# Start the installer +welcomeDialogs + # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole -# Display the welcome dialog -whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c +# Let the user decide if they want to block ads over IPv4 and/or IPv6 +use4andor6 -# Explain the need for a static address -whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. - -In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c - -# Ask if the user wannts 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? - - IP address: $IPv4addr - Subnet mask: $IPv4mask - 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. - 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. - -It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c - # Nothing else to do since the variables are already set above +# Decide is IPv4 will be used +if [[ "$useIPv4" = true ]];then + echo "Using IPv4" + getStaticIPv4Settings + setStaticIPv4 else - # 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 a loop to let the user enter their information with the chance to go back and edit it if necessary - until [[ $ipSettingsCorrect = True ]] - do - # Ask for the IPv4 address - IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # 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) - if [[ $? = 0 ]];then - echo "Your static IPv4 gateway: $IPv4gw" - # 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? - IP address: $IPv4addr - Subnet mask: $IPv4mask - Gateway: $IPv4gw" $r $c)then - # If the settings are correct, then we need to set the piholeIP - # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP - # After that's done, the loop ends and we move on - ipSettingsCorrect=True - - else - # If the settings are wrong, the loop continues - ipSettingsCorrect=False - fi - else - # Cancelling gateway settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else - # Cancelling IPv4 settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - done -# End the if statement for DHCP vs. static + echo "IPv4 will NOT be used." +fi + +# Decide is IPv6 will be used +if [[ "$useIPv6" = true ]];then + whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: + + http://pi-hole.net/donate" $r $c + echo "Using IPv6" +else + whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: + + http://pi-hole.net/donate" $r $c + echo "IPv6 will NOT be used." fi -# Set the static address -set_static_ip # Install and log everything to a file installPihole | tee $tmpLog From ad91eb44fbac32f0e1efa41b42e669168293d076 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Mon, 9 Nov 2015 18:33:32 -0600 Subject: [PATCH 042/148] choose an interface also fixing ipv6 logic --- automated install/basic-install.sh | 60 +++++++++++++++++++++++++----- 1 file changed, 51 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 73e7f1fb..d171bf80 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -63,6 +63,40 @@ whiptail --msgbox --backtitle "Initating network interface" --title "Static IP N In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c } +chooseInterface() +{ +# Turn the available interfaces into an array so it can be used with a whiptail dialog +interfacesArray=() +while read -r line +do +interfacesArray+=("$line" "available" "OFF") +done <<< "$availableInterfaces" + +# Find out how many interfaces are available to choose from +interfaceCount=$(echo "$availableInterfaces" | wc -l) +chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface" $r $c $interfaceCount) +chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) +for desiredInterface in $chooseInterfaceOptions +do + piholeInterface=$desiredInterface + # case $chooseInterfaceOptions in + # eth0) + # echo "Ethernet" + # useIPv4=true + # ;; + # IPv6) + # echo "IPv6 selected." + # useIPv6=true + # ;; + # esac + # chosenInterface="$desiredInterface" + # echo "$desiredInterface" + echo "Chosen: $piholeInterface" +done + + +} + use4andor6() { # Let use select IPv4 and/or IPv6 @@ -79,13 +113,18 @@ do useIPv4=true ;; IPv6) - echo "IPv6 selected." + echo "IPv6 selected." useIPv6=true ;; esac done } +useIPv6dialog() +{ +whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c +} + getStaticIPv4Settings() { @@ -215,6 +254,8 @@ welcomeDialogs # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole +chooseInterface + # Let the user decide if they want to block ads over IPv4 and/or IPv6 use4andor6 @@ -224,23 +265,24 @@ if [[ "$useIPv4" = true ]];then getStaticIPv4Settings setStaticIPv4 else + useIPv4=false echo "IPv4 will NOT be used." fi # Decide is IPv6 will be used if [[ "$useIPv6" = true ]];then - whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: - - http://pi-hole.net/donate" $r $c - echo "Using IPv6" + # If only IPv6 is selected, exit because it is not supported yet + if [[ "$useIPv6" = true ]] && [[ "$useIPv4" = false ]];then + useIPv6dialog + exit + else + useIPv6dialog + fi else - whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help. Consider donating at: - - http://pi-hole.net/donate" $r $c + useIPv6=false echo "IPv6 will NOT be used." fi - # Install and log everything to a file installPihole | tee $tmpLog From 0936e394d48f12fb0ee5cf19e33467c9c2697785 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 08:12:24 -0600 Subject: [PATCH 043/148] reboot only if new IP was set --- automated install/basic-install.sh | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index d171bf80..2963dfcb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -200,7 +200,7 @@ fi setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP -echo "interface $ethernetDevice +echo "interface $piholeInterface static ip_address=$IPv4addr/24 static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null @@ -295,5 +295,12 @@ Your Pi will restart when you close this dialog. If you are using SSH, reconnec The install log is in /etc/phole." $r $c - -sudo reboot +# If the current IP address equals the desired address, no change is needed +if [[ $IPv4addr = "$(cat /tmp/piholeIP)" ]];then + # So just start the services + echo "sudo service dnsmasq start" + echo "sudo service lighttpd start" +else + # Restart to apply the new static IP address + echo "sudo reboot" +fi From 814873c6430054211a098c88e0b9b05230d2e38b Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:28:05 -0600 Subject: [PATCH 044/148] reboot logic --- automated install/basic-install.sh | 41 +++++++++++------------------- 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2963dfcb..a5cef6b6 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -69,7 +69,7 @@ chooseInterface() interfacesArray=() while read -r line do -interfacesArray+=("$line" "available" "OFF") +interfacesArray+=("$line" "available" "ON") done <<< "$availableInterfaces" # Find out how many interfaces are available to choose from @@ -79,22 +79,8 @@ chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface - # case $chooseInterfaceOptions in - # eth0) - # echo "Ethernet" - # useIPv4=true - # ;; - # IPv6) - # echo "IPv6 selected." - # useIPv6=true - # ;; - # esac - # chosenInterface="$desiredInterface" - # echo "$desiredInterface" - echo "Chosen: $piholeInterface" + echo "Using interface: $piholeInterface" done - - } use4andor6() @@ -125,7 +111,6 @@ useIPv6dialog() whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c } - getStaticIPv4Settings() { # Ask if the user wannts to use DHCP settings as their static IP @@ -142,6 +127,8 @@ if (whiptail --backtitle "Calibrating network interface" --title "Static IP Addr It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c # Nothing else to do since the variables are already set above else + # Since a custom address will be used, restart at the end of the script to apply the new changes + rebootNeeded=true # 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 a loop to let the user enter their information with the chance to go back and edit it if necessary @@ -240,6 +227,7 @@ sudo chown dnsmasq:root /var/log/pihole.log sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh sudo chmod 755 /usr/local/bin/whitelist.sh @@ -254,6 +242,7 @@ welcomeDialogs # Just back up the original Pi-hole right away since it won't take long and it gets it out of the way backupLegacyPihole +# Find interfaces and let the user choose one chooseInterface # Let the user decide if they want to block ads over IPv4 and/or IPv6 @@ -280,7 +269,7 @@ if [[ "$useIPv6" = true ]];then fi else useIPv6=false - echo "IPv6 will NOT be used." + echo "IPv6 will NOT be used. Consider a donation at pi-hole.net/donate" fi # Install and log everything to a file @@ -291,16 +280,16 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -Your Pi will restart when you close this dialog. If you are using SSH, reconnect using the IP address above. +If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. The install log is in /etc/phole." $r $c -# If the current IP address equals the desired address, no change is needed -if [[ $IPv4addr = "$(cat /tmp/piholeIP)" ]];then - # So just start the services - echo "sudo service dnsmasq start" - echo "sudo service lighttpd start" -else +# If a custom address was set, restart +if [[ "$rebootNeeded" = true ]];then # Restart to apply the new static IP address - echo "sudo reboot" + sudo reboot +else + # If not, just start the services since the address will stay the same + sudo service dnsmasq start + sudo service lighttpd start fi From dee3df4e1195c1ae45c61240640e14bc04548845 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:28:53 -0600 Subject: [PATCH 045/148] download master gravity --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a5cef6b6..85f79e59 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -224,7 +224,7 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/installation/gravity.sh +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh From 0cb20fc080afdc95dcf6484cd66d2bfeb8c329e3 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 17:34:25 -0600 Subject: [PATCH 046/148] typo --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 85f79e59..2a2b88d5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -282,7 +282,7 @@ whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Co If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. -The install log is in /etc/phole." $r $c +The install log is in /etc/pihole." $r $c # If a custom address was set, restart if [[ "$rebootNeeded" = true ]];then From d0d165ad165e1ba873df73bd97691de7c9bf7afa Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 10 Nov 2015 21:27:53 -0600 Subject: [PATCH 047/148] chmod the log flusher --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2a2b88d5..f0a7d139 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -231,8 +231,8 @@ sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/ sudo chmod 755 /usr/local/bin/gravity.sh sudo chmod 755 /usr/local/bin/chronometer.sh sudo chmod 755 /usr/local/bin/whitelist.sh +sudo chmod 755 /usr/local/bin/piholeLogFlush.sh sudo /usr/local/bin/gravity.sh -sudo service networking restart } ######## SCRIPT ############ From 689426180a7ed7540bec4e529e4db206903f40ee Mon Sep 17 00:00:00 2001 From: dschaper Date: Sun, 15 Nov 2015 13:59:51 +0000 Subject: [PATCH 048/148] Resolve merge conflicts --- gravity.sh | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/gravity.sh b/gravity.sh index 93793196..c6405c7d 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,11 +1,18 @@ #!/usr/bin/env bash # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources - -# This script should only be run after you have a static IP address set on the Pi -piholeIP=$(hostname -I) +piholeIPfile=/tmp/piholeIP +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 + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") +fi # Ad-list sources--one per line in single quotes +# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. Uncomment at your own risk sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' @@ -129,8 +136,7 @@ function gravity_advanced() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - awk '{print "'"$piholeIP"'" $1}' $origin/$eventHorizon > $origin/$accretionDisc - + cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $origin/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it sudo cp $origin/$accretionDisc $adList kill -HUP $(pidof dnsmasq) From b005da395f21ffdabd3459867b28621a0d778039 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 15 Nov 2015 20:54:15 -0600 Subject: [PATCH 049/148] Updated install instructions Also a screenshot of the dialog-based installer --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09b88524..3e02f0d4 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Automated Install 1. Install Raspbian -2. Set a **static** IP address -3. Run the command below +2. Run the command below -```curl -L install.pi-hole.net | bash``` +### ```curl -L install.pi-hole.net | bash``` + +![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. From 1578a28363ec2bef64556b46427e04ea21b6f7bf Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 19 Nov 2015 19:36:34 -0600 Subject: [PATCH 050/148] pihole in the cloud link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3e02f0d4..258168c2 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,6 @@ This script will work for other UNIX-like systems with some slight **modificatio ### Examples Of The Pi-hole On Other Operating Systems - [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/) [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From d0e9e90ebeaf4638231d78470dd638d38542a0ac Mon Sep 17 00:00:00 2001 From: Cole Turner Date: Fri, 20 Nov 2015 22:53:43 -0500 Subject: [PATCH 051/148] pinholeIP should only use one IP Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c6405c7d..c2d1ff92 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,7 @@ if [[ -f $piholeIPfile ]];then 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 - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) fi # Ad-list sources--one per line in single quotes From 4e50a03dfc6169bf691fae25f61e9fc3365272b3 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 21 Nov 2015 13:29:03 -0600 Subject: [PATCH 052/148] uninstall script This should remove the Pi-hole. --- automated install/uninstall.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 automated install/uninstall.sh diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh new file mode 100644 index 00000000..b0dd3368 --- /dev/null +++ b/automated install/uninstall.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Completely uninstalls the Pi-hole + +######### SCRIPT ########### +sudo apt-get -y remove --purge dnsutils bc toilet +sudo apt-get -y remove --purge dnsmasq +sudo apt-get -y remove --purge lighttpd php5-common php5-cgi php5 +sudo rm -rf /var/www/html +sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo rm /etc/crontab +sudo mv /etc/crontab.orig /etc/crontab +sudo rm /etc/dnsmasq.conf +sudo rm -rf /etc/lighttpd/ +sudo rm /var/log/pihole.log +sudo rm /usr/local/bin/gravity.sh +sudo rm /usr/local/bin/chronometer.sh +sudo rm /usr/local/bin/whitelist.sh +sudo rm /usr/local/bin/piholeLogFlush.sh +sudo rm -rf /etc/pihole/ From f02c37ec07a33c60588823c0420a9e9888d4af7f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 22 Nov 2015 23:49:38 -0800 Subject: [PATCH 053/148] Start code refactor, eliminate some repetitive code Begin code refactor prepatation, prevent DRY where possible. --- gravity.sh | 174 ++++++++++++++++++++--------------------------------- 1 file changed, 66 insertions(+), 108 deletions(-) diff --git a/gravity.sh b/gravity.sh index 4c191c39..62a2cf2e 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,11 +1,18 @@ -#!/bin/bash +#!/usr/bin/env bash # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources - -# This script should only be run after you have a static IP address set on the Pi -piholeIP=$(hostname -I) +piholeIPfile=/tmp/piholeIP +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 + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) +fi # Ad-list sources--one per line in single quotes +# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. Uncomment at your own risk sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' @@ -16,139 +23,90 @@ sources=('https://adaway.org/hosts.txt' 'http://winhelp2002.mvps.org/hosts.txt') # Variables for various stages of downloading and formatting the list -adList=/etc/pihole/gravity.list -origin=/etc/pihole -piholeDir=/etc/pihole -justDomainsExtension=domains -matter=pihole.0.matter.txt -andLight=pihole.1.andLight.txt -supernova=pihole.2.supernova.txt -eventHorizon=pihole.3.eventHorizon.txt -accretionDisc=pihole.4.accretionDisc.txt -eyeOfTheNeedle=pihole.5.wormhole.txt +basename=pihole +piholeDir=/etc/$basename +adList=$piholeDir/gravity.list blacklist=$piholeDir/blacklist.txt whitelist=$piholeDir/whitelist.txt -latentWhitelist=$origin/latentWhitelist.txt +latentWhitelist=$piholeDir/latentWhitelist.txt +justDomainsExtension=domains +matter=$basename.0.matter.txt +andLight=$basename.1.andLight.txt +supernova=$basename.2.supernova.txt +eventHorizon=$basename.3.eventHorizon.txt +accretionDisc=$basename.4.accretionDisc.txt +eyeOfTheNeedle=$basename.5.wormhole.txt # After setting defaults, check if there's local overrides if [[ -r $piholeDir/pihole.conf ]];then echo "** Local calibration requested..." - . $piholeDir/pihole.conf + . $piholeDir/pihole.conf fi echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here if [[ -d $piholeDir ]];then - : + : else - echo "** Creating pihole directory..." - sudo mkdir $piholeDir + echo "** Creating pihole directory..." + sudo mkdir $piholeDir fi # 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) + url=${sources[$i]} + # Get just the domain from the URL + domain=$(echo "$url" | cut -d'/' -f3) - # Save the file as list.#.domain - saveLocation=$origin/list.$i.$domain.$justDomainsExtension + # Save the file as list.#.domain + saveLocation=$piholeDir/list.$i.$domain.$justDomainsExtension - 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 - # to complete properly and reset the user agent when required - case "$domain" in - "adblock.mahakala.is") - agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' - cmd="curl -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 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' + cmd_ext="-e http://forum.xda-developers.com/" + ;; - "pgl.yoyo.org") - cmd="curl -d mimetype=plaintext -d hostformat=hosts" - ;; + "pgl.yoyo.org") + echo "** $numberOf domains being pulled in by gravity..." - # Default is a simple curl request - *) cmd="curl" - esac + # Remove carriage returns and preceding whitespace + # not really needed anymore? + cp $piholeDir/$andLight $piholeDir/$supernova - # tmp file, so we don't have to store the (long!) lists in RAM - patternBuffer=$(mktemp) - heisenbergCompensator="" - if [[ -r $saveLocation ]]; then - heisenbergCompensator="-z $saveLocation" - fi - CMD="$cmd -s $heisenbergCompensator -A '$agent' $url > $patternBuffer" - $cmd -s $heisenbergCompensator -A "$agent" $url > $patternBuffer + # Sort and remove duplicates + sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon + numberOf=$(wc -l < $piholeDir/$eventHorizon) + echo "** $numberOf unique domains trapped in the event horizon." - - if [[ -s "$patternBuffer" ]];then - # Remove comments and print only the domain name - # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious - # This helps with that and makes it easier to read - # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $patternBuffer | \ - sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation - echo "Done." - else - echo "Skipping pattern because transporter logic detected no changes..." - fi - - # Cleanup - rm -f $patternBuffer -done - -# Find all files with the .domains extension and compile them into one file and remove CRs -echo "** Aggregating list of domains..." -find $origin/ -type f -name "*.$justDomainsExtension" -exec cat {} \; | tr -d '\r' > $origin/$matter - -# Append blacklist entries if they exist -if [[ -r $blacklist ]];then - numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) - echo "** Blacklisting $numberOf domain(s)..." - cat $blacklist >> $origin/$matter -fi - -########################### -function gravity_advanced() { - - numberOf=$(wc -l < $origin/$andLight) - echo "** $numberOf domains being pulled in by gravity..." - - # Remove carriage returns and preceding whitespace - # not really needed anymore? - cp $origin/$andLight $origin/$supernova - - # Sort and remove duplicates - sort -u $origin/$supernova > $origin/$eventHorizon - numberOf=$(wc -l < $origin/$eventHorizon) - echo "** $numberOf unique domains trapped in the event horizon." - - # Format domain list as "192.168.x.x domain.com" - echo "** Formatting domains into a HOSTS file..." - awk '{print "'"$piholeIP"'" $1}' $origin/$eventHorizon > $origin/$accretionDisc - - # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it - sudo cp $origin/$accretionDisc $adList - kill -HUP $(pidof dnsmasq) + # Format domain list as "192.168.x.x domain.com" + echo "** Formatting domains into a HOSTS file..." + cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it + sudo cp $piholeDir/$accretionDisc $adList + kill -HUP $(pidof dnsmasq) } # Whitelist (if applicable) then remove duplicates and format for dnsmasq if [[ -r $whitelist ]];then - # Remove whitelist entries - numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) - plural=; [[ "$numberOf" != "1" ]] && plural=s - echo "** Whitelisting $numberOf domain${plural}..." + # Remove whitelist entries + numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) + plural=; [[ "$numberOf" != "1" ]] && plural=s + echo "** Whitelisting $numberOf domain${plural}..." - # Append a "$" to the end, prepend a "^" to the beginning, and - # replace "." with "\." of each line to turn each entry into a - # regexp so it can be parsed out with grep -x - awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist + # Append a "$" to the end, prepend a "^" to the beginning, and + # replace "." with "\." of each line to turn each entry into a + # regexp so it can be parsed out with grep -x + awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist else - rm $latentWhitelist + rm $latentWhitelist fi # Prevent our sources from being pulled into the hole @@ -156,10 +114,10 @@ plural=; [[ "${#sources[@]}" != "1" ]] && plural=s echo "** Whitelisting ${#sources[@]} ad list source${plural}..." for url in ${sources[@]} do - echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist + echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist done # Remove whitelist entries from deduped list -grep -vxf $latentWhitelist $origin/$matter > $origin/$andLight +grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight gravity_advanced From 668d14e32d6b1f506d3ff34c41a561aa34855bfc Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 00:36:01 -0800 Subject: [PATCH 054/148] Add functions Start to add functions for code reuse --- gravity.sh | 53 +++++++++++++++++++++++++++-------------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/gravity.sh b/gravity.sh index 62a2cf2e..eb4c150f 100755 --- a/gravity.sh +++ b/gravity.sh @@ -46,36 +46,35 @@ echo "** Neutrino emissions detected..." # 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 + sudo chmod 777 $piholeDir + find "$piholeDir" -type f -exec sudo chmod 666 {} \; else echo "** Creating pihole directory..." - sudo mkdir $piholeDir + mkdir $piholeDir fi -# 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) +########################### +function gravity_patterncheck() { - # Save the file as list.#.domain - saveLocation=$piholeDir/list.$i.$domain.$justDomainsExtension + patternBuffer=$1 - 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 - "adblock.mahakala.is") - agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' - cmd_ext="-e http://forum.xda-developers.com/" - ;; - - "pgl.yoyo.org") - echo "** $numberOf domains being pulled in by gravity..." + # check if the patternbuffer is a non-zero length file + if [[ -s "$patternBuffer" ]];then + # Remove comments and print only the domain name + # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious + # This helps with that and makes it easier to read + # It also helps with debugging so each stage of the script can be researched more in depth + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $patternBuffer | \ + sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation + echo "Done." + else + # curl didn't download any host files, probably because of the date check + echo "Transporter logic detected no changes, pattern skipped..." + fi +} # Remove carriage returns and preceding whitespace # not really needed anymore? @@ -90,10 +89,12 @@ do echo "** Formatting domains into a HOSTS file..." cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it - sudo cp $piholeDir/$accretionDisc $adList - kill -HUP $(pidof dnsmasq) + cp $piholeDir/$accretionDisc $adList + sudo kill -HUP $(pidof dnsmasq) } +gravity_spinup + # Whitelist (if applicable) then remove duplicates and format for dnsmasq if [[ -r $whitelist ]];then # Remove whitelist entries From a1e609d0059b1db0212494621cad0f824bb52315 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 01:16:00 -0800 Subject: [PATCH 055/148] Ugly hack permissions Temporary hack for /etc/pihole directory and file permissions to pull out sudo requirement. (Irony is that is requires sudo.) This will be fixed later, but for now it's needed for existing installs so they don't break. --- gravity.sh | 58 +++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/gravity.sh b/gravity.sh index eb4c150f..f3b8f828 100755 --- a/gravity.sh +++ b/gravity.sh @@ -57,10 +57,10 @@ else fi ########################### -function gravity_patterncheck() { - +# patternCheck - check to see if curl downloaded any new files, and then process those +# files so they are in host format. +function gravity_patternCheck() { patternBuffer=$1 - # check if the patternbuffer is a non-zero length file if [[ -s "$patternBuffer" ]];then # Remove comments and print only the domain name @@ -76,6 +76,32 @@ function gravity_patterncheck() { fi } + # 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 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' + cmd_ext="-e http://forum.xda-developers.com/" + ;; + + "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 +done + # Compress files to singularity and white/blacklist + gravity_Schwarzchild +} + +function gravity_advanced() { + + numberOf=$(wc -l < $piholeDir/$andLight) + echo "** $numberOf domains being pulled in by gravity..." + # Remove carriage returns and preceding whitespace # not really needed anymore? cp $piholeDir/$andLight $piholeDir/$supernova @@ -95,30 +121,4 @@ function gravity_patterncheck() { gravity_spinup -# Whitelist (if applicable) then remove duplicates and format for dnsmasq -if [[ -r $whitelist ]];then - # Remove whitelist entries - numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) - plural=; [[ "$numberOf" != "1" ]] && plural=s - echo "** Whitelisting $numberOf domain${plural}..." - - # Append a "$" to the end, prepend a "^" to the beginning, and - # replace "." with "\." of each line to turn each entry into a - # regexp so it can be parsed out with grep -x - awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist -else - rm $latentWhitelist -fi - -# Prevent our sources from being pulled into the hole -plural=; [[ "${#sources[@]}" != "1" ]] && plural=s -echo "** Whitelisting ${#sources[@]} ad list source${plural}..." -for url in ${sources[@]} -do - echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist -done - -# Remove whitelist entries from deduped list -grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight - gravity_advanced From fe46afd08d2058899f34722e5113b67f8b8a320f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 01:47:24 -0800 Subject: [PATCH 056/148] More functions More refactoring --- gravity.sh | 73 +++++++++++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/gravity.sh b/gravity.sh index f3b8f828..9cb017d0 100755 --- a/gravity.sh +++ b/gravity.sh @@ -42,6 +42,10 @@ if [[ -r $piholeDir/pihole.conf ]];then echo "** Local calibration requested..." . $piholeDir/pihole.conf fi +########################### +# collapse - begin formation of pihole +function gravity_collapse() { + echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here @@ -55,46 +59,42 @@ else echo "** Creating pihole directory..." mkdir $piholeDir fi - -########################### -# patternCheck - check to see if curl downloaded any new files, and then process those -# files so they are in host format. -function gravity_patternCheck() { - patternBuffer=$1 - # check if the patternbuffer is a non-zero length file - if [[ -s "$patternBuffer" ]];then - # Remove comments and print only the domain name - # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious - # This helps with that and makes it easier to read - # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $patternBuffer | \ - sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $saveLocation - echo "Done." - else - # curl didn't download any host files, probably because of the date check - echo "Transporter logic detected no changes, pattern skipped..." - fi } - # 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 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' - cmd_ext="-e http://forum.xda-developers.com/" - ;; +# spinup - main gravity function +function gravity_spinup() { - "pgl.yoyo.org") - cmd_ext="-d mimetype=plaintext -d hostformat=hosts" - ;; +# 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 +# Whitelist (if applicable) domains +if [[ -r $whitelist ]];then + # Remove whitelist entries + numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) + plural=; [[ "$numberOf" != "1" ]] && plural=s + echo "** Whitelisting $numberOf domain${plural}..." - # Default is a simple request - *) cmd_ext="" - esac - gravity_transport $url $cmd_ext $agent + # Append a "$" to the end, prepend a "^" to the beginning, and + # replace "." with "\." of each line to turn each entry into a + # regexp so it can be parsed out with grep -x + awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist +else + rm $latentWhitelist +fi + +# Prevent our sources from being pulled into the hole +plural=; [[ "${#sources[@]}" != "1" ]] && plural=s +echo "** Whitelisting ${#sources[@]} ad list source${plural}..." +for url in ${sources[@]} +do + echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist done - # Compress files to singularity and white/blacklist - gravity_Schwarzchild + +# Remove whitelist entries from list +grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight + } function gravity_advanced() { @@ -120,5 +120,6 @@ function gravity_advanced() { } gravity_spinup - +gravity_transport +gravity_Schwartzchild gravity_advanced From af909e0ee67bf5893e476c047c40e78a0085678c Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 02:52:12 -0800 Subject: [PATCH 057/148] Copyright issues Some of the blocklists are copyright and need to be pulled and stored as is. They can be processed further in the script to remove comments. --- gravity.sh | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 90 insertions(+), 6 deletions(-) diff --git a/gravity.sh b/gravity.sh index 9cb017d0..f8f91bd3 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,4 +1,7 @@ #!/usr/bin/env bash +# Pi-hole: A black hole for Internet advertisements +# (c) 2015 by Jacob Salmela GPL 2.0 +# Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources piholeIPfile=/tmp/piholeIP @@ -45,7 +48,6 @@ fi ########################### # collapse - begin formation of pihole function gravity_collapse() { - echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here @@ -61,6 +63,44 @@ else fi } +# patternCheck - check to see if curl downloaded any new files, and then process those +# files so they are in host format. +function gravity_patternCheck() { + patternBuffer=$1 + # check if the patternbuffer is a non-zero length file + 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 + echo "Done." + else + # curl didn't download any host files, probably because of the date check + echo "Transporter logic detected no changes, pattern skipped..." + fi +} + +# transport - curl the specified url with any needed command extentions, then patternCheck +function gravity_transport() { + url=$1 + cmd_ext=$2 + agent=$3 + # tmp file, so we don't have to store the (long!) lists in RAM + patternBuffer=$(mktemp) + heisenbergCompensator="" + if [[ -r $saveLocation ]]; then + # if domain has been saved, add file for date check to only download newer + heisenbergCompensator="-z $saveLocation" + fi + # Silently curl url + curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer + + gravity_patternCheck $patternBuffer + + # Cleanup + rm -f $patternBuffer + +} # spinup - main gravity function function gravity_spinup() { @@ -69,6 +109,48 @@ 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 + + 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 + "adblock.mahakala.is") + agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' + cmd_ext="-e http://forum.xda-developers.com/" + ;; + + "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 +done +} + +# Schwarzchild - aggregate domains to one list, and then white/blacklist unified list +function gravity_Schwarzchild() { + +# Find all files with the .domains extension and compile them into one file and remove CRs +echo "** Aggregating list of domains..." +find $piholeDir/ -type f -name "*.$justDomainsExtension" -exec cat {} \; | tr -d '\r' > $piholeDir/$matter + +# Append blacklist entries if they exist +if [[ -r $blacklist ]];then + numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) + echo "** Blacklisting $numberOf domain(s)..." + cat $blacklist >> $piholeDir/$matter +fi + # Whitelist (if applicable) domains if [[ -r $whitelist ]];then # Remove whitelist entries @@ -102,9 +184,12 @@ function gravity_advanced() { numberOf=$(wc -l < $piholeDir/$andLight) echo "** $numberOf domains being pulled in by gravity..." - # Remove carriage returns and preceding whitespace - # not really needed anymore? - cp $piholeDir/$andLight $piholeDir/$supernova + # Remove comments and print only the domain name + # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious + # This helps with that and makes it easier to read + # It also helps with debugging so each stage of the script can be researched more in depth + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ + sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova # Sort and remove duplicates sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon @@ -120,6 +205,5 @@ function gravity_advanced() { } gravity_spinup -gravity_transport -gravity_Schwartzchild +gravity_Schwarzchild gravity_advanced From 4f1bb12d36b64c239cb1ed2bb3f117bb64995498 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 03:11:16 -0800 Subject: [PATCH 058/148] More functions Splitting into more functions --- gravity.sh | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/gravity.sh b/gravity.sh index f8f91bd3..4a57112f 100755 --- a/gravity.sh +++ b/gravity.sh @@ -179,6 +179,19 @@ grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight } +function gravity_unique() { + # Sort and remove duplicates + sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon + numberOf=$(wc -l < $piholeDir/$eventHorizon) + echo "** $numberOf unique domains trapped in the event horizon." +} +function gravity_hostFormat() { + # Format domain list as "192.168.x.x domain.com" + echo "** Formatting domains into a HOSTS file..." + cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it + cp $piholeDir/$accretionDisc $adList +} function gravity_advanced() { numberOf=$(wc -l < $piholeDir/$andLight) @@ -191,19 +204,11 @@ function gravity_advanced() { awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova - # Sort and remove duplicates - sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon - numberOf=$(wc -l < $piholeDir/$eventHorizon) - echo "** $numberOf unique domains trapped in the event horizon." - - # Format domain list as "192.168.x.x domain.com" - echo "** Formatting domains into a HOSTS file..." - cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc - # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it - cp $piholeDir/$accretionDisc $adList sudo kill -HUP $(pidof dnsmasq) } gravity_spinup gravity_Schwarzchild +gravity_unique +gravity_hostFormat gravity_advanced From a5d29a1048f1629b7854dc8cefe25675b904b088 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 03:26:10 -0800 Subject: [PATCH 059/148] Fix function ordering Unique is now called after the comments are scrubbed from the unified domain list. --- gravity.sh | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/gravity.sh b/gravity.sh index 4a57112f..af1e98dc 100755 --- a/gravity.sh +++ b/gravity.sh @@ -137,7 +137,7 @@ do done } -# Schwarzchild - aggregate domains to one list, and then white/blacklist unified list +# Schwarzchild - aggregate domains to one list and add blacklisted domains function gravity_Schwarzchild() { # Find all files with the .domains extension and compile them into one file and remove CRs @@ -150,6 +150,9 @@ if [[ -r $blacklist ]];then echo "** Blacklisting $numberOf domain(s)..." cat $blacklist >> $piholeDir/$matter fi +} + +function gravity_pulsar() { # Whitelist (if applicable) domains if [[ -r $whitelist ]];then @@ -176,7 +179,6 @@ done # Remove whitelist entries from list grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight - } function gravity_unique() { @@ -194,9 +196,6 @@ function gravity_hostFormat() { } function gravity_advanced() { - numberOf=$(wc -l < $piholeDir/$andLight) - echo "** $numberOf domains being pulled in by gravity..." - # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read @@ -204,11 +203,16 @@ function gravity_advanced() { awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova + numberOf=$(wc -l < $piholeDir/$supernova) + echo "** $numberOf domains being pulled in by gravity..." + gravity_unique + sudo kill -HUP $(pidof dnsmasq) } gravity_spinup gravity_Schwarzchild -gravity_unique +gravity_pulsar gravity_hostFormat gravity_advanced + From e2b518568ea1477068a90587c4dedf0d5859ee9b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 12:39:47 -0800 Subject: [PATCH 060/148] Forgot to start the directory check function --- gravity.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/gravity.sh b/gravity.sh index af1e98dc..e3337e42 100755 --- a/gravity.sh +++ b/gravity.sh @@ -210,6 +210,7 @@ function gravity_advanced() { sudo kill -HUP $(pidof dnsmasq) } +gravity_collapse gravity_spinup gravity_Schwarzchild gravity_pulsar From 20399b82620a67a2322a4da51feb79e1620062e4 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Mon, 23 Nov 2015 13:12:11 -0800 Subject: [PATCH 061/148] Build array of active domains to concatenate Fix #86 Builds an array of active domains, and then loops through that list to pick files to concatenate after truncating Matter. --- gravity.sh | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index e3337e42..ae20d439 100755 --- a/gravity.sh +++ b/gravity.sh @@ -113,6 +113,7 @@ do # Save the file as list.#.domain saveLocation=$piholeDir/list.$i.$domain.$justDomainsExtension + activeDomains[$i]=$saveLocation agent="Mozilla/10.0" @@ -140,9 +141,13 @@ done # Schwarzchild - aggregate domains to one list and add blacklisted domains function gravity_Schwarzchild() { -# Find all files with the .domains extension and compile them into one file and remove CRs +# Find all active domains and compile them into one file and remove CRs echo "** Aggregating list of domains..." -find $piholeDir/ -type f -name "*.$justDomainsExtension" -exec cat {} \; | tr -d '\r' > $piholeDir/$matter +truncate -s 0 $piholeDir/$matter +for i in "${activeDomains[@]}" +do + cat $i |tr -d '\r' >> $piholeDir/$matter +done # Append blacklist entries if they exist if [[ -r $blacklist ]];then From 04f6c478ccd1f3d651dd858d9cb77339217eef2f Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 15 Nov 2015 20:54:15 -0600 Subject: [PATCH 062/148] Updated install instructions Also a screenshot of the dialog-based installer --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 09b88524..3e02f0d4 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ # Automated Install 1. Install Raspbian -2. Set a **static** IP address -3. Run the command below +2. Run the command below -```curl -L install.pi-hole.net | bash``` +### ```curl -L install.pi-hole.net | bash``` + +![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. From ecb514dd0a206176876b6cba59b4b8ae9a1001be Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 19 Nov 2015 19:36:34 -0600 Subject: [PATCH 063/148] pihole in the cloud link --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3e02f0d4..258168c2 100644 --- a/README.md +++ b/README.md @@ -63,5 +63,6 @@ This script will work for other UNIX-like systems with some slight **modificatio ### Examples Of The Pi-hole On Other Operating Systems - [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/) [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From 03bbef07b5ef08c7005bade5b634d303149c5f58 Mon Sep 17 00:00:00 2001 From: Cole Turner Date: Fri, 20 Nov 2015 22:53:43 -0500 Subject: [PATCH 064/148] pinholeIP should only use one IP Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c6405c7d..c2d1ff92 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,7 @@ if [[ -f $piholeIPfile ]];then 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 - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") + piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) fi # Ad-list sources--one per line in single quotes From 464003d6741c81a6bc969db90eb4b34bb9932413 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 21 Nov 2015 13:29:03 -0600 Subject: [PATCH 065/148] uninstall script This should remove the Pi-hole. --- automated install/uninstall.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 automated install/uninstall.sh diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh new file mode 100644 index 00000000..b0dd3368 --- /dev/null +++ b/automated install/uninstall.sh @@ -0,0 +1,19 @@ +#!/bin/bash +# Completely uninstalls the Pi-hole + +######### SCRIPT ########### +sudo apt-get -y remove --purge dnsutils bc toilet +sudo apt-get -y remove --purge dnsmasq +sudo apt-get -y remove --purge lighttpd php5-common php5-cgi php5 +sudo rm -rf /var/www/html +sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo rm /etc/crontab +sudo mv /etc/crontab.orig /etc/crontab +sudo rm /etc/dnsmasq.conf +sudo rm -rf /etc/lighttpd/ +sudo rm /var/log/pihole.log +sudo rm /usr/local/bin/gravity.sh +sudo rm /usr/local/bin/chronometer.sh +sudo rm /usr/local/bin/whitelist.sh +sudo rm /usr/local/bin/piholeLogFlush.sh +sudo rm -rf /etc/pihole/ From 29ae66c6db1d8748ba54fc79a9ec12dc56211afb Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 13:43:59 -0800 Subject: [PATCH 066/148] Check IP info for outgoing interface --- automated install/basic-install.sh | 46 ++++++++++++------------------ 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f0a7d139..2609973f 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Pi-hole: A black hole for Internet advertisements # by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi @@ -24,9 +24,11 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") -IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') -IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') +# Find IP used to route to outside world +IPv4info=$(ip route get 8.8.8.8) +IPv4dev=$(echo $IPv4info| awk '{print $5}') +IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') +IPv4gw=$(echo $IPv4info | awk '{print $3}') # IPv6 support to be added later #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) @@ -117,7 +119,6 @@ getStaticIPv4Settings() 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: $IPv4addr - Subnet mask: $IPv4mask 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. 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. @@ -138,22 +139,17 @@ else IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # 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) if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # 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? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then # If the settings are correct, then we need to set the piholeIP # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP + echo ${IPv4addr%/*} > /tmp/piholeIP # After that's done, the loop ends and we move on ipSettingsCorrect=True else @@ -167,12 +163,6 @@ else exit fi else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else # Cancelling IPv4 settings window ipSettingsCorrect=False echo "User canceled." @@ -188,7 +178,7 @@ setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $piholeInterface -static ip_address=$IPv4addr/24 +static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } @@ -224,15 +214,15 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh -sudo /usr/local/bin/gravity.sh +sudo curl -o /usr/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/bin/gravity.sh +sudo chmod 755 /usr/bin/chronometer.sh +sudo chmod 755 /usr/bin/whitelist.sh +sudo chmod 755 /usr/bin/piholeLogFlush.sh +sudo /usr/bin/gravity.sh } ######## SCRIPT ############ From 6e13134328c779375b74b2a2f6d00ee39e67f578 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 13:51:11 -0800 Subject: [PATCH 067/148] Revert FHS change until merged --- automated install/basic-install.sh | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 2609973f..f2a98fb7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -214,15 +214,15 @@ sudo rm /var/www/master.zip 2>/dev/null sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/bin/gravity.sh -sudo chmod 755 /usr/bin/chronometer.sh -sudo chmod 755 /usr/bin/whitelist.sh -sudo chmod 755 /usr/bin/piholeLogFlush.sh -sudo /usr/bin/gravity.sh +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/gravity.sh +sudo chmod 755 /usr/local/bin/chronometer.sh +sudo chmod 755 /usr/local/bin/whitelist.sh +sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +sudo /usr/local/bin/gravity.sh } ######## SCRIPT ############ From 21ee63b7fb77da949eca5aca710afade971a0236 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 14:08:13 -0800 Subject: [PATCH 068/148] Get IP info from outgoing interface Use IP to get interface information from outgoing interface. Use CIDR notation to make things easier. --- automated install/basic-install.sh | 28 +++++++++------------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f0a7d139..f2a98fb7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Pi-hole: A black hole for Internet advertisements # by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi @@ -24,9 +24,11 @@ columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) r=$(( rows / 2 )) c=$(( columns / 2 )) -IPv4addr=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1") -IPv4mask=$(ifconfig | awk -F':' '/inet addr/ && !/127.0.0.1/ {print $4}') -IPv4gw=$(ip route show | awk '/default\ via/ {print $3}') +# Find IP used to route to outside world +IPv4info=$(ip route get 8.8.8.8) +IPv4dev=$(echo $IPv4info| awk '{print $5}') +IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') +IPv4gw=$(echo $IPv4info | awk '{print $3}') # IPv6 support to be added later #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) @@ -117,7 +119,6 @@ getStaticIPv4Settings() 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: $IPv4addr - Subnet mask: $IPv4mask 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. 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. @@ -138,22 +139,17 @@ else IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) if [[ $? = 0 ]];then echo "Your static IPv4 address: $IPv4addr" - # Ask for the subnet mask - IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) - if [[ $? = 0 ]];then - echo "Your static IPv4 netmask: $IPv4mask" - # 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) if [[ $? = 0 ]];then echo "Your static IPv4 gateway: $IPv4gw" # 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? IP address: $IPv4addr - Subnet mask: $IPv4mask Gateway: $IPv4gw" $r $c)then # If the settings are correct, then we need to set the piholeIP # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script - echo $IPv4addr > /tmp/piholeIP + echo ${IPv4addr%/*} > /tmp/piholeIP # After that's done, the loop ends and we move on ipSettingsCorrect=True else @@ -167,12 +163,6 @@ else exit fi else - # Cancelling subnet mask settings window - ipSettingsCorrect=False - echo "User canceled." - exit - fi - else # Cancelling IPv4 settings window ipSettingsCorrect=False echo "User canceled." @@ -188,7 +178,7 @@ setStaticIPv4() { # Append these lines to /etc/dhcpcd.conf to enable a static IP echo "interface $piholeInterface -static ip_address=$IPv4addr/24 +static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } From b011fe28d9ba095f6f6a057dc3a08bc0749f305b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 14:34:06 -0800 Subject: [PATCH 069/148] No longer need a reboot --- automated install/basic-install.sh | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f2a98fb7..47c402f6 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -128,8 +128,6 @@ if (whiptail --backtitle "Calibrating network interface" --title "Static IP Addr It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." $r $c # Nothing else to do since the variables are already set above else - # Since a custom address will be used, restart at the end of the script to apply the new changes - rebootNeeded=true # 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 a loop to let the user enter their information with the chance to go back and edit it if necessary @@ -180,7 +178,8 @@ setStaticIPv4() echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw -static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +sudo ip addr replace dev $piholeInterface $IPv4addr } installPihole() @@ -274,12 +273,5 @@ If you didn't use DHCP settings as your new static address, the Pi will restart The install log is in /etc/pihole." $r $c -# If a custom address was set, restart -if [[ "$rebootNeeded" = true ]];then - # Restart to apply the new static IP address - sudo reboot -else - # If not, just start the services since the address will stay the same - sudo service dnsmasq start - sudo service lighttpd start -fi +sudo service dnsmasq start +sudo service lighttpd start From bc0a8e7733925799d0401c40fc1132a30ed516de Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 25 Nov 2015 18:08:17 -0600 Subject: [PATCH 070/148] final dialog verbiage Updating dialog to reflect changes in #90 --- automated install/basic-install.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 47c402f6..3c6d14fd 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -178,7 +178,7 @@ setStaticIPv4() echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw -static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null sudo ip addr replace dev $piholeInterface $IPv4addr } @@ -269,7 +269,7 @@ sudo mv $tmpLog $instalLogLoc whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. -If you didn't use DHCP settings as your new static address, the Pi will restart after this dialog. If you are using SSH, you may need to reconnect using the IP address above. +If you set a new IP address, it should work fine, but you may want to reboot the Pi at some point. The install log is in /etc/pihole." $r $c From 23856d65e21bb0b960882eecff48cdb932c586af Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 16:35:36 -0800 Subject: [PATCH 071/148] IP address detection update --- gravity.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index c2d1ff92..49520549 100755 --- a/gravity.sh +++ b/gravity.sh @@ -8,7 +8,9 @@ if [[ -f $piholeIPfile ]];then 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 - piholeIP=$(ip -4 addr show | awk '{match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); ip = substr($0,RSTART,RLENGTH); print ip}' | sed '/^\s*$/d' | grep -v "127.0.0.1" | (head -n1)) + IPv4dev=$(ip route get 8.8.8.8 | awk '{print $5}') + piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') + piholeIP=${piholeIPCIDR%/*} fi # Ad-list sources--one per line in single quotes From 29ae57465bbbf06606894278cda84ad8df08f15f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Wed, 25 Nov 2015 19:51:07 -0800 Subject: [PATCH 072/148] Bug Fix - Cleanup Files --- gravity.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index ae20d439..d70f0dce 100755 --- a/gravity.sh +++ b/gravity.sh @@ -145,7 +145,7 @@ function gravity_Schwarzchild() { echo "** Aggregating list of domains..." truncate -s 0 $piholeDir/$matter for i in "${activeDomains[@]}" -do +do cat $i |tr -d '\r' >> $piholeDir/$matter done @@ -199,6 +199,16 @@ function gravity_hostFormat() { # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } +function gravity_blackbody() { + for file in $piholeDir/*.$justDomainsExtension + do + if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then + : + else + rm -f $file + fi + done +} function gravity_advanced() { # Remove comments and print only the domain name @@ -221,4 +231,4 @@ gravity_Schwarzchild gravity_pulsar gravity_hostFormat gravity_advanced - +gravity_blackbody From c45dc277b6117aae69e1e60cbe2d7e77ab2e4525 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:29:13 -0800 Subject: [PATCH 073/148] Tighten themeatics --- gravity.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gravity.sh b/gravity.sh index d70f0dce..018989c7 100755 --- a/gravity.sh +++ b/gravity.sh @@ -73,10 +73,10 @@ function gravity_patternCheck() { # and stored as is. They can be processed for content after they # have been saved. cp $patternBuffer $saveLocation - echo "Done." + echo "List updated, transport successful..." else # curl didn't download any host files, probably because of the date check - echo "Transporter logic detected no changes, pattern skipped..." + echo "No changes detected, transport skipped..." fi } @@ -117,7 +117,7 @@ do 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 # to complete properly and reset the user agent when required From d1e475da89154fe2ad83e03391137ca1fae0e99e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:48:52 -0800 Subject: [PATCH 074/148] Move black/white list check to pulsar --- gravity.sh | 144 ++++++++++++++++++++++++++++------------------------- 1 file changed, 77 insertions(+), 67 deletions(-) diff --git a/gravity.sh b/gravity.sh index 018989c7..27f5d823 100755 --- a/gravity.sh +++ b/gravity.sh @@ -4,6 +4,7 @@ # Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources + piholeIPfile=/tmp/piholeIP 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 @@ -15,7 +16,8 @@ else fi # Ad-list sources--one per line in single quotes -# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. Uncomment at your own risk +# The mahakala source is commented out due to many users having issues with it blocking legitimate domains. +# Uncomment at your own risk sources=('https://adaway.org/hosts.txt' 'http://adblock.gjtech.net/?format=unix-hosts' #'http://adblock.mahakala.is/' @@ -45,62 +47,65 @@ if [[ -r $piholeDir/pihole.conf ]];then echo "** Local calibration requested..." . $piholeDir/pihole.conf fi + ########################### # collapse - begin formation of pihole function gravity_collapse() { echo "** Neutrino emissions detected..." -# Create the pihole resource directory if it doesn't exist. Future files will be stored here -if [[ -d $piholeDir ]];then + # 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 sudo chmod 777 $piholeDir find "$piholeDir" -type f -exec sudo chmod 666 {} \; -else + else echo "** Creating pihole directory..." mkdir $piholeDir -fi + fi } # patternCheck - check to see if curl downloaded any new files, and then process those # files so they are in host format. function gravity_patternCheck() { - patternBuffer=$1 - # check if the patternbuffer is a non-zero length file - 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 - echo "List updated, transport successful..." - else - # curl didn't download any host files, probably because of the date check - echo "No changes detected, transport skipped..." - fi + patternBuffer=$1 + # check if the patternbuffer is a non-zero length file + 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 + echo "List updated, transport successful..." + else + # curl didn't download any host files, probably because of the date check + echo "No changes detected, transport skipped..." + fi } # transport - curl the specified url with any needed command extentions, then patternCheck function gravity_transport() { - url=$1 - cmd_ext=$2 - agent=$3 - # tmp file, so we don't have to store the (long!) lists in RAM - patternBuffer=$(mktemp) - heisenbergCompensator="" - if [[ -r $saveLocation ]]; then - # if domain has been saved, add file for date check to only download newer - heisenbergCompensator="-z $saveLocation" - fi - # Silently curl url - curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer + url=$1 + cmd_ext=$2 + agent=$3 + + # tmp file, so we don't have to store the (long!) lists in RAM + patternBuffer=$(mktemp) + heisenbergCompensator="" + if [[ -r $saveLocation ]]; then + # if domain has been saved, add file for date check to only download newer + heisenbergCompensator="-z $saveLocation" + fi - gravity_patternCheck $patternBuffer - - # Cleanup - rm -f $patternBuffer + # Silently curl url + curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer + # Check for list updates + gravity_patternCheck $patternBuffer + # Cleanup + rm -f $patternBuffer } + # spinup - main gravity function function gravity_spinup() { @@ -141,26 +146,26 @@ done # Schwarzchild - aggregate domains to one list and add blacklisted domains function gravity_Schwarzchild() { -# Find all active domains and compile them into one file and remove CRs -echo "** Aggregating list of domains..." -truncate -s 0 $piholeDir/$matter -for i in "${activeDomains[@]}" -do - cat $i |tr -d '\r' >> $piholeDir/$matter -done - -# Append blacklist entries if they exist -if [[ -r $blacklist ]];then - numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) - echo "** Blacklisting $numberOf domain(s)..." - cat $blacklist >> $piholeDir/$matter -fi + # Find all active domains and compile them into one file and remove CRs + echo "** Aggregating list of domains..." + truncate -s 0 $piholeDir/$matter + for i in "${activeDomains[@]}" + do + cat $i |tr -d '\r' >> $piholeDir/$matter + done } function gravity_pulsar() { + + # Append blacklist entries if they exist + if [[ -r $blacklist ]];then + numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) + echo "** Blacklisting $numberOf domain(s)..." + cat $blacklist >> $piholeDir/$matter + fi -# Whitelist (if applicable) domains -if [[ -r $whitelist ]];then + # Whitelist (if applicable) domains + if [[ -r $whitelist ]];then # Remove whitelist entries numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) plural=; [[ "$numberOf" != "1" ]] && plural=s @@ -170,20 +175,20 @@ if [[ -r $whitelist ]];then # replace "." with "\." of each line to turn each entry into a # regexp so it can be parsed out with grep -x awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist -else + else rm $latentWhitelist -fi + fi -# Prevent our sources from being pulled into the hole -plural=; [[ "${#sources[@]}" != "1" ]] && plural=s -echo "** Whitelisting ${#sources[@]} ad list source${plural}..." -for url in ${sources[@]} -do + # Prevent our sources from being pulled into the hole + plural=; [[ "${#sources[@]}" != "1" ]] && plural=s + echo "** Whitelisting ${#sources[@]} ad list source${plural}..." + for url in ${sources[@]} + do echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist -done + done -# Remove whitelist entries from list -grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight + # Remove whitelist entries from list + grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight } function gravity_unique() { @@ -192,6 +197,7 @@ function gravity_unique() { numberOf=$(wc -l < $piholeDir/$eventHorizon) echo "** $numberOf unique domains trapped in the event horizon." } + function gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." @@ -199,16 +205,20 @@ function gravity_hostFormat() { # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } + function gravity_blackbody() { - for file in $piholeDir/*.$justDomainsExtension - do - if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then - : - else - rm -f $file - fi - done + # Loop through list files + for file in $piholeDir/*.$justDomainsExtension + do + # If list is active then leave it (noop) else rm the list + if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then + : + else + rm -f $file + fi + done } + function gravity_advanced() { # Remove comments and print only the domain name From 9892d06c0db96ad090061778049e765d05283007 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 26 Nov 2015 15:56:37 -0800 Subject: [PATCH 075/148] Code format cleanups --- gravity.sh | 61 +++++++++++++++++++++++++++--------------------------- 1 file changed, 31 insertions(+), 30 deletions(-) diff --git a/gravity.sh b/gravity.sh index 27f5d823..f34ce80b 100755 --- a/gravity.sh +++ b/gravity.sh @@ -51,7 +51,7 @@ fi ########################### # collapse - begin formation of pihole function gravity_collapse() { -echo "** Neutrino emissions detected..." + echo "** Neutrino emissions detected..." # Create the pihole resource directory if it doesn't exist. Future files will be stored here if [[ -d $piholeDir ]];then @@ -66,8 +66,7 @@ echo "** Neutrino emissions detected..." fi } -# patternCheck - check to see if curl downloaded any new files, and then process those -# files so they are in host format. +# patternCheck - check to see if curl downloaded any new files. function gravity_patternCheck() { patternBuffer=$1 # check if the patternbuffer is a non-zero length file @@ -83,7 +82,7 @@ function gravity_patternCheck() { fi } -# transport - curl the specified url with any needed command extentions, then patternCheck +# transport - curl the specified url with any needed command extentions function gravity_transport() { url=$1 cmd_ext=$2 @@ -109,9 +108,9 @@ function gravity_transport() { # spinup - main gravity function function gravity_spinup() { -# 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 + # 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) @@ -139,8 +138,8 @@ do # Default is a simple request *) cmd_ext="" esac - gravity_transport $url $cmd_ext $agent -done + gravity_transport $url $cmd_ext $agent + done } # Schwarzchild - aggregate domains to one list and add blacklisted domains @@ -155,6 +154,7 @@ function gravity_Schwarzchild() { done } +# Pulsar - White/blacklist application function gravity_pulsar() { # Append blacklist entries if they exist @@ -192,25 +192,26 @@ function gravity_pulsar() { } function gravity_unique() { - # Sort and remove duplicates - sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon - numberOf=$(wc -l < $piholeDir/$eventHorizon) - echo "** $numberOf unique domains trapped in the event horizon." + # Sort and remove duplicates + sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon + numberOf=$(wc -l < $piholeDir/$eventHorizon) + echo "** $numberOf unique domains trapped in the event horizon." } function gravity_hostFormat() { - # Format domain list as "192.168.x.x domain.com" - echo "** Formatting domains into a HOSTS file..." - cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc - # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it - cp $piholeDir/$accretionDisc $adList + # Format domain list as "192.168.x.x domain.com" + echo "** Formatting domains into a HOSTS file..." + cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it + cp $piholeDir/$accretionDisc $adList } +# blackbody - remove any remnant files from script processes function gravity_blackbody() { # Loop through list files for file in $piholeDir/*.$justDomainsExtension do - # If list is active 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 : else @@ -220,19 +221,19 @@ function gravity_blackbody() { } function gravity_advanced() { + # Remove comments and print only the domain name + # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious + # This helps with that and makes it easier to read + # It also helps with debugging so each stage of the script can be researched more in depth + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ + sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova - # Remove comments and print only the domain name - # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious - # This helps with that and makes it easier to read - # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ - sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova + numberOf=$(wc -l < $piholeDir/$supernova) + echo "** $numberOf domains being pulled in by gravity..." - numberOf=$(wc -l < $piholeDir/$supernova) - echo "** $numberOf domains being pulled in by gravity..." - gravity_unique - - sudo kill -HUP $(pidof dnsmasq) + gravity_unique + + sudo kill -HUP $(pidof dnsmasq) } gravity_collapse From a2cddda590ad983dc7ae8915646130559eb1e947 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:29:44 -0600 Subject: [PATCH 076/148] if whitelist.txt doesn't exist, create it --- advanced/Scripts/whitelist.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index d610d0a5..97385c97 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,5 +1,9 @@ #!/bin/bash +if [[ ! -f /etc/pihole/whitelist.txt ]];then + touch /etc/pihole/whitelist.txt +fi + if [ $# = 0 ]; then echo "Immediately whitelists one or more domains." echo "Usage: whitelist.sh domain1 [domain2 ...]" @@ -29,7 +33,7 @@ done # Now report on and remove matched domains if [ "$combopattern" != "" ]; then echo "Modifying hosts file..." - + # Construct pattern to match entry in hosts file. # This consists of one or more IP addresses followed by the domain name. pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') From 573c1ef94f1baa0da7ec53dd9221ddf7c03957bc Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:34:02 -0600 Subject: [PATCH 077/148] double bracket notation --- advanced/Scripts/whitelist.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index 97385c97..ea06cc8b 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -4,7 +4,7 @@ if [[ ! -f /etc/pihole/whitelist.txt ]];then touch /etc/pihole/whitelist.txt fi -if [ $# = 0 ]; then +if [[ $# = 0 ]]; then echo "Immediately whitelists one or more domains." echo "Usage: whitelist.sh domain1 [domain2 ...]" fi @@ -19,9 +19,9 @@ do # Construct basic pattern to match domain name. basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') - if [ "$basicpattern" != "" ]; then + if [[ "$basicpattern" != "" ]]; then # Add to the combination pattern that will be used below - if [ "$combopattern" != "" ]; then combopattern="$combopattern|"; fi + if [[ "$combopattern" != "" ]]; then combopattern="$combopattern|"; fi combopattern="$combopattern$basicpattern" # Also add the domain to the whitelist but only if it's not already present @@ -31,7 +31,7 @@ do done # Now report on and remove matched domains -if [ "$combopattern" != "" ]; then +if [[ "$combopattern" != "" ]]; then echo "Modifying hosts file..." # Construct pattern to match entry in hosts file. From 831322b8b2d6faa07b3951cd1973dab4d6ebaf62 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 27 Nov 2015 18:38:33 -0600 Subject: [PATCH 078/148] replace file paths with variables --- advanced/Scripts/whitelist.sh | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index ea06cc8b..cda557c0 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,7 +1,8 @@ #!/bin/bash - -if [[ ! -f /etc/pihole/whitelist.txt ]];then - touch /etc/pihole/whitelist.txt +whitelist=/etc/pihole/whitelist.txt +adList=/etc/pihole/gravity.list +if [[ ! -f $whitelist ]];then + touch $whitelist fi if [[ $# = 0 ]]; then @@ -25,8 +26,8 @@ do combopattern="$combopattern$basicpattern" # Also add the domain to the whitelist but only if it's not already present - grep -E -q "^$basicpattern$" /etc/pihole/whitelist.txt \ - || echo "$var" >> /etc/pihole/whitelist.txt + grep -E -q "^$basicpattern$" $whitelist \ + || echo "$var" >> $whitelist fi done @@ -39,8 +40,8 @@ if [[ "$combopattern" != "" ]]; then pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') # Output what will be removed and then actually remove - sed -r -n 's/'"$pattern"'/ Removed: \3/p' /etc/pihole/gravity.list - sed -r -i '/'"$pattern"'/d' /etc/pihole/gravity.list + sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList + sed -r -i '/'"$pattern"'/d' $adList echo "** $# domain(s) whitelisted." # Force dnsmasq to reload /etc/pihole/gravity.list From 1eb7f879f07b8c2b856bb9aaf0ae57c56ca02f30 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 1 Dec 2015 15:12:16 -0600 Subject: [PATCH 079/148] fixes #101 the line url.access-deny caused the error. --- advanced/lighttpd.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index a4253a0e..31cb47b9 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -1,4 +1,5 @@ server.modules = ( + "mod_access", "mod_expire", "mod_compress", "mod_redirect", From c34cc1608baf2c7c1450c19a9922107d91e57d29 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 1 Dec 2015 16:04:07 -0600 Subject: [PATCH 080/148] for use with logstalgia This seems to show the domain queried and the path requested. --- advanced/lighttpd.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/advanced/lighttpd.conf b/advanced/lighttpd.conf index 31cb47b9..3998269a 100644 --- a/advanced/lighttpd.conf +++ b/advanced/lighttpd.conf @@ -1,5 +1,6 @@ server.modules = ( "mod_access", + "mod_accesslog", "mod_expire", "mod_compress", "mod_redirect", @@ -15,6 +16,8 @@ server.pid-file = "/var/run/lighttpd.pid" server.username = "www-data" server.groupname = "www-data" server.port = 80 +accesslog.filename = "/var/log/lighttpd/access.log" +accesslog.format = "%{%s}t|%V|%r|%s|%b" index-file.names = ( "index.php", "index.html", "index.lighttpd.html" ) From 2193d6a81fcc65732d606ee294aa756e3530b65f Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 01:29:26 -0800 Subject: [PATCH 081/148] Document dnsmasq.conf config --- advanced/dnsmasq.conf | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 25b2138e..30d72381 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -1,12 +1,47 @@ +# If you want dnsmasq to read another file, as well as /etc/hosts, use +# this. addn-hosts=/etc/pihole/gravity.list + +# The following two options make you a better netizen, since they +# tell dnsmasq to filter out queries which the public DNS cannot +# answer, and which load the servers (especially the root servers) +# unnecessarily. If you have a dial-on-demand link they also stop +# these requests from bringing up the link unnecessarily. + +# Never forward plain names (without a dot or domain part) domain-needed +# Never forward addresses in the non-routed address spaces. bogus-priv + +# If you don't want dnsmasq to read /etc/resolv.conf or any other +# file, getting its servers from this file instead (see below), then +# uncomment this. no-resolv + +# Add other name servers here, with domain specs if they are for +# non-public domains. server=8.8.8.8 server=8.8.4.4 + +# If you want dnsmasq to listen for DHCP and DNS requests only on +# specified interfaces (and the loopback) give the name of the +# interface (eg eth0) here. interface=eth0 +# Or which to listen on by address (remember to include 127.0.0.1 if +# you use this.) listen-address=127.0.0.1 + +# Set the cachesize here. cache-size=10000 + +# For debugging purposes, log each DNS query as it passes through +# dnsmasq. log-queries log-facility=/var/log/pihole.log + +# Normally responses which come from /etc/hosts and the DHCP lease +# file have Time-To-Live set as zero, which conventionally means +# do not cache further. If you are happy to trade lower load on the +# server for potentially stale date, you can set a time-to-live (in +# seconds) here. local-ttl=300 From 9421366e4f552e5d0c69b4bb0636d10d13d99249 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 09:25:13 -0800 Subject: [PATCH 082/148] Breakout basic-install.sh to functions --- automated install/basic-install.sh | 83 ++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 28 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 3c6d14fd..99daaa52 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -148,6 +148,7 @@ else # If the settings are correct, then we need to set the piholeIP # Saving it to a temporary file us to retrieve it later when we run the gravity.sh script echo ${IPv4addr%/*} > /tmp/piholeIP + echo $piholeInterface > /tmp/piholeINT # After that's done, the loop ends and we move on ipSettingsCorrect=True else @@ -182,45 +183,71 @@ static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null sudo ip addr replace dev $piholeInterface $IPv4addr } -installPihole() -{ +installScripts(){ +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh +} + +installConfigs(){ +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +} + +stopServices(){ +sudo service dnsmasq stop || true +sudo service lighttpd stop || true +} + +installDependencies(){ sudo apt-get update sudo apt-get -y upgrade sudo apt-get -y install dnsutils bc toilet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi -sudo service dnsmasq stop -sudo service lighttpd stop -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf -sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installWebAdmin(){ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +} + +installPiholeWeb(){ +sudo mkdir /var/www/html/pihole +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installCron(){ +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +} + +installPiLog(){ sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +} +installPihole() +{ +installDependencies +stopServices +sudo chown www-data:www-data /var/www/html +sudo chmod 775 /var/www/html +sudo usermod -a -G www-data pi +sudo lighty-enable-mod fastcgi fastcgi-php +installScripts +installConfigs +installWebAdmin +installPiholeWeb +installCron +installPiLog sudo /usr/local/bin/gravity.sh } From 7a82d1ff17af9d17139bd0714746303a75f07514 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 09:26:43 -0800 Subject: [PATCH 083/148] Breakout basic-install.sh into functions --- automated install/basic-install.sh | 82 ++++++++++++++++++++---------- 1 file changed, 54 insertions(+), 28 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 3c6d14fd..f59214b3 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -182,45 +182,71 @@ static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null sudo ip addr replace dev $piholeInterface $IPv4addr } -installPihole() -{ +installScripts(){ +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh +} + +installConfigs(){ +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +} + +stopServices(){ +sudo service dnsmasq stop || true +sudo service lighttpd stop || true +} + +installDependencies(){ sudo apt-get update sudo apt-get -y upgrade sudo apt-get -y install dnsutils bc toilet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi -sudo service dnsmasq stop -sudo service lighttpd stop -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf -sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installWebAdmin(){ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +} + +installPiholeWeb(){ +sudo mkdir /var/www/html/pihole +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installCron(){ +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +} + +installPiLog(){ sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +} +installPihole() +{ +installDependencies +stopServices +sudo chown www-data:www-data /var/www/html +sudo chmod 775 /var/www/html +sudo usermod -a -G www-data pi +sudo lighty-enable-mod fastcgi fastcgi-php +installScripts +installConfigs +installWebAdmin +installPiholeWeb +installCron +installPiLog sudo /usr/local/bin/gravity.sh } From 3651ee5480a434435d8800d98b759353709c1a08 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 09:56:27 -0800 Subject: [PATCH 084/148] Bugfix for hardcoded dnsmasq.conf interface Add target to dnsmasq.conf for sed Replace dnsmasq.conf target with selected interface --- advanced/dnsmasq.conf | 2 +- automated install/basic-install.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 30d72381..c4269165 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -26,7 +26,7 @@ server=8.8.4.4 # If you want dnsmasq to listen for DHCP and DNS requests only on # specified interfaces (and the loopback) give the name of the # interface (eg eth0) here. -interface=eth0 +interface=@INT@ # Or which to listen on by address (remember to include 127.0.0.1 if # you use this.) listen-address=127.0.0.1 diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f59214b3..04f1b39c 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -82,6 +82,7 @@ for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface echo "Using interface: $piholeInterface" + echo ${piholeInterface} > /tmp/piholeINT done } @@ -195,6 +196,7 @@ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf } stopServices(){ From 861673594d91e1710b2492b9dedd64b89d5ae969 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 13:17:27 -0800 Subject: [PATCH 085/148] Point to wiki Point users to the Wiki Customization entry instead of the PR --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 258168c2..4021b766 100644 --- a/README.md +++ b/README.md @@ -49,11 +49,11 @@ The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashb If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below: ``` -origin=/var/run/pihole +piholeDir=/var/run/pihole adList=/etc/dnsmasq.d/adList ``` -See [this PR](https://github.com/jacobsalmela/pi-hole/pull/20) for more details. +See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details. ### How It Works A technical and detailed description can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0)! From b9a5ca60b2f63a3ea27ea77a1ef9edb164d158e0 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Thu, 3 Dec 2015 20:34:45 -0800 Subject: [PATCH 086/148] Oneline ip link call, tighten awk call --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index f59214b3..55292ade 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -34,7 +34,7 @@ IPv4gw=$(echo $IPv4info | awk '{print $3}') #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) #IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) -availableInterfaces=$(ip link show | awk -F' ' '/[0-9]: [a-z]/ {print $2}' | grep -v "lo" | cut -d':' -f1) +availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## From 0c3409a028920f059fc783217a8d1408646a471a Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 4 Dec 2015 21:41:37 -0600 Subject: [PATCH 087/148] fixes #111 Also clears out some errors users don't need to see --- gravity.sh | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/gravity.sh b/gravity.sh index 7d9440a3..170774c6 100755 --- a/gravity.sh +++ b/gravity.sh @@ -14,7 +14,7 @@ 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 '{print $5}') piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') - piholeIP=${piholeIPCIDR%/*} + piholeIP=${piholeIPCIDR%/*} fi # Ad-list sources--one per line in single quotes @@ -89,7 +89,7 @@ function gravity_transport() { url=$1 cmd_ext=$2 agent=$3 - + # tmp file, so we don't have to store the (long!) lists in RAM patternBuffer=$(mktemp) heisenbergCompensator="" @@ -140,7 +140,7 @@ function gravity_spinup() { # Default is a simple request *) cmd_ext="" esac - gravity_transport $url $cmd_ext $agent + gravity_transport $url $cmd_ext $agent done } @@ -151,14 +151,14 @@ function gravity_Schwarzchild() { echo "** Aggregating list of domains..." truncate -s 0 $piholeDir/$matter for i in "${activeDomains[@]}" - do + do cat $i |tr -d '\r' >> $piholeDir/$matter done } # Pulsar - White/blacklist application function gravity_pulsar() { - + # Append blacklist entries if they exist if [[ -r $blacklist ]];then numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) @@ -178,11 +178,11 @@ function gravity_pulsar() { # regexp so it can be parsed out with grep -x awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist else - rm $latentWhitelist + rm $latentWhitelist >/dev/null fi # Prevent our sources from being pulled into the hole - plural=; [[ "${#sources[@]}" != "1" ]] && plural=s + plural=; [[ "${#sources[@]}" != "1" ]] && plural=s echo "** Whitelisting ${#sources[@]} ad list source${plural}..." for url in ${sources[@]} do @@ -210,7 +210,7 @@ function gravity_hostFormat() { # blackbody - remove any remnant files from script processes function gravity_blackbody() { - # Loop through list files + # Loop through list files for file in $piholeDir/*.$justDomainsExtension do # If list is in active array then leave it (noop) else rm the list @@ -234,14 +234,14 @@ function gravity_advanced() { echo "** $numberOf domains being pulled in by gravity..." gravity_unique - - sudo kill -HUP $(pidof dnsmasq) + + sudo kill -s -HUP $(pidof dnsmasq) } gravity_collapse gravity_spinup gravity_Schwarzchild gravity_pulsar -gravity_hostFormat gravity_advanced +gravity_hostFormat gravity_blackbody From 49a40115c8fd5692b43bce68e9e818dcb0c0d157 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 5 Dec 2015 14:04:37 -0600 Subject: [PATCH 088/148] fixes #105 --- advanced/dnsmasq.conf | 4 ++-- automated install/basic-install.sh | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 30d72381..8fe5bb27 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -18,7 +18,7 @@ bogus-priv # uncomment this. no-resolv -# Add other name servers here, with domain specs if they are for +# Add other name servers here, with domain specs if they are for # non-public domains. server=8.8.8.8 server=8.8.4.4 @@ -26,7 +26,7 @@ server=8.8.4.4 # If you want dnsmasq to listen for DHCP and DNS requests only on # specified interfaces (and the loopback) give the name of the # interface (eg eth0) here. -interface=eth0 +interface=@INT@ # Or which to listen on by address (remember to include 127.0.0.1 if # you use this.) listen-address=127.0.0.1 diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 3c6d14fd..d2a67a10 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -92,7 +92,6 @@ cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) options=(IPv4 "Block ads over IPv4" on IPv6 "Block ads over IPv4" off) choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) -clear for choice in $choices do case $choice in @@ -179,6 +178,7 @@ echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +echo "Setting IP to $IPv4addr. You may need to restart after the install is complete." sudo ip addr replace dev $piholeInterface $IPv4addr } @@ -200,6 +200,7 @@ sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig sudo mv /etc/crontab /etc/crontab.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf sudo mv /etc/crontab /etc/crontab.orig sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron From f453d407a9f03d6eb601e12936a55e11c76ffe89 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 5 Dec 2015 14:14:34 -0600 Subject: [PATCH 089/148] log-async For better performance. I have been using it for a few weeks with no adverse effects. --- advanced/dnsmasq.conf | 3 +++ 1 file changed, 3 insertions(+) diff --git a/advanced/dnsmasq.conf b/advanced/dnsmasq.conf index 8fe5bb27..25f52a57 100644 --- a/advanced/dnsmasq.conf +++ b/advanced/dnsmasq.conf @@ -45,3 +45,6 @@ log-facility=/var/log/pihole.log # server for potentially stale date, you can set a time-to-live (in # seconds) here. local-ttl=300 + +# This allows it to continue functioning without being blocked by syslog, and allows syslog to use dnsmasq for DNS queries without risking deadlock +log-async From 2b5030e629cca370ee16d0bbc12c7e27c475f8af Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 5 Dec 2015 23:23:44 -0600 Subject: [PATCH 090/148] Link to explainer video Also clarifies that the automated install is for Raspbian installs only. --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4021b766..6e6f6a8f 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,6 @@ -# Automated Install +# Automated Install +#### Designed For Raspberry Pi B, B+, 2, +##### and Zero (with an Ethernet adapter) 1. Install Raspbian 2. Run the command below @@ -11,12 +13,10 @@ Once installed, **configure any device to use the Raspberry Pi as its DNS server [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") -# Raspberry Pi Ad Blocker -**A black hole for ads, hence Pi-hole** +# How Does It Work? +**Watch the 60-second video below to get a quick overview** -![Pi-hole](http://i.imgur.com/wd5ltCU.png) - -The Pi-hole is a DNS/Web server that will **block ads for any device on your network**. +[![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232) ## Coverage From d8034f41560e644772634df3f0e289b85c88033e Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sat, 5 Dec 2015 22:17:28 -0800 Subject: [PATCH 091/148] Get last IP listed for interface --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 170774c6..043b3139 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,7 +13,7 @@ if [[ -f $piholeIPfile ]];then 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 '{print $5}') - piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') + piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') | sed -n '$p' piholeIP=${piholeIPCIDR%/*} fi From d0685935822efd01200bd9e39be76e3586f0703a Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 00:30:16 -0800 Subject: [PATCH 092/148] Get last IP for selected interface --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 043b3139..2598baa9 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,7 +13,7 @@ if [[ -f $piholeIPfile ]];then 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 '{print $5}') - piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') | sed -n '$p' + piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') | awk 'END {print}') piholeIP=${piholeIPCIDR%/*} fi From 7cf5320f50364107c4c7122f526f964fb513bbdc Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 02:40:30 -0800 Subject: [PATCH 093/148] Only write to dhcpcd.conf if address isn't set --- automated install/basic-install.sh | 105 +++++++++++++++++++---------- 1 file changed, 70 insertions(+), 35 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 3c6d14fd..8ea854fc 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -34,7 +34,7 @@ IPv4gw=$(echo $IPv4info | awk '{print $3}') #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) #IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) -availableInterfaces=$(ip link show | awk -F' ' '/[0-9]: [a-z]/ {print $2}' | grep -v "lo" | cut -d':' -f1) +availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf ####### FUCNTIONS ########## @@ -82,6 +82,7 @@ for desiredInterface in $chooseInterfaceOptions do piholeInterface=$desiredInterface echo "Using interface: $piholeInterface" + echo ${piholeInterface} > /tmp/piholeINT done } @@ -92,7 +93,6 @@ cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) options=(IPv4 "Block ads over IPv4" on IPv6 "Block ads over IPv4" off) choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) -clear for choice in $choices do case $choice in @@ -171,56 +171,91 @@ done fi } - -setStaticIPv4() -{ -# Append these lines to /etc/dhcpcd.conf to enable a static IP +setDHCPCD(){ +# Append these lines to dhcpcd.conf to enable a static IP echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null -sudo ip addr replace dev $piholeInterface $IPv4addr } -installPihole() -{ +setStaticIPv4(){ +if grep -q $IPv4addr $dhcpcdFile; then + # address already set, noop + : +else + setDHCPCD + sudo ip addr replace dev $piholeInterface $IPv4addr + echo "Setting IP to $IPv4addr. You may need to restart after the install is complete." +fi +} + +installScripts(){ +sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh +} + +installConfigs(){ +sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf +} + +stopServices(){ +sudo service dnsmasq stop || true +sudo service lighttpd stop || true +} + +installDependencies(){ sudo apt-get update sudo apt-get -y upgrade sudo apt-get -y install dnsutils bc toilet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo mkdir /var/www/html -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi -sudo service dnsmasq stop -sudo service lighttpd stop -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf -sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron -sudo lighty-enable-mod fastcgi fastcgi-php -sudo mkdir /var/www/html/pihole -sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installWebAdmin(){ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip -o /var/www/master.zip -d /var/www/html/ +sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +} + +installPiholeWeb(){ +sudo mkdir /var/www/html/pihole +sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +} + +installCron(){ +sudo mv /etc/crontab /etc/crontab.orig +sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +} + +installPiLog(){ sudo touch /var/log/pihole.log sudo chmod 644 /var/log/pihole.log sudo chown dnsmasq:root /var/log/pihole.log -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/gravity.sh -sudo chmod 755 /usr/local/bin/chronometer.sh -sudo chmod 755 /usr/local/bin/whitelist.sh -sudo chmod 755 /usr/local/bin/piholeLogFlush.sh +} +installPihole() +{ +installDependencies +stopServices +sudo chown www-data:www-data /var/www/html +sudo chmod 775 /var/www/html +sudo usermod -a -G www-data pi +sudo lighty-enable-mod fastcgi fastcgi-php +installScripts +installConfigs +installWebAdmin +installPiholeWeb +installCron +installPiLog sudo /usr/local/bin/gravity.sh } From b391afef49a589d5d1aa9a5a3e33add78f3a3372 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 04:45:04 -0800 Subject: [PATCH 094/148] Interface pull for multiple platforms --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 2598baa9..e097f702 100755 --- a/gravity.sh +++ b/gravity.sh @@ -12,7 +12,7 @@ if [[ -f $piholeIPfile ]];then 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 '{print $5}') + 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 From a230df00320fb3a257cb41fcbbf829d8b4bec4d1 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 05:33:22 -0800 Subject: [PATCH 095/148] Fix errant ) --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index e097f702..66df1e3e 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,7 +13,7 @@ if [[ -f $piholeIPfile ]];then 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}') + piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}') piholeIP=${piholeIPCIDR%/*} fi From cb91b8f5fa6925c74ed2bc1d3e4db461324b28c3 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 05:55:50 -0800 Subject: [PATCH 096/148] Add copyright headers --- advanced/Scripts/chronometer.sh | 9 ++++++++- advanced/Scripts/piholeLogFlush.sh | 10 +++++++++- advanced/Scripts/whitelist.sh | 10 +++++++++- gravity.sh | 7 ++++++- 4 files changed, 32 insertions(+), 4 deletions(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index 73219760..d3ce783d 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -1,6 +1,13 @@ -#!/bin/bash +#!/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. +# +# 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. for (( ; ; )) do clear diff --git a/advanced/Scripts/piholeLogFlush.sh b/advanced/Scripts/piholeLogFlush.sh index 9647fe2c..832c98c9 100755 --- a/advanced/Scripts/piholeLogFlush.sh +++ b/advanced/Scripts/piholeLogFlush.sh @@ -1,3 +1,11 @@ -#!/bin/bash +#!/usr/bin/env bash # Flushes /var/log/pihole.log +# (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. + truncate -s 0 /var/log/pihole.log diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index cda557c0..f66f56d0 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -1,4 +1,12 @@ -#!/bin/bash +#!/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. + whitelist=/etc/pihole/whitelist.txt adList=/etc/pihole/gravity.list if [[ ! -f $whitelist ]];then diff --git a/gravity.sh b/gravity.sh index 7d9440a3..9e636705 100755 --- a/gravity.sh +++ b/gravity.sh @@ -1,9 +1,14 @@ #!/usr/bin/env bash # Pi-hole: A black hole for Internet advertisements -# (c) 2015 by Jacob Salmela GPL 2.0 +# (c) 2015 by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi # http://pi-hole.net # Compiles a list of ad-serving domains by downloading them from multiple sources +# +# 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. piholeIPfile=/tmp/piholeIP if [[ -f $piholeIPfile ]];then From 22d0e82d92e4270a3c7620eccdab3b31e12004e8 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 06:31:49 -0800 Subject: [PATCH 097/148] Add GPL V2+ header --- automated install/basic-install.sh | 7 +++++++ automated install/uninstall.sh | 10 +++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 99daaa52..bf5cd35d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -3,6 +3,13 @@ # by Jacob Salmela # Network-wide ad blocking via your Raspberry Pi # +# (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. # pi-hole.net/donate # # Install with this command (from your Pi): diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh index b0dd3368..563d8d07 100644 --- a/automated install/uninstall.sh +++ b/automated install/uninstall.sh @@ -1,5 +1,13 @@ -#!/bin/bash +#!/usr/bin/env bash # Completely uninstalls the Pi-hole +# (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. + ######### SCRIPT ########### sudo apt-get -y remove --purge dnsutils bc toilet From 723c2d47bb70c58d4bf66b4ed7abb75db7b83004 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 09:27:13 -0800 Subject: [PATCH 098/148] Add gravity.pod --- gravity.pod | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 gravity.pod diff --git a/gravity.pod b/gravity.pod new file mode 100644 index 00000000..595579ed --- /dev/null +++ b/gravity.pod @@ -0,0 +1,21 @@ +=head1 NAME + +Gravity - A Raspberry Pi based Ad Blocker. + +=head1 DESCRIPTION + +Gravity is a script that downloads ad hosting domain name lists and formats +them for use with a domain name server to block ads. + +=head1 BUGS + +Please report any bugs to the bug tracker at https://github.com/jacobsalmela/pi-hole + +=head1 AUTHORS + +B was written by Jacob Salmela . This manual page was +written by Dan Schaper . + +Both are released under the GNU General Public License, version 2 or later. + +=cut From d2b260fc1e04c243b9edaa0ad4920ad3e25df893 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 10:29:59 -0800 Subject: [PATCH 099/148] Log file is automatically generated by dnsmasq, no need to create. --- automated install/basic-install.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 8ea854fc..59baecf7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -237,11 +237,6 @@ sudo mv /etc/crontab /etc/crontab.orig sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron } -installPiLog(){ -sudo touch /var/log/pihole.log -sudo chmod 644 /var/log/pihole.log -sudo chown dnsmasq:root /var/log/pihole.log -} installPihole() { installDependencies @@ -255,7 +250,6 @@ installConfigs installWebAdmin installPiholeWeb installCron -installPiLog sudo /usr/local/bin/gravity.sh } From 412a190b429a8c545729a9fc5edae21cbd6ce88b Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 11:05:09 -0800 Subject: [PATCH 100/148] Basic-install.sh should only show one ip address in whiptail screen. --- automated install/basic-install.sh | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 8ea854fc..8d3e2358 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -25,10 +25,9 @@ r=$(( rows / 2 )) c=$(( columns / 2 )) # Find IP used to route to outside world -IPv4info=$(ip route get 8.8.8.8) -IPv4dev=$(echo $IPv4info| awk '{print $5}') -IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}') -IPv4gw=$(echo $IPv4info | awk '{print $3}') +IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}') +IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}') +IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') # IPv6 support to be added later #IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) From 4027139d9c9d868a0086ab1836aa9eaafb705809 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Sun, 6 Dec 2015 20:24:58 -0800 Subject: [PATCH 101/148] More merge conflict resolution --- automated install/basic-install.sh | 6 ------ 1 file changed, 6 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 7b29bcac..75572a70 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -186,8 +186,6 @@ static routers=$IPv4gw static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null } -<<<<<<< HEAD -======= setStaticIPv4(){ if grep -q $IPv4addr $dhcpcdFile; then # address already set, noop @@ -199,7 +197,6 @@ else fi } ->>>>>>> b261e046bb6a8a2c7f2301ff6a9d37aa70e898fd installScripts(){ sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh @@ -213,10 +210,7 @@ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -<<<<<<< HEAD -======= sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf ->>>>>>> b261e046bb6a8a2c7f2301ff6a9d37aa70e898fd } stopServices(){ From 73bbfc27d0b610a188609d5480c3b22667ec8d81 Mon Sep 17 00:00:00 2001 From: Dan Schaper Date: Tue, 8 Dec 2015 15:43:40 -0800 Subject: [PATCH 102/148] Remove extra debian doc file --- gravity.pod | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 gravity.pod diff --git a/gravity.pod b/gravity.pod deleted file mode 100644 index 595579ed..00000000 --- a/gravity.pod +++ /dev/null @@ -1,21 +0,0 @@ -=head1 NAME - -Gravity - A Raspberry Pi based Ad Blocker. - -=head1 DESCRIPTION - -Gravity is a script that downloads ad hosting domain name lists and formats -them for use with a domain name server to block ads. - -=head1 BUGS - -Please report any bugs to the bug tracker at https://github.com/jacobsalmela/pi-hole - -=head1 AUTHORS - -B was written by Jacob Salmela . This manual page was -written by Dan Schaper . - -Both are released under the GNU General Public License, version 2 or later. - -=cut From 57282cfe161222dd4c2aa336a37dd16d36356a44 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 9 Dec 2015 15:16:34 -0600 Subject: [PATCH 103/148] ugly hack to whitelist from the Web interface I wanted the whitelist feature to keep the user on the same page without having to reload it. I'm sure someone better versed in PHP could eliminate the need for this hack. Nonetheless, it works. www-data runs the script if executed from the Web interface. www-data also needs access to write to /etc/pihole/gravity.list to actually remove the domain. So a few more things need to happen before this will fully work. The changes in this script won't change what is displayed if run from the terminal, but will help when it needs to be run from the Web interface, so I am just committing this now. The only other thing I would like to see would be a progress spinner, but my Web skills still need some work... --- advanced/Scripts/whitelist.sh | 38 ++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index f66f56d0..7b964cdf 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -9,21 +9,47 @@ whitelist=/etc/pihole/whitelist.txt adList=/etc/pihole/gravity.list +webInterfaceEchos=/tmp/whitelistEchoFile + if [[ ! -f $whitelist ]];then touch $whitelist fi +formatEchoes() +{ +if [[ "$(whoami)" = "www-data" ]];then + echo "$1" >> $webInterfaceEchos +else + echo "$1" +fi +} + if [[ $# = 0 ]]; then + # echoes go to a file for showing in the Web interface echo "Immediately whitelists one or more domains." echo "Usage: whitelist.sh domain1 [domain2 ...]" + if [[ "$(whoami)" = "www-data" ]];then + formatEchoes "Enter one or more space-separated FQDN." + # If the user is www-data, the script is probably being called from the Web interface + # Since the Web interface only displays the last echo in the script (I'm still a n00b with PHP) + webInterfaceDisplay=$(cat $webInterfaceEchos) + # The last echo needs to be delimited by a semi-colon so I translate newlines into semi-colons so it displays properly + # Someone better in PHP might be able to come up with a better solution, but this is a highly-requested feature + # This is also used later in the script, too + echo "$webInterfaceDisplay" | tr "\n" ";" + fi fi combopattern="" +# Overwrite any previously existing file so the output is always correct +echo "" > $webInterfaceEchos + # For each argument passed to this script for var in "$@" do - echo "Whitelisting $var..." + # Start appending the echoes into the file for display in the Web interface later + formatEchoes "Whitelisting $var..." # Construct basic pattern to match domain name. basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') @@ -41,7 +67,7 @@ done # Now report on and remove matched domains if [[ "$combopattern" != "" ]]; then - echo "Modifying hosts file..." + formatEchoes "Modifying hosts file..." # Construct pattern to match entry in hosts file. # This consists of one or more IP addresses followed by the domain name. @@ -51,7 +77,13 @@ if [[ "$combopattern" != "" ]]; then sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList sed -r -i '/'"$pattern"'/d' $adList - echo "** $# domain(s) whitelisted." + formatEchoes "** $# domain(s) whitelisted." + + # Only echo the semi-colon delimited echoes if the user running the script is www-data (meaning it is run the from Web interface) + if [[ "$(whoami)" = "www-data" ]];then + webInterfaceDisplay=$(cat $webInterfaceEchos) + echo "$webInterfaceDisplay" | tr "\n" ";" + fi # Force dnsmasq to reload /etc/pihole/gravity.list kill -HUP $(pidof dnsmasq) fi From c88982d0d5cc4958a5ea54e082116c65ef7ba9ef Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 9 Dec 2015 15:52:53 -0600 Subject: [PATCH 104/148] chmod doesn't apply at initial install --- gravity.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/gravity.sh b/gravity.sh index 3a146024..e5ea0597 100755 --- a/gravity.sh +++ b/gravity.sh @@ -239,6 +239,7 @@ function gravity_advanced() { echo "** $numberOf domains being pulled in by gravity..." gravity_unique + find "$piholeDir" -type f -exec sudo chmod 666 {} \; sudo kill -s -HUP $(pidof dnsmasq) } From 184d1bd0461a57df16c3d1b36e43998c607fb356 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 16 Dec 2015 11:23:44 -0600 Subject: [PATCH 105/148] fixes #126 These commands were left out, resulting in the Web interface not showing ads blocked despite the Pi-hole working. It is just a permissions error. --- automated install/basic-install.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 75572a70..b8d818a3 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -231,6 +231,9 @@ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/ww sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +sudo touch /var/log/pihole.log +sudo chmod 644 /var/log/pihole.log +sudo chown dnsmasq:root /var/log/pihole.log } installPiholeWeb(){ From 3cdce17d28649b7100e4508884cceb24e54d9292 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 25 Dec 2015 21:14:19 -0600 Subject: [PATCH 106/148] adding more coverage - Rob's post on medium.com - TekThing video Also posting about plans to partner up with Rob for his new service that can help reduce the flame war surrounding ad blocking --- README.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6e6f6a8f..7ddeb93d 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,13 @@ Once installed, **configure any device to use the Raspberry Pi as its DNS server [![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232) -## Coverage +## Video Coverage + +### TekThing + +Pi-hole is mentioned at the two minute mark + +[![Pi-hole on TekThing](http://img.youtube.com/vi/8Co59HU2gY0/0.jpg)](https://youtu.be/8Co59HU2gY0?t=2m) ### Security Now! Podcast Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there) @@ -26,7 +32,16 @@ Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right th ### Tech Blogs -Featured on [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) and [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! +Pi-hole has been written about on: + +- [Medium](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) +- [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) +- [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! + +## Partnering With Optimal.com + +Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/). + ## Technical Details From a6313c9e9ef74aebfd0b12994582b4a40fd46d44 Mon Sep 17 00:00:00 2001 From: klaas01 Date: Sat, 26 Dec 2015 14:37:51 -0400 Subject: [PATCH 107/148] Update gravity.sh Fix kill command and only run as last step. --- gravity.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 3a146024..57882c55 100755 --- a/gravity.sh +++ b/gravity.sh @@ -239,8 +239,13 @@ function gravity_advanced() { echo "** $numberOf domains being pulled in by gravity..." gravity_unique +} - sudo kill -s -HUP $(pidof dnsmasq) +function gravity_reload() { + # Reload hosts file + + echo "** Refresh lists in dnsmasq..." + sudo kill -HUP $(pidof dnsmasq) } gravity_collapse @@ -250,3 +255,4 @@ gravity_pulsar gravity_advanced gravity_hostFormat gravity_blackbody +gravity_reload From 26dcbfc1f99c1bf6a817f7754dabac03a066f26e Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 27 Dec 2015 12:25:35 -0600 Subject: [PATCH 108/148] hide minor error An error shows up on the first install that `latentWhitelist.txt` doesn't exist and can't be removed. Redirecting STDERR should fix this. --- gravity.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gravity.sh b/gravity.sh index 57882c55..1a8f48e8 100755 --- a/gravity.sh +++ b/gravity.sh @@ -183,7 +183,7 @@ function gravity_pulsar() { # regexp so it can be parsed out with grep -x awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist else - rm $latentWhitelist >/dev/null + rm $latentWhitelist 2>/dev/null fi # Prevent our sources from being pulled into the hole From b757e7a769447f60dd60cbe5cd65e2883556eefa Mon Sep 17 00:00:00 2001 From: Clinton Montague Date: Mon, 28 Dec 2015 12:29:54 +0000 Subject: [PATCH 109/148] Fix typo in installer IPv4 was mentioned in an IPv6 setting - changed to correctly reference IPv6. --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b8d818a3..bbf1fbc2 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -97,7 +97,7 @@ use4andor6() # Let use select IPv4 and/or IPv6 cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) options=(IPv4 "Block ads over IPv4" on - IPv6 "Block ads over IPv4" off) + IPv6 "Block ads over IPv6" off) choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) for choice in $choices do From 8ffa5e935739d6c34e5b22c825bbebc92f7f9ba5 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Wed, 30 Dec 2015 13:34:45 -0600 Subject: [PATCH 110/148] adding unRaid-hole fork --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7ddeb93d..11cb3e79 100644 --- a/README.md +++ b/README.md @@ -79,5 +79,6 @@ This script will work for other UNIX-like systems with some slight **modificatio ### Examples Of The Pi-hole On Other Operating Systems - [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) [![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From d646612a2597ae4a8da35e36ac0737dc012f0c41 Mon Sep 17 00:00:00 2001 From: Salmela Date: Thu, 31 Dec 2015 20:26:05 -0600 Subject: [PATCH 111/148] Block ads over IPv6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I’m pretty sure this works well. Maybe someone else can try it out. --- automated install/basic-install.sh | 38 ++++++++++++++++-------------- gravity.sh | 21 +++++++++++++---- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index bbf1fbc2..21b9c245 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -36,10 +36,6 @@ IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1 IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}') IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') -# IPv6 support to be added later -#IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) -#IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) - availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf @@ -65,6 +61,9 @@ welcomeDialogs() # Display the welcome dialog whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c +# Support for a part-time dev +whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" $r $c + # Explain the need for a static address whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. @@ -116,7 +115,9 @@ done useIPv6dialog() { -whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c +piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') +whiptail --msgbox --backtitle "IPv6..." --title "$piholeIPv6 will be used to block ads." $r $c +sudo touch /etc/pihole/.useIPv6 } getStaticIPv4Settings() @@ -263,6 +264,17 @@ installCron sudo /usr/local/bin/gravity.sh } +displayFinalMessage(){ + whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using: + + $IPv4addr + $piholeIPv6 + + If you set a new IP address, you should restart the Pi. + + The install log is in /etc/pihole." $r $c +} + ######## SCRIPT ############ # Start the installer welcomeDialogs @@ -288,16 +300,10 @@ fi # Decide is IPv6 will be used if [[ "$useIPv6" = true ]];then - # If only IPv6 is selected, exit because it is not supported yet - if [[ "$useIPv6" = true ]] && [[ "$useIPv4" = false ]];then - useIPv6dialog - exit - else - useIPv6dialog - fi + useIPv6dialog else useIPv6=false - echo "IPv6 will NOT be used. Consider a donation at pi-hole.net/donate" + echo "IPv6 will NOT be used." fi # Install and log everything to a file @@ -306,11 +312,7 @@ installPihole | tee $tmpLog # Move the log file into /etc/pihole for storage sudo mv $tmpLog $instalLogLoc -whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. - -If you set a new IP address, it should work fine, but you may want to reboot the Pi at some point. - -The install log is in /etc/pihole." $r $c +displayFinalMessage sudo service dnsmasq start sudo service lighttpd start diff --git a/gravity.sh b/gravity.sh index 1a8f48e8..c2a05534 100755 --- a/gravity.sh +++ b/gravity.sh @@ -11,15 +11,20 @@ # (at your option) any later version. piholeIPfile=/tmp/piholeIP +piholeIPv6file=/etc/pihole/.useIPv6 if [[ -f $piholeIPfile ]];then + 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 # 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%/*} + 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 # Ad-list sources--one per line in single quotes @@ -208,7 +213,13 @@ function gravity_unique() { function gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # 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 $piholeIPv6 ]];then + cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' > $piholeDir/$accretionDisc + else + # Otherwise, just create gravity.list as normal using IPv4 + cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' > $piholeDir/$accretionDisc + fi # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } @@ -243,7 +254,7 @@ function gravity_advanced() { function gravity_reload() { # Reload hosts file - + echo "** Refresh lists in dnsmasq..." sudo kill -HUP $(pidof dnsmasq) } From 987e4e02a9bd62273b67eb07bb5ce670b14ec10f Mon Sep 17 00:00:00 2001 From: Clinton Date: Fri, 1 Jan 2016 14:11:46 +0000 Subject: [PATCH 112/148] Fix bug in gravity.sh where IPv6 list was not always populated Failed to be populated if /tmp/piholeIP does not exist. This may happen under the following conditions: - was not generated during install - gravity.sh being run again after the original install (the file is deleted during the installation process) --- gravity.sh | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/gravity.sh b/gravity.sh index c2a05534..091b5563 100755 --- a/gravity.sh +++ b/gravity.sh @@ -13,10 +13,6 @@ piholeIPfile=/tmp/piholeIP piholeIPv6file=/etc/pihole/.useIPv6 if [[ -f $piholeIPfile ]];then - 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 # 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 @@ -27,6 +23,11 @@ else piholeIP=${piholeIPCIDR%/*} 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 + # Ad-list sources--one per line in single quotes # The mahakala source is commented out due to many users having issues with it blocking legitimate domains. # Uncomment at your own risk From d37db4304ca9194cca4ff6c515334dbb91307940 Mon Sep 17 00:00:00 2001 From: Salmela Date: Fri, 1 Jan 2016 10:59:30 -0600 Subject: [PATCH 113/148] A few small display changes IPv6 box was missing the title. Added some IPv6 echoes. --- automated install/basic-install.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 21b9c245..a529b40d 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -116,7 +116,8 @@ done useIPv6dialog() { piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') -whiptail --msgbox --backtitle "IPv6..." --title "$piholeIPv6 will be used to block ads." $r $c +whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c +sudo mkdir -p /etc/pihole/ sudo touch /etc/pihole/.useIPv6 } @@ -270,9 +271,9 @@ displayFinalMessage(){ $IPv4addr $piholeIPv6 - If you set a new IP address, you should restart the Pi. +If you set a new IP address, you should restart the Pi. - The install log is in /etc/pihole." $r $c +The install log is in /etc/pihole." $r $c } ######## SCRIPT ############ @@ -301,6 +302,8 @@ fi # Decide is IPv6 will be used if [[ "$useIPv6" = true ]];then useIPv6dialog + echo "Using IPv6." + echo "Your IPv6 address is: $piholeIPv6" else useIPv6=false echo "IPv6 will NOT be used." From 89b88a2d5de156aaa5e5f7e5aa8c687c8d76bd5b Mon Sep 17 00:00:00 2001 From: Clinton Date: Sat, 2 Jan 2016 00:10:12 +0000 Subject: [PATCH 114/148] fixes #142 kill -HUP erroring on gravity_reload if dnsmasq is not running --- gravity.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 1a8f48e8..5f3cc84f 100755 --- a/gravity.sh +++ b/gravity.sh @@ -243,9 +243,17 @@ function gravity_advanced() { function gravity_reload() { # Reload hosts file - echo "** Refresh lists in dnsmasq..." - sudo kill -HUP $(pidof 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 } gravity_collapse From 3fc1817e7a3f880c82aceb54be34bc69a8222e50 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Fri, 1 Jan 2016 18:34:33 -0600 Subject: [PATCH 115/148] Merge branch 'master' into ipv6 --- gravity.sh | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/gravity.sh b/gravity.sh index 091b5563..fbecb3ad 100755 --- a/gravity.sh +++ b/gravity.sh @@ -255,9 +255,17 @@ function gravity_advanced() { function gravity_reload() { # Reload hosts file - echo "** Refresh lists in dnsmasq..." - sudo kill -HUP $(pidof 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 } gravity_collapse From bc3224e0b9fce6bb01510113f97e8c55d914c441 Mon Sep 17 00:00:00 2001 From: Clinton Date: Sat, 2 Jan 2016 22:10:26 +0000 Subject: [PATCH 116/148] installer - only select first (probably default) interface in list instead of all --- automated install/basic-install.sh | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index a529b40d..ea7c882e 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -74,9 +74,16 @@ chooseInterface() { # Turn the available interfaces into an array so it can be used with a whiptail dialog interfacesArray=() +firstloop=1 + while read -r line do -interfacesArray+=("$line" "available" "ON") +mode="OFF" +if [[ $firstloop -eq 1 ]]; then + firstloop=0 + mode="ON" +fi +interfacesArray+=("$line" "available" "$mode") done <<< "$availableInterfaces" # Find out how many interfaces are available to choose from From 6f9d2d0567dfdf0286b6369d6fa26382a8fd0ba1 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sat, 2 Jan 2016 17:20:33 -0600 Subject: [PATCH 117/148] fixes #145 A much more elegant way to get the screen size. --- automated install/basic-install.sh | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index ea7c882e..b80180cb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -20,12 +20,9 @@ tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log -# Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely -screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) - # Find the rows and columns -rows=$(stty -a | tr \; \\012 | egrep 'rows' | cut -d' ' -f3) -columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) +rows=$(tput lines) +columns=$(tput cols) # Divide by two so the dialogs take up half of the screen, which looks nice. r=$(( rows / 2 )) From 93664aeb4ec8406041200b6b3aadf670f0b12a5d Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Mon, 4 Jan 2016 20:32:46 -0600 Subject: [PATCH 118/148] cleaning up the readme - removed most of the video images to reduce clutter - converged the "coverage" and "video" sections into a bulleted list of links - added a new project link (pi-hole on/off button) - moved projects up in the page so it's easier to find and see what people are doing with Pi-hole - removed custom conf section since it will be suited better in the wiki or FAQs - added a help section --- README.md | 72 +++++++++++++++++++------------------------------------ 1 file changed, 24 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 11cb3e79..4f8fe88c 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,49 @@ # Automated Install -#### Designed For Raspberry Pi B, B+, 2, -##### and Zero (with an Ethernet adapter) +##### Designed For Raspberry Pi B, B+, 2, and Zero (with an Ethernet adapter) 1. Install Raspbian 2. Run the command below ### ```curl -L install.pi-hole.net | bash``` -![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) +Once installed, [configure your router to have **DHCP clients use the Pi as their DNS server**](http://pi-hole.net/faq/can-i-set-the-pi-hole-to-be-the-dns-server-at-my-router-so-i-dont-have-to-change-settings-for-my-devices/) and then any device that connects to your network will have ads blocked without any further configuration. Alternatively, you can manually set each device to [use the Raspberry Pi as its DNS server](http://pi-hole.net/faq/how-do-i-use-the-pi-hole-as-my-dns-server/). -Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. +## Pi-hole Is Free, But Powered By Your Donations +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "Free, but powered by donations")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") - -# How Does It Work? +## How Does It Work? **Watch the 60-second video below to get a quick overview** -[![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232) +[![Pi-hole exlplained](http://i.imgur.com/qNybJDX.png)](https://vimeo.com/135965232) -## Video Coverage +## Pi-hole Projects +- [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) +- [Pi-hole on/off button](http://thetimmy.silvernight.org/pages/endisbutton/) -### TekThing - -Pi-hole is mentioned at the two minute mark - -[![Pi-hole on TekThing](http://img.youtube.com/vi/8Co59HU2gY0/0.jpg)](https://youtu.be/8Co59HU2gY0?t=2m) - -### Security Now! Podcast -Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there) -[![Pi-hole on Security Now!](http://img.youtube.com/vi/p7-osq_y8i8/0.jpg)](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) - -### Tech Blogs - -Pi-hole has been written about on: - -- [Medium](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) -- [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) -- [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! +## Coverage +- [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)! +- [Pi-hole on TekThing](https://youtu.be/8Co59HU2gY0?t=2m) +- [Pi-hole on Security Now! Podcast](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) ## Partnering With Optimal.com Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/). - ## Technical Details +The Pi-hole is an **advertising-aware DNS/Web server**. If an ad domain is queried, a small Web page or GIF is delivered in place of the advertisement. + A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). ## Gravity -The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). +The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0) (if you decide to use the [mahakala list](https://github.com/jacobsalmela/pi-hole/commit/963eacfe0537a7abddf30441c754c67ca1e40965)). ## Whitelist and blacklist -You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. +You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. Put one domain per line. ## Web Interface The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at: @@ -60,25 +52,9 @@ The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashb ![Web](http://i.imgur.com/m114SCn.png) -## Custom Config File -If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below: - -``` -piholeDir=/var/run/pihole -adList=/etc/dnsmasq.d/adList -``` - -See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details. - -### How It Works -A technical and detailed description can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0)! +## Help +- See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details +- There is also an [FAQ section on pi-hole.net](http://pi-hole.net) ## Other Operating Systems This script will work for other UNIX-like systems with some slight **modifications**. As long as you can install `dnsmasq` and a Webserver, it should work OK. The automated install only works for a clean install of Raspiban right now since that is how the project originated. - -### Examples Of The Pi-hole On Other Operating Systems -- [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) - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") From cfd6e0d65d8fabbe37c5a605e3866077b04f49a1 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 10 Jan 2016 10:40:58 -0600 Subject: [PATCH 119/148] more coverage and an API --- README.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f8fe88c..e7a0adb4 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,9 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei - [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)! - [Pi-hole on TekThing](https://youtu.be/8Co59HU2gY0?t=2m) - [Pi-hole on Security Now! Podcast](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) +- [Foolish Tech Show](https://youtu.be/bYyena0I9yc?t=2m4s) +- [Pi-hole on Ubuntu](http://www.boyter.org/2015/12/pi-hole-ubuntu-14-04/) +- [Catchpoint: iOS 9 Ad Blocking](http://blog.catchpoint.com/2015/09/14/ad-blocking-apple/) ## Partnering With Optimal.com @@ -35,7 +38,7 @@ Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ad ## Technical Details -The Pi-hole is an **advertising-aware DNS/Web server**. If an ad domain is queried, a small Web page or GIF is delivered in place of the advertisement. +The Pi-hole is an **advertising-aware DNS/Web server**. If an ad domain is queried, a small Web page or GIF is delivered in place of the advertisement. You can also [replace ads with any image you want](http://pi-hole.net/faq/is-it-possible-to-change-the-blank-page-that-takes-place-of-the-ads-to-something-else/) since it is just a simple Webpage taking place of the ads. A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). @@ -50,6 +53,18 @@ The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashb `http://192.168.1.x/admin/index.php` +### API + +A basic read-only API can be accessed at `/admin/api.php`. It returns the following JSON: +```JSON +{ + "domains_being_blocked": "136708", + "dns_queries_today": "18108", + "ads_blocked_today": "14648", + "ads_percentage_today": 80.892423238348 +} +``` + ![Web](http://i.imgur.com/m114SCn.png) ## Help From 802638ce8be382fb39e9407db048568ae798724b Mon Sep 17 00:00:00 2001 From: Josh Kastang Date: Sun, 10 Jan 2016 19:08:29 +0000 Subject: [PATCH 120/148] replaces the non-repository managed web interface for pihole and keeps it updated --- automated install/webinterface.sh | 70 +++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 automated install/webinterface.sh diff --git a/automated install/webinterface.sh b/automated install/webinterface.sh new file mode 100644 index 00000000..bcd92c1e --- /dev/null +++ b/automated install/webinterface.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# this script will update the pihole web interface files. +# +# if this is the first time running this script after an +# existing installation, the existing web interface files +# will be removed and replaced with the latest master +# branch from github. subsequent executions of this script +# will pull the latest version of the web interface. +# +# @TODO: add git as requirement to basic-install.sh +# + +WEB_INTERFACE_GIT_URL="https://github.com/jacobsalmela/AdminLTE.git" +WEB_INTERFACE_DIR="/var/www/html/admin" + +main() { + prerequisites + if ! is_repo; then + make_repo + fi + update_repo +} + +prerequisites() { + + # must be root to update + if [[ $EUID -ne 0 ]]; then + sudo bash "$0" "$@" + exit $? + fi + + # web interface must already exist. this is a (lazy) + # check to make sure pihole is actually installed. + if [ ! -d "$WEB_INTERFACE_DIR" ]; then + echo "$WEB_INTERFACE_DIR not found. Exiting." + exit 1 + fi + + if ! type "git" > /dev/null; then + apt-get -y install git + fi +} + +is_repo() { + # if the web interface directory does not have a .git folder + # it means its using the master.zip archive from the install + # script. + if [ ! -d "$WEB_INTERFACE_DIR/.git" ]; then + return 1 + fi + return 0 +} + +# removes the web interface installed from the master.zip archive and +# replaces it with the current master branch from github +make_repo() { + # remove the non-repod interface and clone the interface + rm -rf $WEB_INTERFACE_DIR + git clone "$WEB_INTERFACE_GIT_URL" "$WEB_INTERFACE_DIR" +} + +# pulls the latest master branch from github +update_repo() { + # pull the latest commits + cd "$WEB_INTERFACE_DIR" + git pull +} + +main From 0ef0b0b6613535ae594dc872a4debab6baee2f5b Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 10 Jan 2016 14:09:40 -0600 Subject: [PATCH 121/148] LCD real-time stats --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index e7a0adb4..2f3cb43b 100644 --- a/README.md +++ b/README.md @@ -67,6 +67,12 @@ A basic read-only API can be accessed at `/admin/api.php`. It returns the follow ![Web](http://i.imgur.com/m114SCn.png) +## Real-time Statistics + +You can view [real-time stats](http://pi-hole.net/faq/install-the-real-time-lcd-monitor-chronometer/) via `ssh` or on an [2.8" LCD screen](http://amzn.to/1P0q1Fj). This is accomplished via [`chronometer.sh`](https://github.com/jacobsalmela/pi-hole/blob/master/advanced/Scripts/chronometer.sh). + +![Pi-hole LCD](http://i.imgur.com/nBEqycp.jpg) + ## Help - See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details - There is also an [FAQ section on pi-hole.net](http://pi-hole.net) From 4b1dd8a2a5645e9ab8893f8e5cff561449c21ca2 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Tue, 12 Jan 2016 17:44:08 -0600 Subject: [PATCH 122/148] fixes #158 Running at midnight, not 11:58 in the afternoon. --- advanced/pihole.cron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced/pihole.cron b/advanced/pihole.cron index 47bc61fb..0a11a6d6 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -19,8 +19,8 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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 11 * * * root /usr/local/bin/dailyLog.sh +#50 23 * * * root /usr/local/bin/dailyLog.sh # Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control # Stats will be viewable in the Web interface thanks to the cron job above -58 11 * * * root /usr/local/bin/piholeLogFlush.sh +58 23 * * * root /usr/local/bin/piholeLogFlush.sh From 9ff1129510e93ab7e9c83d121970cad192a95522 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Thu, 14 Jan 2016 17:11:16 -0600 Subject: [PATCH 123/148] Minibian Pi-hole --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2f3cb43b..1b7faffc 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei - [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) - [Pi-hole on/off button](http://thetimmy.silvernight.org/pages/endisbutton/) +- [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole) ## Coverage - [Medium: Block All Ads For $53](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) From ca5e34a9a9f1a2146b8ca2b4b477b6df95a988e6 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Thu, 14 Jan 2016 18:12:45 -0600 Subject: [PATCH 124/148] Merge branch 'master' into whitelist # Conflicts: # gravity.sh --- README.md | 76 ++++++++++++++++++------------ advanced/pihole.cron | 4 +- automated install/basic-install.sh | 62 ++++++++++++++---------- automated install/webinterface.sh | 70 +++++++++++++++++++++++++++ gravity.sh | 39 ++++++++++++--- 5 files changed, 186 insertions(+), 65 deletions(-) create mode 100644 automated install/webinterface.sh diff --git a/README.md b/README.md index 6e6f6a8f..1b7faffc 100644 --- a/README.md +++ b/README.md @@ -1,68 +1,82 @@ # Automated Install -#### Designed For Raspberry Pi B, B+, 2, -##### and Zero (with an Ethernet adapter) +##### Designed For Raspberry Pi B, B+, 2, and Zero (with an Ethernet adapter) 1. Install Raspbian 2. Run the command below ### ```curl -L install.pi-hole.net | bash``` -![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) +Once installed, [configure your router to have **DHCP clients use the Pi as their DNS server**](http://pi-hole.net/faq/can-i-set-the-pi-hole-to-be-the-dns-server-at-my-router-so-i-dont-have-to-change-settings-for-my-devices/) and then any device that connects to your network will have ads blocked without any further configuration. Alternatively, you can manually set each device to [use the Raspberry Pi as its DNS server](http://pi-hole.net/faq/how-do-i-use-the-pi-hole-as-my-dns-server/). -Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. +## Pi-hole Is Free, But Powered By Your Donations +[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "Free, but powered by donations")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") - -# How Does It Work? +## How Does It Work? **Watch the 60-second video below to get a quick overview** -[![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232) +[![Pi-hole exlplained](http://i.imgur.com/qNybJDX.png)](https://vimeo.com/135965232) + +## Pi-hole Projects +- [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) +- [Pi-hole on/off button](http://thetimmy.silvernight.org/pages/endisbutton/) +- [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole) ## Coverage +- [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)! +- [Pi-hole on TekThing](https://youtu.be/8Co59HU2gY0?t=2m) +- [Pi-hole on Security Now! Podcast](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) +- [Foolish Tech Show](https://youtu.be/bYyena0I9yc?t=2m4s) +- [Pi-hole on Ubuntu](http://www.boyter.org/2015/12/pi-hole-ubuntu-14-04/) +- [Catchpoint: iOS 9 Ad Blocking](http://blog.catchpoint.com/2015/09/14/ad-blocking-apple/) -### Security Now! Podcast -Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there) -[![Pi-hole on Security Now!](http://img.youtube.com/vi/p7-osq_y8i8/0.jpg)](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) +## Partnering With Optimal.com -### Tech Blogs - -Featured on [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) and [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)! +Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/). ## Technical Details +The Pi-hole is an **advertising-aware DNS/Web server**. If an ad domain is queried, a small Web page or GIF is delivered in place of the advertisement. You can also [replace ads with any image you want](http://pi-hole.net/faq/is-it-possible-to-change-the-blank-page-that-takes-place-of-the-ads-to-something-else/) since it is just a simple Webpage taking place of the ads. + A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). ## Gravity -The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). +The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0) (if you decide to use the [mahakala list](https://github.com/jacobsalmela/pi-hole/commit/963eacfe0537a7abddf30441c754c67ca1e40965)). ## Whitelist and blacklist -You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. +You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. Put one domain per line. ## Web Interface The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at: `http://192.168.1.x/admin/index.php` +### API + +A basic read-only API can be accessed at `/admin/api.php`. It returns the following JSON: +```JSON +{ + "domains_being_blocked": "136708", + "dns_queries_today": "18108", + "ads_blocked_today": "14648", + "ads_percentage_today": 80.892423238348 +} +``` + ![Web](http://i.imgur.com/m114SCn.png) -## Custom Config File -If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below: +## Real-time Statistics -``` -piholeDir=/var/run/pihole -adList=/etc/dnsmasq.d/adList -``` +You can view [real-time stats](http://pi-hole.net/faq/install-the-real-time-lcd-monitor-chronometer/) via `ssh` or on an [2.8" LCD screen](http://amzn.to/1P0q1Fj). This is accomplished via [`chronometer.sh`](https://github.com/jacobsalmela/pi-hole/blob/master/advanced/Scripts/chronometer.sh). -See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details. +![Pi-hole LCD](http://i.imgur.com/nBEqycp.jpg) -### How It Works -A technical and detailed description can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0)! +## Help +- See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details +- There is also an [FAQ section on pi-hole.net](http://pi-hole.net) ## Other Operating Systems This script will work for other UNIX-like systems with some slight **modifications**. As long as you can install `dnsmasq` and a Webserver, it should work OK. The automated install only works for a clean install of Raspiban right now since that is how the project originated. - -### Examples Of The Pi-hole On Other Operating Systems -- [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/) - -[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") diff --git a/advanced/pihole.cron b/advanced/pihole.cron index 47bc61fb..0a11a6d6 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -19,8 +19,8 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # 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 11 * * * root /usr/local/bin/dailyLog.sh +#50 23 * * * root /usr/local/bin/dailyLog.sh # Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control # Stats will be viewable in the Web interface thanks to the cron job above -58 11 * * * root /usr/local/bin/piholeLogFlush.sh +58 23 * * * root /usr/local/bin/piholeLogFlush.sh diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 75572a70..b80180cb 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -20,12 +20,9 @@ tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log -# Get the screen size in case we need a full-screen message and so we can display a dialog that is sized nicely -screenSize=$(stty -a | tr \; \\012 | egrep 'rows|columns' | cut '-d ' -f3) - # Find the rows and columns -rows=$(stty -a | tr \; \\012 | egrep 'rows' | cut -d' ' -f3) -columns=$(stty -a | tr \; \\012 | egrep 'columns' | cut -d' ' -f3) +rows=$(tput lines) +columns=$(tput cols) # Divide by two so the dialogs take up half of the screen, which looks nice. r=$(( rows / 2 )) @@ -36,10 +33,6 @@ IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1 IPv4addr=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}') IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}') -# IPv6 support to be added later -#IPv6eui64=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/' -f1) -#IPv6linkLocal=$(ip addr show | awk '/inet/ && /scope\ link/ && /fe80/ {print $2}' | cut -d'/' -f1) - availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1) dhcpcdFile=/etc/dhcpcd.conf @@ -65,6 +58,9 @@ welcomeDialogs() # Display the welcome dialog whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c +# Support for a part-time dev +whiptail --msgbox --backtitle "Plea" --title "Free and open source" "The Pi-hole is free, but powered by your donations: http://pi-hole.net/donate" $r $c + # Explain the need for a static address whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. @@ -75,9 +71,16 @@ chooseInterface() { # Turn the available interfaces into an array so it can be used with a whiptail dialog interfacesArray=() +firstloop=1 + while read -r line do -interfacesArray+=("$line" "available" "ON") +mode="OFF" +if [[ $firstloop -eq 1 ]]; then + firstloop=0 + mode="ON" +fi +interfacesArray+=("$line" "available" "$mode") done <<< "$availableInterfaces" # Find out how many interfaces are available to choose from @@ -97,7 +100,7 @@ use4andor6() # Let use select IPv4 and/or IPv6 cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2) options=(IPv4 "Block ads over IPv4" on - IPv6 "Block ads over IPv4" off) + IPv6 "Block ads over IPv6" off) choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) for choice in $choices do @@ -116,7 +119,10 @@ done useIPv6dialog() { -whiptail --msgbox --backtitle "Coming soon..." --title "IPv6 not yet supported" "I need your help for IPv6. Consider donating at: http://pi-hole.net/donate" $r $c +piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') +whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c +sudo mkdir -p /etc/pihole/ +sudo touch /etc/pihole/.useIPv6 } getStaticIPv4Settings() @@ -231,6 +237,9 @@ sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/ww sudo unzip -oq /var/www/master.zip -d /var/www/html/ sudo mv /var/www/html/AdminLTE-master /var/www/html/admin sudo rm /var/www/master.zip 2>/dev/null +sudo touch /var/log/pihole.log +sudo chmod 644 /var/log/pihole.log +sudo chown dnsmasq:root /var/log/pihole.log } installPiholeWeb(){ @@ -260,6 +269,17 @@ installCron sudo /usr/local/bin/gravity.sh } +displayFinalMessage(){ + whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using: + + $IPv4addr + $piholeIPv6 + +If you set a new IP address, you should restart the Pi. + +The install log is in /etc/pihole." $r $c +} + ######## SCRIPT ############ # Start the installer welcomeDialogs @@ -285,16 +305,12 @@ fi # Decide is IPv6 will be used if [[ "$useIPv6" = true ]];then - # If only IPv6 is selected, exit because it is not supported yet - if [[ "$useIPv6" = true ]] && [[ "$useIPv4" = false ]];then - useIPv6dialog - exit - else - useIPv6dialog - fi + useIPv6dialog + echo "Using IPv6." + echo "Your IPv6 address is: $piholeIPv6" else useIPv6=false - echo "IPv6 will NOT be used. Consider a donation at pi-hole.net/donate" + echo "IPv6 will NOT be used." fi # Install and log everything to a file @@ -303,11 +319,7 @@ installPihole | tee $tmpLog # Move the log file into /etc/pihole for storage sudo mv $tmpLog $instalLogLoc -whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using this IP: $IPv4addr. - -If you set a new IP address, it should work fine, but you may want to reboot the Pi at some point. - -The install log is in /etc/pihole." $r $c +displayFinalMessage sudo service dnsmasq start sudo service lighttpd start diff --git a/automated install/webinterface.sh b/automated install/webinterface.sh new file mode 100644 index 00000000..bcd92c1e --- /dev/null +++ b/automated install/webinterface.sh @@ -0,0 +1,70 @@ +#!/usr/bin/env bash +# +# this script will update the pihole web interface files. +# +# if this is the first time running this script after an +# existing installation, the existing web interface files +# will be removed and replaced with the latest master +# branch from github. subsequent executions of this script +# will pull the latest version of the web interface. +# +# @TODO: add git as requirement to basic-install.sh +# + +WEB_INTERFACE_GIT_URL="https://github.com/jacobsalmela/AdminLTE.git" +WEB_INTERFACE_DIR="/var/www/html/admin" + +main() { + prerequisites + if ! is_repo; then + make_repo + fi + update_repo +} + +prerequisites() { + + # must be root to update + if [[ $EUID -ne 0 ]]; then + sudo bash "$0" "$@" + exit $? + fi + + # web interface must already exist. this is a (lazy) + # check to make sure pihole is actually installed. + if [ ! -d "$WEB_INTERFACE_DIR" ]; then + echo "$WEB_INTERFACE_DIR not found. Exiting." + exit 1 + fi + + if ! type "git" > /dev/null; then + apt-get -y install git + fi +} + +is_repo() { + # if the web interface directory does not have a .git folder + # it means its using the master.zip archive from the install + # script. + if [ ! -d "$WEB_INTERFACE_DIR/.git" ]; then + return 1 + fi + return 0 +} + +# removes the web interface installed from the master.zip archive and +# replaces it with the current master branch from github +make_repo() { + # remove the non-repod interface and clone the interface + rm -rf $WEB_INTERFACE_DIR + git clone "$WEB_INTERFACE_GIT_URL" "$WEB_INTERFACE_DIR" +} + +# pulls the latest master branch from github +update_repo() { + # pull the latest commits + cd "$WEB_INTERFACE_DIR" + git pull +} + +main diff --git a/gravity.sh b/gravity.sh index e5ea0597..fbecb3ad 100755 --- a/gravity.sh +++ b/gravity.sh @@ -11,15 +11,21 @@ # (at your option) any later version. piholeIPfile=/tmp/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%/*} + 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 + +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 # Ad-list sources--one per line in single quotes @@ -183,7 +189,7 @@ function gravity_pulsar() { # regexp so it can be parsed out with grep -x awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist else - rm $latentWhitelist >/dev/null + rm $latentWhitelist 2>/dev/null fi # Prevent our sources from being pulled into the hole @@ -208,7 +214,13 @@ function gravity_unique() { function gravity_hostFormat() { # Format domain list as "192.168.x.x domain.com" echo "** Formatting domains into a HOSTS file..." - cat $piholeDir/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"' " $0}' > $piholeDir/$accretionDisc + # 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 $piholeIPv6 ]];then + cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' > $piholeDir/$accretionDisc + else + # Otherwise, just create gravity.list as normal using IPv4 + cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' > $piholeDir/$accretionDisc + fi # Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it cp $piholeDir/$accretionDisc $adList } @@ -239,9 +251,21 @@ function gravity_advanced() { echo "** $numberOf domains being pulled in by gravity..." gravity_unique - find "$piholeDir" -type f -exec sudo chmod 666 {} \; +} - sudo kill -s -HUP $(pidof dnsmasq) +function gravity_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 } gravity_collapse @@ -251,3 +275,4 @@ gravity_pulsar gravity_advanced gravity_hostFormat gravity_blackbody +gravity_reload From 8ad116fe7bfa95b0640ad081859fee24cbb81b7e Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 14:17:55 +0000 Subject: [PATCH 125/148] Aiming to get whitelist.sh to run either standalone or to be called from gravity.sh. Initial commit --- advanced/Scripts/whitelist.sh | 175 +++++++++++++++++++++++++++------- 1 file changed, 139 insertions(+), 36 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index f66f56d0..c4359748 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -7,51 +7,154 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. +if [[ $# = 0 ]]; then + echo "Immediately whitelists one or more domains in the hosts file" + echo "Usage: whitelist.sh domain1 [domain2 ...]" + exit 1 +fi + +#globals whitelist=/etc/pihole/whitelist.txt adList=/etc/pihole/gravity.list -if [[ ! -f $whitelist ]];then - touch $whitelist +reload=true +addmode=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 -if [[ $# = 0 ]]; then - echo "Immediately whitelists one or more domains." - echo "Usage: whitelist.sh domain1 [domain2 ...]" -fi -combopattern="" +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 PopWhitelistFile(){ + #check whitelist file exists, and if not, create it + if [[ ! -f $whitelist ]];then + touch $whitelist + 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" $whitelist || bool=true + if $bool; then + #domain not found in the whitelist file, add it! + echo "** Adding $1 to whitelist file" + echo $1 >> $whitelist + modifyHost=true + else + echo "** $1 already whitelisted! No need to add" + fi +} + +function RemoveDomain(){ + + bool=false + grep -Ex -q "$1" $whitelist || bool=true + if $bool; then + #Domain is not in the whitelist file, no need to Remove + echo "** $1 is NOT whitelisted! No need to remove" + else + #Domain is in the whitelist file, add to a temporary array and remove from whitelist file + echo "** Un-whitelisting $dom..." + domToRemoveList=("${domToRemoveList[@]}" $1) + modifyHost=true + fi +} + +function 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 "** Whitelisting a total of $numberOf domain${plural}..." + awk -F':' '{ print $1 }' $whitelist | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList + fi + else + #we need to add the removed domains to the hosts file + for rdom in "${domToRemoveList[@]}" + do + if [[ -n $piholeIPv6 ]];then + echo "**Blacklisting $rdom on IPv4 and IPv6" + echo $rdom | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList + else + echo "**Blacklisting $rdom on IPv4" + echo $rdom | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList + fi + echo $rdom| sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $whitelist + 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 each argument passed to this script for var in "$@" do - echo "Whitelisting $var..." - - # Construct basic pattern to match domain name. - basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') - - if [[ "$basicpattern" != "" ]]; then - # Add to the combination pattern that will be used below - if [[ "$combopattern" != "" ]]; then combopattern="$combopattern|"; fi - combopattern="$combopattern$basicpattern" - - # Also add the domain to the whitelist but only if it's not already present - grep -E -q "^$basicpattern$" $whitelist \ - || echo "$var" >> $whitelist - fi + case "$var" in + "-nr"| "--noreload" ) reload=false;; + "-d" | "--delmode" ) addmode=false;; + * ) HandleOther $var;; + esac done -# Now report on and remove matched domains -if [[ "$combopattern" != "" ]]; then - echo "Modifying hosts file..." +PopWhitelistFile - # Construct pattern to match entry in hosts file. - # This consists of one or more IP addresses followed by the domain name. - pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') - - # Output what will be removed and then actually remove - sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList - sed -r -i '/'"$pattern"'/d' $adList - - echo "** $# domain(s) whitelisted." - # Force dnsmasq to reload /etc/pihole/gravity.list - kill -HUP $(pidof dnsmasq) +if $modifyHost; then + echo "** Modifying Hosts File" + ModifyHostFile +else + echo "** No changes need to be made" + exit 1 +fi + +if $reload; then + Reload fi From 534dbc9b6e8aecf4d36ba648e46b00749eb570cd Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 14:48:07 +0000 Subject: [PATCH 126/148] added a quiet option for when the script is called by gravity. Less output = less confusion! --- advanced/Scripts/whitelist.sh | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index c4359748..43edcb9c 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -10,6 +10,10 @@ if [[ $# = 0 ]]; then echo "Immediately whitelists one or more domains in the hosts file" echo "Usage: whitelist.sh domain1 [domain2 ...]" + echo "Options:" + echo " -d, --delmode Remove domains from the whitelist" + echo " -nr, --noreload Update Whitelist without refreshing dnsmasq + exit 1 fi From cc62d984d28410430c6aec60cc271acb53cd4aba Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 14:49:16 +0000 Subject: [PATCH 127/148] Changed whitelist function to outsource to whitelist.sh --- gravity.sh | 59 ++++++++++++++++++++++++------------------------------ 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/gravity.sh b/gravity.sh index fbecb3ad..28a2c61a 100755 --- a/gravity.sh +++ b/gravity.sh @@ -48,12 +48,11 @@ blacklist=$piholeDir/blacklist.txt whitelist=$piholeDir/whitelist.txt latentWhitelist=$piholeDir/latentWhitelist.txt justDomainsExtension=domains -matter=$basename.0.matter.txt -andLight=$basename.1.andLight.txt -supernova=$basename.2.supernova.txt -eventHorizon=$basename.3.eventHorizon.txt -accretionDisc=$basename.4.accretionDisc.txt -eyeOfTheNeedle=$basename.5.wormhole.txt +matterandlight=$basename.0.matterandlight.txt +supernova=$basename.1.supernova.txt +eventHorizon=$basename.2.eventHorizon.txt +accretionDisc=$basename.3.accretionDisc.txt +eyeOfTheNeedle=$basename.4.wormhole.txt # After setting defaults, check if there's local overrides if [[ -r $piholeDir/pihole.conf ]];then @@ -160,48 +159,39 @@ function gravity_Schwarzchild() { # Find all active domains and compile them into one file and remove CRs echo "** Aggregating list of domains..." - truncate -s 0 $piholeDir/$matter + truncate -s 0 $piholeDir/$matterandlight for i in "${activeDomains[@]}" do - cat $i |tr -d '\r' >> $piholeDir/$matter + cat $i |tr -d '\r' >> $piholeDir/$matterandlight done } -# Pulsar - White/blacklist application -function gravity_pulsar() { +function gravity_Blacklist(){ # Append blacklist entries if they exist if [[ -r $blacklist ]];then numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) echo "** Blacklisting $numberOf domain(s)..." - cat $blacklist >> $piholeDir/$matter + cat $blacklist >> $piholeDir/$matterandlight fi +} - # Whitelist (if applicable) domains - if [[ -r $whitelist ]];then - # Remove whitelist entries - numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l) - plural=; [[ "$numberOf" != "1" ]] && plural=s - echo "** Whitelisting $numberOf domain${plural}..." - - # Append a "$" to the end, prepend a "^" to the beginning, and - # replace "." with "\." of each line to turn each entry into a - # regexp so it can be parsed out with grep -x - awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist - else - rm $latentWhitelist 2>/dev/null - fi +function gravity_Whitelist() { # Prevent our sources from being pulled into the hole - plural=; [[ "${#sources[@]}" != "1" ]] && plural=s - echo "** Whitelisting ${#sources[@]} ad list source${plural}..." + plural=; [[ "${sources[@]}" != "1" ]] && plural=s + echo "** Whitelisting ${sources[@]} ad list source${plural}..." + + urls=() for url in ${sources[@]} do - echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist + tmp=$(echo "$url" | awk -F '/' '{print $3}' | sed 's/\./\\./g') + urls=("${urls[@]}" $tmp) done + + whitelist.sh -f -dr ${urls[@]} - # Remove whitelist entries from list - grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight + } function gravity_unique() { @@ -240,12 +230,13 @@ function gravity_blackbody() { } function gravity_advanced() { + + # Remove comments and print only the domain name # Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious # This helps with that and makes it easier to read # It also helps with debugging so each stage of the script can be researched more in depth - awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ - sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova + awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$matterandlight | sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova numberOf=$(wc -l < $piholeDir/$supernova) echo "** $numberOf domains being pulled in by gravity..." @@ -268,11 +259,13 @@ function gravity_reload() { fi } + gravity_collapse gravity_spinup gravity_Schwarzchild -gravity_pulsar gravity_advanced gravity_hostFormat gravity_blackbody +gravity_Whitelist +gravity_Blacklist gravity_reload From 14ee4850afda52fc3677c810ff88f3033205cd22 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 14:50:13 +0000 Subject: [PATCH 128/148] Placeholder for blacklist script --- advanced/Scripts/blacklist.sh | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 advanced/Scripts/blacklist.sh diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh new file mode 100644 index 00000000..07dde06b --- /dev/null +++ b/advanced/Scripts/blacklist.sh @@ -0,0 +1,8 @@ +#!/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. From 6b1f14647c3516e22b3d92a1d65d2ef681738a67 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 15:52:27 +0000 Subject: [PATCH 129/148] add reference to blacklist.sh --- automated install/basic-install.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b80180cb..20570f22 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -207,8 +207,9 @@ installScripts(){ sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +sudo curl -o /usr/local/bin/blacklist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/blacklist.sh sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush}.sh } installConfigs(){ From 89e3c25a90486b37acc4dbc45853b9d0508a1dcd Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 15:53:40 +0000 Subject: [PATCH 130/148] Behaves like whitelist, but on the blacklist --- advanced/Scripts/blacklist.sh | 172 ++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index 07dde06b..9eac0780 100644 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -6,3 +6,175 @@ # 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 "Usage: blacklist.sh domain1 [domain2 ...]" + 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" + + 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 whitelist 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 From f68cf10efa9680dd63ccd2a3d239f569d1eebe17 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 15:54:00 +0000 Subject: [PATCH 131/148] Tidied up a couple of things --- advanced/Scripts/whitelist.sh | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index 43edcb9c..52a4ba66 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -9,10 +9,13 @@ if [[ $# = 0 ]]; then echo "Immediately whitelists one or more domains in the hosts file" + echo " " echo "Usage: whitelist.sh domain1 [domain2 ...]" + echo " " echo "Options:" - echo " -d, --delmode Remove domains from the whitelist" - echo " -nr, --noreload Update Whitelist without refreshing dnsmasq + echo " -d, --delmode Remove domains from the whitelist" + echo " -nr, --noreload Update Whitelist without refreshing dnsmasq" + echo " -f, --force Force updating of the hosts files, even if there are no changes" exit 1 fi @@ -22,6 +25,8 @@ whitelist=/etc/pihole/whitelist.txt adList=/etc/pihole/gravity.list reload=true addmode=true +force=false +versbose=true domList=() domToRemoveList=() @@ -74,11 +79,15 @@ function AddDomain(){ grep -Ex -q "$1" $whitelist || bool=true if $bool; then #domain not found in the whitelist file, add it! + if $versbose; then echo "** Adding $1 to whitelist file" + fi echo $1 >> $whitelist modifyHost=true else - echo "** $1 already whitelisted! No need to add" + if $versbose; then + echo "** $1 already whitelisted! No need to add" + fi fi } @@ -88,10 +97,14 @@ function RemoveDomain(){ grep -Ex -q "$1" $whitelist || bool=true if $bool; then #Domain is not in the whitelist file, no need to Remove + if $versbose; 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 $versbose; then echo "** Un-whitelisting $dom..." + fi domToRemoveList=("${domToRemoveList[@]}" $1) modifyHost=true fi @@ -144,19 +157,23 @@ for var in "$@" do case "$var" in "-nr"| "--noreload" ) reload=false;; - "-d" | "--delmode" ) addmode=false;; + "-d" | "--delmode" ) addmode=false;; + "-f" | "--force" ) force=true;; + "-q" | "--quiet" ) versbose=false;; * ) HandleOther $var;; esac done PopWhitelistFile -if $modifyHost; then +if $modifyHost || $force; then echo "** Modifying Hosts File" ModifyHostFile else + if $versbose; then echo "** No changes need to be made" exit 1 + fi fi if $reload; then From 2284a27814e48c1f6d6b80379d03ec56a376ad3e Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 15:54:11 +0000 Subject: [PATCH 132/148] Consumes blacklist.sh now, too. --- gravity.sh | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/gravity.sh b/gravity.sh index 28a2c61a..2ee4ca33 100755 --- a/gravity.sh +++ b/gravity.sh @@ -169,27 +169,23 @@ function gravity_Schwarzchild() { function gravity_Blacklist(){ # Append blacklist entries if they exist - if [[ -r $blacklist ]];then - numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) - echo "** Blacklisting $numberOf domain(s)..." - cat $blacklist >> $piholeDir/$matterandlight - fi + blacklist.sh -f -nr -q } function gravity_Whitelist() { # Prevent our sources from being pulled into the hole plural=; [[ "${sources[@]}" != "1" ]] && plural=s - echo "** Whitelisting ${sources[@]} ad list source${plural}..." + echo "** Whitelisting ${#sources[@]} ad list source${plural}..." urls=() for url in ${sources[@]} do - tmp=$(echo "$url" | awk -F '/' '{print $3}' | sed 's/\./\\./g') + tmp=$(echo "$url" | awk -F '/' '{print $3}') urls=("${urls[@]}" $tmp) done - whitelist.sh -f -dr ${urls[@]} + whitelist.sh -f -nr -q ${urls[@]} } From 2b0bee085bf0b66a292059d6854fadddd5f4ec98 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Fri, 15 Jan 2016 18:57:20 +0000 Subject: [PATCH 133/148] Incorrect reference to whitelist in the blacklist.sh comments :) --- advanced/Scripts/blacklist.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index 9eac0780..40bc224b 100644 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -58,7 +58,7 @@ function HandleOther(){ } function PopBlacklistFile(){ - #check whitelist file exists, and if not, create it + #check blacklist file exists, and if not, create it if [[ ! -f $blacklist ]];then touch $blacklist fi From 665dfdfe8e01c645bd9822f4f2aabffce063ca2e Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 15 Jan 2016 18:50:32 -0500 Subject: [PATCH 134/148] Install Figlet Fonts with Toilet Some OS' don't have Figlet Fonts, which causes `chronometer.sh` to have `error: font small not found` instead of the pretty "Pi-hole" display --- automated install/basic-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b80180cb..fe3eab08 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -227,7 +227,7 @@ sudo service lighttpd stop || true installDependencies(){ sudo apt-get update sudo apt-get -y upgrade -sudo apt-get -y install dnsutils bc toilet +sudo apt-get -y install dnsutils bc toilet figlet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 } From f9a2ca5c3235750fb45cd36561059230d9c8ef90 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sat, 16 Jan 2016 00:47:45 +0000 Subject: [PATCH 135/148] Tidy up help text on both scripts. Add quiet help. --- advanced/Scripts/blacklist.sh | 6 ++++-- advanced/Scripts/whitelist.sh | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/advanced/Scripts/blacklist.sh b/advanced/Scripts/blacklist.sh index 40bc224b..3c3c78c6 100644 --- a/advanced/Scripts/blacklist.sh +++ b/advanced/Scripts/blacklist.sh @@ -9,12 +9,14 @@ 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 " -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 diff --git a/advanced/Scripts/whitelist.sh b/advanced/Scripts/whitelist.sh index fa699be0..8d871c51 100755 --- a/advanced/Scripts/whitelist.sh +++ b/advanced/Scripts/whitelist.sh @@ -16,7 +16,7 @@ if [[ $# = 0 ]]; then echo " -d, --delmode Remove domains from the whitelist" echo " -nr, --noreload Update Whitelist 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 From bd5ed2bcf0dba9fdfb60cdde39525c85be4593ea Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 13:12:55 -0600 Subject: [PATCH 136/148] move webinterface.sh into scripts folder I also renamed it to make it is easier to identify. --- .../webinterface.sh => advanced/Scripts/updateDashboard.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename automated install/webinterface.sh => advanced/Scripts/updateDashboard.sh (100%) diff --git a/automated install/webinterface.sh b/advanced/Scripts/updateDashboard.sh similarity index 100% rename from automated install/webinterface.sh rename to advanced/Scripts/updateDashboard.sh From 6125b2520b15b23049456731545c0a925df1a306 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 13:15:44 -0600 Subject: [PATCH 137/148] install git for updateDashboard.sh I also download and chmod the script --- automated install/basic-install.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 20570f22..03d225d5 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -209,7 +209,8 @@ sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jac sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh sudo curl -o /usr/local/bin/blacklist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/blacklist.sh sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush}.sh +sudo curl -o /usr/local/bin/updateDashboard.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/updateDashboard.sh +sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh } installConfigs(){ @@ -231,6 +232,7 @@ sudo apt-get -y upgrade sudo apt-get -y install dnsutils bc toilet sudo apt-get -y install dnsmasq sudo apt-get -y install lighttpd php5-common php5-cgi php5 +sudo apt-get -y install git } installWebAdmin(){ From 7c6ef0cfd088fccc662bfadd5e957d826c0518f3 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 13:40:09 -0600 Subject: [PATCH 138/148] privileged install This puts sudo in a variable if run as a regular user. If already running as root, the script proceeds as normal. Not a perfect fix, but should help for install on other systems. --- automated install/basic-install.sh | 110 ++++++++++++++++------------- 1 file changed, 59 insertions(+), 51 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 666c2134..961f5aa7 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -17,6 +17,14 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +if [[ $EUID -eq 0 ]];then + echo "You are root." +else + echo "sudo will be used for the install." + export SUDO="sudo" +fi + + tmpLog=/tmp/pihole-install.log instalLogLoc=/etc/pihole/install.log @@ -41,13 +49,13 @@ backupLegacyPihole() { if [[ -f /etc/dnsmasq.d/adList.conf ]];then echo "Original Pi-hole detected. Initiating sub space transport" - sudo mkdir -p /etc/pihole/original/ - sudo mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d") - sudo mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d") - sudo mv /etc/resolv.conf /etc/pihole/original/resolv.conf.$(date "+%Y-%m-%d") - sudo mv /etc/lighttpd/lighttpd.conf /etc/pihole/original/lighttpd.conf.$(date "+%Y-%m-%d") - sudo mv /var/www/pihole/index.html /etc/pihole/original/index.html.$(date "+%Y-%m-%d") - sudo mv /usr/local/bin/gravity.sh /etc/pihole/original/gravity.sh.$(date "+%Y-%m-%d") + $SUDO mkdir -p /etc/pihole/original/ + $SUDO mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d") + $SUDO mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d") + $SUDO mv /etc/resolv.conf /etc/pihole/original/resolv.conf.$(date "+%Y-%m-%d") + $SUDO mv /etc/lighttpd/lighttpd.conf /etc/pihole/original/lighttpd.conf.$(date "+%Y-%m-%d") + $SUDO mv /var/www/pihole/index.html /etc/pihole/original/index.html.$(date "+%Y-%m-%d") + $SUDO mv /usr/local/bin/gravity.sh /etc/pihole/original/gravity.sh.$(date "+%Y-%m-%d") else : fi @@ -121,8 +129,8 @@ useIPv6dialog() { piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }') whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c -sudo mkdir -p /etc/pihole/ -sudo touch /etc/pihole/.useIPv6 +$SUDO mkdir -p /etc/pihole/ +$SUDO touch /etc/pihole/.useIPv6 } getStaticIPv4Settings() @@ -189,7 +197,7 @@ setDHCPCD(){ echo "interface $piholeInterface static ip_address=$IPv4addr static routers=$IPv4gw -static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null +static domain_name_servers=$IPv4gw" | $SUDO tee -a $dhcpcdFile >/dev/null } setStaticIPv4(){ @@ -198,78 +206,78 @@ if grep -q $IPv4addr $dhcpcdFile; then : else setDHCPCD - sudo ip addr replace dev $piholeInterface $IPv4addr + $SUDO ip addr replace dev $piholeInterface $IPv4addr echo "Setting IP to $IPv4addr. You may need to restart after the install is complete." fi } installScripts(){ -sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh -sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh -sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh -sudo curl -o /usr/local/bin/blacklist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/blacklist.sh -sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh -sudo curl -o /usr/local/bin/updateDashboard.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/updateDashboard.sh -sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh +$SUDO curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh +$SUDO curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh +$SUDO curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh +$SUDO curl -o /usr/local/bin/blacklist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/blacklist.sh +$SUDO curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh +$SUDO curl -o /usr/local/bin/updateDashboard.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/updateDashboard.sh +$SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh } installConfigs(){ -sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig -sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf -sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf -sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf +$SUDO mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig +$SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig +$SUDO curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf +$SUDO curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf +$SUDO sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf } stopServices(){ -sudo service dnsmasq stop || true -sudo service lighttpd stop || true +$SUDO service dnsmasq stop || true +$SUDO service lighttpd stop || true } installDependencies(){ -sudo apt-get update -sudo apt-get -y upgrade -sudo apt-get -y install dnsutils bc toilet figlet -sudo apt-get -y install dnsmasq -sudo apt-get -y install lighttpd php5-common php5-cgi php5 -sudo apt-get -y install git +$SUDO apt-get update +$SUDO apt-get -y upgrade +$SUDO apt-get -y install dnsutils bc toilet figlet +$SUDO apt-get -y install dnsmasq +$SUDO apt-get -y install lighttpd php5-common php5-cgi php5 +$SUDO apt-get -y install git } installWebAdmin(){ -sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip -sudo unzip -oq /var/www/master.zip -d /var/www/html/ -sudo mv /var/www/html/AdminLTE-master /var/www/html/admin -sudo rm /var/www/master.zip 2>/dev/null -sudo touch /var/log/pihole.log -sudo chmod 644 /var/log/pihole.log -sudo chown dnsmasq:root /var/log/pihole.log +$SUDO wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip +$SUDO unzip -oq /var/www/master.zip -d /var/www/html/ +$SUDO mv /var/www/html/AdminLTE-master /var/www/html/admin +$SUDO rm /var/www/master.zip 2>/dev/null +$SUDO touch /var/log/pihole.log +$SUDO chmod 644 /var/log/pihole.log +$SUDO chown dnsmasq:root /var/log/pihole.log } installPiholeWeb(){ -sudo mkdir /var/www/html/pihole -sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig -sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html +$SUDO mkdir /var/www/html/pihole +$SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig +$SUDO curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html } installCron(){ -sudo mv /etc/crontab /etc/crontab.orig -sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +$SUDO mv /etc/crontab /etc/crontab.orig +$SUDO curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron } installPihole() { installDependencies stopServices -sudo chown www-data:www-data /var/www/html -sudo chmod 775 /var/www/html -sudo usermod -a -G www-data pi -sudo lighty-enable-mod fastcgi fastcgi-php +$SUDO chown www-data:www-data /var/www/html +$SUDO chmod 775 /var/www/html +$SUDO usermod -a -G www-data pi +$SUDO lighty-enable-mod fastcgi fastcgi-php installScripts installConfigs installWebAdmin installPiholeWeb installCron -sudo /usr/local/bin/gravity.sh +$SUDO /usr/local/bin/gravity.sh } displayFinalMessage(){ @@ -320,9 +328,9 @@ fi installPihole | tee $tmpLog # Move the log file into /etc/pihole for storage -sudo mv $tmpLog $instalLogLoc +$SUDO mv $tmpLog $instalLogLoc displayFinalMessage -sudo service dnsmasq start -sudo service lighttpd start +$SUDO service dnsmasq start +$SUDO service lighttpd start From 5d608a2db5c79526852567cea37083f5e0493f06 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 13:48:29 -0600 Subject: [PATCH 139/148] leave system cron alone MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Taking JoshKastang’s idea from #153, the system cron file will be left alone and the pihole.cron gets its own. --- advanced/pihole.cron | 19 ++++--------------- automated install/basic-install.sh | 3 +-- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/advanced/pihole.cron b/advanced/pihole.cron index 0a11a6d6..57f1c10c 100644 --- a/advanced/pihole.cron +++ b/advanced/pihole.cron @@ -1,22 +1,11 @@ -# /etc/crontab: system-wide crontab -# Unlike any other crontab you don't have to run the `crontab' -# command to install the new version when you edit this file -# and files in /etc/cron.d. These files also have username fields, -# that none of the other crontabs do. - -SHELL=/bin/sh -PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin - -# m h dom mon dow user command -17 * * * * root cd / && run-parts --report /etc/cron.hourly -25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily ) -47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly ) -52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) - # Pi-hole: Update the ad sources once a week on Sunday at 01:59 # Download any updates from the ad lists 59 1 * * 7 root /usr/local/bin/gravity.sh +# Pi-hole: Update the Web interface shortly after gravity runs +# This should also update the version number if it is changed in the dashboard repo +30 2 * * 7 root /usr/local/bin/updateDashboard.sh + # 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 diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index 961f5aa7..b0b94e85 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -260,8 +260,7 @@ $SUDO curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/ } installCron(){ -$SUDO mv /etc/crontab /etc/crontab.orig -$SUDO curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron +$SUDO curl -o /etc/cron.d/pihole https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron } installPihole() From bee109c7849b1ab8cd568dc2fb428d37e163e7a7 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 13:56:08 -0600 Subject: [PATCH 140/148] better uninstall More from JoshKastang. This closes #153 as it is the last step from his ideas. --- automated install/uninstall.sh | 67 ++++++++++++++++++++++++++-------- 1 file changed, 52 insertions(+), 15 deletions(-) diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh index 563d8d07..a518fa0f 100644 --- a/automated install/uninstall.sh +++ b/automated install/uninstall.sh @@ -8,20 +8,57 @@ # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. +# Must be root to uninstall +if [[ $EUID -eq 0 ]];then + echo "You are root." +else + echo "sudo will be used for the install." + export SUDO="sudo" +fi + ######### SCRIPT ########### -sudo apt-get -y remove --purge dnsutils bc toilet -sudo apt-get -y remove --purge dnsmasq -sudo apt-get -y remove --purge lighttpd php5-common php5-cgi php5 -sudo rm -rf /var/www/html -sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig -sudo rm /etc/crontab -sudo mv /etc/crontab.orig /etc/crontab -sudo rm /etc/dnsmasq.conf -sudo rm -rf /etc/lighttpd/ -sudo rm /var/log/pihole.log -sudo rm /usr/local/bin/gravity.sh -sudo rm /usr/local/bin/chronometer.sh -sudo rm /usr/local/bin/whitelist.sh -sudo rm /usr/local/bin/piholeLogFlush.sh -sudo rm -rf /etc/pihole/ +$SUDO apt-get -y remove --purge dnsutils bc toilet +$SUDO apt-get -y remove --purge dnsmasq +$SUDO apt-get -y remove --purge lighttpd php5-common php5-cgi php5 + +# Only web directories/files that are created by pihole should be removed. +echo "Removing the Pi-hole Web server files..." +$SUDO rm -rf /var/www/html/admin +$SUDO rm -rf /var/www/html/pihole +$SUDO rm /var/www/html/index.lighttpd.orig + +# If the web directory is empty after removing these files, then the parent html folder can be removed. +if [[ ! "$(ls -A /var/www/html)" ]]; then + $SUDO rm -rf /var/www/html +fi + +echo "Removing dnsmasq config files..." +$SUDO rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig + +# Attempt to preserve backwards compatibility with older versions +# to guarantee no additional changes were made to /etc/crontab after +# the installation of pihole, /etc/crontab.pihole should be permanently +# preserved. +if [[ -f /etc/crontab.orig ]]; then + echo "Initial Pi-hole cron detected. Restoring the default system cron..." + $SUDO mv /etc/crontab /etc/crontab.pihole + $SUDO mv /etc/crontab.orig /etc/crontab + $SUDO service cron restart +fi + +# Attempt to preserve backwards compatibility with older versions +if [[ -f /etc/cron.d/pihole ]];then + echo "Removing cron.d/pihole..." + $SUDO rm /etc/cron.d/pihole +fi + +echo "Removing config files and scripts..." +$SUDO rm /etc/dnsmasq.conf +$SUDO rm -rf /etc/lighttpd/ +$SUDO rm /var/log/pihole.log +$SUDO rm /usr/local/bin/gravity.sh +$SUDO rm /usr/local/bin/chronometer.sh +$SUDO rm /usr/local/bin/whitelist.sh +$SUDO rm /usr/local/bin/piholeLogFlush.sh +$SUDO rm -rf /etc/pihole/ From 0a0f00da3bf3c2ab769fa0273418ccd33d2ec5a1 Mon Sep 17 00:00:00 2001 From: jacobsalmela Date: Sat, 16 Jan 2016 14:10:03 -0600 Subject: [PATCH 141/148] fixes #169 exits if sudo is not installed when run as a regular user --- automated install/basic-install.sh | 10 +++++++++- automated install/uninstall.sh | 9 ++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/automated install/basic-install.sh b/automated install/basic-install.sh index b0b94e85..82cfbf96 100755 --- a/automated install/basic-install.sh +++ b/automated install/basic-install.sh @@ -17,11 +17,19 @@ # curl -L install.pi-hole.net | bash ######## VARIABLES ######### +# Must be root to install if [[ $EUID -eq 0 ]];then echo "You are root." else echo "sudo will be used for the install." - export SUDO="sudo" + # Check if it is actually installed + # If it isn't, exit because the install cannot complete + if [[ $(dpkg-query -s sudo) ]];then + export SUDO="sudo" + else + echo "Please install sudo or run this as root." + exit 1 + fi fi diff --git a/automated install/uninstall.sh b/automated install/uninstall.sh index a518fa0f..59eca67b 100644 --- a/automated install/uninstall.sh +++ b/automated install/uninstall.sh @@ -13,7 +13,14 @@ if [[ $EUID -eq 0 ]];then echo "You are root." else echo "sudo will be used for the install." - export SUDO="sudo" + # Check if it is actually installed + # If it isn't, exit because the unnstall cannot complete + if [[ $(dpkg-query -s sudo) ]];then + export SUDO="sudo" + else + echo "Please install sudo or run this as root." + exit 1 + fi fi From 414ef54cfe1e27d485b1d26a0c39b7df2a55016b Mon Sep 17 00:00:00 2001 From: Promofaux Date: Sun, 17 Jan 2016 14:09:06 +0000 Subject: [PATCH 142/148] Switched CRLF to LF (DOS to UNIX) --- advanced/Scripts/blacklist.sh | 364 +++++++++++++++++----------------- 1 file changed, 182 insertions(+), 182 deletions(-) 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 From 48f8d7ed0f177215ee08dce72417311bf0ab477f Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 17 Jan 2016 20:34:48 -0600 Subject: [PATCH 143/148] pi-hole mentioned in a podcast Worth a good laugh when they say "shut your pie hole!" --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 1b7faffc..2e574c3c 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,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)! From 0a57b43f092f947df7857dba3dd0915834d83db7 Mon Sep 17 00:00:00 2001 From: Jacob Salmela Date: Sun, 17 Jan 2016 20:55:02 -0600 Subject: [PATCH 144/148] C.H.I.P. ad blocking project --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 2e574c3c..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) From 487c26db442f4f8dd498fe633867bd5837ccc753 Mon Sep 17 00:00:00 2001 From: Promofaux Date: Mon, 18 Jan 2016 22:03:53 +0000 Subject: [PATCH 145/148] Major overhaul. Added -j option to output stats as JSON formatted string. If run with no option, then chronometer runs as normal. Fixed calculations to match those on the web dashboard. --- advanced/Scripts/chronometer.sh | 154 ++++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 27 deletions(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index d3ce783d..f8285313 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -1,35 +1,135 @@ #!/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. # # 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. -for (( ; ; )) +# (at your opercentBlockedTodayion) any later version. + + +#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: whitelist.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 -done + case "$var" in + "-j" | "--json" ) outputJSON;; + "-h" | "--help" ) displayHelp;; + * ) exit 1;; + esac +done \ No newline at end of file From 0eed56380d2cb36cf54832e858df4cdb1febb85a Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 18 Jan 2016 22:15:39 +0000 Subject: [PATCH 146/148] Update chronometer.sh What, me? Reference the wrong file? --- advanced/Scripts/chronometer.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index f8285313..5ef641df 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -111,7 +111,7 @@ function normalChrono(){ function displayHelp(){ echo "Displays stats about your piHole!" echo " " - echo "Usage: whitelist.sh [optional:-j]" + 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:" @@ -132,4 +132,4 @@ do "-h" | "--help" ) displayHelp;; * ) exit 1;; esac -done \ No newline at end of file +done From de464e17cc7b1f3bc4435f431364b65a830e55ad Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 18 Jan 2016 22:24:02 +0000 Subject: [PATCH 147/148] Update chronometer.sh Note to self, Find&Replace>Replace All is a bad idea. --- advanced/Scripts/chronometer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index 5ef641df..ac3dcd23 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -5,7 +5,7 @@ # 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 opercentBlockedTodayion) any later version. +# (at your option) any later version. #Functions############################################################################################################## From f6658991167d5f62ca1aabfdb98ab10ecc01a6c0 Mon Sep 17 00:00:00 2001 From: Adam Warner Date: Mon, 18 Jan 2016 23:35:21 +0000 Subject: [PATCH 148/148] Update chronometer.sh weirdness --- advanced/Scripts/chronometer.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/advanced/Scripts/chronometer.sh b/advanced/Scripts/chronometer.sh index ac3dcd23..b29480a9 100755 --- a/advanced/Scripts/chronometer.sh +++ b/advanced/Scripts/chronometer.sh @@ -112,7 +112,7 @@ 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 "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"