Compare commits

...

221 Commits
2.0 ... v2.2

Author SHA1 Message Date
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
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
Jacob Salmela
9fe531d1aa Merge pull request #94 from dschaper/bug/CleanupFiles
Bug Fix - Cleanup remnant files
2015-11-27 11:59:47 -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
Dan Schaper
29ae57465b Bug Fix - Cleanup Files 2015-11-25 19:51:07 -08:00
Dan Schaper
f899aaad44 Merge branch 'jacobsalmela-development' into bug/CleanupFiles 2015-11-25 19:30:09 -08:00
Dan Schaper
7bbe56d61c Fix merge conflict 2015-11-25 19:29:13 -08:00
Jacob Salmela
8ad69cea33 Merge pull request #85 from dschaper/development
Refactored gravity.sh
2015-11-25 20:14:30 -06:00
Jacob Salmela
11e1859f7d Merge pull request #92 from dschaper/OutsideIP
IP detection update for gravity.sh
2015-11-25 19:05:56 -06:00
Dan Schaper
23856d65e2 IP address detection update 2015-11-25 16:35:36 -08:00
Jacob Salmela
bc0a8e7733 final dialog verbiage
Updating dialog to reflect changes in #90
2015-11-25 18:08:17 -06:00
Dan Schaper
2164e13303 Merge pull request #11 from dschaper/upstream
Pull upstream into master
2015-11-25 16:07:54 -08:00
Dan Schaper
3f4567d088 Merge pull request #10 from jacobsalmela/master
Upstream sync
2015-11-25 16:06:48 -08:00
Jacob Salmela
bf4ef2b314 Merge pull request #90 from dschaper/IPCheck
Pull IP info from outgoing interface
2015-11-25 18:02:09 -06:00
Dan Schaper
b011fe28d9 No longer need a reboot 2015-11-25 14:34:06 -08:00
Dan Schaper
b318d5350c Merge branch 'IPCheck' of https://github.com/dschaper/pi-hole into IPCheck 2015-11-25 14:24:15 -08:00
Dan Schaper
21ee63b7fb Get IP info from outgoing interface
Use IP to get interface information from outgoing interface. Use CIDR notation to make things easier.
2015-11-25 14:08:13 -08:00
Dan Schaper
4057a076a2 Merge pull request #9 from dschaper/upstream
Upstream sync
2015-11-25 14:03:25 -08:00
Dan Schaper
6e13134328 Revert FHS change until merged 2015-11-25 13:55:32 -08:00
Dan Schaper
29ae66c6db Check IP info for outgoing interface 2015-11-25 13:43:59 -08:00
Jacob Salmela
464003d674 uninstall script
This should remove the Pi-hole.
2015-11-25 13:36:39 -08:00
Cole Turner
03bbef07b5 pinholeIP should only use one IP
Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used.
2015-11-25 13:36:39 -08:00
Jacob Salmela
ecb514dd0a pihole in the cloud link 2015-11-25 13:36:39 -08:00
Jacob Salmela
04f6c478cc Updated install instructions
Also a screenshot of the dialog-based installer
2015-11-25 13:36:39 -08:00
Dan Schaper
20399b8262 Build array of active domains to concatenate
Fix #86 Builds an array of active domains, and then loops through that list to pick files to concatenate after truncating Matter.
2015-11-23 13:12:11 -08:00
Dan Schaper
e2b518568e Forgot to start the directory check function 2015-11-23 12:39:47 -08:00
Dan Schaper
100cbd4032 Merge pull request #7 from dschaper/upstream
Upstream
2015-11-23 04:56:40 -08:00
Dan Schaper
673113cb98 Merge pull request #6 from jacobsalmela/master
Upstream sync
2015-11-23 04:55:57 -08:00
Dan Schaper
a5d29a1048 Fix function ordering
Unique is now called after the comments are scrubbed from the unified domain list.
2015-11-23 03:26:10 -08:00
Dan Schaper
4f1bb12d36 More functions
Splitting into more functions
2015-11-23 03:11:16 -08:00
Dan Schaper
3d22e3bb7d Merge pull request #5 from dschaper/refactor
Code refactoring
2015-11-23 02:55:49 -08:00
Dan Schaper
af909e0ee6 Copyright issues
Some of the blocklists are copyright and need to be pulled and stored as is. They can be processed further in the script to remove comments.
2015-11-23 02:52:12 -08:00
Dan Schaper
fe46afd08d More functions
More refactoring
2015-11-23 01:47:24 -08:00
Dan Schaper
a1e609d005 Ugly hack permissions
Temporary hack for /etc/pihole directory and file permissions to pull out sudo requirement. (Irony is that is requires sudo.) This will be fixed later, but for now it's needed for existing installs so they don't break.
2015-11-23 01:16:00 -08:00
Dan Schaper
668d14e32d Add functions
Start to add functions for code reuse
2015-11-23 00:36:01 -08:00
Dan Schaper
f02c37ec07 Start code refactor, eliminate some repetitive code
Begin code refactor prepatation, prevent DRY where possible.
2015-11-22 23:49:38 -08:00
Jacob Salmela
4e50a03dfc uninstall script
This should remove the Pi-hole.
2015-11-21 13:29:03 -06:00
Jacob Salmela
a3a244c4af Merge pull request #82 from colepatrickturner/master
pinholeIP should only use one IP
2015-11-21 12:56:25 -06:00
Cole Turner
d0e9e90ebe pinholeIP should only use one IP
Updated piholeIP because if there are multiple network adapters, the gravity list will populate incorrectly with both IP addresses. Only one address should be used.
2015-11-20 22:53:43 -05:00
Jacob Salmela
1578a28363 pihole in the cloud link 2015-11-19 19:36:34 -06:00
Dan Schaper
9c13d2d88b Merge pull request #3 from jacobsalmela/master
Upstream sync
2015-11-18 02:17:11 -08:00
Jacob Salmela
b005da395f Updated install instructions
Also a screenshot of the dialog-based installer
2015-11-15 20:54:15 -06:00
Jacob Salmela
1b47a42792 Merge pull request #74 from dschaper/CherryPick
Cherry pick from PR73
2015-11-15 08:40:09 -06:00
Jacob Salmela
d477021532 Merge pull request #75 from dschaper/ConflictBreaker
Resolve merge conflicts
2015-11-15 08:39:38 -06:00
Dan Schaper
b895235ec1 Merge pull request #2 from dschaper/ConflictBreaker
Resolve merge conflicts
2015-11-15 06:02:27 -08:00
Dan Schaper
3a01b370d3 Merge pull request #1 from dschaper/CherryPick
Cherry pick
2015-11-15 06:01:58 -08:00
dschaper
689426180a Resolve merge conflicts 2015-11-15 13:59:51 +00:00
Jacob Salmela
d0d165ad16 chmod the log flusher 2015-11-15 13:14:56 +00:00
Jacob Salmela
0cb20fc080 typo 2015-11-15 13:14:46 +00:00
Jacob Salmela
dee3df4e11 download master gravity 2015-11-15 13:14:33 +00:00
Jacob Salmela
814873c643 reboot logic 2015-11-15 13:14:22 +00:00
Jacob Salmela
0936e394d4 reboot only if new IP was set 2015-11-15 13:14:07 +00:00
Jacob Salmela
ad91eb44fb choose an interface
also fixing ipv6 logic
2015-11-15 13:13:21 +00:00
Jacob Salmela
76c217d9cc moving to functions
Also download the whitelist script.  Ask for donations for IPv6 support.
2015-11-15 13:13:07 +00:00
Jacob Salmela
46b4000e75 reboot works better 2015-11-15 13:12:55 +00:00
Jacob Salmela
8ac8aa72ce Closing dialog
Also starting the Pi-hole and restarting networking.
2015-11-15 13:12:41 +00:00
Jacob Salmela
8df376860c simple function to run install commands
The arrays were cool, but I think this just works easier.
2015-11-15 13:12:30 +00:00
Jacob Salmela
eec0a31216 trying text output
I commented out the whiptail dialog at the end in place of text so you
can see what is going on.  I also install the crontab.
2015-11-15 13:12:16 +00:00
Jacob Salmela
fb3fde3d19 testing with no reboot 2015-11-15 13:12:04 +00:00
Jacob Salmela
1482b9563c does gravity use static IP?
The changes to the gravity script check for a temp file containing the
static address set during the install.  I need to verify it works so I
have to change the URL.  I will change it back before merging with
master.
2015-11-15 13:11:49 +00:00
Jacob Salmela
6d989f9160 overwrite html folder
If the files already exist, the installer stalls out because it asks if
you want to replace the existing files.  the -o option forces an
overwrite.
2015-11-15 13:11:29 +00:00
Jacob Salmela
f37990351e dumb mistake
fixed the variable name
2015-11-15 13:11:21 +00:00
Jacob Salmela
a44591ca6b fix permission denied for log file
Just use a temporary file and then move it over once the install is
complete.
2015-11-15 13:11:03 +00:00
Jacob Salmela
37f255d761 save output to log file instead
Since the progress bar hides the output now.  Instead of destroying it,
send it to a log file instead so users who want to see it still can.
2015-11-15 13:10:43 +00:00
Jacob Salmela
72cf5c91a5 set static ip and suppress more output
Created a function to set a static IP address.

