Compare commits

..

186 Commits
v2.1 ... v2.4

Author SHA1 Message Date
Dan Schaper
0b077b9601 Merge pull request #244 from pi-hole/development
Code update for 2016/01/25.
2016-01-25 11:04:09 -08:00
PromoFaux
80bec9c5cf Delete install
Not sure how this got in here... :)
2016-01-25 16:28:26 +00:00
PromoFaux
c24685c49a Merge pull request #243 from pi-hole/HotFix/InstallScript
Hot fix/install script
2016-01-25 16:22:36 +00:00
Adam Warner
2b99fa81f3 Tidy up output lines around new code 2016-01-25 16:08:48 +00:00
Adam Warner
e87443b3e4 add 'http://mirror1.malwaredomains.com/files/justdomains' to list of ad-list sources, can be removed if it causes problems 2016-01-25 15:53:49 +00:00
Adam Warner
74ea597bd8 Cosmetic enhancement. Add the domain 'Pi-Hole.IsWorking.OK' to the top of the domain list to return a friendlier looking domain when pinging a blocked host! 2016-01-25 15:52:22 +00:00
Adam Warner
354a42dd00 close quotes on line 318!!! 2016-01-25 12:49:04 +00:00
Adam Warner
4cedca3427 add in a prompt to give users the option to quit installation or continue 2016-01-25 12:47:03 +00:00
Dan Schaper
e99be28a73 Variable missing $ 2016-01-25 02:31:03 -08:00
Dan Schaper
32389e4ab8 Terminate string with missing quote 2016-01-25 02:27:44 -08:00
Adam Warner
01d7fc0ac9 Removed apt-get update/upgrade, instead checking for updates availible and advising user to update/upgrade after installation of pi-hole. Addresses issue #218 2016-01-25 10:07:12 +00:00
Promofaux
6b76270889 Remove spinner call when adding URLs of adlist to array.. seems to break it. 2016-01-24 22:30:12 +00:00
PromoFaux
5d040f45c8 Merge pull request #239 from pi-hole/development
Development
2016-01-24 22:12:04 +00:00
Promofaux
cebdcc71a7 Add $SUDO call to spinner() in gravity.sh 2016-01-24 21:27:25 +00:00
Promofaux
eec14be10d add $SUDO into spinner control. 2016-01-24 21:19:23 +00:00
Promofaux
c179936b54 add $SUDO 2016-01-24 20:49:37 +00:00
Promofaux
649a565801 run apt-get install as sudo when resolving dependencies 2016-01-24 20:35:24 +00:00
Promofaux
2d4ebf5eb5 FIX CONFLICTS 2016-01-24 20:29:22 +00:00
Promofaux
754beed3a1 Bring up to date with master 2016-01-24 20:22:41 +00:00
Promofaux
df5059944b Merge branch 'Promofaux-InstallRework' into development 2016-01-24 18:51:10 +00:00
Promofaux
9f0927351d Merge from #236 2016-01-24 18:49:25 +00:00
Promofaux
736edf44e4 Added date check before running apt-get update/upgrade. Wont run apt-get update/upgrade if it has already been run today 2016-01-24 17:53:27 +00:00
Promofaux
8ecf8eb76c output to match other scripts 2016-01-24 17:18:37 +00:00
Promofaux
3cd1a5b1d5 ... Helps if I add the changes to the repo file, and not the test file on my pi. 2016-01-24 16:51:54 +00:00
Promofaux
39507b9d0d Added echo ':::' to the top of the file 2016-01-24 16:47:38 +00:00
Promofaux
dfcf9d133e Make output make a bit more sense 2016-01-24 16:46:00 +00:00
Promofaux
8a74942da7 Cleaned up output before running gravity.sh 2016-01-24 16:41:11 +00:00
Promofaux
2fe42138c7 removed a space 2016-01-24 16:37:15 +00:00
Promofaux
1563146918 improvements to git functions (passing parameters). Added >/dev/null to attempt to supress output from apt-get upgrade 2016-01-24 16:33:53 +00:00
Promofaux
cf3aea8075 uncomment the apt-get update/upgrade! 2016-01-24 15:27:40 +00:00
Promofaux
a539dc41f3 Tidy up gravity output to match install script 2016-01-24 15:25:24 +00:00
Promofaux
6cea480210 Huge update! Base files now cloned from github (or updated if already existing) and copied out to the correct directories. Web admin interface is now cloned from hithub (or updated if already existing). Packages are checked before we go ahead and try to install them anyway. 2016-01-24 03:31:12 +00:00
PromoFaux
3b4bb48a0f Merge pull request #234 from ChadBHowell/CBH---Dependencies
Add unzip to the dependencies
2016-01-24 00:13:49 +00:00
Promofaux
206717828b Improve spinner function. 2016-01-23 22:25:30 +00:00
Chad Howell
316d26ede2 Add unzip to the dependencies
unzip is required for the install script to complete.  Some distros do
not have it installed by default.
2016-01-23 16:29:52 -05:00
Jacob Salmela
f2e471707e Pi-hole chrome extension 2016-01-23 12:39:09 -06:00
Dan Schaper
1e735c26c4 Repo Change QuickFix
QuickFix for Repo location change.
2016-01-22 20:46:10 -08:00
PromoFaux
7c5df5dfe3 Merge pull request #229 from PromoFaux/TransferPrep
Changed URLs in installScripts() to match new organisation links
2016-01-23 01:34:47 +00:00
PromoFaux
5b62f91bb4 Update README.md
Whoops, forgot the readme.. *embarrassed face*
2016-01-23 01:31:33 +00:00
Promofaux
e8b8fb0835 s 2016-01-23 00:23:32 +00:00
Promofaux
6663ced38d Initial commit 2016-01-23 00:13:16 +00:00
Dan Schaper
0b03264fb0 Merge pull request #225 from jacobsalmela/bugfix/createPiholeDir
Bugfix/create pihole dir
2016-01-22 16:11:15 -08:00
Promofaux
c99a8a9b15 initial commit 2016-01-22 20:30:32 +00:00
Dan Schaper
ea0fb15ff2 Move creation of pihole directory out of IPv6 function 2016-01-22 19:48:55 +00:00
Adam Warner
05a59b17be Changed URLs in installScripts() to match new organisation links 2016-01-22 16:50:01 +00:00
Leo
8b18fdd322 Update gravity.sh 2016-01-21 17:19:09 -05:00
Leo
1349f584be Use Sudo Detection from Installer in Gravity.sh Also
Prevents errors from being thrown when gravity.sh is run as root and the user doesn't have sudo installed (just like install.sh does)
2016-01-21 17:14:55 -05:00
Dan Schaper
48db85187e Merge pull request #219 from jacobsalmela/master
Update Development
2016-01-21 12:19:12 -08:00
Dan Schaper
d1e054d713 Merge pull request #216 from mechaxl/master
Fixing minor typos in basic-install.sh
2016-01-21 09:48:44 -08:00
Kenneth Koski
ce578534fe Fixing minor typos in basic-install.sh 2016-01-21 11:33:49 -06:00
Dan Schaper
c7c4a5c602 Merge pull request #215 from jacobsalmela/development
Merge development into master
2016-01-21 08:42:53 -08:00
Promofaux
3f40a95929 Whoops, should probably commit more often. Massive overhaul. Cleaned up output, less verbose (will still output errors, but gets rid of anything not needed) Added a spinner so users don't think it has stalled 2016-01-20 23:34:18 +00:00
Promofaux
5c25c42da8 Make installPiholeWeb() more inteliigent. Checks for existence of /var/www/html/pihole, and only downloads from repo if it does not exist. Will stop install script from overwriting any tweaks users have made to index.html 2016-01-20 22:14:17 +00:00
Promofaux
96011bc2ae make InstallWebAdmin() a bit more intelligent, and less verbose. Checks if installing over an existing installation, and if so, will remove existing webadmin folder. 2016-01-20 22:02:54 +00:00
Promofaux
4f59577fd1 Remove SUDO from line that runs gravity.sh to stop files in /etc/pihole being owned by root 2016-01-20 21:20:52 +00:00
Dan Schaper
494fcd60ab Merge branch 'development' of https://github.com/jacobsalmela/pi-hole into development 2016-01-20 05:25:49 +00:00
Mcat12
544919175c Added back in debugging response header 2016-01-20 05:23:30 +00:00
Mcat12
ede8f4714f Removed extra http redirect 2016-01-20 05:23:15 +00:00
Dan Schaper
b512496818 Merge pull request #207 from jacobsalmela/bugfix/Chronometer
Bugfix for Chronometer
2016-01-19 17:42:41 -08:00
Dan Schaper
8094f7234c Merge pull request #202 from PromoFaux/FixChronometer
Fix chronometer
2016-01-19 17:39:46 -08:00
Dan Schaper
7dfd9f0378 Merge pull request #205 from PromoFaux/InstallScript
Clean /etc/pihole/list.* during `basic-install.sh` to set a baseline for install procedures. Fixes #195. Submitted by @PromoFaux.
2016-01-19 16:21:49 -08:00
Promofaux
bc51f88805 Check if any list.* files exist from previous installation, if they do delete them. 2016-01-19 22:52:29 +00:00
Dan Schaper
e04e2537a8 Merge pull request #203 from jacobsalmela/master
Merge master into development
2016-01-19 13:20:21 -08:00
Promofaux
af982a02af Move call to CheckIPv6 function into CalcBlockedDomains, rather than relying on remembering to call it before you call CalcBlockedDomains. 2016-01-19 21:14:01 +00:00
Jacob Salmela
03277899ca Merge pull request #199 from PromoFaux/master
Update Readme to link to whitelist/blacklist wiki page
2016-01-19 12:16:41 -06:00
Adam Warner
6756843be7 Merge pull request #2 from PromoFaux/PromoFaux-patch-1
Update README.md
2016-01-19 17:14:10 +00:00
Adam Warner
ac35417ab0 Update README.md
Updated Whitelist/Blacklist section - added link to wiki
Added information about `chronometer.sh -j`
2016-01-19 17:13:48 +00:00
Adam Warner
092c951078 Merge pull request #1 from jacobsalmela/master
Merge from upstream
2016-01-19 16:26:09 +00:00
Jacob Salmela
9ba38e668a Merge pull request #193 from PromoFaux/Chronometer
Major overhaul of chronometer script
2016-01-18 17:36:33 -06:00
Adam Warner
f665899116 Update chronometer.sh
weirdness
2016-01-18 23:35:21 +00:00
Adam Warner
de464e17cc Update chronometer.sh
Note to self, Find&Replace>Replace All is a bad idea.
2016-01-18 22:24:02 +00:00
Adam Warner
0eed56380d Update chronometer.sh
What, me? Reference the wrong file?
2016-01-18 22:15:39 +00:00
Promofaux
487c26db44 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. 2016-01-18 22:03:53 +00:00
Jacob Salmela
0a57b43f09 C.H.I.P. ad blocking project 2016-01-17 20:55:02 -06:00
Jacob Salmela
48f8d7ed0f pi-hole mentioned in a podcast
Worth a good laugh when they say "shut your pie hole!"
2016-01-17 20:34:48 -06:00
Jacob Salmela
d77399727c Merge pull request #189 from jacobsalmela/whitelist
Switched CRLF to LF (DOS to UNIX)
2016-01-17 18:34:02 -06:00
Jacob Salmela
56ea07c1ec Merge pull request #187 from PromoFaux/whitelist
Switched CRLF to LF (DOS to UNIX)
2016-01-17 08:56:09 -06:00
Promofaux
414ef54cfe Switched CRLF to LF (DOS to UNIX) 2016-01-17 14:09:06 +00:00
jacobsalmela
0a0f00da3b fixes #169
exits if sudo is not installed when run as a regular user
2016-01-16 14:10:03 -06:00
jacobsalmela
bee109c784 better uninstall
More from JoshKastang.  This closes #153 as it is the last step from
his ideas.
2016-01-16 13:56:08 -06:00
jacobsalmela
5d608a2db5 leave system cron alone
Taking JoshKastang’s idea from #153, the system cron file will be left
alone and the pihole.cron gets its own.
2016-01-16 13:48:29 -06:00
jacobsalmela
7c6ef0cfd0 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.
2016-01-16 13:40:09 -06:00
Jacob Salmela
0cf859344a Merge pull request #176 from xd1936/patch-1
Install Figlet Fonts with Toilet
2016-01-16 13:19:15 -06:00
jacobsalmela
6125b2520b install git for updateDashboard.sh
I also download and chmod the script
2016-01-16 13:15:44 -06:00
jacobsalmela
bd5ed2bcf0 move webinterface.sh into scripts folder
I also renamed it to make it is easier to identify.
2016-01-16 13:12:55 -06:00
Jacob Salmela
a2a58f7b39 Merge pull request #180 from jacobsalmela/whitelist
Whitelist/blacklist improvements
2016-01-16 12:24:43 -06:00
Jacob Salmela
87980c6df8 Merge pull request #174 from PromoFaux/whitelist
Whitelisting changes
2016-01-16 11:58:08 -06:00
Promofaux
f9a2ca5c32 Tidy up help text on both scripts. Add quiet help. 2016-01-16 00:47:45 +00:00
Leo
665dfdfe8e 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
2016-01-15 18:50:32 -05:00
Adam Warner
2b0bee085b Incorrect reference to whitelist in the blacklist.sh comments :) 2016-01-15 18:57:20 +00:00
Adam Warner
ddfefb291d Merge branch 'Whitelistingchanges' into whitelist 2016-01-15 18:45:59 +00:00
Adam Warner
5d842a7533 Merging 2016-01-15 18:45:12 +00:00
Adam Warner
2284a27814 Consumes blacklist.sh now, too. 2016-01-15 15:54:11 +00:00
Adam Warner
f68cf10efa Tidied up a couple of things 2016-01-15 15:54:00 +00:00
Adam Warner
89e3c25a90 Behaves like whitelist, but on the blacklist 2016-01-15 15:53:40 +00:00
Adam Warner
6b1f14647c add reference to blacklist.sh 2016-01-15 15:52:27 +00:00
Adam Warner
14ee4850af Placeholder for blacklist script 2016-01-15 14:50:13 +00:00
Adam Warner
cc62d984d2 Changed whitelist function to outsource to whitelist.sh 2016-01-15 14:49:16 +00:00
Adam Warner
534dbc9b6e added a quiet option for when the script is called by gravity. Less output = less confusion! 2016-01-15 14:48:07 +00:00
Adam Warner
8ad116fe7b Aiming to get whitelist.sh to run either standalone or to be called from gravity.sh. Initial commit 2016-01-15 14:17:55 +00:00
jacobsalmela
ca5e34a9a9 Merge branch 'master' into whitelist
# Conflicts:
#	gravity.sh
2016-01-14 18:12:45 -06:00
Jacob Salmela
9ff1129510 Minibian Pi-hole 2016-01-14 17:11:16 -06:00
Jacob Salmela
4b1dd8a2a5 fixes #158
Running at midnight, not 11:58 in the afternoon.
2016-01-12 17:44:08 -06:00
Jacob Salmela
b5bdfe27be Merge pull request #155 from JoshKastang/webinterface-update
replaces the non-repository managed web interface for pihole and keep…
2016-01-11 17:39:42 -06:00
Jacob Salmela
0ef0b0b661 LCD real-time stats 2016-01-10 14:09:40 -06:00
Josh Kastang
802638ce8b replaces the non-repository managed web interface for pihole and keeps it updated 2016-01-10 19:08:29 +00:00
Jacob Salmela
cfd6e0d65d more coverage and an API 2016-01-10 10:40:58 -06:00
Jacob Salmela
93664aeb4e 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
2016-01-04 20:32:46 -06:00
Jacob Salmela
6f9d2d0567 fixes #145
A much more elegant way to get the screen size.
2016-01-02 17:20:33 -06:00
Jacob Salmela
d2b6947886 Merge pull request #146 from iblamefish/multiple-interfaces
installer - only select first (probably default) interface in list instead of all
2016-01-02 17:17:58 -06:00
Clinton
bc3224e0b9 installer - only select first (probably default) interface in list instead of all 2016-01-02 22:10:26 +00:00
Jacob Salmela
ba75c4c62c Merge pull request #144 from jacobsalmela/ipv6
Enables ad-blocking over IPv6 for an even better Internet experience.
2016-01-01 18:44:07 -06:00
Jacob Salmela
3fc1817e7a Merge branch 'master' into ipv6 2016-01-01 18:34:33 -06:00
Jacob Salmela
ab1352b48e Merge pull request #143 from iblamefish/master
fixes #142 kill -HUP erroring on gravity_reload if dnsmasq is not running
2016-01-01 18:16:35 -06:00
Clinton
89b88a2d5d fixes #142 kill -HUP erroring on gravity_reload if dnsmasq is not running 2016-01-02 00:10:12 +00:00
Salmela
d37db4304c A few small display changes
IPv6 box was missing the title.
Added some IPv6 echoes.
2016-01-01 10:59:30 -06:00
Jacob Salmela
a6b18feed9 Merge pull request #141 from iblamefish/ipv6
Fix bug in gravity.sh where IPv6 list was not always populated
2016-01-01 09:14:43 -06:00
Clinton
987e4e02a9 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)
2016-01-01 14:11:46 +00:00
Salmela
d646612a25 Block ads over IPv6
I’m pretty sure this works well.  Maybe someone else can try it out.
2015-12-31 20:26:05 -06:00
Jacob Salmela
8ffa5e9357 adding unRaid-hole fork 2015-12-30 13:34:45 -06:00
Jacob Salmela
d92b3fda91 Merge pull request #137 from iblamefish/patch-1
Fix typo in installer
2015-12-28 10:44:50 -06:00
Clinton Montague
b757e7a769 Fix typo in installer
IPv4 was mentioned in an IPv6 setting - changed to correctly reference IPv6.
2015-12-28 12:29:54 +00:00
Jacob Salmela
26dcbfc1f9 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.
2015-12-27 12:25:35 -06:00
Jacob Salmela
94f7363b8f Merge pull request #136 from klaas01/patch-2
Fix kill command to re-read hosts file
2015-12-27 12:07:16 -06:00
klaas01
a6313c9e9e Update gravity.sh
Fix kill command and only run as last step.
2015-12-26 14:37:51 -04:00
Jacob Salmela
3cdce17d28 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
2015-12-25 21:14:19 -06:00
Jacob Salmela
184d1bd046 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.
2015-12-16 11:23:44 -06:00
Jacob Salmela
c88982d0d5 chmod doesn't apply at initial install 2015-12-09 15:52:53 -06:00
Jacob Salmela
57282cfe16 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...
2015-12-09 15:16:34 -06:00
Jacob Salmela
263d9a222a Merge pull request #120 from dschaper/documenting
Add GPL V2+ headers to script files
2015-12-08 17:46:56 -06:00
Dan Schaper
73bbfc27d0 Remove extra debian doc file 2015-12-08 15:43:40 -08:00
Dan Schaper
4027139d9c More merge conflict resolution 2015-12-06 20:24:58 -08:00
Dan Schaper
d215fa9ade Resolve merge confict 2015-12-06 20:22:34 -08:00
Dan Schaper
b261e046bb Merge pull request #8 from jacobsalmela/master
Upstream sync
2015-12-06 14:44:55 -08:00
Jacob Salmela
4bca6fdfc4 Merge pull request #124 from dschaper/master
Fix merge conflicts
2015-12-06 16:41:46 -06:00
Dan Schaper
9c1eca23ae Fix merge conflicts 2015-12-06 14:39:43 -08:00
Dan Schaper
66953319c4 Merge branch 'development' of github.com:dschaper/pi-hole into development 2015-12-06 14:37:40 -08:00
Dan Schaper
dfc317124c Merge pull request #6 from jacobsalmela/development
Development
2015-12-06 14:36:55 -08:00
Dan Schaper
debb5aeed6 Merge pull request #5 from jacobsalmela/master
Upstream sync
2015-12-06 14:36:26 -08:00
Jacob Salmela
f724a3a61a Merge pull request #122 from dschaper/bug/interfaceCheck
Bug/interface check
2015-12-06 16:32:44 -06:00
Jacob Salmela
f5e573371c Merge pull request #121 from dschaper/development
Merge development
2015-12-06 16:31:11 -06:00
Jacob Salmela
86192a6950 Merge pull request #117 from dschaper/master
Merge development into master
2015-12-06 16:18:12 -06:00
Dan Schaper
ed75f11f3e Merge branch 'bug/interfaceCheck' into development 2015-12-06 14:05:35 -08:00
Dan Schaper
dcccb2ee2b Merge branch 'bug/multipleIP' into development 2015-12-06 11:58:02 -08:00
Dan Schaper
412a190b42 Basic-install.sh should only show one ip address in whiptail screen. 2015-12-06 11:05:09 -08:00
Dan Schaper
d2b260fc1e Log file is automatically generated by dnsmasq, no need to create. 2015-12-06 10:29:59 -08:00
Dan Schaper
723c2d47bb Add gravity.pod 2015-12-06 09:27:13 -08:00
Dan Schaper
22d0e82d92 Add GPL V2+ header 2015-12-06 06:31:49 -08:00
Dan Schaper
cb91b8f5fa Add copyright headers 2015-12-06 05:55:50 -08:00
Dan Schaper
a230df0032 Fix errant ) 2015-12-06 05:33:22 -08:00
Dan Schaper
b391afef49 Interface pull for multiple platforms 2015-12-06 04:45:04 -08:00
Dan Schaper
5441591409 Resolve merge confict 2015-12-06 03:10:29 -08:00
Dan Schaper
7cf5320f50 Only write to dhcpcd.conf if address isn't set 2015-12-06 02:40:30 -08:00
Dan Schaper
04c31f3d06 Merge branch 'development'
Conflicts:
	automated install/basic-install.sh
