Compare commits

...

60 Commits
v2.2 ... v2.3

Author SHA1 Message Date
Dan Schaper
c7c4a5c602 Merge pull request #215 from jacobsalmela/development
Merge development into master
2016-01-21 08:42:53 -08:00
Promofaux
3f40a95929 Whoops, should probably commit more often. Massive overhaul. Cleaned up output, less verbose (will still output errors, but gets rid of anything not needed) Added a spinner so users don't think it has stalled 2016-01-20 23:34:18 +00:00
Promofaux
5c25c42da8 Make installPiholeWeb() more inteliigent. Checks for existence of /var/www/html/pihole, and only downloads from repo if it does not exist. Will stop install script from overwriting any tweaks users have made to index.html 2016-01-20 22:14:17 +00:00
Promofaux
96011bc2ae make InstallWebAdmin() a bit more intelligent, and less verbose. Checks if installing over an existing installation, and if so, will remove existing webadmin folder. 2016-01-20 22:02:54 +00:00
Promofaux
4f59577fd1 Remove SUDO from line that runs gravity.sh to stop files in /etc/pihole being owned by root 2016-01-20 21:20:52 +00:00
Dan Schaper
494fcd60ab Merge branch 'development' of https://github.com/jacobsalmela/pi-hole into development 2016-01-20 05:25:49 +00:00
Mcat12
544919175c Added back in debugging response header 2016-01-20 05:23:30 +00:00
Mcat12
ede8f4714f Removed extra http redirect 2016-01-20 05:23:15 +00:00
Dan Schaper
b512496818 Merge pull request #207 from jacobsalmela/bugfix/Chronometer
Bugfix for Chronometer
2016-01-19 17:42:41 -08:00
Dan Schaper
8094f7234c Merge pull request #202 from PromoFaux/FixChronometer
Fix chronometer
2016-01-19 17:39:46 -08:00
Dan Schaper
7dfd9f0378 Merge pull request #205 from PromoFaux/InstallScript
Clean /etc/pihole/list.* during `basic-install.sh` to set a baseline for install procedures. Fixes #195. Submitted by @PromoFaux.
2016-01-19 16:21:49 -08:00
Promofaux
bc51f88805 Check if any list.* files exist from previous installation, if they do delete them. 2016-01-19 22:52:29 +00:00
Dan Schaper
e04e2537a8 Merge pull request #203 from jacobsalmela/master
Merge master into development
2016-01-19 13:20:21 -08:00
Promofaux
af982a02af Move call to CheckIPv6 function into CalcBlockedDomains, rather than relying on remembering to call it before you call CalcBlockedDomains. 2016-01-19 21:14:01 +00:00
Jacob Salmela
03277899ca Merge pull request #199 from PromoFaux/master
Update Readme to link to whitelist/blacklist wiki page
2016-01-19 12:16:41 -06:00
Adam Warner
6756843be7 Merge pull request #2 from PromoFaux/PromoFaux-patch-1
Update README.md
2016-01-19 17:14:10 +00:00
Adam Warner
ac35417ab0 Update README.md
Updated Whitelist/Blacklist section - added link to wiki
Added information about `chronometer.sh -j`
2016-01-19 17:13:48 +00:00
Adam Warner
092c951078 Merge pull request #1 from jacobsalmela/master
Merge from upstream
2016-01-19 16:26:09 +00:00
Jacob Salmela
9ba38e668a Merge pull request #193 from PromoFaux/Chronometer
Major overhaul of chronometer script
2016-01-18 17:36:33 -06:00
Adam Warner
f665899116 Update chronometer.sh
weirdness
2016-01-18 23:35:21 +00:00
Adam Warner
de464e17cc Update chronometer.sh
Note to self, Find&Replace>Replace All is a bad idea.
2016-01-18 22:24:02 +00:00
Adam Warner
0eed56380d Update chronometer.sh
What, me? Reference the wrong file?
2016-01-18 22:15:39 +00:00
Promofaux
487c26db44 Major overhaul. Added -j option to output stats as JSON formatted string. If run with no option, then chronometer runs as normal. Fixed calculations to match those on the web dashboard. 2016-01-18 22:03:53 +00:00
Jacob Salmela
0a57b43f09 C.H.I.P. ad blocking project 2016-01-17 20:55:02 -06:00
Jacob Salmela
48f8d7ed0f pi-hole mentioned in a podcast
Worth a good laugh when they say "shut your pie hole!"
2016-01-17 20:34:48 -06:00
Jacob Salmela
d77399727c Merge pull request #189 from jacobsalmela/whitelist
Switched CRLF to LF (DOS to UNIX)
2016-01-17 18:34:02 -06:00
Jacob Salmela
56ea07c1ec Merge pull request #187 from PromoFaux/whitelist
Switched CRLF to LF (DOS to UNIX)
2016-01-17 08:56:09 -06:00
Promofaux
414ef54cfe Switched CRLF to LF (DOS to UNIX) 2016-01-17 14:09:06 +00:00
jacobsalmela
0a0f00da3b fixes #169
exits if sudo is not installed when run as a regular user
2016-01-16 14:10:03 -06:00
jacobsalmela
bee109c784 better uninstall
More from JoshKastang.  This closes #153 as it is the last step from
his ideas.
2016-01-16 13:56:08 -06:00
jacobsalmela
5d608a2db5 leave system cron alone
Taking JoshKastang’s idea from #153, the system cron file will be left
alone and the pihole.cron gets its own.
2016-01-16 13:48:29 -06:00
jacobsalmela
7c6ef0cfd0 privileged install
This puts sudo in a variable if run as a regular user.  If already
running as root, the script proceeds as normal.  Not a perfect fix, but
should help for install on other systems.
2016-01-16 13:40:09 -06:00
Jacob Salmela
0cf859344a Merge pull request #176 from xd1936/patch-1
Install Figlet Fonts with Toilet
2016-01-16 13:19:15 -06:00
jacobsalmela
6125b2520b install git for updateDashboard.sh
I also download and chmod the script
2016-01-16 13:15:44 -06:00
jacobsalmela
bd5ed2bcf0 move webinterface.sh into scripts folder
I also renamed it to make it is easier to identify.
2016-01-16 13:12:55 -06:00
Jacob Salmela
a2a58f7b39 Merge pull request #180 from jacobsalmela/whitelist
Whitelist/blacklist improvements
2016-01-16 12:24:43 -06:00
Jacob Salmela
87980c6df8 Merge pull request #174 from PromoFaux/whitelist
Whitelisting changes
2016-01-16 11:58:08 -06:00
Promofaux
f9a2ca5c32 Tidy up help text on both scripts. Add quiet help. 2016-01-16 00:47:45 +00:00
Leo
665dfdfe8e Install Figlet Fonts with Toilet
Some OS' don't have Figlet Fonts, which causes `chronometer.sh` to have `error: font small not found` instead of the pretty "Pi-hole" display
2016-01-15 18:50:32 -05:00
Adam Warner
2b0bee085b Incorrect reference to whitelist in the blacklist.sh comments :) 2016-01-15 18:57:20 +00:00
Adam Warner
ddfefb291d Merge branch 'Whitelistingchanges' into whitelist 2016-01-15 18:45:59 +00:00
Adam Warner
5d842a7533 Merging 2016-01-15 18:45:12 +00:00
Adam Warner
2284a27814 Consumes blacklist.sh now, too. 2016-01-15 15:54:11 +00:00
Adam Warner
f68cf10efa Tidied up a couple of things 2016-01-15 15:54:00 +00:00
Adam Warner
89e3c25a90 Behaves like whitelist, but on the blacklist 2016-01-15 15:53:40 +00:00
Adam Warner
6b1f14647c add reference to blacklist.sh 2016-01-15 15:52:27 +00:00
Adam Warner
14ee4850af Placeholder for blacklist script 2016-01-15 14:50:13 +00:00
Adam Warner
cc62d984d2 Changed whitelist function to outsource to whitelist.sh 2016-01-15 14:49:16 +00:00
Adam Warner
534dbc9b6e added a quiet option for when the script is called by gravity. Less output = less confusion! 2016-01-15 14:48:07 +00:00
Adam Warner
8ad116fe7b Aiming to get whitelist.sh to run either standalone or to be called from gravity.sh. Initial commit 2016-01-15 14:17:55 +00:00
jacobsalmela
ca5e34a9a9 Merge branch 'master' into whitelist
# Conflicts:
#	gravity.sh
2016-01-14 18:12:45 -06:00
Jacob Salmela
9ff1129510 Minibian Pi-hole 2016-01-14 17:11:16 -06:00
Jacob Salmela
4b1dd8a2a5 fixes #158
Running at midnight, not 11:58 in the afternoon.
2016-01-12 17:44:08 -06:00
Jacob Salmela
b5bdfe27be Merge pull request #155 from JoshKastang/webinterface-update
replaces the non-repository managed web interface for pihole and keep…
2016-01-11 17:39:42 -06:00
Jacob Salmela
0ef0b0b661 LCD real-time stats 2016-01-10 14:09:40 -06:00
Josh Kastang
802638ce8b replaces the non-repository managed web interface for pihole and keeps it updated 2016-01-10 19:08:29 +00:00
Jacob Salmela
cfd6e0d65d more coverage and an API 2016-01-10 10:40:58 -06:00
Jacob Salmela
93664aeb4e cleaning up the readme
- removed most of the video images to reduce clutter
- converged the "coverage" and "video" sections into a bulleted list of links
- added a new project link (pi-hole on/off button)
- moved projects up in the page so it's easier to find and see what people are doing with Pi-hole
- removed custom conf section since it will be suited better in the wiki or FAQs
- added a help section
2016-01-04 20:32:46 -06:00
Jacob Salmela
c88982d0d5 chmod doesn't apply at initial install 2015-12-09 15:52:53 -06:00
Jacob Salmela
57282cfe16 ugly hack to whitelist from the Web interface
I wanted the whitelist feature to keep the user on the same page
without having to reload it.  I'm sure someone better versed in PHP
could eliminate the need for this hack.  Nonetheless, it works.