I also sent STDOUT and STDERR to /dev/null so it doesn't mangle the
progress bar.  When the device reboots, it still gets mangled a bit
(via ssh).
2015-11-15 13:10:26 +00:00
Jacob Salmela
dfe1b126c4 progress dialog working
The ellipses cause errors, so they were removed.

I was on the right track with the associate array, but it would
previously execute the commands out of order.  Following directions
from the URL in the comments, I made another array that helps keep the
array in the order.
2015-11-15 13:10:09 +00:00
Jacob Salmela
4229a3e5e9 whiptail revamp of install script
This is a large update that helps users install the Pi-hole a bit
easier by using some dialog windows and also letting the user set a
static IP (I still need to figure out how to actually set the address
in the system, but everything else having to do with the install script
works).
2015-11-15 13:07:03 +00:00
Jacob Salmela
7a3add3a2e Merge pull request #72 from dschaper/master
Change shell path to environment
2015-11-14 20:02:28 -06:00
Dan Schaper
3992c0fba8 Merge pull request #5 from dschaper/dschaper-patch-1
Change shebang to environment
2015-11-14 15:09:22 -08:00
Dan Schaper
763aa6aa5c Change shebang to environment
Find bash in the environment, not hard coded to path
2015-11-11 00:43:00 -08:00
Jacob Salmela
ce0ca3cc61 for use with /etc/crontab
Adding a system-wide crontab to update the ad source lists, flush the
log daily, and (eventually) record the stats for historical purposes.
2015-11-07 07:58:35 -06:00
Dan Schaper
5495f23e4e Merge pull request #3 from jacobsalmela/master
Upstream sync
2015-11-06 15:47:58 -08:00
Jacob Salmela
e9bd7b1d47 Merge pull request #70 from jacobsalmela/development
Merge development changes
2015-11-06 17:29:29 -06:00
Jacob Salmela
a7d1b0b42c Revert "theme addition"
This reverts commit e1b8419a07.
2015-11-06 17:17:14 -06:00
Jacob Salmela
e1b8419a07 theme addition
Further adherence to the science/star trek theme
2015-11-06 17:16:14 -06:00
Jacob Salmela
932d410b66 anal retentive changes
OCD
2015-11-06 17:14:05 -06:00
Jacob Salmela
c297a86211 decluttering output
I love the adherence to the theme, but this line makes it difficult to
quickly read what is happening.
2015-11-06 17:10:17 -06:00
Jacob Salmela
1b65193fe4 new hostsfile url
This seems to be the more appropriate URL:
http://hosts-file.net/ad_servers.txt.