2015-12-06 00:48:15 -08:00
Dan Schaper
e5652be2a9 Merge pull request #4 from jacobsalmela/development
Sync with upstream development branch
2015-12-06 00:34:01 -08:00
Dan Schaper
d068593582 Get last IP for selected interface 2015-12-06 00:30:16 -08:00
Dan Schaper
3e0daa7e3c Merge pull request #3 from jacobsalmela/master
Upstream sync
2015-12-05 23:04:08 -08:00
Dan Schaper
d8034f4156 Get last IP listed for interface 2015-12-05 22:17:28 -08:00
Jacob Salmela
2b5030e629 Link to explainer video
Also clarifies that the automated install is for Raspbian installs only.
2015-12-05 23:23:44 -06:00
Jacob Salmela
f453d407a9 log-async
For better performance.  I have been using it for a few weeks with no
adverse effects.
2015-12-05 14:14:34 -06:00
Jacob Salmela
49a40115c8 fixes #105 2015-12-05 14:04:37 -06:00
Dan Schaper
f7f2895eec Merge pull request #2 from jacobsalmela/master
Upstream sync
2015-12-04 20:26:50 -08:00
Jacob Salmela
0c3409a028 fixes #111
Also clears out some errors users don't need to see
2015-12-04 21:41:37 -06:00
Dan Schaper
f896d1a5bc Merge pull request #1 from jacobsalmela/development
Sync to upstream/development
2015-12-04 18:10:47 -08:00
Jacob Salmela
3b5f40c1f7 Merge branch 'master' into development 2015-12-04 16:31:45 -06:00
Jacob Salmela
e74bb78a96 Merge pull request #109 from dschaper/bug/dnsmasqInterface
Bug/dnsmasq interface
2015-12-04 15:09:38 -06:00
Jacob Salmela
99c9f792f2 Merge pull request #108 from dschaper/feature/installFunctions
Feature/install functions
2015-12-04 15:09:23 -06:00
Jacob Salmela
0a5c3d021a Merge pull request #110 from dschaper/patch-2
ReadMe.md point to wiki
2015-12-04 15:08:17 -06:00
Dan Schaper
b9a5ca60b2 Oneline ip link call, tighten awk call 2015-12-03 20:34:45 -08:00
Dan Schaper
861673594d Point to wiki
Point users to the Wiki Customization entry instead of the PR
2015-12-03 13:17:27 -08:00
Dan Schaper
3651ee5480 Bugfix for hardcoded dnsmasq.conf interface
Add target to dnsmasq.conf for sed