www-data runs the script if executed from the Web interface.  www-data
also needs access to write to /etc/pihole/gravity.list to actually
remove the domain.  So a few more things need to happen before this
will fully work.

The changes in this script won't change what is displayed if run from
the terminal, but will help when it needs to be run from the Web
interface, so I am just committing this now.

The only other thing I would like to see would be a progress spinner,
but my Web skills still need some work...
2015-12-09 15:16:34 -06:00
10 changed files with 847 additions and 259 deletions

View File

@@ -1,84 +1,84 @@
# Automated Install # Automated Install
#### Designed For Raspberry Pi B, B+, 2, ##### Designed For Raspberry Pi B, B+, 2, and Zero (with an Ethernet adapter)
##### and Zero (with an Ethernet adapter)
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 install.pi-hole.net | bash```
![Pi-hole automated installation](http://i.imgur.com/Un7lBlj.png) Once installed, [configure your router to have **DHCP clients use the Pi as their DNS server**](http://pi-hole.net/faq/can-i-set-the-pi-hole-to-be-the-dns-server-at-my-router-so-i-dont-have-to-change-settings-for-my-devices/) and then any device that connects to your network will have ads blocked without any further configuration. Alternatively, you can manually set each device to [use the Raspberry Pi as its DNS server](http://pi-hole.net/faq/how-do-i-use-the-pi-hole-as-my-dns-server/).
Once installed, **configure any device to use the Raspberry Pi as its DNS server and the ads will be blocked**. You can also configure your router's DHCP options to assign the Pi as clients DNS server so they do not need to do it manually. ## Pi-hole Is Free, But Powered By Your Donations
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "Free, but powered by donations")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate") ## How Does It Work?
# How Does It Work?
**Watch the 60-second video below to get a quick overview** **Watch the 60-second video below to get a quick overview**
[![Pi-hole exlplained](http://i.imgur.com/wd5ltCU.png)](https://vimeo.com/135965232) [![Pi-hole exlplained](http://i.imgur.com/qNybJDX.png)](https://vimeo.com/135965232)
## Video Coverage ## Pi-hole Projects
- [Go Bananas for CHiP-hole ad blocking](https://www.hackster.io/jacobsalmela/chip-hole-network-wide-ad-blocker-98e037)
- [Sky-Hole](http://dlaa.me/blog/post/skyhole)
- [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/)
- [unRaid-hole](https://github.com/spants/unraidtemplates/blob/master/Spants/unRaid-hole.xml#L13)--[Repo and more info](http://lime-technology.com/forum/index.php?PHPSESSID=c0eae3e5ef7e521f7866034a3336489d&topic=38486.0)
- [Pi-hole on/off button](http://thetimmy.silvernight.org/pages/endisbutton/)
- [Minibian Pi-hole](http://munkjensen.net/wiki/index.php/See_my_Pi-Hole#Minibian_Pi-hole)
### TekThing ## Coverage
- [MacObserver Podcast 585](http://www.macobserver.com/tmo/podcast/macgeekgab-585)
Pi-hole is mentioned at the two minute mark - [Medium: Block All Ads For $53](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d)
- [MakeUseOf: Adblock Everywhere, The Pi-hole Way](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/)
[![Pi-hole on TekThing](http://img.youtube.com/vi/8Co59HU2gY0/0.jpg)](https://youtu.be/8Co59HU2gY0?t=2m) - [Lifehacker: Turn Your Pi Into An Ad Blocker With A Single Command](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)!
- [Pi-hole on TekThing](https://youtu.be/8Co59HU2gY0?t=2m)
### Security Now! Podcast - [Pi-hole on Security Now! Podcast](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s)
Pi-hole is mentioned at 100 minutes and 26 seconds (the link brings you right there) - [Foolish Tech Show](https://youtu.be/bYyena0I9yc?t=2m4s)
[![Pi-hole on Security Now!](http://img.youtube.com/vi/p7-osq_y8i8/0.jpg)](http://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) - [Pi-hole on Ubuntu](http://www.boyter.org/2015/12/pi-hole-ubuntu-14-04/)
- [Catchpoint: iOS 9 Ad Blocking](http://blog.catchpoint.com/2015/09/14/ad-blocking-apple/)
### Tech Blogs
Pi-hole has been written about on:
- [Medium](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d)
- [MakeUseOf](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/)
- [Lifehacker](http://lifehacker.com/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-co-1686093533)!
## Partnering With Optimal.com ## Partnering With Optimal.com
Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/). Pi-hole will be teaming up with [Rob Leathern's subscription service to avoid ads](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d). This service is unique and will help content-creators and publishers [still make money from visitors who are using an ad ablocker](http://techcrunch.com/2015/12/17/the-new-optimal/).
## Technical Details ## Technical Details
The Pi-hole is an **advertising-aware DNS/Web server**. If an ad domain is queried, a small Web page or GIF is delivered in place of the advertisement. You can also [replace ads with any image you want](http://pi-hole.net/faq/is-it-possible-to-change-the-blank-page-that-takes-place-of-the-ads-to-something-else/) since it is just a simple Webpage taking place of the ads.
A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). A more detailed explanation of the installation can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0).
## Gravity ## Gravity
The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0). The [gravity.sh](https://github.com/jacobsalmela/pi-hole/blob/master/gravity.sh) does most of the magic. The script pulls in ad domains from many sources and compiles them into a single list of [over 1.6 million entries](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0) (if you decide to use the [mahakala list](https://github.com/jacobsalmela/pi-hole/commit/963eacfe0537a7abddf30441c754c67ca1e40965)).
## Whitelist and blacklist ## Whitelist and blacklist
You can add a `whitelist.txt` or `blacklist.txt` in `/etc/pihole/` and the script will apply those files automatically. Domains can be whitelisted and blacklisted using two pre-installed scripts. See [the wiki page](https://github.com/jacobsalmela/pi-hole/wiki/Whitelisting-and-Blacklisting) for more details
## Web Interface ## Web Interface
The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at: The [Web interface](https://github.com/jacobsalmela/AdminLTE#pi-hole-admin-dashboard) will be installed automatically so you can view stats and change settings. You can find it at:
`http://192.168.1.x/admin/index.php` `http://192.168.1.x/admin/index.php`
### API
A basic read-only API can be accessed at `/admin/api.php`. It returns the following JSON:
```JSON
{
"domains_being_blocked": "136708",
"dns_queries_today": "18108",
"ads_blocked_today": "14648",
"ads_percentage_today": "80.89"
}
```
The same output can be acheived on the CLI by running `chronometer.sh -j`
![Web](http://i.imgur.com/m114SCn.png) ![Web](http://i.imgur.com/m114SCn.png)
## Custom Config File ## Real-time Statistics
If you want to use your own variables for the gravity script (i.e. storing the files in a different location) and don't want to have to change them every time there is an update to the script, create a file called `/etc/pihole/pihole.conf`. In it, you should add your own variables in a similar fashion as shown below:
``` You can view [real-time stats](http://pi-hole.net/faq/install-the-real-time-lcd-monitor-chronometer/) via `ssh` or on an [2.8" LCD screen](http://amzn.to/1P0q1Fj). This is accomplished via [`chronometer.sh`](https://github.com/jacobsalmela/pi-hole/blob/master/advanced/Scripts/chronometer.sh).
piholeDir=/var/run/pihole ![Pi-hole LCD](http://i.imgur.com/nBEqycp.jpg)
adList=/etc/dnsmasq.d/adList
```
See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details. ## Help
- See the [Wiki](https://github.com/jacobsalmela/pi-hole/wiki/Customization) entry for more details
### How It Works - There is also an [FAQ section on pi-hole.net](http://pi-hole.net)
A technical and detailed description can be found [here](http://jacobsalmela.com/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0)!
## 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 only works for a clean install of Raspiban right now since that is how the project originated.
### Examples Of The Pi-hole On Other Operating Systems
- [Sky-Hole](http://dlaa.me/blog/post/skyhole)
- [Pi-hole in the Cloud!](http://blog.codybunch.com/2015/07/28/Pi-Hole-in-the-cloud/)
- [unRaid-hole](https://github.com/spants/unraidtemplates/blob/master/Spants/unRaid-hole.xml#L13)--[Repo and more info](http://lime-technology.com/forum/index.php?PHPSESSID=c0eae3e5ef7e521f7866034a3336489d&topic=38486.0)
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif "AdminLTE Presentation")](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY "Donate")

View File

@@ -0,0 +1,182 @@
#!/usr/bin/env bash
# (c) 2015 by Jacob Salmela
# This file is part of Pi-hole.
#
# Pi-hole is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
if [[ $# = 0 ]]; then
echo "Immediately blacklists one or more domains in the hosts file"
echo " "
echo "Usage: blacklist.sh domain1 [domain2 ...]"
echo " "
echo "Options:"
echo " -d, --delmode Remove domains from the blacklist"
echo " -nr, --noreload Update blacklist without refreshing dnsmasq"
echo " -f, --force Force updating of the hosts files, even if there are no changes"
echo " -q, --quiet output is less verbose"
exit 1
fi
#globals
blacklist=/etc/pihole/blacklist.txt
adList=/etc/pihole/gravity.list
reload=true
addmode=true
force=false
versbose=true
domList=()
domToRemoveList=()
piholeIPfile=/tmp/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6
# Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
piholeIP=${piholeIPCIDR%/*}
modifyHost=false
if [[ -f $piholeIPv6file ]];then
# If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi
function HandleOther(){
#check validity of domain
validDomain=$(echo $1 | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
if [ -z "$validDomain" ]; then
echo $1 is not a valid argument or domain name
else
domList=("${domList[@]}" $validDomain)
fi
}
function PopBlacklistFile(){
#check blacklist file exists, and if not, create it
if [[ ! -f $blacklist ]];then
touch $blacklist
fi
for dom in "${domList[@]}"
do
if $addmode; then
AddDomain $dom
else
RemoveDomain $dom
fi
done
}
function AddDomain(){
#| sed 's/\./\\./g'
bool=false
grep -Ex -q "$1" $blacklist || bool=true
if $bool; then
#domain not found in the blacklist file, add it!
if $versbose; then
echo "** Adding $1 to blacklist file"
fi
echo $1 >> $blacklist
modifyHost=true
else
if $versbose; then
echo "** $1 already blacklisted! No need to add"
fi
fi
}
function RemoveDomain(){
bool=false
grep -Ex -q "$1" $blacklist || bool=true
if $bool; then
#Domain is not in the blacklist file, no need to Remove
if $versbose; then
echo "** $1 is NOT blacklisted! No need to remove"
fi
else
#Domain is in the blacklist file, add to a temporary array
if $versbose; then
echo "** Un-blacklisting $dom..."
fi
domToRemoveList=("${domToRemoveList[@]}" $1)
modifyHost=true
fi
}
function ModifyHostFile(){
if $addmode; then
#add domains to the hosts file
if [[ -r $blacklist ]];then
numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s
echo "** blacklisting a total of $numberOf domain${plural}..."
if [[ -n $piholeIPv6 ]];then
cat $blacklist | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList
else
cat $blacklist | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
fi
fi
else
for dom in "${domToRemoveList[@]}"
do
#we need to remove the domains from the blacklist file and the host file
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList
echo $dom | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $blacklist
done
fi
}
function Reload() {
# Reload hosts file
echo "** Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ $dnsmasqPid ]]; then
# service already running - reload config
sudo kill -HUP $dnsmasqPid
else
# service not running, start it up
sudo service dnsmasq start
fi
}
###################################################
for var in "$@"
do
case "$var" in
"-nr"| "--noreload" ) reload=false;;
"-d" | "--delmode" ) addmode=false;;
"-f" | "--force" ) force=true;;
"-q" | "--quiet" ) versbose=false;;
* ) HandleOther $var;;
esac
done
PopBlacklistFile
if $modifyHost || $force; then
echo "** Modifying Hosts File"
ModifyHostFile
else
if $versbose; then
echo "** No changes need to be made"
fi
exit 1
fi
if $reload; then
Reload
fi

View File

@@ -1,6 +1,4 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# Displays Pi-hole stats on the Adafruit PiTFT 2.8" touch screen
# Set the pi user to log in automatically and run this script from /etc/profile
# (c) 2015 by Jacob Salmela # (c) 2015 by Jacob Salmela
# This file is part of Pi-hole. # This file is part of Pi-hole.
# #
@@ -8,28 +6,130 @@
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
# 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.
for (( ; ; ))
#Functions##############################################################################################################
piLog="/var/log/pihole.log"
gravity="/etc/pihole/gravity.list"
today=$(date "+%b %e")
function CalcBlockedDomains(){
CheckIPv6
if [ -e "$gravity" ]; then
#Are we IPV6 or IPV4?
if [[ -n $piholeIPv6 ]];then
#We are IPV6
blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1/2}')
else
#We are IPV4
blockedDomainsTotal=$(wc -l /etc/pihole/gravity.list | awk '{print $1}')
fi
else
blockedDomainsTotal="Err."
fi
}
function CalcQueriesToday(){
if [ -e "$piLog" ];then
queriesToday=$(cat "$piLog" | grep "$today" | awk '/query/ {print $6}' | wc -l)
else
queriesToday="Err."
fi
}
function CalcblockedToday(){
if [ -e "$piLog" ] && [ -e "$gravity" ];then
blockedToday=$(cat $piLog | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
else
blockedToday="Err."
fi
}
function CalcPercentBlockedToday(){
if [ "$queriesToday" != "Err." ] && [ "$blockedToday" != "Err." ]; then
#scale 2 rounds the number down, so we'll do scale 4 and then trim the last 2 zeros
percentBlockedToday=$(echo "scale=4; $blockedToday/$queriesToday*100" | bc)
percentBlockedToday=$(sed 's/.\{2\}$//' <<< "$percentBlockedToday")
fi
}
function CheckIPv6(){
piholeIPv6file="/etc/pihole/.useIPv6"
if [[ -f $piholeIPv6file ]];then
# If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi
}
function outputJSON(){
CalcQueriesToday
CalcblockedToday
CalcPercentBlockedToday
CalcBlockedDomains
printf '{"domains_being_blocked":"%s","dns_queries_today":"%s","ads_blocked_today":"%s","ads_percentage_today":"%s"}\n' "$blockedDomainsTotal" "$queriesToday" "$blockedToday" "$percentBlockedToday"
}
function normalChrono(){
for (( ; ; ))
do
clear
# Displays a colorful Pi-hole logo
toilet -f small -F gay Pi-hole
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)"
echo ""
uptime | cut -d' ' -f11-
echo "-------------------------------"
# Uncomment to continually read the log file and display the current domain being blocked
#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'
#uncomment next 4 lines to use original query count calculation
#today=$(date "+%b %e")
#todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l)
#todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l)
#todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l)
CalcQueriesToday
CalcblockedToday
CalcPercentBlockedToday
CalcBlockedDomains
echo "Blocking: $blockedDomainsTotal"
#below commented line does not add up to todaysQueryCount
#echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6"
echo "Queries: $queriesToday" #same total calculation as dashboard
echo "Pi-holed: $blockedToday ($percentBlockedToday%)"
sleep 5
done
}
function displayHelp(){
echo "Displays stats about your piHole!"
echo " "
echo "Usage: chronometer.sh [optional:-j]"
echo "Note: If no option is passed, then stats are displayed on screen, updated every 5 seconds"
echo " "
echo "Options:"
echo " -j, --json output stats as JSON formatted string"
echo " -h, --help display this help text"
exit 1
}
if [[ $# = 0 ]]; then
normalChrono
fi
for var in "$@"
do do
clear case "$var" in
# Displays a colorful Pi-hole logo "-j" | "--json" ) outputJSON;;
toilet -f small -F gay Pi-hole "-h" | "--help" ) displayHelp;;
echo " $(ifconfig eth0 | awk '/inet addr/ {print $2}' | cut -d':' -f2)" * ) exit 1;;
echo "" esac
uptime | cut -d' ' -f11-
echo "-------------------------------"
# Uncomment to continually read the log file and display the current domain being blocked
#tail -f /var/log/pihole.log | awk '/\/etc\/pihole\/gravity.list/ {if ($7 != "address" && $7 != "name" && $7 != "/etc/pihole/gravity.list") print $7; else;}'
today=$(date "+%b %e")
todaysQueryCount=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ {print $7}' | wc -l)
todaysQueryCountV4=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[A\]/ {print $7}' | wc -l)
todaysQueryCountV6=$(cat /var/log/pihole.log | grep "$today" | awk '/query/ && /\[AAAA\]/ {print $7}' | wc -l)
todaysAdsEliminated=$(cat /var/log/pihole.log | grep "$today" | awk '/\/etc\/pihole\/gravity.list/ {print $7}' | wc -l)
dividend=$(echo "$todaysAdsEliminated/$todaysQueryCount" | bc -l)
fp=$(echo "$dividend*100" | bc -l)
percentAds=$(echo ${fp:0:4})
echo "Queries: $todaysQueryCountV4 / $todaysQueryCountV6"
echo "Pi-holed: $todaysAdsEliminated ($percentAds%)"
sleep 5
done done

View File

@@ -0,0 +1,70 @@
#!/usr/bin/env bash
#
# this script will update the pihole web interface files.
#
# if this is the first time running this script after an
# existing installation, the existing web interface files
# will be removed and replaced with the latest master
# branch from github. subsequent executions of this script
# will pull the latest version of the web interface.
#
# @TODO: add git as requirement to basic-install.sh
#
WEB_INTERFACE_GIT_URL="https://github.com/jacobsalmela/AdminLTE.git"
WEB_INTERFACE_DIR="/var/www/html/admin"
main() {
prerequisites
if ! is_repo; then
make_repo
fi
update_repo
}
prerequisites() {
# must be root to update
if [[ $EUID -ne 0 ]]; then
sudo bash "$0" "$@"
exit $?
fi
# web interface must already exist. this is a (lazy)
# check to make sure pihole is actually installed.
if [ ! -d "$WEB_INTERFACE_DIR" ]; then
echo "$WEB_INTERFACE_DIR not found. Exiting."
exit 1
fi
if ! type "git" > /dev/null; then
apt-get -y install git
fi
}
is_repo() {
# if the web interface directory does not have a .git folder
# it means its using the master.zip archive from the install
# script.
if [ ! -d "$WEB_INTERFACE_DIR/.git" ]; then
return 1
fi
return 0
}
# removes the web interface installed from the master.zip archive and
# replaces it with the current master branch from github
make_repo() {
# remove the non-repod interface and clone the interface
rm -rf $WEB_INTERFACE_DIR
git clone "$WEB_INTERFACE_GIT_URL" "$WEB_INTERFACE_DIR"
}
# pulls the latest master branch from github
update_repo() {
# pull the latest commits
cd "$WEB_INTERFACE_DIR"
git pull
}
main

View File

@@ -7,51 +7,174 @@
# 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.
if [[ $# = 0 ]]; then
echo "Immediately whitelists one or more domains in the hosts file"
echo " "
echo "Usage: whitelist.sh domain1 [domain2 ...]"
echo " "
echo "Options:"
echo " -d, --delmode Remove domains from the whitelist"
echo " -nr, --noreload Update Whitelist without refreshing dnsmasq"
echo " -f, --force Force updating of the hosts files, even if there are no changes"
echo " -q, --quiet output is less verbose"
exit 1
fi
#globals
whitelist=/etc/pihole/whitelist.txt whitelist=/etc/pihole/whitelist.txt
adList=/etc/pihole/gravity.list adList=/etc/pihole/gravity.list
if [[ ! -f $whitelist ]];then reload=true
touch $whitelist addmode=true
force=false
versbose=true
domList=()
domToRemoveList=()
piholeIPfile=/tmp/piholeIP
piholeIPv6file=/etc/pihole/.useIPv6
# Otherwise, the IP address can be taken directly from the machine, which will happen when the script is run by the user and not the installation script
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
piholeIPCIDR=$(ip -o -f inet addr show dev $IPv4dev | awk '{print $4}' | awk 'END {print}')
piholeIP=${piholeIPCIDR%/*}
modifyHost=false
if [[ -f $piholeIPv6file ]];then
# If the file exists, then the user previously chose to use IPv6 in the automated installer
piholeIPv6=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
fi fi
if [[ $# = 0 ]]; then
echo "Immediately whitelists one or more domains."
echo "Usage: whitelist.sh domain1 [domain2 ...]"
fi
combopattern="" function HandleOther(){
#check validity of domain
validDomain=$(echo $1 | perl -ne'print if /\b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b/')
if [ -z "$validDomain" ]; then
echo $1 is not a valid argument or domain name
else
domList=("${domList[@]}" $validDomain)
fi
}
function PopWhitelistFile(){
#check whitelist file exists, and if not, create it
if [[ ! -f $whitelist ]];then
touch $whitelist
fi
for dom in "${domList[@]}"
do
if $addmode; then
AddDomain $dom
else
RemoveDomain $dom
fi
done
}
function AddDomain(){
#| sed 's/\./\\./g'
bool=false
grep -Ex -q "$1" $whitelist || bool=true
if $bool; then
#domain not found in the whitelist file, add it!
if $versbose; then
echo "** Adding $1 to whitelist file"
fi
echo $1 >> $whitelist
modifyHost=true
else
if $versbose; then
echo "** $1 already whitelisted! No need to add"
fi
fi
}
function RemoveDomain(){
bool=false
grep -Ex -q "$1" $whitelist || bool=true
if $bool; then
#Domain is not in the whitelist file, no need to Remove
if $versbose; then
echo "** $1 is NOT whitelisted! No need to remove"
fi
else
#Domain is in the whitelist file, add to a temporary array and remove from whitelist file
if $versbose; then
echo "** Un-whitelisting $dom..."
fi
domToRemoveList=("${domToRemoveList[@]}" $1)
modifyHost=true
fi
}
function ModifyHostFile(){
if $addmode; then
#remove domains in from hosts file
if [[ -r $whitelist ]];then
# Remove whitelist entries
numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s
echo "** Whitelisting a total of $numberOf domain${plural}..."
awk -F':' '{ print $1 }' $whitelist | sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /[^.]'{}'(?!.)/;' $adList
fi
else
#we need to add the removed domains to the hosts file
for rdom in "${domToRemoveList[@]}"
do
if [[ -n $piholeIPv6 ]];then
echo "**Blacklisting $rdom on IPv4 and IPv6"
echo $rdom | awk -v ipv4addr="$piholeIP" -v ipv6addr="$piholeIPv6" '{sub(/\r$/,""); print ipv4addr" "$0"\n"ipv6addr" "$0}' >> $adList
else
echo "**Blacklisting $rdom on IPv4"
echo $rdom | awk -v ipv4addr="$piholeIP" '{sub(/\r$/,""); print ipv4addr" "$0}' >>$adList
fi
echo $rdom| sed 's/\./\\./g' | xargs -I {} perl -i -ne'print unless /'{}'(?!.)/;' $whitelist
done
fi
}
function Reload() {
# Reload hosts file
echo "** Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq)
if [[ $dnsmasqPid ]]; then
# service already running - reload config
sudo kill -HUP $dnsmasqPid
else
# service not running, start it up
sudo service dnsmasq start
fi
}
###################################################
# For each argument passed to this script
for var in "$@" for var in "$@"
do do
echo "Whitelisting $var..." case "$var" in
"-nr"| "--noreload" ) reload=false;;
# Construct basic pattern to match domain name. "-d" | "--delmode" ) addmode=false;;
basicpattern=$(echo $var | awk -F '[# \t]' 'NF>0&&$1!="" {print ""$1""}' | sed 's/\./\\./g') "-f" | "--force" ) force=true;;
"-q" | "--quiet" ) versbose=false;;
if [[ "$basicpattern" != "" ]]; then * ) HandleOther $var;;
# Add to the combination pattern that will be used below esac
if [[ "$combopattern" != "" ]]; then combopattern="$combopattern|"; fi
combopattern="$combopattern$basicpattern"
# Also add the domain to the whitelist but only if it's not already present
grep -E -q "^$basicpattern$" $whitelist \
|| echo "$var" >> $whitelist
fi
done done
# Now report on and remove matched domains PopWhitelistFile
if [[ "$combopattern" != "" ]]; then
echo "Modifying hosts file..."
# Construct pattern to match entry in hosts file. if $modifyHost || $force; then
# This consists of one or more IP addresses followed by the domain name. echo "** Modifying Hosts File"
pattern=$(echo $combopattern | awk -F '[# \t]' '{printf "%s", "^(([0-9]+\.){3}[0-9]+ +)+("$1")$"}') ModifyHostFile
else
# Output what will be removed and then actually remove if $versbose; then
sed -r -n 's/'"$pattern"'/ Removed: \3/p' $adList echo "** No changes need to be made"
sed -r -i '/'"$pattern"'/d' $adList exit 1
fi
echo "** $# domain(s) whitelisted." fi
# Force dnsmasq to reload /etc/pihole/gravity.list
kill -HUP $(pidof dnsmasq) if $reload; then
Reload
fi fi

View File

@@ -42,10 +42,4 @@ $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." )
# Set the cache to 1 day for better performance
expire.url = ("" => "access plus 1 days")
# Send the query into the black hole
url.rewrite = (".*" => "pihole/index.html" )
} }

View File

@@ -1,26 +1,15 @@
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# Pi-hole: Update the ad sources once a week on Sunday at 01:59 # Pi-hole: Update the ad sources once a week on Sunday at 01:59
# Download any updates from the ad lists # Download any updates from the ad lists
59 1 * * 7 root /usr/local/bin/gravity.sh 59 1 * * 7 root /usr/local/bin/gravity.sh
# Pi-hole: Update the Web interface shortly after gravity runs
# This should also update the version number if it is changed in the dashboard repo
30 2 * * 7 root /usr/local/bin/updateDashboard.sh
# Pi-hole: Parse the log file before it is flushed and save the stats to a database # 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 11 * * * root /usr/local/bin/dailyLog.sh #50 23 * * * root /usr/local/bin/dailyLog.sh
# Pi-hole: Flush the log daily at 11:58 so it doesn't get out of control # 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 11 * * * root /usr/local/bin/piholeLogFlush.sh 58 23 * * * root /usr/local/bin/piholeLogFlush.sh

View File

@@ -17,6 +17,22 @@
# curl -L install.pi-hole.net | bash # curl -L install.pi-hole.net | bash
######## VARIABLES ######### ######## VARIABLES #########
# Must be root to install
if [[ $EUID -eq 0 ]];then
echo "You are root."
else
echo "::: sudo will be used for the install."
# Check if it is actually installed
# If it isn't, exit because the install cannot complete
if [[ $(dpkg-query -s sudo) ]];then
export SUDO="sudo"
else
echo "::: Please install sudo or run this as root."
exit 1
fi
fi
tmpLog=/tmp/pihole-install.log tmpLog=/tmp/pihole-install.log
instalLogLoc=/etc/pihole/install.log instalLogLoc=/etc/pihole/install.log
@@ -37,17 +53,34 @@ availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -
dhcpcdFile=/etc/dhcpcd.conf dhcpcdFile=/etc/dhcpcd.conf
####### FUCNTIONS ########## ####### FUCNTIONS ##########
###All creddit for the below function goes to http://fitnr.com/showing-a-bash-spinner.html
spinner()
{
local pid=$1
local delay=0.001
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"
}
backupLegacyPihole() 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") $SUDO mv /usr/local/bin/gravity.sh /etc/pihole/original/gravity.sh.$(date "+%Y-%m-%d")
else else
: :
fi fi
@@ -90,7 +123,7 @@ chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1
for desiredInterface in $chooseInterfaceOptions for desiredInterface in $chooseInterfaceOptions
do do
piholeInterface=$desiredInterface piholeInterface=$desiredInterface
echo "Using interface: $piholeInterface" echo "::: Using interface: $piholeInterface"
echo ${piholeInterface} > /tmp/piholeINT echo ${piholeInterface} > /tmp/piholeINT
done done
} }
@@ -105,24 +138,42 @@ choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
for choice in $choices for choice in $choices
do do
case $choice in case $choice in
IPv4) IPv4)useIPv4=true;;
echo "IPv4 selected." IPv6)useIPv6=true;;
useIPv4=true
;;
IPv6)
echo "IPv6 selected."
useIPv6=true
;;
esac esac
done done
if [ $useIPv4 ] && [ ! $useIPv6 ]; then
getStaticIPv4Settings
setStaticIPv4
echo "::: Using IPv4 on $IPv4addr"
echo "::: IPv6 will NOT be used."
fi
if [ ! $useIPv4 ] && [ $useIPv6 ]; then
useIPv6dialog
echo "::: IPv4 will NOT be used."
echo "::: Using IPv6 on $piholeIPv6"
fi
if [ $useIPv4 ] && [ $useIPv6 ]; then
getStaticIPv4Settings
setStaticIPv4
useIPv6dialog
echo "::: Using IPv4 on $IPv4addr"
echo "::: Using IPv6 on $piholeIPv6"
fi
if [ ! $useIPv4 ] && [ ! $useIPv6 ]; then
echo "::: Cannot continue, neither IPv4 or IPv6 selected"
echo "::: Exiting"
exit 1
fi
} }
useIPv6dialog() useIPv6dialog()
{ {
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) }')
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$piholeIPv6 will be used to block ads." $r $c
sudo mkdir -p /etc/pihole/ $SUDO mkdir -p /etc/pihole/
sudo touch /etc/pihole/.useIPv6 $SUDO touch /etc/pihole/.useIPv6
} }
getStaticIPv4Settings() getStaticIPv4Settings()
@@ -189,7 +240,7 @@ setDHCPCD(){
echo "interface $piholeInterface echo "interface $piholeInterface
static ip_address=$IPv4addr static ip_address=$IPv4addr
static routers=$IPv4gw static routers=$IPv4gw
static domain_name_servers=$IPv4gw" | sudo tee -a $dhcpcdFile >/dev/null static domain_name_servers=$IPv4gw" | $SUDO tee -a $dhcpcdFile >/dev/null
} }
setStaticIPv4(){ setStaticIPv4(){
@@ -198,75 +249,141 @@ if grep -q $IPv4addr $dhcpcdFile; then
: :
else else
setDHCPCD setDHCPCD
sudo ip addr replace dev $piholeInterface $IPv4addr $SUDO ip addr replace dev $piholeInterface $IPv4addr
echo "Setting IP to $IPv4addr. You may need to restart after the install is complete." echo "Setting IP to $IPv4addr. You may need to restart after the install is complete."
fi fi
} }
installScripts(){ installScripts(){
sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh $SUDO echo " "
sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh $SUDO echo "::: Installing scripts..."
sudo curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh #$SUDO rm /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh
sudo curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh $SUDO curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh
sudo chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,piholeLogFlush}.sh $SUDO curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh
$SUDO curl -o /usr/local/bin/whitelist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/whitelist.sh
$SUDO curl -o /usr/local/bin/blacklist.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/blacklist.sh
$SUDO curl -o /usr/local/bin/piholeLogFlush.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/piholeLogFlush.sh
$SUDO curl -o /usr/local/bin/updateDashboard.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/updateDashboard.sh
$SUDO chmod 755 /usr/local/bin/{gravity,chronometer,whitelist,blacklist,piholeLogFlush,updateDashboard}.sh
$SUDO echo "::: ...done."
} }
installConfigs(){ installConfigs(){
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig $SUDO echo " "
sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig $SUDO echo "::: Installing configs..."
sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf $SUDO mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf $SUDO mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig
sudo sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf $SUDO curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf
$SUDO curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf
$SUDO sed -i "s/@INT@/$piholeInterface/" /etc/dnsmasq.conf
$SUDO echo "::: ...done."
} }
stopServices(){ stopServices(){
sudo service dnsmasq stop || true $SUDO echo " "
sudo service lighttpd stop || true $SUDO echo "::: Stopping services..."
$SUDO service dnsmasq stop || true
$SUDO service lighttpd stop || true
$SUDO echo "::: ...done."
} }
installDependencies(){ installDependencies(){
sudo apt-get update $SUDO echo " "
sudo apt-get -y upgrade $SUDO echo "::: Updating apt-get package list"
sudo apt-get -y install dnsutils bc toilet $SUDO apt-get -qq update & spinner $!
sudo apt-get -y install dnsmasq $SUDO echo "::: Upgrading apt-get packages"
sudo apt-get -y install lighttpd php5-common php5-cgi php5 $SUDO apt-get -yqq upgrade & spinner $!
$SUDO echo "::: ...done."
$SUDO echo "::: installing dnsutils, bc, toilet, and figlet..."
$SUDO apt-get -yqq install dnsutils bc toilet figlet & spinner $!
$SUDO echo "::: ...done."
$SUDO echo "::: Installing dnsmasq..."
$SUDO apt-get -yqq install dnsmasq & spinner $!
$SUDO echo "::: ...done."
$SUDO echo "::: Installing lighttpd, php5-common, php5-cgi, and php5..."
$SUDO apt-get -yqq install lighttpd php5-common php5-cgi php5 & spinner $!
$SUDO echo "::: ...done."
$SUDO echo "::: Installing git..."
$SUDO apt-get -yqq install git & spinner $!
$SUDO echo "::: ...done."
} }
installWebAdmin(){ installWebAdmin(){
sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip $SUDO echo " "
sudo unzip -oq /var/www/master.zip -d /var/www/html/ $SUDO echo "::: Downloading and installing latest WebAdmin files..."
sudo mv /var/www/html/AdminLTE-master /var/www/html/admin if [ -d "/var/www/html/admin" ]; then
sudo rm /var/www/master.zip 2>/dev/null $SUDO rm -rf /var/www/html/admin
sudo touch /var/log/pihole.log fi
sudo chmod 644 /var/log/pihole.log if [ -d "/var/www/html/AdminLTE-master" ]; then
sudo chown dnsmasq:root /var/log/pihole.log $SUDO rm -rf /var/www/html/AdminLTE-master
fi
$SUDO wget -nv https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip & spinner $!
$SUDO unzip -oq /var/www/master.zip -d /var/www/html/
$SUDO mv /var/www/html/AdminLTE-master /var/www/html/admin
$SUDO rm /var/www/master.zip 2>/dev/null
$SUDO echo "::: ...Done."
$SUDO echo "::: Creating log file and changing owner to dnsmasq..."
if [ ! -f /var/log/pihole.log ]; then
$SUDO touch /var/log/pihole.log
$SUDO chmod 644 /var/log/pihole.log
$SUDO chown dnsmasq:root /var/log/pihole.log
else
$SUDO echo "::: No need to create, already exists!"
fi
$SUDO echo "::: ...done."
} }
installPiholeWeb(){ installPiholeWeb(){
sudo mkdir /var/www/html/pihole $SUDO echo " "
sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig $SUDO echo "::: Downloading and installing pihole custom index page..."
sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html if [ -d "/var/www/html/pihole" ]; then
$SUDO echo "::: Existing page detected, not overwriting"
else
$SUDO mkdir /var/www/html/pihole
$SUDO mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig
$SUDO curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html
fi
$SUDO echo "::: ...done."
} }
installCron(){ installCron(){
sudo mv /etc/crontab /etc/crontab.orig $SUDO echo " "
sudo curl -o /etc/crontab https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron $SUDO echo "::: Downloading latest Cron script..."
$SUDO curl -o /etc/cron.d/pihole https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/pihole.cron
$SUDO echo "::: ...done."
} }
runGravity()
{
$SUDO echo " "
$SUDO echo "::: Preparing to run gravity.sh to refresh hosts..."
if ls /etc/pihole/list* 1> /dev/null 2>&1; then
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
$SUDO rm /etc/pihole/list.*
fi
#Don't run as SUDO, this was causing issues
/usr/local/bin/gravity.sh
$SUDO echo "::: ...done."
}
installPihole() installPihole()
{ {
installDependencies installDependencies
stopServices stopServices
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 pi
sudo lighty-enable-mod fastcgi fastcgi-php $SUDO lighty-enable-mod fastcgi fastcgi-php
installScripts installScripts
installConfigs installConfigs
installWebAdmin installWebAdmin
installPiholeWeb installPiholeWeb
installCron installCron
sudo /usr/local/bin/gravity.sh runGravity
} }
displayFinalMessage(){ displayFinalMessage(){
@@ -293,33 +410,14 @@ chooseInterface
# Let the user decide if they want to block ads over IPv4 and/or IPv6 # Let the user decide if they want to block ads over IPv4 and/or IPv6
use4andor6 use4andor6
# Decide is IPv4 will be used
if [[ "$useIPv4" = true ]];then
echo "Using IPv4"
getStaticIPv4Settings
setStaticIPv4
else
useIPv4=false
echo "IPv4 will NOT be used."
fi
# Decide is IPv6 will be used
if [[ "$useIPv6" = true ]];then
useIPv6dialog
echo "Using IPv6."
echo "Your IPv6 address is: $piholeIPv6"
else
useIPv6=false
echo "IPv6 will NOT be used."
fi
# Install and log everything to a file # Install and log everything to a file
installPihole | tee $tmpLog installPihole | tee $tmpLog
# Move the log file into /etc/pihole for storage # Move the log file into /etc/pihole for storage
sudo mv $tmpLog $instalLogLoc $SUDO mv $tmpLog $instalLogLoc
displayFinalMessage displayFinalMessage
sudo service dnsmasq start $SUDO service dnsmasq start
sudo service lighttpd start $SUDO service lighttpd start

View File

@@ -8,20 +8,64 @@
# 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.
# Must be root to uninstall
if [[ $EUID -eq 0 ]];then
echo "You are root."
else
echo "sudo will be used for the install."
# Check if it is actually installed
# If it isn't, exit because the unnstall cannot complete
if [[ $(dpkg-query -s sudo) ]];then
export SUDO="sudo"
else
echo "Please install sudo or run this as root."
exit 1
fi
fi
######### SCRIPT ########### ######### SCRIPT ###########
sudo apt-get -y remove --purge dnsutils bc toilet $SUDO apt-get -y remove --purge dnsutils bc toilet
sudo apt-get -y remove --purge dnsmasq $SUDO apt-get -y remove --purge dnsmasq
sudo apt-get -y remove --purge lighttpd php5-common php5-cgi php5 $SUDO apt-get -y remove --purge lighttpd php5-common php5-cgi php5
sudo rm -rf /var/www/html
sudo rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig # Only web directories/files that are created by pihole should be removed.
sudo rm /etc/crontab echo "Removing the Pi-hole Web server files..."
sudo mv /etc/crontab.orig /etc/crontab $SUDO rm -rf /var/www/html/admin
sudo rm /etc/dnsmasq.conf $SUDO rm -rf /var/www/html/pihole
sudo rm -rf /etc/lighttpd/ $SUDO rm /var/www/html/index.lighttpd.orig
sudo rm /var/log/pihole.log
sudo rm /usr/local/bin/gravity.sh # If the web directory is empty after removing these files, then the parent html folder can be removed.
sudo rm /usr/local/bin/chronometer.sh if [[ ! "$(ls -A /var/www/html)" ]]; then
sudo rm /usr/local/bin/whitelist.sh $SUDO rm -rf /var/www/html
sudo rm /usr/local/bin/piholeLogFlush.sh fi
sudo rm -rf /etc/pihole/
echo "Removing dnsmasq config files..."
$SUDO rm /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
# Attempt to preserve backwards compatibility with older versions
# to guarantee no additional changes were made to /etc/crontab after
# the installation of pihole, /etc/crontab.pihole should be permanently
# preserved.
if [[ -f /etc/crontab.orig ]]; then
echo "Initial Pi-hole cron detected. Restoring the default system cron..."
$SUDO mv /etc/crontab /etc/crontab.pihole
$SUDO mv /etc/crontab.orig /etc/crontab
$SUDO service cron restart
fi
# Attempt to preserve backwards compatibility with older versions
if [[ -f /etc/cron.d/pihole ]];then
echo "Removing cron.d/pihole..."
$SUDO rm /etc/cron.d/pihole
fi
echo "Removing config files and scripts..."
$SUDO rm /etc/dnsmasq.conf
$SUDO rm -rf /etc/lighttpd/
$SUDO rm /var/log/pihole.log
$SUDO rm /usr/local/bin/gravity.sh
$SUDO rm /usr/local/bin/chronometer.sh
$SUDO rm /usr/local/bin/whitelist.sh
$SUDO rm /usr/local/bin/piholeLogFlush.sh
$SUDO rm -rf /etc/pihole/

View File

@@ -48,12 +48,11 @@ blacklist=$piholeDir/blacklist.txt
whitelist=$piholeDir/whitelist.txt whitelist=$piholeDir/whitelist.txt
latentWhitelist=$piholeDir/latentWhitelist.txt latentWhitelist=$piholeDir/latentWhitelist.txt
justDomainsExtension=domains justDomainsExtension=domains
matter=$basename.0.matter.txt matterandlight=$basename.0.matterandlight.txt
andLight=$basename.1.andLight.txt supernova=$basename.1.supernova.txt
supernova=$basename.2.supernova.txt eventHorizon=$basename.2.eventHorizon.txt
eventHorizon=$basename.3.eventHorizon.txt accretionDisc=$basename.3.accretionDisc.txt
accretionDisc=$basename.4.accretionDisc.txt eyeOfTheNeedle=$basename.4.wormhole.txt
eyeOfTheNeedle=$basename.5.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
@@ -160,48 +159,35 @@ function gravity_Schwarzchild() {
# 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 "** Aggregating list of domains..." echo "** Aggregating list of domains..."
truncate -s 0 $piholeDir/$matter truncate -s 0 $piholeDir/$matterandlight
for i in "${activeDomains[@]}" for i in "${activeDomains[@]}"
do do
cat $i |tr -d '\r' >> $piholeDir/$matter cat $i |tr -d '\r' >> $piholeDir/$matterandlight
done done
} }
# Pulsar - White/blacklist application
function gravity_pulsar() {
function gravity_Blacklist(){
# Append blacklist entries if they exist # Append blacklist entries if they exist
if [[ -r $blacklist ]];then blacklist.sh -f -nr -q
numberOf=$(cat $blacklist | sed '/^\s*$/d' | wc -l) }
echo "** Blacklisting $numberOf domain(s)..."
cat $blacklist >> $piholeDir/$matter
fi
# Whitelist (if applicable) domains
if [[ -r $whitelist ]];then
# Remove whitelist entries
numberOf=$(cat $whitelist | sed '/^\s*$/d' | wc -l)
plural=; [[ "$numberOf" != "1" ]] && plural=s
echo "** Whitelisting $numberOf domain${plural}..."
# Append a "$" to the end, prepend a "^" to the beginning, and
# replace "." with "\." of each line to turn each entry into a
# regexp so it can be parsed out with grep -x
awk -F '[# \t]' 'NF>0&&$1!="" {print "^"$1"$"}' $whitelist | sed 's/\./\\./g' > $latentWhitelist
else
rm $latentWhitelist 2>/dev/null
fi
function gravity_Whitelist() {
# Prevent our sources from being pulled into the hole # Prevent our sources from being pulled into the hole
plural=; [[ "${#sources[@]}" != "1" ]] && plural=s plural=; [[ "${sources[@]}" != "1" ]] && plural=s
echo "** Whitelisting ${#sources[@]} ad list source${plural}..." echo "** Whitelisting ${#sources[@]} ad list source${plural}..."
urls=()
for url in ${sources[@]} for url in ${sources[@]}
do do
echo "$url" | awk -F '/' '{print "^"$3"$"}' | sed 's/\./\\./g' >> $latentWhitelist tmp=$(echo "$url" | awk -F '/' '{print $3}')
urls=("${urls[@]}" $tmp)
done done
whitelist.sh -f -nr -q ${urls[@]}
# Remove whitelist entries from list
grep -vxf $latentWhitelist $piholeDir/$matter > $piholeDir/$andLight
} }
function gravity_unique() { function gravity_unique() {
@@ -240,12 +226,13 @@ function gravity_blackbody() {
} }
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
awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$andLight | \ awk '($1 !~ /^#/) { if (NF>1) {print $2} else {print $1}}' $piholeDir/$matterandlight | sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova
sed -nr -e 's/\.{2,}/./g' -e '/\./p' > $piholeDir/$supernova
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..."
@@ -256,7 +243,6 @@ function gravity_advanced() {
function gravity_reload() { function gravity_reload() {
# Reload hosts file # Reload hosts file
echo "** Refresh lists in dnsmasq..." echo "** Refresh lists in dnsmasq..."
dnsmasqPid=$(pidof dnsmasq) dnsmasqPid=$(pidof dnsmasq)
if [[ $dnsmasqPid ]]; then if [[ $dnsmasqPid ]]; then
@@ -268,11 +254,13 @@ function gravity_reload() {
fi fi
} }
gravity_collapse gravity_collapse
gravity_spinup gravity_spinup
gravity_Schwarzchild gravity_Schwarzchild
gravity_pulsar
gravity_advanced gravity_advanced
gravity_hostFormat gravity_hostFormat
gravity_blackbody gravity_blackbody
gravity_Whitelist
gravity_Blacklist
gravity_reload gravity_reload