I compared it to the original URL using opendiff and they are exactly
the same.
2015-11-06 17:05:04 -06:00
Jacob Salmela
a06098bb16 remove filename from whitelist output
I also cleared the whitespace (or rather, Atom did).
I moved the pinhole.conf to it's current location
I commented out mahakala
2015-11-06 17:03:55 -06:00
Jacob Salmela
a675dc3f2c Merge pull request #68 from dschaper/hawson-reduce-memory
Hawson reduce memory
2015-11-06 16:50:37 -06:00
Dan Schaper
15b9fb68d7 Remove filename from wc
Line 118 and Line 127 changed wc to remove filename from output.
2015-11-06 10:24:12 -08:00
Dan Schaper
642c31c361 Theme changes 2015-11-05 18:33:05 -08:00
Dan Schaper
8e21488542 hawson memory reductions 2015-11-05 18:22:17 -08:00
Dan Schaper
deb6e76e08 Merge pull request #1 from dschaper/hawson-reduce-memory
Upstream Branch pseudo-rebase
2015-11-05 18:11:43 -08:00
Dan Schaper
23eece9443 Upstream Branch pseudo-rebase 2015-11-05 18:11:34 -08:00
Jacob Salmela
1b51b9ade3 for use as a cron job
The log will be flushed daily and stats will be stored in a DB for
displaying on the Web interface.
2015-11-05 14:31:38 -06:00
Jacob Salmela
a36352dfb6 Merge pull request #58 from Giermann/patch-1
add whitespace after $piholeIP
2015-11-04 21:02:58 -06:00
Jacob Salmela
271163ed66 Merge pull request #61 from nathanpjones/improve-whitelist-script
Improve whitelisting script
2015-11-04 20:35:42 -06:00
Jacob Salmela
3290dbbe48 link to Sky-Hole fork
Pi-hole in the cloud with Sky-Hole.
2015-10-31 17:09:21 -05:00
Jacob Salmela
d9aa19d2cd Link to Security Now! mention 2015-10-27 18:22:54 -05:00
Jacob Salmela
58e4fbd0fb New, easier-to-remember installation command
Also a picture of the Web interface and how to access it since it is now included in the automated installer.
2015-10-27 17:59:01 -05:00
Jacob Salmela
ec7bbd4ca8 Merge pull request #63 from jacobsalmela/installation
Installs the Web interface now
2015-10-27 17:28:28 -05:00
Jacob Salmela
2f9e650739 Merge pull request #62 from jacobsalmela/lighttpd
New lighttpd.conf.  Closes #31 and #50
2015-10-27 17:26:45 -05:00
Jacob Salmela
4ad2b68ee1 reverting IPv6 so I can merge lighttpd.conf 2015-10-27 17:16:17 -05:00
Jacob Salmela
7a0b92d2c1 missed a few file paths 2015-10-27 17:03:48 -05:00
Jacob Salmela
cfc4697236 Download and install the Web interface
dnsmasq also needs to be able to read the log file to properly display
the statistics
2015-10-27 16:21:20 -05:00
Jacob Salmela
bc3ece778d /var/www/html instead of /var/www
lighttpd in Jessie uses /var/www/html for the root folder, so in order
to only edit one lightpd.conf file, the installer will create the
correct directory even if not being run on Jessie.
2015-10-27 16:19:01 -05:00
Jacob Salmela
6d0c67af9a Install and enable PHP
Needed to view the admin web interface
2015-10-27 16:16:22 -05:00
Nathan Jones
deb48c124f Improve whitelisting script
Match domain exactly instead of partially.
Gather list of domains to minimize number of times that hosts file must be enumerated.
Only add domain to whitelist if it isn't already present.
2015-10-25 16:53:20 -07:00
Jacob Salmela
ca9ca36315 Merge pull request #60 from ManuCart/patch-1
Update basic-install.sh
2015-10-24 19:20:49 -05:00
Emmanuel CHARETTE
ced96905e9 Update basic-install.sh
change `shutdown -r now` to reboot for ssh users
2015-10-24 21:55:31 +02:00
Sven Giermann
d5ffec64f2 add whitespace after $piholeIP
In my case there had been no whitespace in piholeIP (I configured it statically because 'hostname -I' returns multiple IP addresses, which ends in errornous hosts file), so it's more safe to add one between IP and hostname.

Further, I removed the obsolete latentBlacklist variable.
2015-10-22 15:17:44 +02:00
Jacob Salmela
17904b3106 ads still get blocked when a 404 happens 2015-10-17 12:12:51 -05:00
Jacob Salmela
7b16a42f31 conditionals for accessing the web interface
This adds in some back end improvements for better debugging.  It also
allows you to access the Web interface, while you are connected to the
Pi-hole, which resolves #31
2015-10-17 12:11:03 -05:00
Jacob Salmela
28dd956449 changing web server root folder
Since the version of lighted in Jessie moved the default folder to
/var/www/html, I am going to make it the same for wheezy for better
compatibility.

Also removed spaces
2015-10-17 12:04:49 -05:00
Jacob Salmela
bf397db73e adding crontab file
I plan to use this to be deployed with the automatic installer.  Just
pushing the file for now so I can test download it.
2015-10-15 18:58:12 -05:00
Jacob Salmela
963eacfe05 commenting out mahakala list
Due to so many users having issues with this list blocking legitimate
domains such as microsoft.com, apple.com, xkcd.com and more, I am
turning it off by default.  While this drastically reduces the amount
of domains blocked, ad-blocking performance still seems to function
quite well.

Long-time users can simply uncomment the list, but this will make it so
new users have a more pleasant experience.

If you already have the mahakala list, you will need to remove it first
with this command:

sudo rm /etc/pihole/list.2.adblock.mahakala.is.domains