Replace dnsmasq.conf target with selected interface
2015-12-03 10:05:48 -08:00
Dan Schaper
7a82d1ff17 Breakout basic-install.sh into functions 2015-12-03 09:26:43 -08:00
Dan Schaper
9421366e4f Breakout basic-install.sh to functions 2015-12-03 09:25:13 -08:00
Jacob Salmela
b806a36cfc Merge pull request #106 from dschaper/documenting
Document dnsmasq.conf config
2015-12-03 10:23:44 -06:00
Dan Schaper
2193d6a81f Document dnsmasq.conf config 2015-12-03 01:29:26 -08:00
Jacob Salmela
9ee2f006ac Merge pull request #102 from jacobsalmela/lighttpd
Fix #101 and add Logstalgia requirements
2015-12-01 20:10:21 -06:00
Jacob Salmela
c34cc1608b for use with logstalgia
This seems to show the domain queried and the path requested.
2015-12-01 16:04:07 -06:00
Jacob Salmela
1eb7f879f0 fixes #101
the line url.access-deny caused the error.
2015-12-01 15:12:16 -06:00
Jacob Salmela
6c4f4f49bd Merge branch 'master' into lighttpd 2015-12-01 15:09:51 -06:00
Jacob Salmela
831322b8b2 replace file paths with variables 2015-11-27 18:38:33 -06:00
Jacob Salmela
573c1ef94f double bracket notation 2015-11-27 18:34:02 -06:00
Jacob Salmela
a2cddda590 if whitelist.txt doesn't exist, create it 2015-11-27 18:29:44 -06:00
Jacob Salmela
3b9f7031d5 Merge pull request #96 from dschaper/feature/AtomicFunctions
Feature/atomic functions
2015-11-27 18:10:51 -06:00
Dan Schaper
9892d06c0d Code format cleanups 2015-11-26 15:56:37 -08:00
Dan Schaper
d1e475da89 Move black/white list check to pulsar 2015-11-26 15:48:52 -08:00
Dan Schaper
c45dc277b6 Tighten themeatics 2015-11-26 15:29:13 -08:00
12 changed files with 1410 additions and 465 deletions

