Compare commits
270 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
3853997295 | ||
|
76899c9ac5 | ||
|
99a5b3a98a | ||
|
219aff9a93 | ||
|
b6e1b3bff0 | ||
|
1ce888e828 | ||
|
1c10a801dc | ||
|
48fa83c9ac | ||
|
31ea3a2757 | ||
|
05e0003555 | ||
|
01f53f6d6c | ||
|
107e0404de | ||
|
ab99e80333 | ||
|
3154a378a6 | ||
|
8e04f1c03e | ||
|
c0aadeab3d | ||
|
6c87698f1a | ||
|
db2e9f8bf3 | ||
|
9a4c5cef86 | ||
|
bdfc86f850 | ||
|
70dadfba28 | ||
|
01e1e34874 | ||
|
28a3cbfa87 | ||
|
0b480c2d3f | ||
|
391dea445a | ||
|
e074c72130 | ||
|
96f3f863e5 | ||
|
3877f6fd94 | ||
|
cbbc6df05a | ||
|
32ff7fb321 | ||
|
5537e57eec | ||
|
9c94af04cc | ||
|
3f0b15902d | ||
|
4d3835dde2 | ||
|
8514f42d0d | ||
|
6d9fbe8d41 | ||
|
849185d3c9 | ||
|
47cc757ed0 | ||
|
f6edd435af | ||
|
0c0dd914f7 | ||
|
c6405bc93b | ||
|
cdffdfbded | ||
|
0bbfb323b1 | ||
|
4f08359786 | ||
|
7efb17537a | ||
|
7e06769d44 | ||
|
5347ee4896 | ||
|
834bf30a10 | ||
|
22ea384ac8 | ||
|
3e6dd9ea9e | ||
|
10f363e9e7 | ||
|
69e8c014c3 | ||
|
dbb40e1dda | ||
|
d710b97276 | ||
|
0e6e8040ba | ||
|
c6fb0bad4b | ||
|
2d08217173 | ||
|
36645d9335 | ||
|
97d3aedba1 | ||
|
5976b20aec | ||
|
ad8573c739 | ||
|
7f9410fd34 | ||
|
71133f6b59 | ||
|
5d5d6c2c70 | ||
|
37fa462db5 | ||
|
1a2046a7eb | ||
|
3dff7e80fc | ||
|
6eea9239a7 | ||
|
75f1969bd2 | ||
|
e97755eb91 | ||
|
b938949cdb | ||
|
447af208b3 | ||
|
d47fbbbe96 | ||
|
767b72fbfa | ||
|
b94a8da9d6 | ||
|
12b5be239b | ||
|
0fbf72bb09 | ||
|
ae2117ff5a | ||
|
b80821c4b7 | ||
|
cf01b5a002 | ||
|
bb66d559e7 | ||
|
7b8fa3b922 | ||
|
777676b525 | ||
|
28f2a1309e | ||
|
4b0a7c2252 | ||
|
2625d9f7fe | ||
|
45f24c8a85 | ||
|
5f7c11f495 | ||
|
ec4d2d65a6 | ||
|
3e20f5dd3c | ||
|
7014b5a150 | ||
|
f8427ab789 | ||
|
31fc2bfeb7 | ||
|
fb5bc16c83 | ||
|
724075e448 | ||
|
45cb9a2e80 | ||
|
456eee05f2 | ||
|
23872f77a8 | ||
|
37c1999965 | ||
|
86dd4dd784 | ||
|
00b65abd09 | ||
|
fee55fa642 | ||
|
76ea1962be | ||
|
df3cf72d29 | ||
|
32dd594f06 | ||
|
ba0ba1de94 | ||
|
660e71f032 | ||
|
169e6fdba4 | ||
|
138aeaf8c7 | ||
|
33669793b7 | ||
|
80f4bf9475 | ||
|
bed869b08e | ||
|
f2150ee7e1 | ||
|
eaf89995ee | ||
|
2311b42bca | ||
|
a4fbccac9b | ||
|
a0cf93a7ca | ||
|
f444c7d4a5 | ||
|
8ef4c12f97 | ||
|
c520c55ff4 | ||
|
6145748bfb | ||
|
1a1026b367 | ||
|
8c45bd32b7 | ||
|
2b5cee05e6 | ||
|
5442954db6 | ||
|
5ee382c8eb | ||
|
901cb44f5e | ||
|
7388461ede | ||
|
5223627b71 | ||
|
646c4a3ccc | ||
|
0b9e78df2c | ||
|
a9c24b456d | ||
|
b4463bf42c | ||
|
8f8dc66c70 | ||
|
b746250e71 | ||
|
26b7e7ec8e | ||
|
bc09760c84 | ||
|
ceb229c6ac | ||
|
1e6ac33ef1 | ||
|
86eafe7a33 | ||
|
00f46dc149 | ||
|
396c7ab9ee | ||
|
fa2cef6395 | ||
|
04638c9065 | ||
|
02bb5b6742 | ||
|
fad5fafa32 | ||
|
b0dd231018 | ||
|
0b5f005a5d | ||
|
babca8d47b | ||
|
eb462955fe | ||
|
b79db36336 | ||
|
404ea0ce6d | ||
|
d3971b26e4 | ||
|
a44a201f00 | ||
|
1d80fdddd4 | ||
|
f09745b4ad | ||
|
d13ae0610e | ||
|
3eaa447323 | ||
|
604506da10 | ||
|
122ce11381 | ||
|
8cbd9f7f08 | ||
|
7c41e5bafc | ||
|
4452f784a8 | ||
|
ced0ae0d65 | ||
|
876c51302a | ||
|
a6877e7c13 | ||
|
f633d1fa5b | ||
|
4f90b41343 | ||
|
e4ddf8bc33 | ||
|
613ab9febc | ||
|
e92cceecc1 | ||
|
3283f3ed7d | ||
|
0ed30b802d | ||
|
beefff8cce | ||
|
b1554d6a89 | ||
|
4230b03884 | ||
|
2182b8339e | ||
|
b07b77c58f | ||
|
6542407fa3 | ||
|
ebf995536b | ||
|
adcd7f10ee | ||
|
af83936047 | ||
|
c3b5b97a41 | ||
|
6c58ea18dc | ||
|
830b287e5d | ||
|
52549d51ab | ||
|
fe05ed13e5 | ||
|
3a46e7fc0a | ||
|
88674e21cf | ||
|
a0673c7028 | ||
|
592af80659 | ||
|
3ec9b3b021 | ||
|
ca2d3a192c | ||
|
209bf7d746 | ||
|
13777cc1aa | ||
|
bffc77e478 | ||
|
0ebb7eecdb | ||
|
99863bb799 | ||
|
800d2f0859 | ||
|
f397844603 | ||
|
2d895f328c | ||
|
b14b182084 | ||
|
8687d25d88 | ||
|
7001edcd1d | ||
|
4a1e88f4bf | ||
|
b41608d40b | ||
|
c5d45edf2d | ||
|
0116b6341c | ||
|
3e7ecda80f | ||
|
f0e5b2b6f9 | ||
|
5976ec9323 | ||
|
eb3463fad1 | ||
|
5f9e5869e9 | ||
|
950480bb77 | ||
|
6530ec58c7 | ||
|
b1515c5e3f | ||
|
6581f119fd | ||
|
9ad7c12710 | ||
|
8e289215b4 | ||
|
3718c3be56 | ||
|
c3c051385c | ||
|
21c688a8a8 | ||
|
668b883651 | ||
|
c396aeed52 | ||
|
40f541bc31 | ||
|
44974f98a0 | ||
|
b7cb3df9bc | ||
|
432e6d5395 | ||
|
fdf805bc7b | ||
|
73e13f3875 | ||
|
da959e1296 | ||
|
94600c54cb | ||
|
c4fc2e089d | ||
|
06444c1c27 | ||
|
f8897942f3 | ||
|
4d0b4cfb36 | ||
|
7116634739 | ||
|
36492f4857 | ||
|
3a887af513 | ||
|
3142992c57 | ||
|
68a9b88b58 | ||
|
3c801e5b91 | ||
|
ecd46f8560 | ||
|
dee8ce587d | ||
|
4c24186911 | ||
|
af360a1a20 | ||
|
b5406240c6 | ||
|
73bfbba5f7 | ||
|
46d7bfecdb | ||
|
a734927591 | ||
|
255706e173 | ||
|
b2fbf46e60 | ||
|
e37495d80b | ||
|
beb6b950f7 | ||
|
2d1c0be24e | ||
|
9941651b3c | ||
|
31fda124f3 | ||
|
b7f6498a5c | ||
|
282da1c2b6 | ||
|
8e6ec6ef0c | ||
|
704b3ee673 | ||
|
c18a1c3eca | ||
|
4e1870197e | ||
|
3bf61cce95 | ||
|
68889b0544 | ||
|
8a90a47fc2 | ||
|
eee0ccef8c | ||
|
29c593b8b0 | ||
|
71fd32b1f4 | ||
|
fcf3b4e4e2 |
7
.github/ISSUE_TEMPLATE.md
vendored
Normal file
7
.github/ISSUE_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
##### Expected Behaviour:
|
||||||
|
|
||||||
|
|
||||||
|
##### Actual Behaviour:
|
||||||
|
|
||||||
|
|
||||||
|
##### Steps to reproduce this issue:
|
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
11
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Fixes #[issue number] .
|
||||||
|
|
||||||
|
Changes proposed in this pull request:
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
-
|
||||||
|
|
||||||
|
@pi-hole/gravity
|
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.DS_Store
|
8
CONTRIBUTING.md
Normal file
8
CONTRIBUTING.md
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
This is a basic checklist for now, We will update it in the future.
|
||||||
|
|
||||||
|
* Fork the repo and create your new branch based on the `development` branch.
|
||||||
|
* Commit Unix line endings
|
||||||
|
* If you want, try to keep to the theme of black holes/gravity. This can add some fun to your submission.
|
||||||
|
* Submit Pull Requests to the development branch only.
|
||||||
|
* Before Submitting your Pull Request, merge `development` with your new branch and fix any conflicts. (Make sure you don't break anything in development!)
|
||||||
|
* Be patient. We will review all submitted pull requests, but our focus is on stability.. please don't be offended if we reject your PR, or it appears we're doing nothing with it! We'll get around to it..
|
31
README.md
31
README.md
@@ -1,22 +1,42 @@
|
|||||||
# Automated Install
|
# Automated Install
|
||||||
##### Designed For Raspberry Pi B, B+, 2, and Zero (with an Ethernet adapter)
|
##### Designed For Raspberry Pi A+, B, B+, 2, Zero, and 3B (with an Ethernet/Wi-Fi adapter) (Works on most Debian distributions!)
|
||||||
|
|
||||||
|
|
||||||
|
[](https://gitter.im/pi-hole/pi-hole?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
1. Install Raspbian
|
1. Install Raspbian
|
||||||
|
|
||||||
2. Run the command below
|
2. Run the command below
|
||||||
|
|
||||||
### ```curl -L install.pi-hole.net | bash```
|
### ```curl -L https://install.pi-hole.net | bash```
|
||||||
|
|
||||||
|
#### Alternative Semi-Automated install ####
|
||||||
|
```
|
||||||
|
wget -O basic-install.sh https://install.pi-hole.net
|
||||||
|
chmod +x basic-install.sh
|
||||||
|
./basic-install.sh
|
||||||
|
```
|
||||||
|
|
||||||
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 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/).
|
||||||
|
|
||||||
## Pi-hole Is Free, But Powered By Your Donations
|
## Pi-hole Is Free, But Powered By Your Donations
|
||||||
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")
|
[](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")
|
||||||
|
|
||||||
|
## Catch us out on the net:
|
||||||
|
Twitter: [@The_Pi_Hole](https://twitter.com/The_Pi_Hole)
|
||||||
|
|
||||||
|
reddit: [/r/pihole](https://www.reddit.com/r/pihole/)
|
||||||
|
|
||||||
## How Does It Work?
|
## How Does It Work?
|
||||||
**Watch the 60-second video below to get a quick overview**
|
**Watch the 60-second video below to get a quick overview**
|
||||||
|
|
||||||
[](https://vimeo.com/135965232)
|
[](https://vimeo.com/135965232)
|
||||||
|
|
||||||
## Pi-hole Projects
|
## Pi-hole Projects
|
||||||
|
- [Get LED alerts for each blocked ad](http://www.stinebaugh.info/get-led-alerts-for-each-blocked-ad-using-pi-hole/)
|
||||||
|
- [Pi-hole on Ubuntu 14.04 on VirtualBox](http://hbalagtas.blogspot.com/2016/02/adblocking-with-pi-hole-and-ubuntu-1404.html)
|
||||||
|
- [x86 Docker container that runs Pi-hole](https://hub.docker.com/r/diginc/pi-hole/)
|
||||||
|
- [Splunk: Pi-hole Visualizser](https://splunkbase.splunk.com/app/3023/)
|
||||||
- [Pi-hole Chrome extension](https://chrome.google.com/webstore/detail/pi-hole-list-editor/hlnoeoejkllgkjbnnnhfolapllcnaglh) ([open source](https://github.com/packtloss/pihole-extension))
|
- [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)
|
- [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)
|
- [Sky-Hole](http://dlaa.me/blog/post/skyhole)
|
||||||
@@ -26,7 +46,8 @@ Once installed, [configure your router to have **DHCP clients use the Pi as thei
|
|||||||
- [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole)
|
- [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole)
|
||||||
|
|
||||||
## Coverage
|
## Coverage
|
||||||
- [Splunk: Pi-hole Visualizser](https://splunkbase.splunk.com/app/3023/)
|
- [TekThing: 5 fun, easy projects for a Raspberry Pi](https://youtu.be/QwrKlyC2kdM?t=1m42s)
|
||||||
|
- [Pi-hole on Adafruit's blog](https://blog.adafruit.com/2016/03/04/pi-hole-is-a-black-hole-for-internet-ads-piday-raspberrypi-raspberry_pi/)
|
||||||
- [The Defrag Show - MSDN/Channel 9](https://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-Endoscope-USB-Camera-The-Final-HoloLens-Vote-Adblock-Pi-and-more?WT.mc_id=dlvr_twitter_ch9#time=20m39s)
|
- [The Defrag Show - MSDN/Channel 9](https://channel9.msdn.com/Shows/The-Defrag-Show/Defrag-Endoscope-USB-Camera-The-Final-HoloLens-Vote-Adblock-Pi-and-more?WT.mc_id=dlvr_twitter_ch9#time=20m39s)
|
||||||
- [MacObserver Podcast 585](http://www.macobserver.com/tmo/podcast/macgeekgab-585)
|
- [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)
|
- [Medium: Block All Ads For $53](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d)
|
||||||
@@ -59,6 +80,8 @@ The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashb
|
|||||||
|
|
||||||
`http://192.168.1.x/admin/index.php`
|
`http://192.168.1.x/admin/index.php`
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
### API
|
### API
|
||||||
|
|
||||||
A basic read-only API can be accessed at `/admin/api.php`. It returns the following JSON:
|
A basic read-only API can be accessed at `/admin/api.php`. It returns the following JSON:
|
||||||
@@ -84,4 +107,4 @@ You can view [real-time stats](http://pi-hole.net/faq/install-the-real-time-lcd-
|
|||||||
- There is also an [FAQ section on pi-hole.net](http://pi-hole.net)
|
- There is also an [FAQ section on pi-hole.net](http://pi-hole.net)
|
||||||
|
|
||||||
## Other Operating Systems
|
## 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.
|
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 is only for a clean install of a Debian based system, such as the Raspberry Pi.
|
||||||
|
@@ -1,8 +1,50 @@
|
|||||||
https://adaway.org/hosts.txt
|
## Pi-hole ad-list default sources. Updated 21/02/2016 #########################
|
||||||
|
# #
|
||||||
|
# To make changes to this file: #
|
||||||
|
# 1. run `cp /etc/pihole/adlists.default /etc/pihole/adlists.list` #
|
||||||
|
# 2. run `nano /etc/pihole/adlists.list` #
|
||||||
|
# 3. Uncomment or comment any of the below lists #
|
||||||
|
# #
|
||||||
|
# Know of any other lists? Feel free to let us know about them, or add them #
|
||||||
|
# to this file! #
|
||||||
|
################################################################################
|
||||||
|
|
||||||
|
# The below list amalgamates several lists we used previously.
|
||||||
|
# See `https://github.com/StevenBlack/hosts` for details
|
||||||
|
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
|
||||||
|
|
||||||
|
# Other lists we consider safe:
|
||||||
http://adblock.gjtech.net/?format=unix-hosts
|
http://adblock.gjtech.net/?format=unix-hosts
|
||||||
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
|
|
||||||
http://mirror1.malwaredomains.com/files/justdomains
|
http://mirror1.malwaredomains.com/files/justdomains
|
||||||
|
http://sysctl.org/cameleon/hosts
|
||||||
|
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
|
||||||
|
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
|
||||||
|
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
|
||||||
|
|
||||||
|
# hosts-file.net list. Updated frequently, but has been known to block legitimate sites.
|
||||||
|
http://hosts-file.net/ad_servers.txt
|
||||||
|
|
||||||
|
# Mahakala list. Has been known to block legitimage domains including the entire .com range.
|
||||||
|
# Warning: Due to the sheer size of this list, the web admin console will be unresponsive.
|
||||||
|
#http://adblock.mahakala.is/
|
||||||
|
|
||||||
|
# ADZHOSTS list. Has been known to block legitimate domains
|
||||||
|
#http://optimate.dl.sourceforge.net/project/adzhosts/HOSTS.txt
|
||||||
|
|
||||||
|
# Windows 10 telemetry list
|
||||||
|
#https://raw.githubusercontent.com/crazy-max/WindowsSpyBlocker/master/hostsBlockWindowsSpy.txt
|
||||||
|
|
||||||
|
# Securemecca.com list - Also blocks "adult" sites (pornography/gambling etc)
|
||||||
|
#http://securemecca.com/Downloads/hosts.txt
|
||||||
|
|
||||||
|
# Quidsup's tracker list
|
||||||
|
https://raw.githubusercontent.com/quidsup/notrack/master/trackers.txt
|
||||||
|
|
||||||
|
# Block the BBC News website Breaking News banner
|
||||||
|
#https://raw.githubusercontent.com/BreakingTheNews/BreakingTheNews.github.io/master/hosts
|
||||||
|
|
||||||
|
|
||||||
|
# Untested Lists:
|
||||||
|
#https://raw.githubusercontent.com/reek/anti-adblock-killer/master/anti-adblock-killer-filters.txt
|
||||||
|
#http://spam404bl.com/spam404scamlist.txt
|
||||||
|
#http://malwaredomains.lehigh.edu/files/domains.txt
|
||||||
|
100
advanced/Scripts/blacklist.sh
Normal file → Executable file
100
advanced/Scripts/blacklist.sh
Normal file → Executable file
@@ -11,39 +11,37 @@
|
|||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
if [[ $# = 0 ]]; then
|
if [[ $# = 0 ]]; then
|
||||||
echo "Immediately blacklists one or more domains in the hosts file"
|
helpFunc
|
||||||
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
|
fi
|
||||||
|
|
||||||
#globals
|
#globals
|
||||||
blacklist=/etc/pihole/blacklist.txt
|
basename=pihole
|
||||||
adList=/etc/pihole/gravity.list
|
piholeDir=/etc/$basename
|
||||||
|
adList=$piholeDir/gravity.list
|
||||||
|
blacklist=$piholeDir/blacklist.txt
|
||||||
reload=true
|
reload=true
|
||||||
addmode=true
|
addmode=true
|
||||||
force=false
|
force=false
|
||||||
versbose=true
|
verbose=true
|
||||||
|
|
||||||
domList=()
|
domList=()
|
||||||
domToRemoveList=()
|
domToRemoveList=()
|
||||||
|
|
||||||
|
|
||||||
piholeIPfile=/tmp/piholeIP
|
|
||||||
piholeIPv6file=/etc/pihole/.useIPv6
|
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
|
# 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)}')
|
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
|
||||||
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
|
piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
|
||||||
piholeIP=${piholeIPCIDR%/*}
|
piholeIP=${piholeIPCIDR%/*}
|
||||||
|
|
||||||
modifyHost=false
|
modifyHost=false
|
||||||
|
|
||||||
|
# After setting defaults, check if there's local overrides
|
||||||
|
if [[ -r $piholeDir/pihole.conf ]];then
|
||||||
|
echo "::: Local calibration requested..."
|
||||||
|
. $piholeDir/pihole.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [[ -f $piholeIPv6file ]];then
|
if [[ -f $piholeIPv6file ]];then
|
||||||
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
||||||
@@ -51,12 +49,27 @@ if [[ -f $piholeIPv6file ]];then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
function helpFunc()
|
||||||
|
{
|
||||||
|
echo "::: Immediately blacklists one or more domains in the hosts file"
|
||||||
|
echo ":::"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Usage: sudo pihole -b domain1 [domain2 ...]"
|
||||||
|
echo "::: Options:"
|
||||||
|
echo "::: -d, --delmode Remove domains from the blacklist"
|
||||||
|
echo "::: -nr, --noreload Update blacklist without refreshing dnsmasq"
|
||||||
|
echo "::: -f, --force Force updating of the hosts files, even if there are no changes"
|
||||||
|
echo "::: -q, --quiet output is less verbose"
|
||||||
|
echo "::: -h, --help Show this help dialog"
|
||||||
|
echo "::: -l, --list Display your blacklisted domains"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
function HandleOther(){
|
function HandleOther(){
|
||||||
#check validity of domain
|
#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/')
|
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
|
if [ -z "$validDomain" ]; then
|
||||||
echo $1 is not a valid argument or domain name
|
echo "::: $1 is not a valid argument or domain name"
|
||||||
else
|
else
|
||||||
domList=("${domList[@]}" $validDomain)
|
domList=("${domList[@]}" $validDomain)
|
||||||
fi
|
fi
|
||||||
@@ -67,12 +80,11 @@ function PopBlacklistFile(){
|
|||||||
if [[ ! -f $blacklist ]];then
|
if [[ ! -f $blacklist ]];then
|
||||||
touch $blacklist
|
touch $blacklist
|
||||||
fi
|
fi
|
||||||
for dom in "${domList[@]}"
|
for dom in "${domList[@]}"; do
|
||||||
do
|
if "$addmode"; then
|
||||||
if $addmode; then
|
AddDomain "$dom"
|
||||||
AddDomain $dom
|
|
||||||
else
|
else
|
||||||
RemoveDomain $dom
|
RemoveDomain "$dom"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -83,15 +95,15 @@ function AddDomain(){
|
|||||||
grep -Ex -q "$1" $blacklist || bool=true
|
grep -Ex -q "$1" $blacklist || bool=true
|
||||||
if $bool; then
|
if $bool; then
|
||||||
#domain not found in the blacklist file, add it!
|
#domain not found in the blacklist file, add it!
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo -n "::: Adding $1 to blacklist file..."
|
echo -n "::: Adding $1 to blacklist file..."
|
||||||
fi
|
fi
|
||||||
echo $1 >> $blacklist
|
echo "$1" >> $blacklist
|
||||||
modifyHost=true
|
modifyHost=true
|
||||||
echo " done!"
|
echo " done!"
|
||||||
else
|
else
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: $1 already exists in blacklist.txt! No need to add"
|
echo "::: $1 already exists in $blacklist! No need to add"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -102,12 +114,12 @@ function RemoveDomain(){
|
|||||||
grep -Ex -q "$1" $blacklist || bool=true
|
grep -Ex -q "$1" $blacklist || bool=true
|
||||||
if $bool; then
|
if $bool; then
|
||||||
#Domain is not in the blacklist file, no need to Remove
|
#Domain is not in the blacklist file, no need to Remove
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: $1 is NOT blacklisted! No need to remove"
|
echo "::: $1 is NOT blacklisted! No need to remove"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
#Domain is in the blacklist file, add to a temporary array
|
#Domain is in the blacklist file, add to a temporary array
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: Un-blacklisting $dom..."
|
echo "::: Un-blacklisting $dom..."
|
||||||
fi
|
fi
|
||||||
domToRemoveList=("${domToRemoveList[@]}" $1)
|
domToRemoveList=("${domToRemoveList[@]}" $1)
|
||||||
@@ -128,24 +140,21 @@ function ModifyHostFile(){
|
|||||||
else
|
else
|
||||||
cat $blacklist | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
|
cat $blacklist | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
|
|
||||||
echo ":::"
|
echo ":::"
|
||||||
for dom in "${domToRemoveList[@]}"
|
for dom in "${domToRemoveList[@]}"
|
||||||
do
|
do
|
||||||
#we need to remove the domains from the blacklist file and the host file
|
#we need to remove the domains from the blacklist file and the host file
|
||||||
echo "::: $dom"
|
echo "::: $dom"
|
||||||
echo -n "::: removing from HOSTS file..."
|
echo -n "::: removing from HOSTS file..."
|
||||||
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList
|
echo "$dom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList
|
||||||
echo " done!"
|
echo " done!"
|
||||||
echo -n "::: removing from blackist.txt..."
|
echo -n "::: removing from blackist.txt..."
|
||||||
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $blacklist
|
echo "$dom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $blacklist
|
||||||
echo " done!"
|
echo " done!"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function Reload() {
|
function Reload() {
|
||||||
@@ -157,7 +166,7 @@ function Reload() {
|
|||||||
|
|
||||||
if [[ $dnsmasqPid ]]; then
|
if [[ $dnsmasqPid ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
sudo kill -HUP $dnsmasqPid
|
sudo kill -HUP "$dnsmasqPid"
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
sudo service dnsmasq start
|
sudo service dnsmasq start
|
||||||
@@ -165,6 +174,17 @@ function Reload() {
|
|||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function DisplayBlist() {
|
||||||
|
verbose=false
|
||||||
|
echo -e " Displaying Gravity Affected Domains \n"
|
||||||
|
count=1
|
||||||
|
while IFS= read -r AD
|
||||||
|
do
|
||||||
|
echo "${count}: $AD"
|
||||||
|
count=$((count+1))
|
||||||
|
done < "$blacklist"
|
||||||
|
}
|
||||||
|
|
||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
for var in "$@"
|
for var in "$@"
|
||||||
@@ -173,8 +193,10 @@ do
|
|||||||
"-nr"| "--noreload" ) reload=false;;
|
"-nr"| "--noreload" ) reload=false;;
|
||||||
"-d" | "--delmode" ) addmode=false;;
|
"-d" | "--delmode" ) addmode=false;;
|
||||||
"-f" | "--force" ) force=true;;
|
"-f" | "--force" ) force=true;;
|
||||||
"-q" | "--quiet" ) versbose=false;;
|
"-q" | "--quiet" ) verbose=false;;
|
||||||
* ) HandleOther $var;;
|
"-h" | "--help" ) helpFunc;;
|
||||||
|
"-l" | "--list" ) DisplayBlist;;
|
||||||
|
* ) HandleOther "$var";;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -183,7 +205,7 @@ PopBlacklistFile
|
|||||||
if $modifyHost || $force; then
|
if $modifyHost || $force; then
|
||||||
ModifyHostFile
|
ModifyHostFile
|
||||||
else
|
else
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: No changes need to be made"
|
echo "::: No changes need to be made"
|
||||||
fi
|
fi
|
||||||
exit 1
|
exit 1
|
||||||
|
@@ -51,9 +51,13 @@ function CalcblockedToday(){
|
|||||||
|
|
||||||
function CalcPercentBlockedToday(){
|
function CalcPercentBlockedToday(){
|
||||||
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then
|
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then
|
||||||
|
if [ "$queriesToday" != 0 ]; then #Fixes divide by zero error :)
|
||||||
#scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros
|
#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=$(echo "scale=4; $blockedToday/$queriesToday*100" | bc)
|
||||||
percentBlockedToday=$(sed 's/.\{2\}$//' <<< "$percentBlockedToday")
|
percentBlockedToday=$(sed 's/.\{2\}$//' <<< "$percentBlockedToday")
|
||||||
|
else
|
||||||
|
percentBlockedToday=0
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -84,6 +88,8 @@ function normalChrono(){
|
|||||||
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
|
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
|
||||||
echo ""
|
echo ""
|
||||||
uptime | cut -d' ' -f11-
|
uptime | cut -d' ' -f11-
|
||||||
|
#uptime -p #Doesn't work on all versions of uptime
|
||||||
|
uptime | awk -F'( |,|:)+' '{if ($7=="min") m=$6; else {if ($7~/^day/) {d=$6;h=$8;m=$9} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes."}'
|
||||||
echo "-------------------------------"
|
echo "-------------------------------"
|
||||||
# Uncomment to continually read the log file and display the current domain being blocked
|
# 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;}'
|
#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'
|
||||||
@@ -112,14 +118,14 @@ function normalChrono(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
function displayHelp(){
|
function displayHelp(){
|
||||||
echo "Displays stats about your piHole!"
|
echo "::: Displays stats about your piHole!"
|
||||||
echo " "
|
echo ":::"
|
||||||
echo "Usage: chronometer.sh [optional:-j]"
|
echo "::: Usage: sudo pihole -c [optional:-j]"
|
||||||
echo "Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds"
|
echo "::: Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds"
|
||||||
echo " "
|
echo ":::"
|
||||||
echo "Options:"
|
echo "::: Options:"
|
||||||
echo " -j, --json output stats as JSON formatted string"
|
echo "::: -j, --json output stats as JSON formatted string"
|
||||||
echo " -h, --help display this help text"
|
echo "::: -h, --help display this help text"
|
||||||
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
310
advanced/Scripts/piholeDebug.sh
Executable file
310
advanced/Scripts/piholeDebug.sh
Executable file
@@ -0,0 +1,310 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
|
# (c) 2015, 2016 by Jacob Salmela
|
||||||
|
# Network-wide ad blocking via your Raspberry Pi
|
||||||
|
# http://pi-hole.net
|
||||||
|
# Generates pihole_debug.log in /var/log/ to be used for troubleshooting.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Nate Brandeburg
|
||||||
|
# nate@ubiquisoft.com
|
||||||
|
# 3/24/2016
|
||||||
|
|
||||||
|
######## GLOBAL VARS ########
|
||||||
|
DEBUG_LOG="/var/log/pihole_debug.log"
|
||||||
|
DNSMASQFILE="/etc/dnsmasq.conf"
|
||||||
|
PIHOLECONFFILE="/etc/dnsmasq.d/01-pihole.conf"
|
||||||
|
LIGHTTPDFILE="/etc/lighttpd/lighttpd.conf"
|
||||||
|
GRAVITYFILE="/etc/pihole/gravity.list"
|
||||||
|
HOSTSFILE="/etc/hosts"
|
||||||
|
WHITELISTFILE="/etc/pihole/whitelist.txt"
|
||||||
|
BLACKLISTFILE="/etc/pihole/blacklist.txt"
|
||||||
|
ADLISTSFILE="/etc/pihole/adlists.list"
|
||||||
|
PIHOLELOG="/var/log/pihole.log"
|
||||||
|
WHITELISTMATCHES="/tmp/whitelistmatches.list"
|
||||||
|
|
||||||
|
|
||||||
|
######## FIRST CHECK ########
|
||||||
|
# Must be root to debug
|
||||||
|
if [[ $EUID -eq 0 ]]; then
|
||||||
|
echo "::: You are root... Beginning debug!"
|
||||||
|
else
|
||||||
|
echo "::: Sudo will be used for debugging."
|
||||||
|
# Check if sudo is actually installed
|
||||||
|
if [[ $(dpkg-query -s sudo) ]]; then
|
||||||
|
export SUDO="sudo"
|
||||||
|
else
|
||||||
|
echo "::: Please install sudo or run this as root."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ensure the file exists, create if not, clear if exists.
|
||||||
|
if [ ! -f "$DEBUG_LOG" ]; then
|
||||||
|
$SUDO touch $DEBUG_LOG
|
||||||
|
$SUDO chmod 644 $DEBUG_LOG
|
||||||
|
$SUDO chown "$USER":root $DEBUG_LOG
|
||||||
|
else
|
||||||
|
truncate -s 0 $DEBUG_LOG
|
||||||
|
fi
|
||||||
|
|
||||||
|
### Private functions exist here ###
|
||||||
|
function compareWhitelist {
|
||||||
|
if [ ! -f "$WHITELISTMATCHES" ]; then
|
||||||
|
$SUDO touch $WHITELISTMATCHES
|
||||||
|
$SUDO chmod 644 $WHITELISTMATCHES
|
||||||
|
$SUDO chown "$USER":root $WHITELISTMATCHES
|
||||||
|
else
|
||||||
|
truncate -s 0 $WHITELISTMATCHES
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "######## Whitelist Comparison #########" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
while read -r line; do
|
||||||
|
TMP=$(grep -w ".* $line$" "$GRAVITYFILE")
|
||||||
|
if [ ! -z "$TMP" ]; then
|
||||||
|
echo "$TMP" >> $DEBUG_LOG
|
||||||
|
echo "$TMP" >> $WHITELISTMATCHES
|
||||||
|
fi
|
||||||
|
done < "$WHITELISTFILE"
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
}
|
||||||
|
|
||||||
|
function compareBlacklist {
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "######## Blacklist Comparison #########" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
while read -r line; do
|
||||||
|
if [ ! -z "$line" ]; then
|
||||||
|
grep -w ".* $line$" "$GRAVITYFILE" >> $DEBUG_LOG
|
||||||
|
fi
|
||||||
|
done < "$BLACKLISTFILE"
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
}
|
||||||
|
|
||||||
|
function testNslookup {
|
||||||
|
TESTURL="doubleclick.com"
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############ NSLookup Test ############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
# Find a blocked url that has not been whitelisted.
|
||||||
|
if [ -s "$WHITELISTMATCHES" ]; then
|
||||||
|
while read -r line; do
|
||||||
|
CUTURL=${line#*" "}
|
||||||
|
if [ "$CUTURL" != "Pi-Hole.IsWorking.OK" ]; then
|
||||||
|
while read -r line2; do
|
||||||
|
CUTURL2=${line2#*" "}
|
||||||
|
if [ "$CUTURL" != "$CUTURL2" ]; then
|
||||||
|
TESTURL="$CUTURL"
|
||||||
|
break 2
|
||||||
|
fi
|
||||||
|
done < "$WHITELISTMATCHES"
|
||||||
|
fi
|
||||||
|
done < "$GRAVITYFILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "NSLOOKUP of $TESTURL from PiHole:" >> $DEBUG_LOG
|
||||||
|
nslookup "$TESTURL" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
echo "NSLOOKUP of $TESTURL from 8.8.8.8:" >> $DEBUG_LOG
|
||||||
|
nslookup "$TESTURL" 8.8.8.8 >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkProcesses {
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "########### Processes Check ###########" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Logging status of lighttpd and dnsmasq..."
|
||||||
|
PROCESSES=( lighttpd dnsmasq )
|
||||||
|
for i in "${PROCESSES[@]}"
|
||||||
|
do
|
||||||
|
echo "" >> $DEBUG_LOG
|
||||||
|
echo -n $i >> "$DEBUG_LOG"
|
||||||
|
echo " processes status:" >> $DEBUG_LOG
|
||||||
|
$SUDO systemctl -l status $i >> "$DEBUG_LOG"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
### END FUNCTIONS ###
|
||||||
|
|
||||||
|
### Check Pi internet connections ###
|
||||||
|
# Log the IP addresses of this Pi
|
||||||
|
IPADDR=$($SUDO ifconfig | perl -nle 's/dr:(\S+)/print $1/e')
|
||||||
|
echo "::: Writing local IPs to debug log"
|
||||||
|
echo "IP Addresses of this Pi:" >> $DEBUG_LOG
|
||||||
|
echo "$IPADDR" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
|
||||||
|
# Check if we can connect to the local gateway
|
||||||
|
GATEWAY_CHECK=$(ping -q -w 1 -c 1 "$(ip r | grep default | cut -d ' ' -f 3)" > /dev/null && echo ok || echo error)
|
||||||
|
echo "Gateway check:" >> $DEBUG_LOG
|
||||||
|
echo "$GATEWAY_CHECK" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
|
||||||
|
compareWhitelist
|
||||||
|
compareBlacklist
|
||||||
|
testNslookup
|
||||||
|
checkProcesses
|
||||||
|
|
||||||
|
echo "::: Writing dnsmasq.conf to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############### Dnsmasq ###############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$DNSMASQFILE" ]
|
||||||
|
then
|
||||||
|
#cat $DNSMASQFILE >> $DEBUG_LOG
|
||||||
|
while read -r line; do
|
||||||
|
if [ ! -z "$line" ]; then
|
||||||
|
[[ "$line" =~ ^#.*$ ]] && continue
|
||||||
|
echo "$line" >> $DEBUG_LOG
|
||||||
|
fi
|
||||||
|
done < "$DNSMASQFILE"
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No dnsmasq.conf file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo dnsmasq.conf file found!\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Writing 01-pihole.conf to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "########### 01-pihole.conf ############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$PIHOLECONFFILE" ]
|
||||||
|
then
|
||||||
|
#cat "$PIHOLECONFFILE" >> $DEBUG_LOG
|
||||||
|
while read -r line; do
|
||||||
|
if [ ! -z "$line" ]; then
|
||||||
|
[[ "$line" =~ ^#.*$ ]] && continue
|
||||||
|
echo "$line" >> $DEBUG_LOG
|
||||||
|
fi
|
||||||
|
done < "$PIHOLECONFFILE"
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No 01-pihole.conf file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo 01-pihole.conf file found\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Writing lighttpd.conf to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############ lighttpd.conf ############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$LIGHTTPDFILE" ]
|
||||||
|
then
|
||||||
|
#cat "$PIHOLECONFFILE" >> $DEBUG_LOG
|
||||||
|
while read -r line; do
|
||||||
|
if [ ! -z "$line" ]; then
|
||||||
|
[[ "$line" =~ ^#.*$ ]] && continue
|
||||||
|
echo "$line" >> $DEBUG_LOG
|
||||||
|
fi
|
||||||
|
done < "$LIGHTTPDFILE"
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No lighttpd.conf file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo lighttpd.conf file found\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Writing size of gravity.list to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############ gravity.list #############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$GRAVITYFILE" ]
|
||||||
|
then
|
||||||
|
wc -l "$GRAVITYFILE" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No gravity.list file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo gravity.list file found\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Write the hostname output to compare against entries in /etc/hosts, which is logged next
|
||||||
|
echo "Hostname of this pihole is: " >> $DEBUG_LOG
|
||||||
|
hostname >> $DEBUG_LOG
|
||||||
|
|
||||||
|
echo "::: Writing hosts file to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "################ Hosts ################" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$HOSTSFILE" ]
|
||||||
|
then
|
||||||
|
cat "$HOSTSFILE" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No hosts file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo hosts file found!\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
### PiHole application specific logging ###
|
||||||
|
echo "::: Writing whitelist to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############## Whitelist ##############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$WHITELISTFILE" ]
|
||||||
|
then
|
||||||
|
cat "$WHITELISTFILE" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No whitelist.txt file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo whitelist.txt file found!\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Writing blacklist to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############## Blacklist ##############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$BLACKLISTFILE" ]
|
||||||
|
then
|
||||||
|
cat "$BLACKLISTFILE" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No blacklist.txt file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo blacklist.txt file found!\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "::: Writing adlists.list to debug log..."
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############ adlists.list #############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$ADLISTSFILE" ]
|
||||||
|
then
|
||||||
|
cat "$ADLISTSFILE" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
else
|
||||||
|
echo "No adlists.list file found... using adlists.default!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo adlists.list file found... using adlists.default!\n"
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Continuously append the pihole.log file to the pihole_debug.log file
|
||||||
|
function dumpPiHoleLog {
|
||||||
|
trap '{ echo -e "\nFinishing debug write from interrupt... Quitting!" ; exit 1; }' INT
|
||||||
|
echo -e "::: Writing current pihole traffic to debug log...\n:::\tTry loading any/all sites that you are having trouble with now... \n:::\t(Press ctrl+C to finish)"
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
echo "############# pihole.log ##############" >> $DEBUG_LOG
|
||||||
|
echo "#######################################" >> $DEBUG_LOG
|
||||||
|
if [ -e "$PIHOLELOG" ]
|
||||||
|
then
|
||||||
|
while true; do
|
||||||
|
tail -f "$PIHOLELOG" >> $DEBUG_LOG
|
||||||
|
echo >> $DEBUG_LOG
|
||||||
|
done
|
||||||
|
else
|
||||||
|
echo "No pihole.log file found!" >> $DEBUG_LOG
|
||||||
|
printf ":::\tNo pihole.log file found!\n"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Anything to be done after capturing of pihole.log terminates
|
||||||
|
function finalWork {
|
||||||
|
echo "::: Finshed debugging!"
|
||||||
|
}
|
||||||
|
trap finalWork EXIT
|
||||||
|
|
||||||
|
### Method calls for additional logging ###
|
||||||
|
dumpPiHoleLog
|
@@ -10,4 +10,6 @@
|
|||||||
# the Free Software Foundation, either version 2 of the License, or
|
# the Free Software Foundation, either version 2 of the License, or
|
||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
echo -n "::: Flushing /var/log/pihole.log ..."
|
||||||
truncate -s 0 /var/log/pihole.log
|
truncate -s 0 /var/log/pihole.log
|
||||||
|
echo "... done!"
|
||||||
|
89
advanced/Scripts/setupLCD.sh
Executable file
89
advanced/Scripts/setupLCD.sh
Executable file
@@ -0,0 +1,89 @@
|
|||||||
|
#!/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
|
||||||
|
# Automatically configures the Pi to use the 2.8 LCD screen to display stats on it (also works over ssh)
|
||||||
|
#
|
||||||
|
# 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 ###########
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Borrowed from adafruit-pitft-helper < borrowed from raspi-config
|
||||||
|
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L324-L334
|
||||||
|
getInitSys() {
|
||||||
|
if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
|
||||||
|
SYSTEMD=1
|
||||||
|
elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
|
||||||
|
SYSTEMD=0
|
||||||
|
else
|
||||||
|
echo "Unrecognised init system"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Borrowed from adafruit-pitft-helper:
|
||||||
|
# https://github.com/adafruit/Adafruit-PiTFT-Helper/blob/master/adafruit-pitft-helper#L274-L285
|
||||||
|
autoLoginPiToConsole() {
|
||||||
|
if [ -e /etc/init.d/lightdm ]; then
|
||||||
|
if [ $SYSTEMD -eq 1 ]; then
|
||||||
|
$SUDO systemctl set-default multi-user.target
|
||||||
|
$SUDO ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
|
||||||
|
else
|
||||||
|
$SUDO update-rc.d lightdm disable 2
|
||||||
|
$SUDO sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
######### SCRIPT ###########
|
||||||
|
# Set pi to log in automatically
|
||||||
|
getInitSys
|
||||||
|
autoLoginPiToConsole
|
||||||
|
|
||||||
|
# Set chronomter to run automatically when pi logs in
|
||||||
|
echo /usr/local/bin/chronometer.sh >> /home/pi/.bashrc
|
||||||
|
# OR
|
||||||
|
#$SUDO echo /usr/local/bin/chronometer.sh >> /etc/profile
|
||||||
|
|
||||||
|
# Set up the LCD screen based on Adafruits instuctions:
|
||||||
|
# https://learn.adafruit.com/adafruit-pitft-28-inch-resistive-touchscreen-display-raspberry-pi/easy-install
|
||||||
|
curl -SLs https://apt.adafruit.com/add-pin | $SUDO bash
|
||||||
|
$SUDO apt-get -y install raspberrypi-bootloader
|
||||||
|
$SUDO apt-get -y install adafruit-pitft-helper
|
||||||
|
$SUDO adafruit-pitft-helper -t 28r
|
||||||
|
|
||||||
|
# Download the cmdline.txt file that prevents the screen from going blank after a period of time
|
||||||
|
$SUDO mv /boot/cmdline.txt /boot/cmdline.orig
|
||||||
|
$SUDO curl -o /boot/cmdline.txt https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/cmdline.txt
|
||||||
|
|
||||||
|
# Back up the original file and download the new one
|
||||||
|
$SUDO mv /etc/default/console-setup /etc/default/console-setup.orig
|
||||||
|
$SUDO curl -o /etc/default/console-setup https://raw.githubusercontent.com/pi-hole/pi-hole/master/advanced/console-setup
|
||||||
|
|
||||||
|
# Instantly apply the font change to the LCD screen
|
||||||
|
$SUDO setupcon
|
||||||
|
|
||||||
|
$SUDO reboot
|
||||||
|
|
||||||
|
# Start showing the stats on the screen by running the command on another tty:
|
||||||
|
# http://unix.stackexchange.com/questions/170063/start-a-process-on-a-different-tty
|
||||||
|
#setsid sh -c 'exec /usr/local/bin/chronometer.sh <> /dev/tty1 >&0 2>&1'
|
0
advanced/Scripts/updateDashboard.sh
Normal file → Executable file
0
advanced/Scripts/updateDashboard.sh
Normal file → Executable file
@@ -11,38 +11,36 @@
|
|||||||
# (at your option) any later version.
|
# (at your option) any later version.
|
||||||
|
|
||||||
if [[ $# = 0 ]]; then
|
if [[ $# = 0 ]]; then
|
||||||
echo "Immediately whitelists one or more domains in the hosts file"
|
helpFunc
|
||||||
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
|
fi
|
||||||
|
|
||||||
#globals
|
#globals
|
||||||
whitelist=/etc/pihole/whitelist.txt
|
basename=pihole
|
||||||
adList=/etc/pihole/gravity.list
|
piholeDir=/etc/$basename
|
||||||
|
adList=$piholeDir/gravity.list
|
||||||
|
whitelist=$piholeDir/whitelist.txt
|
||||||
reload=true
|
reload=true
|
||||||
addmode=true
|
addmode=true
|
||||||
force=false
|
force=false
|
||||||
versbose=true
|
verbose=true
|
||||||
|
|
||||||
domList=()
|
domList=()
|
||||||
domToRemoveList=()
|
domToRemoveList=()
|
||||||
|
|
||||||
piholeIPfile=/tmp/piholeIP
|
|
||||||
piholeIPv6file=/etc/pihole/.useIPv6
|
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
|
# 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)}')
|
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
|
||||||
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
|
piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
|
||||||
piholeIP=${piholeIPCIDR%/*}
|
piholeIP=${piholeIPCIDR%/*}
|
||||||
|
|
||||||
modifyHost=false
|
modifyHost=false
|
||||||
|
|
||||||
|
# After setting defaults, check if there's local overrides
|
||||||
|
if [[ -r $piholeDir/pihole.conf ]];then
|
||||||
|
echo "::: Local calibration requested..."
|
||||||
|
. $piholeDir/pihole.conf
|
||||||
|
fi
|
||||||
|
|
||||||
if [[ -f $piholeIPv6file ]];then
|
if [[ -f $piholeIPv6file ]];then
|
||||||
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
# If the file exists, then the user previously chose to use IPv6 in the automated installer
|
||||||
@@ -50,10 +48,25 @@ if [[ -f $piholeIPv6file ]];then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
function helpFunc()
|
||||||
|
{
|
||||||
|
echo "::: Immediately whitelists one or more domains in the hosts file"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Usage: sudo pihole -w 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"
|
||||||
|
echo "::: -h, --help Show this help dialog"
|
||||||
|
echo "::: -l, --list Display your whitelisted domains"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
function HandleOther(){
|
function HandleOther(){
|
||||||
#check validity of domain
|
#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/')
|
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
|
if [ -z "$validDomain" ]; then
|
||||||
echo "::: $1 is not a valid argument or domain name"
|
echo "::: $1 is not a valid argument or domain name"
|
||||||
else
|
else
|
||||||
@@ -69,9 +82,9 @@ function PopWhitelistFile(){
|
|||||||
for dom in "${domList[@]}"
|
for dom in "${domList[@]}"
|
||||||
do
|
do
|
||||||
if $addmode; then
|
if $addmode; then
|
||||||
AddDomain $dom
|
AddDomain "$dom"
|
||||||
else
|
else
|
||||||
RemoveDomain $dom
|
RemoveDomain "$dom"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
@@ -83,17 +96,17 @@ function AddDomain(){
|
|||||||
grep -Ex -q "$1" $whitelist || bool=true
|
grep -Ex -q "$1" $whitelist || bool=true
|
||||||
if $bool; then
|
if $bool; then
|
||||||
#domain not found in the whitelist file, add it!
|
#domain not found in the whitelist file, add it!
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo -n "::: Adding $1 to whitelist.txt..."
|
echo -n "::: Adding $1 to $whitelist..."
|
||||||
fi
|
fi
|
||||||
echo $1 >> $whitelist
|
echo "$1" >> $whitelist
|
||||||
modifyHost=true
|
modifyHost=true
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo " done!"
|
echo " done!"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: $1 already exists in whitelist.txt, no need to add!"
|
echo "::: $1 already exists in $whitelist, no need to add!"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -104,12 +117,12 @@ function RemoveDomain(){
|
|||||||
grep -Ex -q "$1" $whitelist || bool=true
|
grep -Ex -q "$1" $whitelist || bool=true
|
||||||
if $bool; then
|
if $bool; then
|
||||||
#Domain is not in the whitelist file, no need to Remove
|
#Domain is not in the whitelist file, no need to Remove
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo "::: $1 is NOT whitelisted! No need to remove"
|
echo "::: $1 is NOT whitelisted! No need to remove"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
#Domain is in the whitelist file, add to a temporary array and remove from whitelist file
|
#Domain is in the whitelist file, add to a temporary array and remove from whitelist file
|
||||||
#if $versbose; then
|
#if $verbose; then
|
||||||
#echo "::: Un-whitelisting $dom..."
|
#echo "::: Un-whitelisting $dom..."
|
||||||
#fi
|
#fi
|
||||||
domToRemoveList=("${domToRemoveList[@]}" $1)
|
domToRemoveList=("${domToRemoveList[@]}" $1)
|
||||||
@@ -126,13 +139,13 @@ function ModifyHostFile(){
|
|||||||
plural=; [[ "$numberOf" != "1" ]] && plural=s
|
plural=; [[ "$numberOf" != "1" ]] && plural=s
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Modifying HOSTS file to whitelist $numberOf domain${plural}..."
|
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 -r 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
|
awk -F':' '{print $1}' $whitelist | while read -r line; do echo "$piholeIPv6 $line"; done >> /etc/pihole/whitelist.tmp
|
||||||
echo "l" >> /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
|
grep -F -x -v -f $piholeDir/whitelist.tmp $adList > $piholeDir/gravity.tmp
|
||||||
rm /etc/pihole/gravity.list
|
rm $adList
|
||||||
mv /etc/pihole/gravity.tmp /etc/pihole/gravity.list
|
mv $piholeDir/gravity.tmp $adList
|
||||||
rm /etc/pihole/whitelist.tmp
|
rm $piholeDir/whitelist.tmp
|
||||||
echo " done!"
|
echo " done!"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
@@ -144,15 +157,15 @@ function ModifyHostFile(){
|
|||||||
do
|
do
|
||||||
if [[ -n $piholeIPv6 ]];then
|
if [[ -n $piholeIPv6 ]];then
|
||||||
echo -n "::: Un-whitelisting $rdom on IPv4 and IPv6..."
|
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 "$rdom" | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList
|
||||||
echo " done!"
|
echo " done!"
|
||||||
else
|
else
|
||||||
echo -n "::: Un-whitelisting $rdom on IPv4"
|
echo -n "::: Un-whitelisting $rdom on IPv4"
|
||||||
echo $rdom | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
|
echo "$rdom" | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
|
||||||
echo " done!"
|
echo " done!"
|
||||||
fi
|
fi
|
||||||
echo -n "::: Removing $rdom from whitelist.txt..."
|
echo -n "::: Removing $rdom from $whitelist..."
|
||||||
echo $rdom| sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $whitelist
|
echo "$rdom" | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $whitelist
|
||||||
echo " done!"
|
echo " done!"
|
||||||
done
|
done
|
||||||
fi
|
fi
|
||||||
@@ -166,7 +179,7 @@ function Reload() {
|
|||||||
|
|
||||||
if [[ $dnsmasqPid ]]; then
|
if [[ $dnsmasqPid ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
sudo kill -HUP $dnsmasqPid
|
sudo kill -HUP "$dnsmasqPid"
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
sudo service dnsmasq start
|
sudo service dnsmasq start
|
||||||
@@ -174,6 +187,17 @@ function Reload() {
|
|||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function DisplayWlist() {
|
||||||
|
verbose=false
|
||||||
|
echo -e " Displaying Gravity Resistant Domains \n"
|
||||||
|
count=1
|
||||||
|
while IFS= read -r RD
|
||||||
|
do
|
||||||
|
echo "${count}: $RD"
|
||||||
|
count=$((count+1))
|
||||||
|
done < "$whitelist"
|
||||||
|
}
|
||||||
|
|
||||||
###################################################
|
###################################################
|
||||||
|
|
||||||
for var in "$@"
|
for var in "$@"
|
||||||
@@ -182,8 +206,10 @@ do
|
|||||||
"-nr"| "--noreload" ) reload=false;;
|
"-nr"| "--noreload" ) reload=false;;
|
||||||
"-d" | "--delmode" ) addmode=false;;
|
"-d" | "--delmode" ) addmode=false;;
|
||||||
"-f" | "--force" ) force=true;;
|
"-f" | "--force" ) force=true;;
|
||||||
"-q" | "--quiet" ) versbose=false;;
|
"-q" | "--quiet" ) verbose=false;;
|
||||||
* ) HandleOther $var;;
|
"-h" | "--help" ) helpFunc;;
|
||||||
|
"-l" | "--list" ) DisplayWlist;;
|
||||||
|
* ) HandleOther "$var";;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
@@ -192,11 +218,11 @@ PopWhitelistFile
|
|||||||
if $modifyHost || $force; then
|
if $modifyHost || $force; then
|
||||||
ModifyHostFile
|
ModifyHostFile
|
||||||
else
|
else
|
||||||
if $versbose; then
|
if $verbose; then
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: No changes need to be made"
|
echo "::: No changes need to be made"
|
||||||
exit 1
|
|
||||||
fi
|
fi
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if $reload; then
|
if $reload; then
|
||||||
|
12
advanced/bash-completion/pihole
Normal file
12
advanced/bash-completion/pihole
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
_pihole()
|
||||||
|
{
|
||||||
|
local cur prev opts
|
||||||
|
COMPREPLY=()
|
||||||
|
cur="${COMP_WORDS[COMP_CWORD]}"
|
||||||
|
prev="${COMP_WORDS[COMP_CWORD-1]}"
|
||||||
|
opts="whitelist blacklist debug flush updateDashboard updateGravity setupLCD chronometer uninstall help"
|
||||||
|
|
||||||
|
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
complete -F _pihole pihole
|
1
advanced/cmdline.txt
Normal file
1
advanced/cmdline.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait fbcon=map:10 fbcon=font:VGA8x8 consoleblank=0
|
17
advanced/console-setup
Normal file
17
advanced/console-setup
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
# CONFIGURATION FILE FOR SETUPCON
|
||||||
|
|
||||||
|
# Consult the console-setup(5) manual page.
|
||||||
|
|
||||||
|
ACTIVE_CONSOLES="/dev/tty[1-6]"
|
||||||
|
|
||||||
|
CHARMAP="UTF-8"
|
||||||
|
|
||||||
|
# For best results with the Adafruit 2.8 LCD and Pi-hole's chronometer
|
||||||
|
CODESET="guess"
|
||||||
|
FONTFACE="Terminus"
|
||||||
|
FONTSIZE="10x20"
|
||||||
|
|
||||||
|
VIDEOMODE=
|
||||||
|
|
||||||
|
# The following is an example how to use a braille font
|
||||||
|
# FONT='lat9w-08.psf.gz brl-8x8.psf'
|
1
advanced/index.js
Normal file
1
advanced/index.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
var x = "Pi-hole: A black hole for Internet advertisements."
|
@@ -53,4 +53,6 @@ $HTTP["url"] =~ "^/admin/" {
|
|||||||
$HTTP["url"] =~ "^(?!/admin)/.*" {
|
$HTTP["url"] =~ "^(?!/admin)/.*" {
|
||||||
# Create a response header for debugging using curl -I
|
# Create a response header for debugging using curl -I
|
||||||
setenv.add-response-header = ( "X-Pi-hole" => "A black hole for Internet advertisements." )
|
setenv.add-response-header = ( "X-Pi-hole" => "A black hole for Internet advertisements." )
|
||||||
|
# rewrite only js requests
|
||||||
|
url.rewrite = ("(.*).js" => "pihole/index.js")
|
||||||
}
|
}
|
||||||
|
@@ -11,16 +11,16 @@
|
|||||||
|
|
||||||
# Pi-hole: Update the ad sources once a week on Sunday at 01:59
|
# Pi-hole: Update the ad sources once a week on Sunday at 01:59
|
||||||
# Download any updates from the adlists
|
# Download any updates from the adlists
|
||||||
59 1 * * 7 root /usr/local/bin/gravity.sh
|
59 1 * * 7 root /usr/local/bin/pihole updateGravity
|
||||||
|
|
||||||
# Pi-hole: Update the Web interface shortly after gravity runs
|
# 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
|
# This should also update the version number if it is changed in the dashboard repo
|
||||||
30 2 * * 7 root /usr/local/bin/updateDashboard.sh
|
30 2 * * 7 root /usr/local/bin/pihole updateDashboard
|
||||||
|
|
||||||
# Pi-hole: Parse the log file before it is flushed and save the stats to a database
|
# 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
|
# This will be used for a historical view of your Pi-hole's performance
|
||||||
#50 23 * * * root /usr/local/bin/dailyLog.sh
|
#50 23 * * * root /usr/local/bin/dailyLog.sh # note: this is outdated
|
||||||
|
|
||||||
# Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control
|
# 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
|
# Stats will be viewable in the Web interface thanks to the cron job above
|
||||||
58 23 * * * root /usr/local/bin/piholeLogFlush.sh
|
58 23 * * * root /usr/local/bin/pihole flush
|
||||||
|
@@ -40,7 +40,7 @@ c=$(( columns / 2 ))
|
|||||||
# Find IP used to route to outside world
|
# 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)}')
|
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}')
|
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}')
|
IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}')
|
||||||
|
|
||||||
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1)
|
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1)
|
||||||
@@ -64,27 +64,20 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
if [ -d "/etc/pihole" ]; then
|
|
||||||
# Likely an existing install
|
|
||||||
upgrade=true
|
|
||||||
else
|
|
||||||
upgrade=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
####### FUNCTIONS ##########
|
####### FUNCTIONS ##########
|
||||||
###All credit for the below function goes to http://fitnr.com/showing-a-bash-spinner.html
|
spinner()
|
||||||
spinner() {
|
{
|
||||||
local pid=$1
|
local pid=$1
|
||||||
|
local delay=0.50
|
||||||
spin='-\|/'
|
local spinstr='/-\|'
|
||||||
i=0
|
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do
|
||||||
while $SUDO kill -0 $pid 2>/dev/null
|
local temp=${spinstr#?}
|
||||||
do
|
printf " [%c] " "$spinstr"
|
||||||
i=$(( (i+1) %4 ))
|
local spinstr=$temp${spinstr%"$temp"}
|
||||||
printf "\b${spin:$i:1}"
|
sleep $delay
|
||||||
sleep .1
|
printf "\b\b\b\b\b\b"
|
||||||
done
|
done
|
||||||
printf "\b"
|
printf " \b\b\b\b"
|
||||||
}
|
}
|
||||||
|
|
||||||
backupLegacyPihole() {
|
backupLegacyPihole() {
|
||||||
@@ -92,12 +85,17 @@ backupLegacyPihole() {
|
|||||||
if [[ -f /etc/dnsmasq.d/adList.conf ]];then
|
if [[ -f /etc/dnsmasq.d/adList.conf ]];then
|
||||||
echo "::: Original Pi-hole detected. Initiating sub space transport"
|
echo "::: Original Pi-hole detected. Initiating sub space transport"
|
||||||
$SUDO mkdir -p /etc/pihole/original/
|
$SUDO 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.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/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/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 /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 /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")
|
if [ ! -d /opt/pihole ]; then
|
||||||
|
$SUDO mkdir /opt/pihole
|
||||||
|
$SUDO chown "$USER":root /opt/pihole
|
||||||
|
$SUDO chmod u+srwx /opt/pihole
|
||||||
|
fi
|
||||||
|
$SUDO mv /opt/pihole/gravity.sh /etc/pihole/original/gravity.sh."$(date "+%Y-%m-%d")"
|
||||||
else
|
else
|
||||||
:
|
:
|
||||||
fi
|
fi
|
||||||
@@ -112,9 +110,29 @@ welcomeDialogs() {
|
|||||||
|
|
||||||
# Explain the need for a static address
|
# Explain the need for a static address
|
||||||
whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
|
whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
|
||||||
|
|
||||||
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c
|
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
verifyFreeDiskSpace() {
|
||||||
|
# 50MB is the minimum space needed (45MB install (includes web admin bootstrap/jquery libraries etc) + 5MB one day of logs.)
|
||||||
|
requiredFreeBytes=51200
|
||||||
|
|
||||||
|
existingFreeBytes=$(df -lk / 2>&1 | awk '{print $4}' | head -2 | tail -1)
|
||||||
|
if ! [[ "$existingFreeBytes" =~ ^([0-9])+$ ]]; then
|
||||||
|
existingFreeBytes=$(df -lk /dev 2>&1 | awk '{print $4}' | head -2 | tail -1)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ $existingFreeBytes -lt $requiredFreeBytes ]]; then
|
||||||
|
whiptail --msgbox --backtitle "Insufficient Disk Space" --title "Insufficient Disk Space" "\nYour system appears to be low on disk space. pi-hole recomends a minimum of $requiredFreeBytes Bytes.\nYou only have $existingFreeBytes Free.\n\nIf this is a new install you may need to expand your disk.\n\nTry running:\n 'sudo raspi-config'\nChoose the 'expand file system option'\n\nAfter rebooting, run this installation again.\n\ncurl -L install.pi-hole.net | bash\n" $r $c
|
||||||
|
echo "$existingFreeBytes is less than $requiredFreeBytes"
|
||||||
|
echo "Insufficient free space, exiting..."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
chooseInterface() {
|
chooseInterface() {
|
||||||
# Turn the available interfaces into an array so it can be used with a whiptail dialog
|
# Turn the available interfaces into an array so it can be used with a whiptail dialog
|
||||||
interfacesArray=()
|
interfacesArray=()
|
||||||
@@ -139,7 +157,7 @@ chooseInterface() {
|
|||||||
do
|
do
|
||||||
piholeInterface=$desiredInterface
|
piholeInterface=$desiredInterface
|
||||||
echo "::: Using interface: $piholeInterface"
|
echo "::: Using interface: $piholeInterface"
|
||||||
echo ${piholeInterface} > /tmp/piholeINT
|
echo "${piholeInterface}" > /tmp/piholeINT
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
echo "::: Cancel selected, exiting...."
|
echo "::: Cancel selected, exiting...."
|
||||||
@@ -148,10 +166,16 @@ chooseInterface() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanupIPv6() {
|
||||||
|
# Removes IPv6 indicator file if we are not using IPv6
|
||||||
|
if [ -f "/etc/pihole/.useIPv6" ] && [ ! "$useIPv6" ]; then
|
||||||
|
rm /etc/pihole/.useIPv6
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
use4andor6() {
|
use4andor6() {
|
||||||
# Let use select IPv4 and/or IPv6
|
# Let use select IPv4 and/or IPv6
|
||||||
cmd=(whiptail --separate-output --checklist "Select Protocols" $r $c 2)
|
cmd=(whiptail --separate-output --checklist "Select Protocols (press space to select)" $r $c 2)
|
||||||
options=(IPv4 "Block ads over IPv4" on
|
options=(IPv4 "Block ads over IPv4" on
|
||||||
IPv6 "Block ads over IPv6" off)
|
IPv6 "Block ads over IPv6" off)
|
||||||
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
|
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
|
||||||
@@ -187,6 +211,7 @@ use4andor6() {
|
|||||||
echo "::: Exiting"
|
echo "::: Exiting"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
cleanupIPv6
|
||||||
else
|
else
|
||||||
echo "::: Cancel selected. Exiting..."
|
echo "::: Cancel selected. Exiting..."
|
||||||
exit 1
|
exit 1
|
||||||
@@ -218,11 +243,11 @@ getStaticIPv4Settings() {
|
|||||||
until [[ $ipSettingsCorrect = True ]]
|
until [[ $ipSettingsCorrect = True ]]
|
||||||
do
|
do
|
||||||
# Ask for the IPv4 address
|
# Ask for the IPv4 address
|
||||||
IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3)
|
IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c "$IPv4addr" 3>&1 1>&2 2>&3)
|
||||||
if [[ $? = 0 ]];then
|
if [[ $? = 0 ]];then
|
||||||
echo "::: Your static IPv4 address: $IPv4addr"
|
echo "::: Your static IPv4 address: $IPv4addr"
|
||||||
# Ask for the gateway
|
# Ask for the gateway
|
||||||
IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3)
|
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
|
if [[ $? = 0 ]];then
|
||||||
echo "::: Your static IPv4 gateway: $IPv4gw"
|
echo "::: Your static IPv4 gateway: $IPv4gw"
|
||||||
# Give the user a chance to review their settings before moving on
|
# Give the user a chance to review their settings before moving on
|
||||||
@@ -231,8 +256,8 @@ getStaticIPv4Settings() {
|
|||||||
Gateway: $IPv4gw" $r $c)then
|
Gateway: $IPv4gw" $r $c)then
|
||||||
# If the settings are correct, then we need to set the piholeIP
|
# 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
|
# Saving it to a temporary file us to retrieve it later when we run the gravity.sh script
|
||||||
echo ${IPv4addr%/*} > /tmp/piholeIP
|
echo "${IPv4addr%/*}" > /tmp/piholeIP
|
||||||
echo $piholeInterface > /tmp/piholeINT
|
echo "$piholeInterface" > /tmp/piholeINT
|
||||||
# After that's done, the loop ends and we move on
|
# After that's done, the loop ends and we move on
|
||||||
ipSettingsCorrect=True
|
ipSettingsCorrect=True
|
||||||
else
|
else
|
||||||
@@ -266,22 +291,43 @@ setDHCPCD() {
|
|||||||
|
|
||||||
setStaticIPv4() {
|
setStaticIPv4() {
|
||||||
# Tries to set the IPv4 address
|
# Tries to set the IPv4 address
|
||||||
if grep -q $IPv4addr $dhcpcdFile; then
|
if grep -q "$IPv4addr" $dhcpcdFile; then
|
||||||
# address already set, noop
|
# address already set, noop
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
setDHCPCD
|
setDHCPCD
|
||||||
$SUDO ip addr replace dev $piholeInterface $IPv4addr
|
$SUDO ip addr replace dev "$piholeInterface" "$IPv4addr"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete."
|
echo "::: Setting IP to $IPv4addr. You may need to restart after the install is complete."
|
||||||
echo ":::"
|
echo ":::"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function valid_ip()
|
||||||
|
{
|
||||||
|
local ip=$1
|
||||||
|
local stat=1
|
||||||
|
|
||||||
|
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
|
||||||
|
OIFS=$IFS
|
||||||
|
IFS='.'
|
||||||
|
ip=($ip)
|
||||||
|
IFS=$OIFS
|
||||||
|
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
|
||||||
|
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
|
||||||
|
stat=$?
|
||||||
|
fi
|
||||||
|
return $stat
|
||||||
|
}
|
||||||
|
|
||||||
setDNS(){
|
setDNS(){
|
||||||
DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider" $r $c 2)
|
DNSChoseCmd=(whiptail --separate-output --radiolist "Select Upstream DNS Provider. To use your own, select Custom." $r $c 6)
|
||||||
DNSChooseOptions=(Google "" on
|
DNSChooseOptions=(Google "" on
|
||||||
OpenDNS "" off)
|
OpenDNS "" off
|
||||||
|
Level3 "" off
|
||||||
|
Norton "" off
|
||||||
|
Comodo "" off
|
||||||
|
Custom "" off)
|
||||||
DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty)
|
DNSchoices=$("${DNSChoseCmd[@]}" "${DNSChooseOptions[@]}" 2>&1 >/dev/tty)
|
||||||
if [[ $? = 0 ]];then
|
if [[ $? = 0 ]];then
|
||||||
case $DNSchoices in
|
case $DNSchoices in
|
||||||
@@ -295,6 +341,69 @@ setDNS(){
|
|||||||
piholeDNS1="208.67.222.222"
|
piholeDNS1="208.67.222.222"
|
||||||
piholeDNS2="208.67.220.220"
|
piholeDNS2="208.67.220.220"
|
||||||
;;
|
;;
|
||||||
|
Level3)
|
||||||
|
echo "::: Using Level3 servers."
|
||||||
|
piholeDNS1="4.2.2.1"
|
||||||
|
piholeDNS2="4.2.2.2"
|
||||||
|
;;
|
||||||
|
Norton)
|
||||||
|
echo "::: Using Norton ConnectSafe servers."
|
||||||
|
piholeDNS1="199.85.126.10"
|
||||||
|
piholeDNS2="199.85.127.10"
|
||||||
|
;;
|
||||||
|
Comodo)
|
||||||
|
echo "::: Using Comodo Secure servers."
|
||||||
|
piholeDNS1="8.26.56.26"
|
||||||
|
piholeDNS2="8.20.247.20"
|
||||||
|
;;
|
||||||
|
Custom)
|
||||||
|
until [[ $DNSSettingsCorrect = True ]]
|
||||||
|
do
|
||||||
|
strInvalid="Invalid"
|
||||||
|
if [ ! $piholeDNS1 ]; then
|
||||||
|
if [ ! $piholeDNS2 ]; then
|
||||||
|
prePopulate=""
|
||||||
|
else
|
||||||
|
prePopulate=", $piholeDNS2"
|
||||||
|
fi
|
||||||
|
elif [ $piholeDNS1 ] && [ ! $piholeDNS2 ]; then
|
||||||
|
prePopulate="$piholeDNS1"
|
||||||
|
elif [ $piholeDNS1 ] && [ $piholeDNS2 ]; then
|
||||||
|
prePopulate="$piholeDNS1, $piholeDNS2"
|
||||||
|
fi
|
||||||
|
piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), seperated by a comma.\n\nFor example '8.8.8.8, 8.8.4.4'" $r $c "$prePopulate" 3>&1 1>&2 2>&3)
|
||||||
|
if [[ $? = 0 ]];then
|
||||||
|
piholeDNS1=$(echo "$piholeDNS" | sed 's/[, \t]\+/,/g' | awk -F, '{print$1}')
|
||||||
|
piholeDNS2=$(echo "$piholeDNS" | sed 's/[, \t]\+/,/g' | awk -F, '{print$2}')
|
||||||
|
if ! valid_ip "$piholeDNS1" || [ ! "$piholeDNS1" ]; then
|
||||||
|
piholeDNS1=$strInvalid
|
||||||
|
fi
|
||||||
|
if ! valid_ip "$piholeDNS2" && [ "$piholeDNS2" ]; then
|
||||||
|
piholeDNS2=$strInvalid
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "::: Cancel selected, exiting...."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if [[ $piholeDNS1 == "$strInvalid" ]] || [[ $piholeDNS2 == "$strInvalid" ]]; then
|
||||||
|
whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\n\n DNS Server 1: $piholeDNS1\n DNS Server 2: $piholeDNS2" $r $c
|
||||||
|
if [[ $piholeDNS1 == "$strInvalid" ]]; then
|
||||||
|
piholeDNS1=""
|
||||||
|
fi
|
||||||
|
if [[ $piholeDNS2 == "$strInvalid" ]]; then
|
||||||
|
piholeDNS2=""
|
||||||
|
fi
|
||||||
|
DNSSettingsCorrect=False
|
||||||
|
else
|
||||||
|
if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\n DNS Server 1: $piholeDNS1\n DNS Server 2: $piholeDNS2" $r $c) then
|
||||||
|
DNSSettingsCorrect=True
|
||||||
|
else
|
||||||
|
# If the settings are wrong, the loop continues
|
||||||
|
DNSSettingsCorrect=False
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
else
|
else
|
||||||
echo "::: Cancel selected. Exiting..."
|
echo "::: Cancel selected. Exiting..."
|
||||||
@@ -307,7 +416,6 @@ versionCheckDNSmasq(){
|
|||||||
dnsFile1="/etc/dnsmasq.conf"
|
dnsFile1="/etc/dnsmasq.conf"
|
||||||
dnsFile2="/etc/dnsmasq.conf.orig"
|
dnsFile2="/etc/dnsmasq.conf.orig"
|
||||||
dnsSearch="addn-hosts=/etc/pihole/gravity.list"
|
dnsSearch="addn-hosts=/etc/pihole/gravity.list"
|
||||||
|
|
||||||
defaultFile="/etc/.pihole/advanced/dnsmasq.conf.original"
|
defaultFile="/etc/.pihole/advanced/dnsmasq.conf.original"
|
||||||
newFileToInstall="/etc/.pihole/advanced/01-pihole.conf"
|
newFileToInstall="/etc/.pihole/advanced/01-pihole.conf"
|
||||||
newFileFinalLocation="/etc/dnsmasq.d/01-pihole.conf"
|
newFileFinalLocation="/etc/dnsmasq.d/01-pihole.conf"
|
||||||
@@ -335,21 +443,50 @@ versionCheckDNSmasq(){
|
|||||||
$SUDO cp $newFileToInstall $newFileFinalLocation
|
$SUDO cp $newFileToInstall $newFileFinalLocation
|
||||||
echo " done."
|
echo " done."
|
||||||
$SUDO sed -i "s/@INT@/$piholeInterface/" $newFileFinalLocation
|
$SUDO sed -i "s/@INT@/$piholeInterface/" $newFileFinalLocation
|
||||||
|
if [[ "$piholeDNS1" != "" ]]; then
|
||||||
$SUDO sed -i "s/@DNS1@/$piholeDNS1/" $newFileFinalLocation
|
$SUDO sed -i "s/@DNS1@/$piholeDNS1/" $newFileFinalLocation
|
||||||
|
else
|
||||||
|
$SUDO sed -i '/^server=@DNS1@/d' $newFileFinalLocation
|
||||||
|
fi
|
||||||
|
if [[ "$piholeDNS2" != "" ]]; then
|
||||||
$SUDO sed -i "s/@DNS2@/$piholeDNS2/" $newFileFinalLocation
|
$SUDO sed -i "s/@DNS2@/$piholeDNS2/" $newFileFinalLocation
|
||||||
|
else
|
||||||
|
$SUDO sed -i '/^server=@DNS2@/d' $newFileFinalLocation
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
installScripts() {
|
installScripts() {
|
||||||
# Install the scripts from /etc/.pihole to their various locations
|
# Install the scripts from /etc/.pihole to their various locations
|
||||||
$SUDO echo ":::"
|
$SUDO echo ":::"
|
||||||
$SUDO echo -n "::: Installing scripts..."
|
$SUDO echo -n "::: Installing scripts to /opt/pihole..."
|
||||||
$SUDO cp /etc/.pihole/gravity.sh /usr/local/bin/gravity.sh
|
if [ ! -d /opt/pihole ]; then
|
||||||
$SUDO cp /etc/.pihole/advanced/Scripts/chronometer.sh /usr/local/bin/chronometer.sh
|
$SUDO mkdir /opt/pihole
|
||||||
$SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /usr/local/bin/whitelist.sh
|
$SUDO chown "$USER":root /opt/pihole
|
||||||
$SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /usr/local/bin/blacklist.sh
|
$SUDO chmod u+srwx /opt/pihole
|
||||||
$SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /usr/local/bin/piholeLogFlush.sh
|
fi
|
||||||
$SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /usr/local/bin/updateDashboard.sh
|
$SUDO cp /etc/.pihole/gravity.sh /opt/pihole/gravity.sh
|
||||||
$SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh
|
$SUDO cp /etc/.pihole/advanced/Scripts/chronometer.sh /opt/pihole/chronometer.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/whitelist.sh /opt/pihole/whitelist.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/blacklist.sh /opt/pihole/blacklist.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/piholeDebug.sh /opt/pihole/piholeDebug.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/piholeLogFlush.sh /opt/pihole/piholeLogFlush.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/updateDashboard.sh /opt/pihole/updateDashboard.sh
|
||||||
|
$SUDO cp /etc/.pihole/automated\ install/uninstall.sh /opt/pihole/uninstall.sh
|
||||||
|
$SUDO cp /etc/.pihole/advanced/Scripts/setupLCD.sh /opt/pihole/setupLCD.sh
|
||||||
|
$SUDO chmod 755 /opt/pihole/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard,uninstall,setupLCD}.sh
|
||||||
|
$SUDO cp /etc/.pihole/pihole /usr/local/bin/pihole
|
||||||
|
$SUDO chmod 755 /usr/local/bin/pihole
|
||||||
|
$SUDO cp /etc/.pihole/advanced/bash-completion/pihole /etc/bash_completion.d/pihole
|
||||||
|
. /etc/bash_completion.d/pihole
|
||||||
|
|
||||||
|
#Tidy up /usr/local/bin directory if installing over previous install.
|
||||||
|
oldFiles=( gravity chronometer whitelist blacklist piholeLogFlush updateDashboard uninstall setupLCD piholeDebug)
|
||||||
|
for i in "${oldFiles[@]}"; do
|
||||||
|
if [ -f "/usr/local/bin/$i.sh" ]; then
|
||||||
|
$SUDO rm /usr/local/bin/"$i".sh
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
$SUDO echo " done."
|
$SUDO echo " done."
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -358,7 +495,11 @@ installConfigs() {
|
|||||||
$SUDO echo ":::"
|
$SUDO echo ":::"
|
||||||
$SUDO echo "::: Installing configs..."
|
$SUDO echo "::: Installing configs..."
|
||||||
versionCheckDNSmasq
|
versionCheckDNSmasq
|
||||||
|
if [ ! -d "/etc/lighttpd" ]; then
|
||||||
|
$SUDO mkdir /etc/lighttpd
|
||||||
|
$SUDO chown "$USER":root /etc/lighttpd
|
||||||
$SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
|
$SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
|
||||||
|
fi
|
||||||
$SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf
|
$SUDO cp /etc/.pihole/advanced/lighttpd.conf /etc/lighttpd/lighttpd.conf
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -366,7 +507,7 @@ stopServices() {
|
|||||||
# Stop dnsmasq and lighttpd
|
# Stop dnsmasq and lighttpd
|
||||||
$SUDO echo ":::"
|
$SUDO echo ":::"
|
||||||
$SUDO echo -n "::: Stopping services..."
|
$SUDO echo -n "::: Stopping services..."
|
||||||
$SUDO service dnsmasq stop & spinner $! || true
|
#$SUDO service dnsmasq stop & spinner $! || true
|
||||||
$SUDO service lighttpd stop & spinner $! || true
|
$SUDO service lighttpd stop & spinner $! || true
|
||||||
$SUDO echo " done."
|
$SUDO echo " done."
|
||||||
}
|
}
|
||||||
@@ -376,12 +517,11 @@ checkForDependencies() {
|
|||||||
#requiring user input (e.g password for phpmyadmin see #218)
|
#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
|
#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
|
# if so, advise the user to run apt-get update/upgrade at their own discretion
|
||||||
|
|
||||||
#Check to see if apt-get update has already been run today
|
#Check to see if apt-get update has already been run today
|
||||||
# it needs to have been run at least once on new installs!
|
# it needs to have been run at least once on new installs!
|
||||||
|
|
||||||
timestamp=$(stat -c %Y /var/cache/apt/)
|
timestamp=$(stat -c %Y /var/cache/apt/)
|
||||||
timestampAsDate=$(date -d @$timestamp "+%b %e")
|
timestampAsDate=$(date -d @"$timestamp" "+%b %e")
|
||||||
today=$(date "+%b %e")
|
today=$(date "+%b %e")
|
||||||
|
|
||||||
if [ ! "$today" == "$timestampAsDate" ]; then
|
if [ ! "$today" == "$timestampAsDate" ]; then
|
||||||
@@ -393,7 +533,7 @@ checkForDependencies() {
|
|||||||
fi
|
fi
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Checking apt-get for upgraded packages...."
|
echo -n "::: Checking apt-get for upgraded packages...."
|
||||||
updatesToInstall=$(sudo apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst)
|
updatesToInstall=$($SUDO apt-get -s -o Debug::NoLocking=true upgrade | grep -c ^Inst)
|
||||||
echo " done!"
|
echo " done!"
|
||||||
echo ":::"
|
echo ":::"
|
||||||
if [[ $updatesToInstall -eq "0" ]]; then
|
if [[ $updatesToInstall -eq "0" ]]; then
|
||||||
@@ -407,13 +547,11 @@ checkForDependencies() {
|
|||||||
echo "::: Checking dependencies:"
|
echo "::: Checking dependencies:"
|
||||||
|
|
||||||
dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget )
|
dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common php5-cgi php5 git curl unzip wget )
|
||||||
for i in "${dependencies[@]}"
|
for i in "${dependencies[@]}"; do
|
||||||
do
|
|
||||||
:
|
|
||||||
echo -n "::: Checking for $i..."
|
echo -n "::: Checking for $i..."
|
||||||
if [ $(dpkg-query -W -f='${Status}' $i 2>/dev/null | grep -c "ok installed") -eq 0 ]; then
|
if [ "$(dpkg-query -W -f='${Status}' "$i" 2>/dev/null | grep -c "ok installed")" -eq 0 ]; then
|
||||||
echo -n " Not found! Installing...."
|
echo -n " Not found! Installing...."
|
||||||
$SUDO apt-get -y -qq install $i > /dev/null & spinner $!
|
$SUDO apt-get -y -qq install "$i" > /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
else
|
else
|
||||||
echo " already installed!"
|
echo " already installed!"
|
||||||
@@ -454,7 +592,7 @@ is_repo() {
|
|||||||
make_repo() {
|
make_repo() {
|
||||||
# Remove the non-repod interface and clone the interface
|
# Remove the non-repod interface and clone the interface
|
||||||
echo -n "::: Cloning $2 into $1..."
|
echo -n "::: Cloning $2 into $1..."
|
||||||
$SUDO rm -rf $1
|
$SUDO rm -rf "$1"
|
||||||
$SUDO git clone -q "$2" "$1" > /dev/null & spinner $!
|
$SUDO git clone -q "$2" "$1" > /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
@@ -462,7 +600,7 @@ make_repo() {
|
|||||||
update_repo() {
|
update_repo() {
|
||||||
# Pull the latest commits
|
# Pull the latest commits
|
||||||
echo -n "::: Updating repo in $1..."
|
echo -n "::: Updating repo in $1..."
|
||||||
cd "$1"
|
cd "$1" || exit
|
||||||
$SUDO git pull -q > /dev/null & spinner $!
|
$SUDO git pull -q > /dev/null & spinner $!
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
@@ -490,8 +628,12 @@ installPiholeWeb() {
|
|||||||
$SUDO echo " Existing page detected, not overwriting"
|
$SUDO echo " Existing page detected, not overwriting"
|
||||||
else
|
else
|
||||||
$SUDO mkdir /var/www/html/pihole
|
$SUDO mkdir /var/www/html/pihole
|
||||||
|
if [ -f /var/www/html/index.lighttpd.html ]; then
|
||||||
$SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig
|
$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
|
else
|
||||||
|
printf "\n:::\tNo default index.lighttpd.html file found... not backing up"
|
||||||
|
fi
|
||||||
|
$SUDO cp /etc/.pihole/advanced/index.* /var/www/html/pihole/.
|
||||||
$SUDO echo " done!"
|
$SUDO echo " done!"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -512,28 +654,38 @@ runGravity() {
|
|||||||
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
|
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
|
||||||
$SUDO rm /etc/pihole/list.*
|
$SUDO rm /etc/pihole/list.*
|
||||||
fi
|
fi
|
||||||
#Don't run as SUDO, this was causing issues
|
|
||||||
echo "::: Running gravity.sh"
|
echo "::: Running gravity.sh"
|
||||||
echo ":::"
|
$SUDO /opt/pihole/gravity.sh
|
||||||
|
|
||||||
/usr/local/bin/gravity.sh
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setUser(){
|
||||||
|
# Check if user pihole exists and create if not
|
||||||
|
echo "::: Checking if user 'pihole' exists..."
|
||||||
|
if id -u pihole > /dev/null 2>&1; then
|
||||||
|
echo "::: User 'pihole' already exists"
|
||||||
|
else
|
||||||
|
echo "::: User 'pihole' doesn't exist. Creating..."
|
||||||
|
$SUDO useradd -r -s /usr/sbin/nologin pihole
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
installPihole() {
|
installPihole() {
|
||||||
# Install base files and web interface
|
# Install base files and web interface
|
||||||
checkForDependencies # done
|
checkForDependencies # done
|
||||||
stopServices
|
stopServices
|
||||||
|
setUser
|
||||||
$SUDO mkdir -p /etc/pihole/
|
$SUDO mkdir -p /etc/pihole/
|
||||||
|
if [ ! -d "/var/www/html" ]; then
|
||||||
|
$SUDO mkdir -p /var/www/html
|
||||||
|
fi
|
||||||
$SUDO chown www-data:www-data /var/www/html
|
$SUDO chown www-data:www-data /var/www/html
|
||||||
$SUDO chmod 775 /var/www/html
|
$SUDO chmod 775 /var/www/html
|
||||||
$SUDO usermod -a -G www-data pi
|
$SUDO usermod -a -G www-data pihole
|
||||||
$SUDO lighty-enable-mod fastcgi fastcgi-php > /dev/null
|
$SUDO lighty-enable-mod fastcgi fastcgi-php > /dev/null
|
||||||
|
|
||||||
getGitFiles
|
getGitFiles
|
||||||
installScripts
|
installScripts
|
||||||
installConfigs
|
installConfigs
|
||||||
#installWebAdmin
|
|
||||||
CreateLogFile
|
CreateLogFile
|
||||||
installPiholeWeb
|
installPiholeWeb
|
||||||
installCron
|
installCron
|
||||||
@@ -544,8 +696,8 @@ displayFinalMessage() {
|
|||||||
# Final completion message to user
|
# Final completion message to user
|
||||||
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
|
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
|
||||||
|
|
||||||
$IPv4addr
|
IPv4: $IPv4addr
|
||||||
$piholeIPv6
|
IPv6: $piholeIPv6
|
||||||
|
|
||||||
If you set a new IP address, you should restart the Pi.
|
If you set a new IP address, you should restart the Pi.
|
||||||
|
|
||||||
@@ -557,6 +709,9 @@ The install log is in /etc/pihole." $r $c
|
|||||||
$SUDO mkdir -p /etc/pihole/
|
$SUDO mkdir -p /etc/pihole/
|
||||||
welcomeDialogs
|
welcomeDialogs
|
||||||
|
|
||||||
|
# Verify there is enough disk space for the install
|
||||||
|
verifyFreeDiskSpace
|
||||||
|
|
||||||
# Just back up the original Pi-hole right away since it won't take long and it gets it out of the way
|
# Just back up the original Pi-hole right away since it won't take long and it gets it out of the way
|
||||||
backupLegacyPihole
|
backupLegacyPihole
|
||||||
# Find interfaces and let the user choose one
|
# Find interfaces and let the user choose one
|
||||||
@@ -575,6 +730,18 @@ $SUDO mv $tmpLog $instalLogLoc
|
|||||||
|
|
||||||
displayFinalMessage
|
displayFinalMessage
|
||||||
|
|
||||||
|
echo -n "::: Restarting services..."
|
||||||
# Start services
|
# Start services
|
||||||
$SUDO service dnsmasq start
|
$SUDO service dnsmasq restart
|
||||||
$SUDO service lighttpd start
|
$SUDO service lighttpd start
|
||||||
|
echo " done."
|
||||||
|
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Installation Complete! Configure your devices to use the Pi-hole as their DNS server using:"
|
||||||
|
echo "::: $IPv4addr"
|
||||||
|
echo "::: $piholeIPv6"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: If you set a new IP address, you should restart the Pi."
|
||||||
|
echo "::: "
|
||||||
|
echo "::: The install log is located at: /etc/pihole/install.log"
|
||||||
|
|
||||||
|
127
automated install/uninstall.sh
Normal file → Executable file
127
automated install/uninstall.sh
Normal file → Executable file
@@ -12,45 +12,89 @@
|
|||||||
|
|
||||||
# Must be root to uninstall
|
# Must be root to uninstall
|
||||||
if [[ $EUID -eq 0 ]];then
|
if [[ $EUID -eq 0 ]];then
|
||||||
echo "You are root."
|
echo "::: You are root."
|
||||||
else
|
else
|
||||||
echo "sudo will be used for the install."
|
echo "::: Sudo will be used for the uninstall."
|
||||||
# Check if it is actually installed
|
# Check if it is actually installed
|
||||||
# If it isn't, exit because the unnstall cannot complete
|
# If it isn't, exit because the unnstall cannot complete
|
||||||
if [[ $(dpkg-query -s sudo) ]];then
|
if [[ $(dpkg-query -s sudo) ]];then
|
||||||
export SUDO="sudo"
|
export SUDO="sudo"
|
||||||
else
|
else
|
||||||
echo "Please install sudo or run this as root."
|
echo "::: Please install sudo or run this as root."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
spinner()
|
||||||
|
{
|
||||||
|
local pid=$1
|
||||||
|
local delay=0.50
|
||||||
|
local spinstr='/-\|'
|
||||||
|
while [ "$(ps a | awk '{print $1}' | grep "$pid")" ]; do
|
||||||
|
local temp=${spinstr#?}
|
||||||
|
printf " [%c] " "$spinstr"
|
||||||
|
local spinstr=$temp${spinstr%"$temp"}
|
||||||
|
sleep $delay
|
||||||
|
printf "\b\b\b\b\b\b"
|
||||||
|
done
|
||||||
|
printf " \b\b\b\b"
|
||||||
|
}
|
||||||
|
|
||||||
######### SCRIPT ###########
|
function removeAndPurge {
|
||||||
$SUDO apt-get -y remove --purge dnsutils bc toilet
|
# Purge dependencies
|
||||||
$SUDO apt-get -y remove --purge dnsmasq
|
echo ":::"
|
||||||
$SUDO apt-get -y remove --purge lighttpd php5-common php5-cgi php5
|
# Nate 3/28/2016 - Removed `php5-cgi` and `php5` as they are removed with php5-common
|
||||||
|
dependencies=( dnsutils bc toilet figlet dnsmasq lighttpd php5-common git curl unzip wget )
|
||||||
|
for i in "${dependencies[@]}"; do
|
||||||
|
if [ "$(dpkg-query -W --showformat='${Status}\n' "$i" 2> /dev/null | grep -c "ok installed")" -eq 1 ]; then
|
||||||
|
while true; do
|
||||||
|
read -rp "::: Do you wish to remove $i from your system? [y/n]: " yn
|
||||||
|
case $yn in
|
||||||
|
[Yy]* ) printf ":::\tRemoving %s..." "$i"; $SUDO apt-get -y remove --purge "$i" &> /dev/null & spinner $!; printf "done!\n"; break;;
|
||||||
|
[Nn]* ) printf ":::\tSkipping %s" "$i\n"; break;;
|
||||||
|
* ) printf "::: You must answer yes or no!\n";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
else
|
||||||
|
printf ":::\tPackage %s not installed... Not removing.\n" "$i"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
# Remove dependency config files
|
||||||
|
echo "::: Removing dnsmasq config files..."
|
||||||
|
$SUDO rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig /etc/dnsmasq.d/01-pihole.conf &> /dev/null
|
||||||
|
|
||||||
|
# Take care of any additional package cleaning
|
||||||
|
printf "::: Auto removing remaining dependencies..."
|
||||||
|
$SUDO apt-get -y autoremove &> /dev/null & spinner $!; printf "done!\n";
|
||||||
|
printf "::: Auto cleaning remaining dependencies..."
|
||||||
|
$SUDO apt-get -y autoclean &> /dev/null & spinner $!; printf "done!\n";
|
||||||
|
|
||||||
|
# Call removeNoPurge to remove PiHole specific files
|
||||||
|
removeNoPurge
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeNoPurge {
|
||||||
|
echo ":::"
|
||||||
# Only web directories/files that are created by pihole should be removed.
|
# Only web directories/files that are created by pihole should be removed.
|
||||||
echo "Removing the Pi-hole Web server files..."
|
echo "::: Removing the Pi-hole Web server files..."
|
||||||
$SUDO rm -rf /var/www/html/admin
|
$SUDO rm -rf /var/www/html/admin &> /dev/null
|
||||||
$SUDO rm -rf /var/www/html/pihole
|
$SUDO rm -rf /var/www/html/pihole &> /dev/null
|
||||||
$SUDO rm /var/www/html/index.lighttpd.orig
|
$SUDO rm /var/www/html/index.lighttpd.orig &> /dev/null
|
||||||
|
|
||||||
# If the web directory is empty after removing these files, then the parent html folder can be removed.
|
# If the web directory is empty after removing these files, then the parent html folder can be removed.
|
||||||
|
if [ -d "/var/www/html" ]; then
|
||||||
if [[ ! "$(ls -A /var/www/html)" ]]; then
|
if [[ ! "$(ls -A /var/www/html)" ]]; then
|
||||||
$SUDO rm -rf /var/www/html
|
$SUDO rm -rf /var/www/html &> /dev/null
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Removing dnsmasq config files..."
|
|
||||||
$SUDO rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
|
|
||||||
|
|
||||||
# Attempt to preserve backwards compatibility with older versions
|
# Attempt to preserve backwards compatibility with older versions
|
||||||
# to guarantee no additional changes were made to /etc/crontab after
|
# to guarantee no additional changes were made to /etc/crontab after
|
||||||
# the installation of pihole, /etc/crontab.pihole should be permanently
|
# the installation of pihole, /etc/crontab.pihole should be permanently
|
||||||
# preserved.
|
# preserved.
|
||||||
if [[ -f /etc/crontab.orig ]]; then
|
if [[ -f /etc/crontab.orig ]]; then
|
||||||
echo "Initial Pi-hole cron detected. Restoring the default system cron..."
|
echo "::: Initial Pi-hole cron detected. Restoring the default system cron..."
|
||||||
$SUDO mv /etc/crontab /etc/crontab.pihole
|
$SUDO mv /etc/crontab /etc/crontab.pihole
|
||||||
$SUDO mv /etc/crontab.orig /etc/crontab
|
$SUDO mv /etc/crontab.orig /etc/crontab
|
||||||
$SUDO service cron restart
|
$SUDO service cron restart
|
||||||
@@ -58,16 +102,45 @@ fi
|
|||||||
|
|
||||||
# Attempt to preserve backwards compatibility with older versions
|
# Attempt to preserve backwards compatibility with older versions
|
||||||
if [[ -f /etc/cron.d/pihole ]];then
|
if [[ -f /etc/cron.d/pihole ]];then
|
||||||
echo "Removing cron.d/pihole..."
|
echo "::: Removing cron.d/pihole..."
|
||||||
$SUDO rm /etc/cron.d/pihole
|
$SUDO rm /etc/cron.d/pihole &> /dev/null
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Removing config files and scripts..."
|
echo "::: Removing config files and scripts..."
|
||||||
$SUDO rm /etc/dnsmasq.conf
|
if [ ! "$(dpkg-query -W --showformat='${Status}\n' lighttpd 2> /dev/null | grep -c "ok installed")" -eq 1 ]; then
|
||||||
$SUDO rm -rf /etc/lighttpd/
|
$SUDO rm -rf /etc/lighttpd/ &> /dev/null
|
||||||
$SUDO rm /var/log/pihole.log
|
else
|
||||||
$SUDO rm /usr/local/bin/gravity.sh
|
if [ -f /etc/lighttpd/lighttpd.conf.orig ]; then
|
||||||
$SUDO rm /usr/local/bin/chronometer.sh
|
$SUDO mv /etc/lighttpd/lighttpd.conf.orig /etc/lighttpd/lighttpd.conf
|
||||||
$SUDO rm /usr/local/bin/whitelist.sh
|
fi
|
||||||
$SUDO rm /usr/local/bin/piholeLogFlush.sh
|
fi
|
||||||
$SUDO rm -rf /etc/pihole/
|
|
||||||
|
$SUDO rm /etc/dnsmasq.d/adList.conf &> /dev/null
|
||||||
|
$SUDO rm /etc/dnsmasq.d/01-pihole.conf &> /dev/null
|
||||||
|
$SUDO rm -rf /var/log/*pihole* &> /dev/null
|
||||||
|
$SUDO rm -rf /etc/pihole/ &> /dev/null
|
||||||
|
$SUDO rm -rf /etc/.pihole/ &> /dev/null
|
||||||
|
$SUDO rm -rf /opt/pihole/ &> /dev/null
|
||||||
|
$SUDO rm /usr/local/bin/pihole &> /dev/null
|
||||||
|
$SUDO rm /etc/bash_completion.d/pihole
|
||||||
|
|
||||||
|
echo ":::"
|
||||||
|
printf "::: Finished removing PiHole from your system. Sorry to see you go!\n"
|
||||||
|
printf "::: Reach out to us at https://github.com/pi-hole/pi-hole/issues if you need help\n"
|
||||||
|
printf "::: Reinstall by simpling running\n:::\n:::\tcurl -L https://install.pi-hole.net | bash\n:::\n::: at any time!\n:::\n"
|
||||||
|
printf "::: PLEASE RESET YOUR DNS ON YOUR ROUTER/CLIENTS TO RESTORE INTERNET CONNECTIVITY!\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
######### SCRIPT ###########
|
||||||
|
echo "::: Preparing to remove packages, be sure that each may be safely removed depending on your operating system."
|
||||||
|
echo "::: (SAFE TO REMOVE ALL ON RASPBIAN)"
|
||||||
|
while true; do
|
||||||
|
read -rp "::: Do you wish to purge PiHole's dependencies from your OS? (You will be prompted for each package) [y/n]: " yn
|
||||||
|
case $yn in
|
||||||
|
[Yy]* ) removeAndPurge; break;;
|
||||||
|
|
||||||
|
[Nn]* ) removeNoPurge; break;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
@@ -38,6 +38,6 @@ include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
|
|||||||
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
|
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
|
||||||
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
|
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
|
||||||
|
|
||||||
$HTTP["host"] =~ "ads.hulu.com|ads-v-darwin.hulu.com" {
|
$HTTP["host"] =~ "ads.hulu.com|ads-v-darwin.hulu.com|ads-e-darwin.hulu.com" {
|
||||||
url.redirect = ( ".*" => "http://192.168.1.101:8200/MediaItems/19.mov")
|
url.redirect = ( ".*" => "http://192.168.1.101:8200/MediaItems/19.mov")
|
||||||
}
|
}
|
||||||
|
125
gravity.sh
125
gravity.sh
@@ -12,6 +12,7 @@
|
|||||||
|
|
||||||
# Run this script as root or under sudo
|
# Run this script as root or under sudo
|
||||||
echo ":::"
|
echo ":::"
|
||||||
|
|
||||||
if [[ $EUID -eq 0 ]];then
|
if [[ $EUID -eq 0 ]];then
|
||||||
echo "::: You are root."
|
echo "::: You are root."
|
||||||
else
|
else
|
||||||
@@ -31,6 +32,8 @@ piholeIPv6file=/etc/pihole/.useIPv6
|
|||||||
|
|
||||||
adListFile=/etc/pihole/adlists.list
|
adListFile=/etc/pihole/adlists.list
|
||||||
adListDefault=/etc/pihole/adlists.default
|
adListDefault=/etc/pihole/adlists.default
|
||||||
|
whitelistScript=/opt/pihole/whitelist.sh
|
||||||
|
blacklistScript=/opt/pihole/blacklist.sh
|
||||||
|
|
||||||
if [[ -f $piholeIPfile ]];then
|
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
|
# 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
|
||||||
@@ -39,7 +42,7 @@ if [[ -f $piholeIPfile ]];then
|
|||||||
else
|
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
|
# 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)}')
|
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
|
||||||
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
|
piholeIPCIDR=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
|
||||||
piholeIP=${piholeIPCIDR%/*}
|
piholeIP=${piholeIPCIDR%/*}
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -48,22 +51,20 @@ if [[ -f $piholeIPv6file ]];then
|
|||||||
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Variables for various stages of downloading and formatting the list
|
# Variables for various stages of downloading and formatting the list
|
||||||
|
## Nate 3/26/2016 - Commented unused variables
|
||||||
basename=pihole
|
basename=pihole
|
||||||
piholeDir=/etc/$basename
|
piholeDir=/etc/$basename
|
||||||
adList=$piholeDir/gravity.list
|
adList=$piholeDir/gravity.list
|
||||||
blacklist=$piholeDir/blacklist.txt
|
#blacklist=$piholeDir/blacklist.txt
|
||||||
whitelist=$piholeDir/whitelist.txt
|
#whitelist=$piholeDir/whitelist.txt
|
||||||
latentWhitelist=$piholeDir/latentWhitelist.txt
|
#latentWhitelist=$piholeDir/latentWhitelist.txt
|
||||||
justDomainsExtension=domains
|
justDomainsExtension=domains
|
||||||
matterandlight=$basename.0.matterandlight.txt
|
matterandlight=$basename.0.matterandlight.txt
|
||||||
supernova=$basename.1.supernova.txt
|
supernova=$basename.1.supernova.txt
|
||||||
eventHorizon=$basename.2.eventHorizon.txt
|
eventHorizon=$basename.2.eventHorizon.txt
|
||||||
accretionDisc=$basename.3.accretionDisc.txt
|
accretionDisc=$basename.3.accretionDisc.txt
|
||||||
eyeOfTheNeedle=$basename.4.wormhole.txt
|
#eyeOfTheNeedle=$basename.4.wormhole.txt
|
||||||
|
|
||||||
# After setting defaults, check if there's local overrides
|
# After setting defaults, check if there's local overrides
|
||||||
if [[ -r $piholeDir/pihole.conf ]];then
|
if [[ -r $piholeDir/pihole.conf ]];then
|
||||||
@@ -71,22 +72,6 @@ if [[ -r $piholeDir/pihole.conf ]];then
|
|||||||
. $piholeDir/pihole.conf
|
. $piholeDir/pihole.conf
|
||||||
fi
|
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
|
# collapse - begin formation of pihole
|
||||||
function gravity_collapse() {
|
function gravity_collapse() {
|
||||||
@@ -97,16 +82,26 @@ function gravity_collapse() {
|
|||||||
#custom file found, use this instead of default
|
#custom file found, use this instead of default
|
||||||
echo -n "::: Custom adList file detected. Reading..."
|
echo -n "::: Custom adList file detected. Reading..."
|
||||||
sources=()
|
sources=()
|
||||||
while read -a line; do
|
while read -r line; do
|
||||||
|
#Do not read commented out or blank lines
|
||||||
|
if [[ $line = \#* ]] || [[ ! $line ]]; then
|
||||||
|
echo "" > /dev/null
|
||||||
|
else
|
||||||
sources+=($line)
|
sources+=($line)
|
||||||
|
fi
|
||||||
done < $adListFile
|
done < $adListFile
|
||||||
echo " done!"
|
echo " done!"
|
||||||
else
|
else
|
||||||
#no custom file found, use defaults!
|
#no custom file found, use defaults!
|
||||||
echo -n "::: No custom adlist file detected, reading from default file..."
|
echo -n "::: No custom adlist file detected, reading from default file..."
|
||||||
sources=()
|
sources=()
|
||||||
while read -a line; do
|
while read -r line; do
|
||||||
|
#Do not read commented out or blank lines
|
||||||
|
if [[ $line = \#* ]] || [[ ! $line ]]; then
|
||||||
|
echo "" > /dev/null
|
||||||
|
else
|
||||||
sources+=($line)
|
sources+=($line)
|
||||||
|
fi
|
||||||
done < $adListDefault
|
done < $adListDefault
|
||||||
echo " done!"
|
echo " done!"
|
||||||
fi
|
fi
|
||||||
@@ -117,12 +112,12 @@ function gravity_collapse() {
|
|||||||
# Will update later, needed for existing installs, new installs should
|
# Will update later, needed for existing installs, new installs should
|
||||||
# create this directory as non-root
|
# create this directory as non-root
|
||||||
$SUDO chmod 777 $piholeDir
|
$SUDO chmod 777 $piholeDir
|
||||||
find "$piholeDir" -type f -exec $SUDO chmod 666 {} \; & spinner $!
|
echo ":::"
|
||||||
echo "."
|
echo "::: Existing pihole directory found"
|
||||||
else
|
else
|
||||||
echo -n "::: Creating pihole directory..."
|
echo "::: Creating pihole directory..."
|
||||||
mkdir $piholeDir & spinner $!
|
mkdir $piholeDir
|
||||||
echo " done!"
|
$SUDO chmod 777 $piholeDir
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -134,7 +129,7 @@ function gravity_patternCheck() {
|
|||||||
# Some of the blocklists are copyright, they need to be downloaded
|
# Some of the blocklists are copyright, they need to be downloaded
|
||||||
# and stored as is. They can be processed for content after they
|
# and stored as is. They can be processed for content after they
|
||||||
# have been saved.
|
# have been saved.
|
||||||
cp $patternBuffer $saveLocation
|
cp "$patternBuffer" "$saveLocation"
|
||||||
echo " List updated, transport successful!"
|
echo " List updated, transport successful!"
|
||||||
else
|
else
|
||||||
# curl didn't download any host files, probably because of the date check
|
# curl didn't download any host files, probably because of the date check
|
||||||
@@ -159,10 +154,9 @@ function gravity_transport() {
|
|||||||
# Silently curl url
|
# Silently curl url
|
||||||
curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer
|
curl -s $cmd_ext $heisenbergCompensator -A "$agent" $url > $patternBuffer
|
||||||
# Check for list updates
|
# Check for list updates
|
||||||
gravity_patternCheck $patternBuffer
|
gravity_patternCheck "$patternBuffer"
|
||||||
|
|
||||||
# Cleanup
|
# Cleanup
|
||||||
rm -f $patternBuffer
|
rm -f "$patternBuffer"
|
||||||
}
|
}
|
||||||
|
|
||||||
# spinup - main gravity function
|
# spinup - main gravity function
|
||||||
@@ -198,7 +192,7 @@ function gravity_spinup() {
|
|||||||
# Default is a simple request
|
# Default is a simple request
|
||||||
*) cmd_ext=""
|
*) cmd_ext=""
|
||||||
esac
|
esac
|
||||||
gravity_transport $url $cmd_ext $agent
|
gravity_transport "$url" "$cmd_ext" "$agent"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -207,29 +201,24 @@ function gravity_Schwarzchild() {
|
|||||||
echo "::: "
|
echo "::: "
|
||||||
# Find all active domains and compile them into one file and remove CRs
|
# Find all active domains and compile them into one file and remove CRs
|
||||||
echo -n "::: Aggregating list of domains..."
|
echo -n "::: Aggregating list of domains..."
|
||||||
truncate -s 0 $piholeDir/$matterandlight & spinner $!
|
truncate -s 0 $piholeDir/$matterandlight
|
||||||
for i in "${activeDomains[@]}"
|
for i in "${activeDomains[@]}"
|
||||||
do
|
do
|
||||||
cat $i |tr -d '\r' >> $piholeDir/$matterandlight
|
cat "$i" | tr -d '\r' >> $piholeDir/$matterandlight
|
||||||
done
|
done
|
||||||
echo " done!"
|
echo " done!"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function gravity_Blacklist(){
|
function gravity_Blacklist(){
|
||||||
# Append blacklist entries if they exist
|
# Append blacklist entries if they exist
|
||||||
echo -n "::: Running blacklist script to update HOSTS file...."
|
echo -n "::: Running blacklist script to update HOSTS file...."
|
||||||
blacklist.sh -f -nr -q > /dev/null & spinner $!
|
$blacklistScript -f -nr -q > /dev/null
|
||||||
|
|
||||||
numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt")
|
numBlacklisted=$(wc -l < "/etc/pihole/blacklist.txt")
|
||||||
plural=; [[ "$numBlacklisted" != "1" ]] && plural=s
|
plural=; [[ "$numBlacklisted" != "1" ]] && plural=s
|
||||||
echo " $numBlacklisted domain${plural} blacklisted!"
|
echo " $numBlacklisted domain${plural} blacklisted!"
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function gravity_Whitelist() {
|
function gravity_Whitelist() {
|
||||||
echo ":::"
|
echo ":::"
|
||||||
# Prevent our sources from being pulled into the hole
|
# Prevent our sources from being pulled into the hole
|
||||||
@@ -237,7 +226,7 @@ function gravity_Whitelist() {
|
|||||||
echo -n "::: Adding ${#sources[@]} adlist source${plural} to the whitelist..."
|
echo -n "::: Adding ${#sources[@]} adlist source${plural} to the whitelist..."
|
||||||
|
|
||||||
urls=()
|
urls=()
|
||||||
for url in ${sources[@]}
|
for url in "${sources[@]}"
|
||||||
do
|
do
|
||||||
tmp=$(echo "$url" | awk -F '/' '{print $3}')
|
tmp=$(echo "$url" | awk -F '/' '{print $3}')
|
||||||
urls=("${urls[@]}" $tmp)
|
urls=("${urls[@]}" $tmp)
|
||||||
@@ -245,20 +234,16 @@ function gravity_Whitelist() {
|
|||||||
echo " done!"
|
echo " done!"
|
||||||
|
|
||||||
echo -n "::: Running whitelist script to update HOSTS file...."
|
echo -n "::: Running whitelist script to update HOSTS file...."
|
||||||
whitelist.sh -f -nr -q ${urls[@]} > /dev/null & spinner $!
|
$whitelistScript -f -nr -q "${urls[@]}" > /dev/null
|
||||||
|
|
||||||
numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt")
|
numWhitelisted=$(wc -l < "/etc/pihole/whitelist.txt")
|
||||||
plural=; [[ "$numWhitelisted" != "1" ]] && plural=s
|
plural=; [[ "$numWhitelisted" != "1" ]] && plural=s
|
||||||
echo " $numWhitelisted domain${plural} whitelisted!"
|
echo " $numWhitelisted domain${plural} whitelisted!"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_unique() {
|
function gravity_unique() {
|
||||||
# Sort and remove duplicates
|
# Sort and remove duplicates
|
||||||
echo -n "::: Removing duplicate domains...."
|
echo -n "::: Removing duplicate domains...."
|
||||||
sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon & spinner $!
|
sort -u $piholeDir/$supernova > $piholeDir/$eventHorizon
|
||||||
echo " done!"
|
echo " done!"
|
||||||
numberOf=$(wc -l < $piholeDir/$eventHorizon)
|
numberOf=$(wc -l < $piholeDir/$eventHorizon)
|
||||||
echo "::: $numberOf unique domains trapped in the event horizon."
|
echo "::: $numberOf unique domains trapped in the event horizon."
|
||||||
@@ -267,18 +252,19 @@ function gravity_unique() {
|
|||||||
function gravity_hostFormat() {
|
function gravity_hostFormat() {
|
||||||
# Format domain list as "192.168.x.x domain.com"
|
# Format domain list as "192.168.x.x domain.com"
|
||||||
echo "::: Formatting domains into a HOSTS file..."
|
echo "::: Formatting domains into a HOSTS file..."
|
||||||
|
hostname=$(</etc/hostname)
|
||||||
# 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 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
|
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!
|
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
||||||
echo -e "$piholeIP Pi-Hole.IsWorking.OK \n$piholeIPv6 Pi-Hole.IsWorking.OK" > $piholeDir/$accretionDisc
|
echo -e "$piholeIP $hostname\n$piholeIPv6 $hostname\n$piholeIP pi.hole\n$piholeIPv6 pi.hole" > $piholeDir/$accretionDisc
|
||||||
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $piholeDir/$accretionDisc
|
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $piholeDir/$accretionDisc
|
||||||
|
|
||||||
else
|
else
|
||||||
# Otherwise, just create gravity.list as normal using IPv4
|
# 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!
|
# Add hostname and dummy domain to the top of gravity.list to make ping result return a friendlier looking domain! Also allows for an easy way to access the Pi-hole admin console (pi.hole/admin)
|
||||||
echo -e "$piholeIP Pi-Hole.IsWorking.OK" > $piholeDir/$accretionDisc
|
echo -e "$piholeIP $hostname\n$piholeIP pi.hole" > $piholeDir/$accretionDisc
|
||||||
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >> $piholeDir/$accretionDisc
|
cat $piholeDir/$eventHorizon | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >> $piholeDir/$accretionDisc
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it
|
# Copy the file over as /etc/pihole/gravity.list so dnsmasq can use it
|
||||||
cp $piholeDir/$accretionDisc $adList
|
cp $piholeDir/$accretionDisc $adList
|
||||||
}
|
}
|
||||||
@@ -289,44 +275,55 @@ function gravity_blackbody() {
|
|||||||
for file in $piholeDir/*.$justDomainsExtension
|
for file in $piholeDir/*.$justDomainsExtension
|
||||||
do
|
do
|
||||||
# If list is in active array then leave it (noop) else rm the list
|
# If list is in active array then leave it (noop) else rm the list
|
||||||
if [[ " ${activeDomains[@]} " =~ " ${file} " ]]; then
|
if [[ " ${activeDomains[@]} " =~ ${file} ]]; then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
rm -f $file
|
rm -f "$file"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_advanced() {
|
function gravity_advanced() {
|
||||||
|
|
||||||
|
|
||||||
# Remove comments and print only the domain name
|
# 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
|
# 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
|
# 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
|
# 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...."
|
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 $!
|
awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$matterandlight | sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova
|
||||||
echo " done!"
|
echo " done!"
|
||||||
|
|
||||||
numberOf=$(wc -l < $piholeDir/$supernova)
|
numberOf=$(wc -l < $piholeDir/$supernova)
|
||||||
echo "::: $numberOf domains being pulled in by gravity..."
|
echo "::: $numberOf domains being pulled in by gravity..."
|
||||||
|
|
||||||
gravity_unique
|
gravity_unique
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function gravity_reload() {
|
function gravity_reload() {
|
||||||
|
#Clear no longer needed files...
|
||||||
|
echo ":::"
|
||||||
|
echo -n "::: Cleaning up un-needed files..."
|
||||||
|
$SUDO rm $piholeDir/pihole.*.txt
|
||||||
|
echo " done!"
|
||||||
|
|
||||||
# Reload hosts file
|
# Reload hosts file
|
||||||
echo ":::"
|
echo ":::"
|
||||||
echo -n "::: Refresh lists in dnsmasq..."
|
echo -n "::: Refresh lists in dnsmasq..."
|
||||||
|
|
||||||
|
#ensure /etc/dnsmasq.d/01-pihole.conf is pointing at the correct list!
|
||||||
|
#First escape forward slashes in the path:
|
||||||
|
adList=${adList//\//\\\/}
|
||||||
|
#Now replace the line in dnsmasq file
|
||||||
|
$SUDO sed -i "s/^addn-hosts.*/addn-hosts=$adList/" /etc/dnsmasq.d/01-pihole.conf
|
||||||
dnsmasqPid=$(pidof dnsmasq)
|
dnsmasqPid=$(pidof dnsmasq)
|
||||||
|
|
||||||
|
find "$piholeDir" -type f -exec $SUDO chmod 666 {} \;
|
||||||
|
|
||||||
if [[ $dnsmasqPid ]]; then
|
if [[ $dnsmasqPid ]]; then
|
||||||
# service already running - reload config
|
# service already running - reload config
|
||||||
$SUDO kill -HUP $dnsmasqPid & spinner $!
|
$SUDO kill -HUP "$dnsmasqPid"
|
||||||
else
|
else
|
||||||
# service not running, start it up
|
# service not running, start it up
|
||||||
$SUDO service dnsmasq start & spinner $!
|
$SUDO service dnsmasq start
|
||||||
fi
|
fi
|
||||||
echo " done!"
|
echo " done!"
|
||||||
}
|
}
|
||||||
|
114
pihole
Executable file
114
pihole
Executable file
@@ -0,0 +1,114 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
|
# (c) 2015, 2016 by Jacob Salmela
|
||||||
|
# Network-wide ad blocking via your Raspberry Pi
|
||||||
|
# http://pi-hole.net
|
||||||
|
# Controller for all pihole scripts and functions.
|
||||||
|
#
|
||||||
|
# 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 use this tool
|
||||||
|
if [[ ! $EUID -eq 0 ]];then
|
||||||
|
#echo "::: You are root."
|
||||||
|
#else
|
||||||
|
#echo "::: Sudo will be used for this tool."
|
||||||
|
# Check if it is actually installed
|
||||||
|
# If it isn't, exit because the pihole cannot be invoked without privileges.
|
||||||
|
if [[ $(dpkg-query -s sudo) ]];then
|
||||||
|
export SUDO="sudo"
|
||||||
|
else
|
||||||
|
echo "::: Please install sudo or run this as root."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
function whitelistFunc {
|
||||||
|
shift
|
||||||
|
$SUDO /opt/pihole/whitelist.sh "$@"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function blacklistFunc {
|
||||||
|
shift
|
||||||
|
$SUDO /opt/pihole/blacklist.sh "$@"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function debugFunc {
|
||||||
|
$SUDO /opt/pihole/piholeDebug.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function flushFunc {
|
||||||
|
$SUDO /opt/pihole/piholeLogFlush.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateDashboardFunc {
|
||||||
|
$SUDO /opt/pihole/updateDashboard.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateGravityFunc {
|
||||||
|
$SUDO /opt/pihole/gravity.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupLCDFunction {
|
||||||
|
$SUDO /opt/pihole/setupLCD.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function chronometerFunc {
|
||||||
|
shift
|
||||||
|
$SUDO /opt/pihole/chronometer.sh "$@"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function uninstallFunc {
|
||||||
|
$SUDO /opt/pihole/uninstall.sh
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
function helpFunc {
|
||||||
|
echo "::: Control all PiHole specific functions!"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Usage: pihole [options]"
|
||||||
|
echo "::: Add -h after -w (whitelist), -b (blacklist), or -c (chronometer) for more information on usage"
|
||||||
|
echo ":::"
|
||||||
|
echo "::: Options:"
|
||||||
|
echo "::: -w, whitelist Whitelist domains"
|
||||||
|
echo "::: -b, blacklist Blacklist domains"
|
||||||
|
echo "::: -d, debug Start a debugging session if having trouble"
|
||||||
|
echo "::: -f, flush Flush the pihole.log file"
|
||||||
|
echo "::: -u, updateDashboard Update the web dashboard manually"
|
||||||
|
echo "::: -g, updateGravity Update the list of ad-serving domains"
|
||||||
|
echo "::: -s, setupLCD Automatically configures the Pi to use the 2.8 LCD screen to display stats on it"
|
||||||
|
echo "::: -c, chronometer Calculates stats and displays to an LCD"
|
||||||
|
echo "::: -h, help Show this help dialog"
|
||||||
|
echo "::: uninstall Uninstall Pi-Hole from your system!"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ $# = 0 ]]; then
|
||||||
|
helpFunc
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Handle redirecting to specific functions based on arguments
|
||||||
|
case "$1" in
|
||||||
|
"-w" | "whitelist" ) whitelistFunc "$@";;
|
||||||
|
"-b" | "blacklist" ) blacklistFunc "$@";;
|
||||||
|
"-d" | "debug" ) debugFunc;;
|
||||||
|
"-f" | "flush" ) flushFunc;;
|
||||||
|
"-u" | "updateDashboard" ) updateDashboardFunc;;
|
||||||
|
"-g" | "updateGravity" ) updateGravityFunc;;
|
||||||
|
"-s" | "setupLCD" ) setupLCDFunction;;
|
||||||
|
"-c" | "chronometer" ) chronometerFunc "$@";;
|
||||||
|
"-h" | "help" ) helpFunc;;
|
||||||
|
"uninstall" ) uninstallFunc;;
|
||||||
|
* ) helpFunc;;
|
||||||
|
esac
|
Reference in New Issue
Block a user