There are a few other lists I am looking at including, but this will
provide an immediate fix.
2015-10-11 09:28:11 -05:00
Jacob Salmela
ee40bc0423 forgot to redirect it to the file 2015-10-10 14:02:18 -05:00
Jacob Salmela
428d5e9a06 Revert "new command to print both the IPv4 and IPv6 address on their own line"
This reverts commit 88e6ce041d.
2015-10-10 14:01:10 -05:00
Jacob Salmela
88e6ce041d new command to print both the IPv4 and IPv6 address on their own line
I'm not 100% sure if you can add multiple IP addresses to one domain on
a single line, so I just broke it up into two.  It makes the file
bigger and longer, but I'll have to see how it works
2015-10-10 13:55:49 -05:00
Jacob Salmela
e3c0fdfeb7 new variables for IPv4 and IPv6
The IPv6 address looks for the one created from the MAC address.
2015-10-10 13:52:54 -05:00
Jacob Salmela
dfbf1a952f deleting tabs and spaces 2015-10-10 13:51:21 -05:00
Jacob Salmela
8f3bbadf73 Merge branch 'master' into development 2015-10-10 13:40:07 -05:00
Jacob Salmela
6976532ef5 Removing IP as input
Due to users having issues with the IP not being entered properly, I am restoring the original way to store `piholeIP` until a better solution can be formed.
2015-10-06 06:12:52 -05:00
Jacob Salmela
89e63c7e90 Merge pull request #52 from mospaeda/mospaeda-patch-1
Dnsutils package missing for dig tool
2015-10-05 17:55:12 -05:00
mospaeda
06e89614e9 Dnsutils package missing for dig tool 2015-10-05 23:58:15 +02:00
Jacob Salmela
d859d925e3 Merge pull request #47 from mospaeda/master
Tools are missing for chronometer.sh
2015-10-03 11:10:01 -05:00
Jacob Salmela
d52fdde2f8 using double bracket notation
Despite the script running successfully, it produced this error:

`/usr/local/bin/gravity.sh: line 8: [: missing `]'`

prior to this fix.
2015-10-03 11:06:50 -05:00
Jacob Salmela
533f707578 Merge pull request #45 from jofrep/IP-as-input-parameter
Allow external IP as an input script parameter
2015-10-03 11:05:52 -05:00
Jofre Palau
4ea397bc71 Removed extra blank space if no IP added 2015-09-28 17:40:13 +02:00
mospaeda
7b49677d24 add install for bc and toilet tools
these tools are needed later by chronometer.sh
2015-09-22 22:38:25 +02:00
mospaeda
56d4b7b0f7 Update basic-install.sh 2015-09-22 22:13:16 +02:00
mospaeda
96bc557e21 Update basic-install.sh 2015-09-22 22:11:30 +02:00
mospaeda
11fcfc4bf5 Update basic-install.sh 2015-09-22 22:10:33 +02:00
Jacob Salmela
2ca9b6b005 Merge pull request #42 from hawson/noswap
Allow for local settings to disable swap
2015-09-18 16:49:43 -05:00
Jofre Palau
885069d440 Allow external IP as an input script parameter: ./gravity.sh 123.123.123.123 2015-09-18 23:06:29 +02:00
mospaeda
6fc798ebe4 Update basic-install.sh 2015-09-18 00:40:21 +02:00
mospaeda
2b4500363b Update basic-install.sh 2015-09-18 00:31:17 +02:00
mospaeda
2d91a7a3c4 Update basic-install.sh 2015-09-18 00:22:21 +02:00
mospaeda
d15a085dd0 Update basic-install.sh 2015-09-18 00:20:50 +02:00
mospaeda
8718321727 Update basic-install.sh 2015-09-18 00:06:04 +02:00
mospaeda
d44e48114e Merge pull request #4 from jacobsalmela/master
Rebase
2015-09-17 23:51:32 +02:00
Jesse Becker
cfac2be334 toggle test case for noswap 2015-09-13 15:23:29 -04:00
Jesse Becker
4a4db7ab56 Allow for local settings to disable swap 2015-09-11 22:54:37 -04:00
Jacob Salmela
23713d82a0 1.6 million instead of 900,000
Updating to reflect the latest amount of domains the Pi-hole blocks.
2015-09-06 10:16:11 -05:00
Jacob Salmela
e19a6c3624 Merge pull request #38 from korhadris/master
Fixes #32 and fixes #35
2015-09-06 10:11:39 -05:00
jacobsalmela
2792238472 Merge remote-tracking branch 'origin/development' 2015-08-26 18:08:19 -05:00
jacobsalmela
fa77b7b69d increase swap to fix #37 memory error
This will increase the swap file to 500MB before downloading the lists.
 Most of the issue comes from the mahakala list, which is so large.  If
no swap file is found, one is created.
2015-08-25 18:01:54 -05:00
jacobsalmela
d68c262b96 swap file to eliminate memory allocation error 2015-08-24 16:30:00 -05:00
korhadris
98c94912e1 Replace use of grep -w with grep -x.
Prepend "^" to start of latentWhitelist.txt lines.

The -x switch requires a full line match of the regexp, where as -w
will try to find the match somewhere in the line, looking for work
breaks. Combined with turning the whitelist lines into full regexps,
this results in significantly faster parsing.

Having "^" prepended to the lines also keeps false whitelisting from
occuring, such as the following example:

If whitelist.txt contains "google.com" it would whitelist many other
sites that end in "google.com" as long as there is a non-word
character preceeding the google (such as "-", or ".").
2015-08-22 23:37:01 -07:00
korhadris
a26377d229 Append ad list sources to latentWhitelist.txt to prevent them from being filtered.
Additional fixes for #35. This will prevent our own sources from being
filtered out by competing source lists.
2015-08-22 21:44:41 -07:00
korhadris
e464c04490 Ignore domains in ad lists that do not contain . characters.
This will skip entries such as `localhost`, `android`, `debian` and
empty lines as listed in #35.
2015-08-22 17:47:22 -07:00
korhadris
bb7db11214 Changing printouts when updating sources to tell what is going on when
manually running gravity.sh