View File

@@ -1,68 +1,85 @@
# 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
### ```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?
**Watch the 60-second video below to get a quick overview**
# Raspberry Pi Ad Blocker
**A black hole for ads, hence Pi-hole**
[![Pi-hole exlplained](http://i.imgur.com/qNybJDX.png)](https://vimeo.com/135965232)
![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 Projects
- [Pi-hole Chrome extension](https://chrome.google.com/webstore/detail/pi-hole-list-editor/hlnoeoejkllgkjbnnnhfolapllcnaglh) ([open source](https://github.com/packtloss/pihole-extension))
- [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)
- [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
- [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)!
- [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/pi-hole/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/pi-hole/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.
Domains can be whitelisted and blacklisted using two pre-installed scripts. See [the wiki page](https://github.com/pi-hole/pi-hole/wiki/Whitelisting-and-Blacklisting) for more details
## 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.89"
}
```
The same output can be acheived on the CLI by running `chronometer.sh -j`
![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
```
origin=/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/pi-hole/pi-hole/blob/master/advanced/Scripts/chronometer.sh).
![Pi-hole LCD](http://i.imgur.com/nBEqycp.jpg)
See [this PR](https://github.com/jacobsalmela/pi-hole/pull/20) 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/pi-hole/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")

View File

@@ -0,0 +1,191 @@
#!/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 -n "::: Adding $1 to blacklist file..."
fi
echo $1 >> $blacklist
modifyHost=true
echo " done!"
else
if $versbose; then
echo "::: $1 already exists in blacklist.txt! 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 ":::"
echo -n "::: Modifying HOSTS file to blacklist $numberOf domain${plural}..."
if [[ -n $piholeIPv6 ]];then
cat $blacklist | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList
else
cat $blacklist | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
fi
fi
else
echo ":::"
for dom in "${domToRemoveList[@]}"
do
#we need to remove the domains from the blacklist file and the host file
echo "::: $dom"
echo -n "::: removing from HOSTS file..."
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList
echo " done!"
echo -n "::: removing from blackist.txt..."
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $blacklist
echo " done!"
done
fi
}
function Reload() {
# Reload hosts file
echo ":::"
echo -n "::: 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
echo " done!"
}
###################################################
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
ModifyHostFile
else
if $versbose; then
echo "::: No changes need to be made"
fi
exit 1
fi
if $reload; then
Reload
fi

View File

@@ -1,28 +1,135 @@
#!/bin/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
for (( ; ; ))
#!/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.
#Functions##############################################################################################################
piLog="/var/log/pihole.log"
gravity="/etc/pihole/gravity.list"
today=$(date "+%b %e")
function CalcBlockedDomains(){
CheckIPv6
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
CalcBlockedDomains
printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday"
}
function normalChrono(){
for (( ; ; ))
do
clear
# Displays a colorful Pi-hole logo
toilet -f small -F gay Pi-hole
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
echo ""
uptime | cut -d' ' -f11-
echo "-------------------------------"
# Uncomment to continually read the log file and display the current domain being blocked
#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'
#uncomment next 4 lines to use original query count calculation
#today=$(date "+%b %e")
#todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l)
#todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l)
#todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l)
CalcQueriesToday
CalcblockedToday
CalcPercentBlockedToday
CalcBlockedDomains
echo "Blocking: $blockedDomainsTotal"
#below commented line does not add up to todaysQueryCount
#echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6"
echo "Queries: $queriesToday" #same total calculation as dashboard
echo "Pi-holed: $blockedToday ($percentBlockedToday%)"
sleep 5
done
}
function displayHelp(){
echo "Displays stats about your piHole!"
echo " "
echo "Usage: chronometer.sh [optional:-j]"
echo "Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds"
echo " "
echo "Options:"
echo " -j, --json output stats as JSON formatted string"
echo " -h, --help display this help text"
exit 1
}
if [[ $# = 0 ]]; then
normalChrono
fi
for var in "$@"
do
clear
# Displays a colorful Pi-hole logo
toilet -f small -F gay Pi-hole
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
echo ""
uptime | cut -d' ' -f11-
echo "-------------------------------"
# Uncomment to continually read the log file and display the current domain being blocked
#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'
today=$(date "+%b %e")
todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l)
todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l)
todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l)
todaysAdsEliminated=$(cat /var/log/pihole.log | grep "$today" | awk '/\/etc\/pihole\/gravity.list/ {print $7}' | wc -l)
dividend=$(echo "$todaysAdsEliminated/$todaysQueryCount" | bc -l)
fp=$(echo "$dividend*100" | bc -l)
percentAds=$(echo ${fp:0:4})
echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6"
echo "Pi-holed: $todaysAdsEliminated ($percentAds%)"
sleep 5
case "$var" in
"-j" | "--json" ) outputJSON;;
"-h" | "--help" ) displayHelp;;
* ) exit 1;;
esac
done

View File

@@ -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

View File

@@ -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/pi-hole/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

View File

@@ -1,44 +1,201 @@
#!/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.
if [ $# = 0 ]; then
echo "Immediately whitelists one or more domains."
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 " -f, --force Force updating of the hosts files, even if there are no changes"
echo " -q, --quiet output is less verbose"
exit 1
fi
combopattern=""
#globals
whitelist=/etc/pihole/whitelist.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 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!
if $versbose; then
echo -n "::: Adding $1 to whitelist.txt..."
fi
echo $1 >> $whitelist
modifyHost=true
if $versbose; then
echo " done!"
fi
else
if $versbose; then
echo "::: $1 already exists in whitelist.txt, no need to add!"
fi
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
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
}
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 ":::"
echo -n "::: Modifying HOSTS file to whitelist $numberOf domain${plural}..."
awk -F':' '{print $1}' $whitelist | while read line; do echo "$piholeIP $line"; done > /etc/pihole/whitelist.tmp
awk -F':' '{print $1}' $whitelist | while read line; do echo "$piholeIPv6 $line"; done >> /etc/pihole/whitelist.tmp
echo "l" >> /etc/pihole/whitelist.tmp
grep -F -x -v -f /etc/pihole/whitelist.tmp /etc/pihole/gravity.list > /etc/pihole/gravity.tmp
rm /etc/pihole/gravity.list
mv /etc/pihole/gravity.tmp /etc/pihole/gravity.list
rm /etc/pihole/whitelist.tmp
echo " done!"
fi
else
#we need to add the removed domains to the hosts file
echo ":::"
echo "::: Modifying HOSTS file to un-whitelist domains..."
for rdom in "${domToRemoveList[@]}"
do
if [[ -n $piholeIPv6 ]];then
echo -n "::: Un-whitelisting $rdom on IPv4 and IPv6..."
echo $rdom | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList
echo " done!"
else
echo -n "::: Un-whitelisting $rdom on IPv4"
echo $rdom | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
echo " done!"
fi
echo -n "::: Removing $rdom from whitelist.txt..."
echo $rdom| sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $whitelist
echo " done!"
done
fi
}
function Reload() {
# Reload hosts file
echo ":::"
echo -n "::: 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
echo " done!"
}
###################################################
# 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$" /etc/pihole/whitelist.txt \
|| echo "$var" >> /etc/pihole/whitelist.txt
fi
case "$var" in
"-nr"| "--noreload" ) reload=false;;
"-d" | "--delmode" ) addmode=false;;
"-f" | "--force" ) force=true;;
"-q" | "--quiet" ) versbose=false;;
* ) HandleOther $var;;
esac
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")$"}')
PopWhitelistFile
# 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)
if $modifyHost || $force; then
ModifyHostFile
else
if $versbose; then
echo ":::"
echo "::: No changes need to be made"
exit 1
fi
fi
if $reload; then
Reload
fi