This will print "Getting $domain list... " for each domain, followed
by either "Done" if data was received and validated, or "Skipping
list because it does not have any new entries" if no updates were
needed.
2015-08-22 17:33:30 -07:00
korhadris
1f29d01694 Remove leading and trailing whitespace and . characters and
duplicate `.` characters as each list is stored.

Should fix #32.
2015-08-22 17:05:19 -07:00
korhadris
d6d192cb0a Use url variable to store ${sources[$i]} value to improve readability.
I also wanted to replace the for loop iterating over indices with
something like:

`for url in $sources[@]}`

It made the use of `$i` in the save location more annoying though.
2015-08-22 16:22:07 -07:00
korhadris
0ec6eab683 Appending ".$justDomainsExtension" to $saveLocation variable.
Every use of $saveLocation was adding this and making lines
longer.
2015-08-22 16:04:54 -07:00
korhadris
159b29b80b Replace spaces with tabs to make indentation consistent within the file. 2015-08-22 15:56:32 -07:00
mospaeda
942bdd2b35 Merge pull request #3 from jacobsalmela/master
Rebase
2015-03-29 20:18:40 +02:00
11 changed files with 801 additions and 196 deletions

View File

@@ -1,45 +1,74 @@
# Raspberry Pi Ad Blocker
**A black hole for ads, hence Pi-hole**
![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**.
## Coverage
Featured on [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) and [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)!
## Automated Install
# Automated Install
#### Designed For Raspberry Pi B, B+, 2,
##### and Zero (with an Ethernet adapter)
1. Install Raspbian
2. Set a **static** IP address
3. Run the command below
2. Run the command below
```curl -s "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/automated%20install/basic-install.sh" | bash```
### ```curl -L install.pi-hole.net | bash```
![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png)
Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually.
A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0).
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")
# How Does It Work?
**Watch the 60-second video below to get a quick overview**
[![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232)
## Video Coverage
### TekThing
Pi-hole is mentioned at the two minute mark
[![Pi-hole on TekThing](http://img.youtube.com/vi/8Co59HU2gY0/0.jpg)](https://youtu.be/8Co59HU2gY0?t=2m)
### Security Now! Podcast
Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there)
[![Pi-hole on Security Now!](http://img.youtube.com/vi/p7-osq_y8i8/0.jpg)](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s)
### Tech Blogs
Pi-hole has been written about on:
- [Medium](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d)
- [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/)
- [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)!
## Partnering With Optimal.com
Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/).
## Technical Details
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 900,000 entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0).
The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0).
## Whitelist and blacklist
You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically.
## Web Interface
I am also working on a [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) so you can view stats and change settings.
The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at:
`http://192.168.1.x/admin/index.php`
![Web](http://i.imgur.com/m114SCn.png)
## Custom Config File
If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below:
```
origin=/var/run/pihole
piholeDir=/var/run/pihole
adList=/etc/dnsmasq.d/adList
```
See [this PR](https://github.com/jacobsalmela/pi-hole/pull/20) for more details.
See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details.
### How It Works
A technical and detailed description can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0)!
@@ -47,4 +76,9 @@ A technical and detailed description can be found [here](http://jacobsalmela.com
## Other Operating Systems
This script will work for other UNIX-like systems with some slight **modifications**. As long as you can install `dnsmasq` and a Webserver, it should work OK. The automated install only works for a clean install of Raspiban right now since that is how the project originated.
[![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")
### Examples Of The Pi-hole On Other Operating Systems
- [Sky-Hole](http://dlaa.me/blog/post/skyhole)
- [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/)
- [unRaid-hole](https://github.com/spants/unraidtemplates/blob/master/Spants/unRaid-hole.xml#L13)--[Repo and more info](http://lime-technology.com/forum/index.php?PHPSESSID=c0eae3e5ef7e521f7866034a3336489d&topic=38486.0)
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")

View File

@@ -1,6 +1,13 @@
#!/bin/bash
#!/usr/bin/env bash
# Displays Pi-hole stats on the Adafruit PiTFT 2.8" touch screen
# Set the pi user to log in automatically and run this script from /etc/profile
# (c) 2015 by Jacob Salmela
# This file is part of Pi-hole.
#
# Pi-hole is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
for (( ; ; ))
do
clear

View File

@@ -0,0 +1,11 @@
#!/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

@@ -1,13 +1,57 @@
#!/bin/bash
#!/usr/bin/env bash
# (c) 2015 by Jacob Salmela
# This file is part of Pi-hole.
#
# Pi-hole is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
whitelist=/etc/pihole/whitelist.txt
adList=/etc/pihole/gravity.list
if [[ ! -f $whitelist ]];then
touch $whitelist
fi
if [[ $# = 0 ]]; then
echo "Immediately whitelists one or more domains."
echo "Usage: whitelist.sh domain1 [domain2 ...]"
fi
combopattern=""
# For each argument passed to this script
for var in "$@"
do
echo "Whitelisting $var..."
# Use sed to search for the domain in /etc/pihole/gravity.list and remove it using an in-place edit
sed -i "/$var/d" /etc/pihole/gravity.list
# Also add the domain to the whitelist.txt in /etc/pihole
echo "$var" >> /etc/pihole/whitelist.txt
echo "Whitelisting $var..."
# Construct basic pattern to match domain name.
basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g')
if [[ "$basicpattern" != "" ]]; then
# Add to the combination pattern that will be used below
if [[ "$combopattern" != "" ]]; then combopattern="$combopattern|"; fi
combopattern="$combopattern$basicpattern"
# Also add the domain to the whitelist but only if it's not already present
grep -E -q "^$basicpattern$" $whitelist \
|| echo "$var" >> $whitelist
fi
done
echo "** $# domain(s) whitelisted."
# Force dnsmasq to reload /etc/pihole/gravity.list
kill -HUP $(pidof dnsmasq)
# Now report on and remove matched domains
if [[ "$combopattern" != "" ]]; then
echo "Modifying hosts file..."
# Construct pattern to match entry in hosts file.
# This consists of one or more IP addresses followed by the domain name.
pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}')
# Output what will be removed and then actually remove
sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList
sed -r -i '/'"$pattern"'/d' $adList
echo "** $# domain(s) whitelisted."
# Force dnsmasq to reload /etc/pihole/gravity.list
kill -HUP $(pidof dnsmasq)
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

1
advanced/dphys-swapfile Normal file
View File

@@ -0,0 +1 @@
CONF_SWAPSIZE=500

View File

@@ -1,38 +1,51 @@
server.modules = (
"mod_access",
"mod_accesslog",
"mod_expire",
"mod_compress",
"mod_redirect",
"mod_setenv",
"mod_rewrite"
)
server.document-root = "/var/www"
server.document-root = "/var/www/html"
server.error-handler-404 = "pihole/index.html"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
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" )
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
# Set access to 1 day for better query performance when the list gets so large
# http://jacobsalmela.com/raspberry-pi-block-ads-adtrap/#comment-2013820434
$HTTP["url"] =~ "^/pihole/" {
expire.url = ("" => "access plus 1 days")
# If the URL starts with /admin, it is the Web interface
$HTTP["url"] =~ "^/admin/" {
# Create a response header for debugging using curl -I
setenv.add-response-header = ( "X-Pi-hole" => "The Pi-hole Web interface is working!" )
}
# If the URL does not start with /admin, then it is a query for an ad domain
$HTTP["url"] =~ "^(?!/admin)/.*" {
# Create a response header for debugging using curl -I
setenv.add-response-header = ( "X-Pi-hole" => "A black hole for Internet advertisements." )
# Set the cache to 1 day for better performance
expire.url = ("" => "access plus 1 days")
# Send the query into the black hole
url.rewrite = (".*" => "pihole/index.html" )
}
# Rewrites all URLs to the /var/www/pihole/index.html
$HTTP["host"] =~ ".*" {
url.rewrite = (".*" => "pihole/index.html")
}

26
advanced/pihole.cron Normal file
View File

@@ -0,0 +1,26 @@
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# Pi-hole: Update the ad sources once a week on Sunday at 01:59
# Download any updates from the ad lists
59 1 * * 7 root /usr/local/bin/gravity.sh
# Pi-hole: Parse the log file before it is flushed and save the stats to a database
# This will be used for a historical view of your Pi-hole's performance
#50 11 * * * root /usr/local/bin/dailyLog.sh
# Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control
# Stats will be viewable in the Web interface thanks to the cron job above
58 11 * * * root /usr/local/bin/piholeLogFlush.sh

View File

@@ -1,77 +1,325 @@
#!/bin/bash
# Pi-hole automated install
# Raspberry Pi Ad-blocker
#!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements
# by Jacob Salmela
# Network-wide ad blocking via your Raspberry Pi
#
# Install with this command (from the Pi):
# (c) 2015 by Jacob Salmela
# This file is part of Pi-hole.
#
# curl -s "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/automated%20install/basic-install.sh" | bash
# 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
#
# Or run the commands below in order
# Install with this command (from your Pi):
#
# curl -L install.pi-hole.net | bash
clear
echo " _____ _ _ _ "
echo " | __ (_) | | | | "
echo " | |__) | __ | |__ ___ | | ___ "
echo " | ___/ | |__| | '_ \ / _ \| |/ _ \ "
echo " | | | | | | | | (_) | | __/ "
echo " |_| |_| |_| |_|\___/|_|\___| "
echo " "
echo " Raspberry Pi Ad-blocker "
echo " "
echo "Set a static IP before running this!"
echo " "
echo " Press Enter when ready "
echo " "
read
######## VARIABLES #########
tmpLog=/tmp/pihole-install.log
instalLogLoc=/etc/pihole/install.log
# Find the rows and columns
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
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}')
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..."
echo "Original Pi-hole detected. Initiating sub space transport"
sudo mkdir -p /etc/pihole/original/
mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d")
mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d")
mv /etc/resolv.conf /etc/pihole/original/resolv.conf.$(date "+%Y-%m-%d")
mv /etc/lighttpd/lighttpd.conf /etc/pihole/original/lighttpd.conf.$(date "+%Y-%m-%d")
mv /var/www/pihole/index.html /etc/pihole/original/index.html.$(date "+%Y-%m-%d")
mv /usr/local/bin/gravity.sh /etc/pihole/original/gravity.sh.$(date "+%Y-%m-%d")
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
}
echo "Updating the Pi..."
sudo apt-get update
sudo apt-get -y upgrade
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
echo "Installing DNS..."
sudo apt-get -y install dnsmasq
sudo update-rc.d dnsmasq enable
# 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
echo "Installing a Web server"
sudo apt-get -y install lighttpd
sudo chown www-data:www-data /var/www
sudo chmod 775 /var/www
sudo usermod -a -G www-data pi
# Explain the need for a static address
whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
echo "Stopping services to modify them..."
sudo service dnsmasq stop
sudo service lighttpd stop
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c
}
echo "Backing up original config files and downloading Pi-hole ones..."
chooseInterface()
{
# Turn the available interfaces into an array so it can be used with a whiptail dialog
interfacesArray=()
firstloop=1
while read -r line
do
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)
echo "IPv4 selected."
useIPv4=true
;;
IPv6)
echo "IPv6 selected."
useIPv6=true
;;
esac
done
}
useIPv6dialog()
{
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
whiptail --msgbox --backtitle "IPv6..." --title "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 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 ]]
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)
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
# Cancelling gateway settings window
ipSettingsCorrect=False
echo "User canceled."
exit
fi
else
# Cancelling IPv4 settings window
ipSettingsCorrect=False
echo "User canceled."
exit
fi
done
# End the if statement for DHCP vs. static
fi
}
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 curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh
sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh
sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh
sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh
sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh
}
installConfigs(){
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
sudo mv /var/www/index.lighttpd.html /var/www/index.lighttpd.orig
sudo curl -o /etc/dnsmasq.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"
sudo curl -o /etc/lighttpd/lighttpd.conf "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"
sudo mkdir /var/www/pihole
sudo curl -o /var/www/pihole/index.html "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"
sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf
sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf
sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf
}
echo "Locating the Pi-hole..."
sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"
sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"
sudo chmod 755 /usr/local/bin/gravity.sh
sudo chmod 755 /usr/local/bin/chronometer.sh
stopServices(){
sudo service dnsmasq stop || true
sudo service lighttpd stop || true
}
echo "Entering the event horizon..."
installDependencies(){
sudo apt-get update
sudo apt-get -y upgrade
sudo apt-get -y install dnsutils bc toilet
sudo apt-get -y install dnsmasq
sudo apt-get -y install lighttpd php5-common php5-cgi php5
}
installWebAdmin(){
sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip
sudo unzip -oq /var/www/master.zip -d /var/www/html/
sudo mv /var/www/html/AdminLTE-master /var/www/html/admin
sudo rm /var/www/master.zip 2>/dev/null
sudo touch /var/log/pihole.log
sudo chmod 644 /var/log/pihole.log
sudo chown dnsmasq:root /var/log/pihole.log
}
installPiholeWeb(){
sudo mkdir /var/www/html/pihole
sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig
sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html
}
installCron(){
sudo mv /etc/crontab /etc/crontab.orig
sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron
}
installPihole()
{
installDependencies
stopServices
sudo chown www-data:www-data /var/www/html
sudo chmod 775 /var/www/html
sudo usermod -a -G www-data pi
sudo lighty-enable-mod fastcgi fastcgi-php
installScripts
installConfigs
installWebAdmin
installPiholeWeb
installCron
sudo /usr/local/bin/gravity.sh
}
echo "Restarting..."
sudo shutdown -r now
displayFinalMessage(){
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
$IPv4addr
$piholeIPv6
If you set a new IP address, you should restart the Pi.
The install log is in /etc/pihole." $r $c
}
######## SCRIPT ############
# Start the installer
welcomeDialogs
# 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
useIPv6dialog
echo "Using IPv6."
echo "Your IPv6 address is: $piholeIPv6"
else
useIPv6=false
echo "IPv6 will NOT be used."
fi
# Install and log everything to a file
installPihole | tee $tmpLog
# Move the log file into /etc/pihole for storage
sudo mv $tmpLog $instalLogLoc
displayFinalMessage
sudo service dnsmasq start
sudo service lighttpd start

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Completely uninstalls the Pi-hole
# (c) 2015 by Jacob Salmela
# This file is part of Pi-hole.
#
# Pi-hole is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
######### SCRIPT ###########
sudo apt-get -y remove --purge dnsutils bc toilet
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/

View File

@@ -1,122 +1,278 @@
#!/bin/bash
#!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements
# (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
# 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.
# This script should only be run after you have a static IP address set on the Pi
piholeIP=$(hostname -I)
piholeIPfile=/tmp/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6
if [[ -f $piholeIPfile ]];then
# If the file exists, it means it was exported from the installation script and we should use that value instead of detecting it in this script
piholeIP=$(cat $piholeIPfile)
rm $piholeIPfile
else
# Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
piholeIP=${piholeIPCIDR%/*}
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
sources=('https://adaway.org/hosts.txt'
'http://adblock.gjtech.net/?format=unix-hosts'
'http://adblock.mahakala.is/'
'http://hosts-file.net/.%5Cad_servers.txt'
#'http://adblock.mahakala.is/'
'http://hosts-file.net/ad_servers.txt'
'http://www.malwaredomainlist.com/hostslist/hosts.txt'
'http://pgl.yoyo.org/adservers/serverlist.php?'
'http://someonewhocares.org/hosts/hosts'
'http://winhelp2002.mvps.org/hosts.txt')
# Variables for various stages of downloading and formatting the list
adList=/etc/pihole/gravity.list
origin=/etc/pihole
piholeDir=/etc/pihole
if [[ -f $piholeDir/pihole.conf ]];then
. $piholeDir/pihole.conf
fi
justDomainsExtension=domains
matter=pihole.0.matter.txt
andLight=pihole.1.andLight.txt
supernova=pihole.2.supernova.txt
eventHorizon=pihole.3.eventHorizon.txt
accretionDisc=pihole.4.accretionDisc.txt
eyeOfTheNeedle=pihole.5.wormhole.txt
basename=pihole
piholeDir=/etc/$basename
adList=$piholeDir/gravity.list
blacklist=$piholeDir/blacklist.txt
latentBlacklist=$origin/latentBlacklist.txt
whitelist=$piholeDir/whitelist.txt
latentWhitelist=$origin/latentWhitelist.txt
latentWhitelist=$piholeDir/latentWhitelist.txt
justDomainsExtension=domains
matter=$basename.0.matter.txt
andLight=$basename.1.andLight.txt
supernova=$basename.2.supernova.txt
eventHorizon=$basename.3.eventHorizon.txt
accretionDisc=$basename.4.accretionDisc.txt
eyeOfTheNeedle=$basename.5.wormhole.txt
echo "** Neutrino emissions detected..."
# Create the pihole resource directory if it doesn't exist. Future files will be stored here
if [[ -d $piholeDir ]];then
:
else
echo "** Creating pihole directory..."
sudo mkdir $piholeDir
# After setting defaults, check if there's local overrides
if [[ -r $piholeDir/pihole.conf ]];then
echo "** Local calibration requested..."
. $piholeDir/pihole.conf
fi
# Loop through domain list. Download each one and remove commented lines (lines beginning with '# 'or '/') and blank lines
for ((i = 0; i < "${#sources[@]}"; i++))
do
# Get just the domain from the URL
domain=$(echo "${sources[$i]}" | cut -d'/' -f3)
# Save the file as list.#.domain
saveLocation=$origin/"list"."$i"."$domain"
# Use a case statement to download lists that need special cURL commands to complete properly
case "$domain" in
"adblock.mahakala.is") data=$(curl -s -A 'Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0' -e http://forum.xda-developers.com/ -z $saveLocation."$justDomainsExtension" "${sources[$i]}");;
"pgl.yoyo.org") data=$(curl -s -d mimetype=plaintext -d hostformat=hosts -z $saveLocation."$justDomainsExtension" "${sources[$i]}");;
###########################
# collapse - begin formation of pihole
function gravity_collapse() {
echo "** Neutrino emissions detected..."
*) data=$(curl -s -z $saveLocation."$justDomainsExtension" -A "Mozilla/10.0" "${sources[$i]}");;
esac
if [[ -n "$data" ]];then
echo "Getting $domain list..."
# Remove comments and print only the domain name
# Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious
# This helps with that and makes it easier to read
# It also helps with debugging so each stage of the script can be researched more in depth
echo "$data" | awk 'NF {if ($1 !~ "#") { if (NF>1) {print $2} else {print $1}}}' > $saveLocation."$justDomainsExtension"
# 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 "Skipping $domain list because it does not have any new entries..."
echo "** Creating pihole directory..."
mkdir $piholeDir
fi
done
}
# Find all files with the .domains extension and compile them into one file and remove CRs
echo "** Aggregating list of domains..."
find $origin/ -type f -name "*.$justDomainsExtension" -exec cat {} \; | tr -d '\r' > $origin/$matter
# 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 "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
}
# Append blacklist entries if they exist
if [[ -f $blacklist ]];then
# 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
# 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
url=${sources[$i]}
# Get just the domain from the URL
domain=$(echo "$url" | cut -d'/' -f3)
# Save the file as list.#.domain
saveLocation=$piholeDir/list.$i.$domain.$justDomainsExtension
activeDomains[$i]=$saveLocation
agent="Mozilla/10.0"
echo -n " Getting $domain list: "
# Use a case statement to download lists that need special cURL commands
# to complete properly and reset the user agent when required
case "$domain" in
"adblock.mahakala.is")
agent='Mozilla/5.0 (X11; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0'
cmd_ext="-e http://forum.xda-developers.com/"
;;
"pgl.yoyo.org")
cmd_ext="-d mimetype=plaintext -d hostformat=hosts"
;;
# Default is a simple request
*) cmd_ext=""
esac
gravity_transport $url $cmd_ext $agent
done
}
# Schwarzchild - aggregate domains to one list and 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
}
# Pulsar - White/blacklist application
function gravity_pulsar() {
# Append blacklist entries if they exist
if [[ -r $blacklist ]];then
numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l)
echo "** Blacklisting $numberOf domain(s)..."
cat $blacklist >> $origin/$matter
else
:
fi
cat $blacklist >> $piholeDir/$matter
fi
function gravity_advanced()
###########################
{
numberOf=$(cat $origin/$andLight | sed '/^\s*$/d' | wc -l)
echo "** $numberOf domains being pulled in by gravity..."
# Remove carriage returns and preceding whitespace
cat $origin/$andLight | sed $'s/\r$//' | sed '/^\s*$/d' > $origin/$supernova
# Whitelist (if applicable) domains
if [[ -r $whitelist ]];then
# Remove whitelist entries
numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s
echo "** Whitelisting $numberOf domain${plural}..."
# Append a "$" to the end, prepend a "^" to the beginning, and
# replace "." with "\." of each line to turn each entry into a
# regexp so it can be parsed out with grep -x
awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist
else
rm $latentWhitelist 2>/dev/null
fi
# 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_unique() {
# Sort and remove duplicates
cat $origin/$supernova | sort | uniq > $origin/$eventHorizon
numberOf=$(cat $origin/$eventHorizon | sed '/^\s*$/d' | wc -l)
sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon
numberOf=$(wc -l < $piholeDir/$eventHorizon)
echo "** $numberOf unique domains trapped in the event horizon."
}
function gravity_hostFormat() {
# Format domain list as "192.168.x.x domain.com"
echo "** Formatting domains into a HOSTS file..."
cat $origin/$eventHorizon | awk '{sub(/\r$/,""); print "'"$piholeIP"'" $0}' > $origin/$accretionDisc
# If there is a value in the $piholeIPv6, then IPv6 will be used, so the awk command modified to create a line for both protocols
if [[ -n $piholeIPv6 ]];then
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' > $piholeDir/$accretionDisc
else
# Otherwise, just create gravity.list as normal using IPv4
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' > $piholeDir/$accretionDisc
fi
# Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it
sudo cp $origin/$accretionDisc $adList
kill -HUP $(pidof dnsmasq)
}
# Whitelist (if applicable) then remove duplicates and format for dnsmasq
if [[ -f $whitelist ]];then
# Remove whitelist entries
numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l)
echo "** Whitelisting $numberOf domain(s)..."
# Append a "$" to the end of each line so it can be parsed out with grep -w
echo -n "^$" > $latentWhitelist
awk -F '[# \t]' 'NF>0&&$1!="" {print $1"$"}' $whitelist > $latentWhitelist
cat $origin/$matter | grep -vwf $latentWhitelist > $origin/$andLight
gravity_advanced
else
cat $origin/$matter > $origin/$andLight
gravity_advanced
fi
cp $piholeDir/$accretionDisc $adList
}
# blackbody - remove any remnant files from script processes
function gravity_blackbody() {
# Loop through list files
for file in $piholeDir/*.$justDomainsExtension
do
# If list is 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
}
function gravity_reload() {
# Reload hosts file
echo "** Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ $dnsmasqPid ]]; then
# service already running - reload config
sudo kill -HUP $dnsmasqPid
else
# service not running, start it up
sudo service dnsmasq start
fi
}
gravity_collapse
gravity_spinup
gravity_Schwarzchild
gravity_pulsar
gravity_advanced
gravity_hostFormat
gravity_blackbody
gravity_reload