View File

@@ -1,12 +1,50 @@
# 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
interface=eth0
# 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=@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
# 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
# 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

View File

@@ -1,4 +1,6 @@
server.modules = (
"mod_access",
"mod_accesslog",
"mod_expire",
"mod_compress",
"mod_redirect",
@@ -14,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" )
@@ -38,10 +42,4 @@ $HTTP["url"] =~ "^/admin/" {
$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" )
}

View File

@@ -1,26 +1,15 @@
# /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 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

View File

@@ -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):
@@ -13,215 +20,459 @@
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)
webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git"
webInterfaceDir="/var/www/html/admin"
piholeGitUrl="https://github.com/pi-hole/pi-hole.git"
piholeFilesDir="/etc/.pihole"
# 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 ))
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)
#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 ##########
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")
######## FIRST CHECK ########
# Must be root to install
echo ":::"
if [[ $EUID -eq 0 ]];then
echo "::: You are root."
else
:
echo "::: sudo will be used for the install."
# 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
if [ -f "/etc/dnsmasq.d/01-pihole.conf" ]; then
#Likely an existing install
upgrade=true
else
upgrade=false
fi
####### FUNCTIONS ##########
###All credit for the below function goes to http://fitnr.com/showing-a-bash-spinner.html
spinner(){
local pid=$1
spin='-\|/'
i=0
while $SUDO kill -0 $pid 2>/dev/null
do
i=$(( (i+1) %4 ))
printf "\b${spin:$i:1}"
sleep .1
done
printf "\b"
}
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
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")
else
:
fi
}
chooseInterface()
{
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.
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" "ON")
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
echo "Using interface: $piholeInterface"
done
}
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
}
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
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
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 ]]
interfacesArray=()
firstloop=1
while read -r line
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 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)
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
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
echo "::: Using interface: $piholeInterface"
echo ${piholeInterface} > /tmp/piholeINT
done
}
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 IPv6" off)
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
for choice in $choices
do
case $choice in
IPv4 ) useIPv4=true;;
IPv6 ) useIPv6=true;;
esac
done
if [ $useIPv4 ] && [ ! $useIPv6 ]; then
getStaticIPv4Settings
setStaticIPv4
echo "::: Using IPv4 on $IPv4addr"
echo "::: IPv6 will NOT be used."
fi
if [ ! $useIPv4 ] && [ $useIPv6 ]; then
useIPv6dialog
echo "::: IPv4 will NOT be used."
echo "::: Using IPv6 on $piholeIPv6"
fi
if [ $useIPv4 ] && [ $useIPv6 ]; then
getStaticIPv4Settings
setStaticIPv4
useIPv6dialog
echo "::: Using IPv4 on $IPv4addr"
echo "::: Using IPv6 on $piholeIPv6"
fi
if [ ! $useIPv4 ] && [ ! $useIPv6 ]; then
echo "::: Cannot continue, neither IPv4 or IPv6 selected"
echo "::: Exiting"
exit 1
fi
}
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
}
getStaticIPv4Settings(){
# Ask if the user wants 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
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 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
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 "Your static IPv4 address: $IPv4addr"
# 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
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 $piholeInterface > /tmp/piholeINT
# 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
# If the settings are wrong, the loop continues
# Cancelling gateway settings window
ipSettingsCorrect=False
echo "User canceled."
exit
fi
else
# Cancelling gateway settings window
# Cancelling IPv4 settings window
ipSettingsCorrect=False
echo "User canceled."
exit
fi
else
# Cancelling IPv4 settings window
ipSettingsCorrect=False
echo "User canceled."
exit
done
# End the if statement for DHCP vs. static
fi
done
# End the if statement for DHCP vs. static
fi
}
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
}
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 echo ":::"
$SUDO echo -n "::: Installing scripts..."
$SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh
$SUDO cp /etc/.pihole/advanced/Scripts/chronometer.sh /usr/local/bin/chronometer.sh
$SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh
$SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh
$SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh
$SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh
$SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh
$SUDO echo " done."
}
installConfigs(){
$SUDO echo ":::"
$SUDO echo -n "::: Installing configs..."
$SUDO mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
$SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
$SUDO cp /etc/.pihole/advanced/dnsmasq.conf /etc/dnsmasq.conf
$SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf
$SUDO sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf
$SUDO echo " done."
}
stopServices(){
$SUDO echo ":::"
$SUDO echo -n "::: Stopping services..."
$SUDO service dnsmasq stop & spinner $! || true
$SUDO service lighttpd stop & spinner $! || true
$SUDO echo " done."
}
checkForDependencies(){
#Running apt-get update/upgrade with minimal output can cause some issues with
#requiring user input (e.g password for phpmyadmin see #218)
#We'll change the logic up here, to check to see if there are any updates availible and
# if so, advise the user to run apt-get update/upgrade at their own discretion
today=$(date "+%b %e")
echo ":::"
echo -n "::: Checking apt-get for upgraded packages...."
updatesToInstall=$(sudo apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst) & spinner $!
echo " done!"
echo ":::"
if [ $updatesToInstall > 0 ]; then
echo "::: There are $updatesToInstall updates availible for your pi!"
echo "::: Please consider running 'sudo apt-get update', followed by 'sudo apt-get upgrade'"
echo "::: after pi-hole has finished installing."
echo ":::"
#add in a prompt to give users the option to quit installation or continue
echo -n "::: Would you like to continue with the pi-hole installation? (Y/n):"
read answer
case "$answer" in
[yY][eE][sS]|[yY] ) echo "::: Continuing!";;
* ) echo "::: Quitting install, please run 'curl -L install.pi-hole.net | bash' after updating packages!"
exit 0;;
esac
else
echo "::: Your pi is up to date! Continuing with pi-hole installation..."
fi
echo ":::"
echo "::: Checking dependencies:"
dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget )
for i in "${dependencies[@]}"
do
:
echo -n "::: Checking for $i..."
if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
echo -n " Not found! Installing...."
$SUDO apt-get -y -qq install $i > /dev/null & spinner $!
echo " done!"
else
echo " already installed!"
fi
done
}
getGitFiles(){
echo ":::"
echo "::: Checking for existing base files..."
if is_repo $piholeFilesDir; then
make_repo $piholeFilesDir $piholeGitUrl
else
update_repo $piholeFilesDir
fi
echo ":::"
echo "::: Checking for existing web interface..."
if is_repo $webInterfaceDir; then
make_repo $webInterfaceDir $webInterfaceGitUrl
else
update_repo $webInterfaceDir
fi
}
is_repo() {
echo -n "::: Checking $1 is a repo..."
# if the directory does not have a .git folder
# it is not a repo
if [ -d "$1/.git" ]; then
echo " OK!"
return 1
fi
echo " not found!!"
return 0
}
make_repo() {
# remove the non-repod interface and clone the interface
echo -n "::: Cloning $2 into $1..."
$SUDO rm -rf $1
$SUDO git clone -q "$2" "$1" > /dev/null & spinner $!
echo " done!"
}
update_repo() {
# pull the latest commits
echo -n "::: Updating repo in $1..."
cd "$1"
$SUDO git pull -q > /dev/null & spinner $!
echo " done!"
}
setStaticIPv4()
{
# Append these lines to /etc/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
CreateLogFile(){
echo ":::"
$SUDO echo -n "::: Creating log file and changing owner to dnsmasq..."
if [ ! -f /var/log/pihole.log ]; then
$SUDO touch /var/log/pihole.log
$SUDO chmod 644 /var/log/pihole.log
$SUDO chown dnsmasq:root /var/log/pihole.log
$SUDO echo " done!"
else
$SUDO echo " already exists!"
fi
}
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 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
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/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
installPiholeWeb(){
$SUDO echo ":::"
$SUDO echo -n "::: Installing pihole custom index page..."
if [ -d "/var/www/html/pihole" ]; then
$SUDO echo " Existing page detected, not overwriting"
else
$SUDO mkdir /var/www/html/pihole
$SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig
$SUDO cp /etc/.pihole/advanced/index.html /var/www/html/pihole/index.html
$SUDO echo " done!"
fi
}
installCron(){
$SUDO echo ":::"
$SUDO echo -n "::: Installing latest Cron script..."
$SUDO cp /etc/.pihole/advanced/pihole.cron /etc/cron.d/pihole
$SUDO echo " done!"
}
runGravity(){
$SUDO echo ":::"
$SUDO echo "::: Preparing to run gravity.sh to refresh hosts..."
if ls /etc/pihole/list* 1> /dev/null 2>&1; then
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
$SUDO rm /etc/pihole/list.*
fi
#Don't run as SUDO, this was causing issues
echo "::: Running gravity.sh"
echo ":::"
/usr/local/bin/gravity.sh
}
installPihole(){
checkForDependencies # done
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 > /dev/null
getGitFiles
installScripts
installConfigs
#installWebAdmin
CreateLogFile
installPiholeWeb
installCron
runGravity
}
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 ############
@@ -230,48 +481,20 @@ 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
use4andor6
# Decide is IPv4 will be used
if [[ "$useIPv4" = true ]];then
echo "Using IPv4"
getStaticIPv4Settings
setStaticIPv4
else
useIPv4=false
echo "IPv4 will NOT be used."
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
else
useIPv6=false
echo "IPv6 will NOT be used. Consider a donation at pi-hole.net/donate"
fi
# Install and log everything to a file
installPihole | tee $tmpLog
# Move the log file into /etc/pihole for storage
sudo mv $tmpLog $instalLogLoc
$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.
displayFinalMessage
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
sudo service dnsmasq start
sudo service lighttpd start
$SUDO service dnsmasq start
$SUDO service lighttpd start

View File

@@ -1,19 +1,71 @@
#!/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.
# Must be root to uninstall
if [[ $EUID -eq 0 ]];then
echo "You are root."
else
echo "sudo will be used for the install."
# 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
######### 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/

View File

@@ -1,23 +1,53 @@
#!/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.
# Run this script as root or under sudo
echo ":::"
if [[ $EUID -eq 0 ]];then
echo "::: You are root."
else
echo "::: sudo will be used."
# 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 script as root."
exit 1
fi
fi
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 '{print $5}')
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}')
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
# 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/'
@@ -25,7 +55,8 @@ sources=('https://adaway.org/hosts.txt'
'http://www.malwaredomainlist.com/hostslist/hosts.txt'
'http://pgl.yoyo.org/adservers/serverlist.php?'
'http://someonewhocares.org/hosts/hosts'
'http://winhelp2002.mvps.org/hosts.txt')
'http://winhelp2002.mvps.org/hosts.txt'
'http://mirror1.malwaredomains.com/files/justdomains')
# Variables for various stages of downloading and formatting the list
basename=pihole
@@ -35,80 +66,99 @@ 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
echo "** Local calibration requested..."
echo "::: Local calibration requested..."
. $piholeDir/pihole.conf
fi
spinner(){
local pid=$1
local delay=0.001
local spinstr='/-\|'
spin='-\|/'
i=0
while $SUDO kill -0 $pid 2>/dev/null
do
i=$(( (i+1) %4 ))
printf "\b${spin:$i:1}"
sleep .1
done
printf "\b"
}
###########################
# collapse - begin formation of pihole
function gravity_collapse() {
echo "** Neutrino emissions detected..."
echo -n "::: 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
echo "** Creating pihole directory..."
mkdir $piholeDir
fi
$SUDO chmod 777 $piholeDir
find "$piholeDir" -type f -exec $SUDO chmod 666 {} \; & spinner $!
echo "."
else
echo -n "::: Creating pihole directory..."
mkdir $piholeDir & spinner $!
echo " done!"
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
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
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
# transport - curl the specified url with any needed command extentions
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
gravity_patternCheck $patternBuffer
# 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
# 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() {
# 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
echo "::: "
# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and # blank lines
for ((i = 0; i < "${#sources[@]}"; i++))
do
url=${sources[$i]}
# Get just the domain from the URL
domain=$(echo "$url" | cut -d'/' -f3)
@@ -119,7 +169,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
@@ -137,100 +187,145 @@ do
*) cmd_ext=""
esac
gravity_transport $url $cmd_ext $agent
done
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
echo "::: "
# Find all active domains and compile them into one file and remove CRs
echo -n "::: Aggregating list of domains..."
truncate -s 0 $piholeDir/$matterandlight & spinner $!
for i in "${activeDomains[@]}"
do
cat $i |tr -d '\r' >> $piholeDir/$matterandlight
done
echo " done!"
}
function gravity_pulsar() {
# 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}..."
function gravity_Blacklist(){
# Append blacklist entries if they exist
echo -n "::: Running blacklist script to update HOSTS file...."
blacklist.sh -f -nr -q > /dev/null & spinner $!
numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt")
plural=; [[ "$numBlacklisted" != "1" ]] && plural=s
echo " $numBlacklisted domain${plural} blacklisted!"
}
# 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 list
grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight
function gravity_Whitelist() {
echo ":::"
# Prevent our sources from being pulled into the hole
plural=; [[ "${sources[@]}" != "1" ]] && plural=s
echo -n "::: Adding ${#sources[@]} ad list source${plural} to the whitelist..."
urls=()
for url in ${sources[@]}
do
tmp=$(echo "$url" | awk -F '/' '{print $3}')
urls=("${urls[@]}" $tmp)
done
echo " done!"
echo -n "::: Running whitelist script to update HOSTS file...."
whitelist.sh -f -nr -q ${urls[@]} > /dev/null & spinner $!
numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt")
plural=; [[ "$numWhitelisted" != "1" ]] && plural=s
echo " $numWhitelisted domain${plural} whitelisted!"
}
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
echo -n "::: Removing duplicate domains...."
sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon & spinner $!
echo " done!"
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..."
# 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
#Add dummy domain Pi-Hole.IsWorking.OK to the top of gravity.list to make ping result return a friendlier looking domain!
echo -e "$piholeIP Pi-Hole.IsWorking.OK \n$piholeIPv6 Pi-Hole.IsWorking.OK" > $piholeDir/$accretionDisc
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
#Add dummy domain Pi-Hole.IsWorking.OK to the top of gravity.list to make ping result return a friendlier looking domain!
echo -e "$piholeIP Pi-Hole.IsWorking.OK" > $piholeDir/$accretionDisc
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
}
# blackbody - remove any remnant files from script processes
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 in active array 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
# 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..."
gravity_unique
sudo kill -HUP $(pidof dnsmasq)
# 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 -n "::: Formatting list of domains to remove comments...."
awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$matterandlight | sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova & spinner $!
echo " done!"
numberOf=$(wc -l < $piholeDir/$supernova)
echo "::: $numberOf domains being pulled in by gravity..."
gravity_unique
}
function gravity_reload() {
# Reload hosts file
echo ":::"
echo -n "::: Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ $dnsmasqPid ]]; then
# service already running - reload config
$SUDO kill -HUP $dnsmasqPid & spinner $!
else
# service not running, start it up
$SUDO service dnsmasq start & spinner $!
fi
echo " done!"
}
gravity_collapse
gravity_spinup
gravity_Schwarzchild
gravity_pulsar
gravity_hostFormat
gravity_advanced
gravity_hostFormat
gravity_blackbody
gravity_Whitelist
gravity_Blacklist
gravity_reload