Compare commits

...

584 Commits

Author SHA1 Message Date
Adam Warner
f27efec3e6 X-Pi-hole removed from blocking page...
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-06 23:31:49 +01:00
Adam Warner
2f50da6ea5 no need to declare $viewPort
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-06 23:31:48 +01:00
Adam Warner
603caa9239 Dependabot config tweak
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-06 23:31:48 +01:00
Adam Warner
ab27a3bd45 Dependabot config tweak
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-06 23:30:29 +01:00
yubiuser
f3acc7c839 Make debug log file size human readable (#4350)
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-06 15:19:25 -07:00
DL6ER
6f6b54ea05 Merge pull request #4373 from friederbluemle/rm-idea
Remove .idea/
2021-10-06 20:07:27 +02:00
Frieder Bluemle
3cad8e4c5b Remove .idea/
Signed-off-by: Frieder Bluemle <frieder.bluemle@gmail.com>
2021-10-06 13:38:21 +02:00
yubiuser
9535e2fd6d Merge pull request #4363 from xanoni/update-upstream-dns-capabilities
Update upstream DNS server capability descriptions
2021-10-06 07:18:14 +02:00
Adam Warner
0ea7344c30 add --no-rebase to the git pull command(s) to squelch hint message in newer versions of git (#4226)
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-06 01:19:28 +01:00
Adam Warner
55dce14655 Add execution bit accidentally dropped in #4106 (#4368)
Add some smoke tests for the repository.
 - Add x bit to piholeCheckout.sh. Possibly not needed, but consistency is no bad thing
 - Ensure all files in script directorys have executable bit set

Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-10-05 19:34:51 +01:00
Jauder Ho
5bf35dc687 Add Dependabot and CodeQL support (#4286)
Signed-off-by: Jauder Ho <jauderho@users.noreply.github.com>

Co-authored-by: Adam Warner <me@adamwarner.co.uk>
2021-10-05 18:22:46 +01:00
MichaIng
c5828df198 Consequently use defined file path variables (#4105)
The script defines variables for the most important file paths which are not always used to call the file paths. "lighttpdConfig" was never used in the script itself, so that a shellcheck exception needed to be used. With this change, the defined variables are consequently used, which makes the shellcheck exception obsolete as well.

Additionally the assigned strings are quoted, which is not necessary here but aligns with the coding standard and highlights the strings in most editors and development platforms for developer convenience.

Signed-off-by: MichaIng <micha@dietpi.com>
2021-10-05 16:40:12 +01:00
Adam Warner
77e322afa6 (docs) update README.md (#4371)
- correct grammar
- correct punctuation
- correct pronoun usage

Co-authored-by: Vladislav Doster <mvdoster@gmail.com>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>

Co-authored-by: Vladislav Doster <mvdoster@gmail.com>
2021-10-05 16:25:29 +01:00
Andras Tim
541257849d List fix: no reload (#3981)
* scripts/list: Fixed --noreload options

We should differentiate the ability and the needings.

Signed-off-by: Andras Tim <andras.tim@gmail.com>

* scripts/list: Removed unnecessary tailing whitespaces

Signed-off-by: Andras Tim <andras.tim@gmail.com>

* Update advanced/Scripts/list.sh

Signed-off-by: Andras Tim <andras.tim@gmail.com>

* Merge bash conditions according to MichaIng suggestion

Co-authored-by: micha@dietpi.com
Signed-off-by: Andras Tim <andras.tim@gmail.com>
2021-10-05 15:52:51 +01:00
yubiuser
80560d4a4a Do not export DNS_FQDN_REQUIRED and DNS_BOGUS_PRIV unconditionally (#4354)
* Do not export unconditionally

Signed-off-by: Christian König <ckoenig@posteo.de>

* Check if variable is unset instead of grep for it

Signed-off-by: Christian König <ckoenig@posteo.de>

* Use bash's buld in word syntax

Signed-off-by: Christian König <ckoenig@posteo.de>

* Move export back to their brothers

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-05 14:36:00 +01:00
yubiuser
38bb4a4908 Remove unused wildcard_regex_converter.sh (#4369)
* Remove unused wildcard_regex_converter.sh

Signed-off-by: Christian König <ckoenig@posteo.de>

* Remove regexconverter

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-05 13:09:16 +01:00
yubiuser
2b74b47b4a Remove netcat from dependencies (#4346)
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-05 01:47:18 +01:00
yubiuser
109340033e Do not account for refactor anymore (#4355)
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-05 01:22:27 +01:00
xanoni
0f246b8df5 Update upstream DNS server capability descriptions
Mention that the below 3 upstream DNS support DNSSEC:
- Cloudflare (see https://developers.cloudflare.com/1.1.1.1/faq#how-does-1111-work-with-dnssec)
- DNS.WATCH (see https://dns.watch/index)
- Google (see https://developers.google.com/speed/public-dns/faq#dnssec)
- Quad9 (see https://www.quad9.net/support/faq/#dnssec)

Other providers and capabilities (e.g., ECS) were not checked.

Signed-off-by: xanoni <77220130+xanoni@users.noreply.github.com>
2021-10-04 13:55:20 -04:00
Adam Warner
5b03160295 Install script comment tweaks (#4361) 2021-10-04 11:40:53 +01:00
DL6ER
7b0513d1e6 Merge pull request #4357 from yubiuser/remove_whiptail
Do not let the user select if they want to blocking via IPv4 and/or IPv6
2021-10-03 07:42:19 +02:00
Christian König
466520366d Fogot to save...
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-02 23:47:13 +02:00
Christian König
9dbcbdbe66 Adjust tests
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-02 23:43:08 +02:00
Christian König
a9b9718ffa Do not let the user select if they want to blocking via IPv4 and/or IPv6
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-10-02 23:29:23 +02:00
Adam Warner
fb073373d6 Merge pull request #4106 from MichaIng/patch-2
Remove obsolete DEB package name checks
2021-10-01 15:26:15 +01:00
MichaIng
fd050693a2 Remove obsolete DEB package name checks
The installer contains three checks for specific DEB package names, which did change in past Debian/Ubuntu versions. These checks are obsolete with the current set of supported distro versions:

iproute vs iproute2: All distro versions down to Debian Jessie and Ubuntu Xenial ship the iproute2 package:
- https://packages.debian.org/search?keywords=iproute
- https://packages.ubuntu.com/search?suite=all&keywords=iproute

php5 vs php: None of the Ubuntu version down to Xenial and only Debian Jessie ships the php5 package:
- https://packages.debian.org/search?keywords=php5
- https://packages.ubuntu.com/search?suite=all&keywords=php5
Moreover, installs with PHP5 would fail anyway for a longer time, due to the added php-xml module package, which became a dedicated package with PHP7.0 while being part of the core package with PHP5:
- https://packages.debian.org/search?keywords=php5-xml

php-sqlite vs php-sqlite3: With PHP7, the SQLite module package name changed to sqlite3 prefix:
- https://packages.debian.org/search?keywords=php-sqlite
- https://packages.ubuntu.com/search?suite=all&keywords=php-sqlite

Additionally the code comment about minimal apt-get call output was moved to the actual apt-get install call section, as if refers to issues with package installs that require interactive action and hence output about it to the console. The package cache update as well requires an interactive confirmation when the underlying suite code name changes, e.g. when "buster" becomes "oldstable" and "bullseye" becomes "stable". But that is not what the referred issue was about.

The comments around the installer and Pi-hole package dependencies have been aligned with the current v6 branch as attempt to resolve merge conflicts in the first place.

Signed-off-by: MichaIng <micha@dietpi.com>
2021-10-01 16:12:06 +02:00
yubiuser
841222fa21 Add to INSTALLER_DEPS (#4343)
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-26 10:50:03 -07:00
DL6ER
0576810438 Merge pull request #4339 from pi-hole/tweak/local_ttl
Remove local-ttl from set of default dnsmasq options
2021-09-25 21:57:49 +02:00
DL6ER
b755330f4c Remove local-ttl from set of default dnsmasq options.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-24 11:34:05 +02:00
DL6ER
cf59f35a4e Merge pull request #4324 from jpgpi250/fix_#4322
Fix for gravity syntax error (see #4322)
2021-09-14 09:23:14 +02:00
DL6ER
2131a1fe7f Merge pull request #4327 from yubiuser/export_nfqdn_bogus
Export DNS_FQDN_REQUIRED and DNS_BOGUS_PRIV to setupVars.conf during installation
2021-09-13 08:55:54 +02:00
Christian König
a88a94c4f1 Export DNS_FQDN_REQUIRED and DNS_BOGUS_PRIV to setupVars.conf during installation
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-13 08:06:19 +02:00
yubiuser
1c286c7bc4 Select proper PHP version on RPM based OS after INSTALLER_DEPS have been installed (#4325)
* Select proper PHP version on RPM based OS after INSTALLER_DEPS have been installed

* Remove check for unsupported RPM distros as it is checked in os_check already

* Add select_rpm_php function to tox tests

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-12 13:40:37 -07:00
yubiuser
6d670991c3 Perform a check of required packages befor updating pihole (#4326)
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-12 13:38:55 -07:00
jpgpi250
3439045228 fix Pi-hole v5.4 update - syntax error #4322
Signed-off-by: jpgpi250 <jpgpi250@gmail.com>
2021-09-12 18:24:15 +02:00
Adam Warner
b710e107d6 Merge pull request #4320 from pi-hole/master
Sync master back to dev
2021-09-11 22:39:50 +01:00
Adam Warner
2673c2c072 Merge pull request #4318 from pi-hole/release/v5.4
Pi-hole core v5.4
2021-09-11 22:17:43 +01:00
Adam Warner
e393048488 Merge pull request #4229 from MichaIng/patch-3
Hardcode whiptail dimensions to 20 rows and 70 chars width
2021-09-11 21:37:14 +01:00
Adam Warner
2feea70311 Merge pull request #4319 from pi-hole/development
Sync Dev -> release/v5.4
2021-09-11 21:36:08 +01:00
Adam Warner
62f29ba3fa Merge branch 'release/v5.4' into development 2021-09-11 21:35:11 +01:00
DL6ER
89b1cfcd85 Merge pull request #4243 from yubiuser/debug_dnsmasq
Include all files in the dnsmasq config dir in the debug output
2021-09-11 22:20:00 +02:00
Adam Warner
89e187947e Merge pull request #4282 from pi-hole/new/RFC6761
Install RFC6761 config file
2021-09-11 20:44:46 +01:00
Adam Warner
d2faa93241 Merge pull request #4314 from pi-hole/fix/capabilities
Add possibly missing capabilities
2021-09-11 20:44:24 +01:00
DL6ER
0df099a6a5 Merge pull request #4312 from yubiuser/debug_dnsmasq.conf
Add content of /etc/dnsmasq.conf to debug output
2021-09-11 21:42:36 +02:00
DL6ER
482ac12c9b Merge pull request #4275 from MichaIng/patch-4
Remove ineffective Access-Control-Allow-Origin header
2021-09-11 21:41:49 +02:00
DL6ER
b2592f5d31 Merge pull request #4317 from pi-hole/tweak/UQDN_forwarding
Forward unqualified names to the CF target only when the "Never forward non-FQDN" option is NOT ticked
2021-09-11 21:40:14 +02:00
DL6ER
d0e8b0c962 Forward unqualified names to the CF target only when the "Never forward non-FQDN" option is NOT ticked
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-09 20:28:33 +02:00
Dan Schaper
d48d3aba69 Merge pull request #4305 from pi-hole/tweak/debug_curl
Use --no-progress-meter instead of --silent so error reasons are printed
2021-09-07 09:33:25 -07:00
DL6ER
cbc99d45c6 Small style change to finished debug upload display
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-07 11:21:34 +02:00
DL6ER
be68a5339c Apply same improvement to pihole tricorder feature
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-07 11:16:40 +02:00
DL6ER
606b05eec1 Ensure curl is either storing a valid token or a meaningful error message
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-07 11:13:09 +02:00
DL6ER
a1ee7d92a9 Add possibly missing capabilities
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-09-06 22:38:16 +02:00
Christian König
6941155572 Add content of /etc/dnsmasq.conf to debug output
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-06 17:16:36 +02:00
DL6ER
b6d73ac081 Merge pull request #4311 from yubiuser/debug_resolv
Add content of /etc/resolv.conf to debug output
2021-09-06 10:56:21 +02:00
Christian König
6fec4acd82 Add content of /etc/resolv.conf to debug output
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-09-05 20:44:39 +02:00
DL6ER
b241a19e87 Use --no-progress-meter instead of --silent so error reasons are printed
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-30 21:19:47 +02:00
Dan Schaper
a7ba55ffb0 Merge pull request #4304 from pi-hole/fix/tricorder
Fix pipe to pihole tricorder
2021-08-30 11:49:36 -07:00
DL6ER
115e3eeda9 Use --no-progress-meter instead of --silent so error reasons are printed
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-30 20:20:45 +02:00
DL6ER
21897d7fbd Add warning if curl failed
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-30 15:55:42 +02:00
DL6ER
31c7c019cb Fix piping to pihole tricorder
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-30 14:04:48 +02:00
DL6ER
b97f76e678 Merge pull request #4292 from yubiuser/sudo_apt
Add sudo to apt-get recommendation
2021-08-29 12:55:22 +02:00
Christian König
839a70cc37 Add sudo to apt-get recommendation
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-27 19:16:15 +02:00
DL6ER
a068567926 Merge pull request #4287 from pi-hole/tweak/conditional_forwarding_unqualified_domains
Conditional forwarding: Also forward unqualified host names
2021-08-23 22:02:43 +02:00
DL6ER
06fd8123c3 Also remove "rev-server" lines when rewriting 01-pihole.conf
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-20 16:26:17 +02:00
DL6ER
c2f3477a82 Ensure conditional forwarding will forward unqualified host names if we have no local answer for them.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-20 15:54:25 +02:00
DL6ER
ff64d8cf4d Use variable in user output, too
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-16 09:57:12 +02:00
DL6ER
e8e8104b36 Remove server=/local/ because of https://github.com/pi-hole/pi-hole/pull/4282#discussion_r689112972
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-15 18:37:12 +02:00
MichaIng
e1dca46423 Hardcode whiptail dimensions to 20 rows and 70 chars width
With the suggested way to call the installer via "curl -sSL https://install.pi-hole.net | bash", STDIN is no terminal, but overridden by the curl output, hence in most cases, the minimum dimensions were applied, even on larger screens. All whiptail calls are hence assured to work fine with those dimensions, aside of one case, making the calculations obsolete.

This commit hardcodes the whiptail dimensions to the prior minimum and removes the calculations. This also helps with testing, as it does not matter anymore how the script is called, and developers have a clearly defined space to make dialogs look nice, including line breaks, menu and list heights.

The only case which does not fit the 70 character width, the second menu entry of the "pihole -r" dialog, has been shortened accordingly. This was not an issue before, as "pihole -r" does not override the scripts STDIN and hence did allow larger dimensions based on the now removed calculations.

See the following discussions for reference:
- https://github.com/pi-hole/pi-hole/issues/3323
- https://github.com/pi-hole/pi-hole/pull/4197#issuecomment-876702380

Signed-off-by: MichaIng <micha@dietpi.com>
2021-08-15 18:04:11 +02:00
DL6ER
ea5a3bf0b2 Install RFC6761 config file
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-08-15 11:21:24 +02:00
DL6ER
98867d8d71 Merge pull request #4276 from pi-hole/dev-release5.4
Sync release/v5.4 back into development
2021-08-13 23:37:53 +02:00
Adam Warner
c88c943cda Merge branch 'release/v5.4' into dev-release5.4
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-13 20:24:35 +01:00
MichaIng
3ef90a9e47 Remove ineffective Access-Control-Allow-Origin header
The Access-Control-Allow-Origin header has only relevance, when a resource is loaded from an external host, so one that does not match the host of the primary loaded website. As the fonts are reasonably loaded via local URLs without hostname or scheme from the blocking page style sheet, they are never seen as external resources, regardless whether the blocking page is shown to the browser from a blocked domain or from the Pi-hole domain/IP.

For reference: https://github.com/pi-hole/pi-hole/issues/3462

Signed-off-by: MichaIng <micha@dietpi.com>
2021-08-13 20:42:51 +02:00
DL6ER
58a21bee07 Merge pull request #4271 from yubiuser/fix_splash
Fix Splashpage not appearing properly on non-root directories
2021-08-12 17:32:18 +02:00
Christian König
676b7e60f3 Fix Splashpage not appearing properly on non-root directories
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-12 13:55:40 +02:00
DL6ER
43b88cd628 Merge pull request #4236 from MichaIng/patch-4
Update pihole-FTL.service
2021-08-10 16:09:41 +02:00
DL6ER
e163ed449d Merge pull request #4264 from yubiuser/tweak_enable
On enabling/disabeling only reload-lists instead of reload
2021-08-09 18:26:24 +02:00
yubiuser
ee749f700f Add switching 'to...from' message to ftl checkout output (#4266)
* Add switching 'to...from' message to ftl checkout output

Signed-off-by: Christian König <ckoenig@posteo.de>

* Add quotes

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-07 20:07:45 +02:00
yubiuser
bb7c7cdf33 Add uptime to debug log (#4265)
* Add uptime to debug log

Signed-off-by: Christian König <ckoenig@posteo.de>

* Address github comments

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-07 20:07:14 +02:00
Christian König
ffe45e8b76 On enabling/disabeling only reload-lists instead of reload
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-06 20:51:48 +02:00
Adam Warner
f86ef0128e Merge pull request #4260 from pi-hole/tweak/installorder-butwithoutdhcpcd5-option1
Some tweaks to how packages are installed, plus removal of dhcpd5 dependency (Option 1)
2021-08-05 19:26:56 +01:00
Adam Warner
bdab701470 Remove dhcpcd5 dependency, however still help the user set the static IP if dhcpd5 is already installed (i.e on raspbian)
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:37 +01:00
Adam Warner
1ecb9165ee Remove weird global counter
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:37 +01:00
Adam Warner
2ff3b95117 put FTL Install back to where it was
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:37 +01:00
Adam Warner
3ad5097b12 Change initial install script order:
1. Ensure we have a compatible package manager
  2. Install required packages for os_check to run (we need dnsutils and grep for this
  3. Try to install FTL
  4. FTL installed? Install installer dependencies and continue as normal - no other dependencies are installed until user has gone through all whiptails

Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:37 +01:00
Adam Warner
d68a2ffaf3 Install only minimal requiered package before performing os_check
Co-authored-by: Christian König <ckoenig@posteo.de>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:36 +01:00
Adam Warner
913dcead7f move chmod/chown of macvendor.db to pihole-FTL.service
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:36 +01:00
Adam Warner
1358209a9a rename distro_check to package_manager_detect, as it is more in keeping with what the function actually does
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-08-05 19:02:36 +01:00
Dan Schaper
b729a44209 Merge pull request #4246 from pi-hole/tweak/debug_noipcheck
Remove comparison of IP addresses with setupVars.conf
2021-08-05 09:34:08 -07:00
Adam Warner
5a55fa5e48 Merge pull request #4263 from pi-hole/tweak/debugports
Update debug for new back end.
2021-08-05 17:12:37 +01:00
Adam Warner
d419eaf463 Merge branch 'development' into release/v5.4 2021-08-05 17:05:12 +01:00
Dan Schaper
a8deebde4d Merge pull request #4225 from duxovni/fix-logrotate-conflict
Give pihole its own logrotate state file
2021-08-05 09:03:47 -07:00
Dan Schaper
2ec4e84db4 Merge branch 'development' into fix-logrotate-conflict 2021-08-05 07:45:31 -07:00
Dan Schaper
075b3f6468 Remove ports, nc option and fix wording.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-08-04 20:57:09 -07:00
DL6ER
7911841355 Merge pull request #4262 from yubiuser/tweak_debug
Increase width of ID column in adlist and domain table in debug script
2021-08-04 20:26:49 +02:00
Christian König
d2c75a33d5 Increase width of ID column in adlist and domain table in debug script
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-08-04 20:13:41 +02:00
Adam Warner
15dfd19f58 Merge pull request #4248 from pi-hole/tweak/debugscript
Fix error on checking interfaces that are not dual-stack
2021-08-03 12:29:36 +01:00
DL6ER
9ae6b40818 Merge pull request #4247 from pi-hole/tweak/installLogrotateFail
Remove extra failure display when installation of logrotate file is skipped because the file already exists
2021-07-30 07:44:34 +02:00
Christian König
aa2da80768 Remove traces of unused files
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-28 23:06:01 +02:00
Christian König
b05fc5bb2b Remove specific dnsmasq config files from requiered files
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-28 23:01:18 +02:00
Christian König
c99c86af7f Make all dir list output human readable
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-28 22:53:30 +02:00
Christian König
f552173be3 Resolve merge conflict
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-28 22:51:04 +02:00
DL6ER
d02aa3ced1 Fix error on checking interfaces that are not dual-stack
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-07-28 22:34:55 +02:00
DL6ER
d0eb0d5037 Remove extra failure display when installation of logrotate file is skipped because the file already exists
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-07-28 21:18:02 +02:00
DL6ER
fbfec961d5 Remove comparison of IP addresses with setupVars.conf
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-07-28 21:16:19 +02:00
DL6ER
fba7517cc6 Merge pull request #4244 from yubiuser/debug_shm
Make output of SHM dir human readable
2021-07-28 06:20:31 +02:00
Christian König
0c125eba2c Make output of SHM dir human readable
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-27 22:04:30 +02:00
DL6ER
7f4bb24fd3 Merge pull request #4242 from pi-hole/fix/guard_logrotate
Guard for logrotate func non-zero return
2021-07-27 19:43:52 +02:00
Dan Schaper
b1ea60484e Guard for logrotate func non-zero return
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-07-26 13:22:26 -07:00
MichaIng
57c40cbd09 Update pihole-FTL.service
Make this script a bourne shell script, which requires the removal of only a single bashism, the "{n..m}" expansion. Furthermore, since POSIX echo has no reliable command line options, switch to printf when line breaks shall be omitted. On most distros/setups "sh" calls a much lighter bourne shell like dash, which inits and runs much faster than bash.

Remove unused PIDFILE variable, remove the single case of FTLUSER call and remove it as well. Using variables here might give the wrong impression that there is a change these can be varied. But both are hardcoded in many places throughout Pi-hole, so in this service script.

Consolidate and merge the commands to pre-create and set permissions for required files and directories. The /var/log/pihole directory is and was never used, the touch, chmod and chown call can be merged into one each to reduce overhead. Use "-f" option to to fail on missing database files instead of redirecting STDERR, which is otherwise helpful to debug other possible errors, like missing or corrupted commands, filesystem errors and such.

Do not use "which pihole-FTL" when setting capabilities when the hardcoded path /usr/bin/pihole-FTL is used for the actual daemon call. It makes sense to use the full path here, as the Pi-hole installer and updater installs it explicitly there, and so we prevent users from e.g. overriding it via /usr/local/bin/pihole-FTL too easily.

On pgrep and pkill calls, add the "-x" flag to assure that only "pihole-FTL" is matched and not "foo-pihole-FTL" or "pihole-FTL-bar".

Do not remove possible leftovers from previous pihole-FTL processes on start, but on stop instead. Since "start" includes a proceeding "stop" as well, on service start nothing changes, but on service stop, some resources are now freed.

Remove leading "$" from usage message. In bash this was omitted, as $'...' is a special syntax for escape sequence expansion, which is not applicable here. In dash it would be printed literally. To keep previous behaviour, it is hence removed.

Signed-off-by: MichaIng <micha@dietpi.com>
2021-07-24 14:55:54 +02:00
Dan Schaper
95d1464e36 Merge pull request #4233 from kthchew/teleporter
Add `-t` (teleporter) option to Admin Console help dialog
2021-07-21 10:08:31 -07:00
Kenneth Chew
092e533a30 Add -t option to Admin Console help dialog
Signed-off-by: Kenneth Chew <kenneth.c0@protonmail.com>
2021-07-18 14:31:37 -04:00
DL6ER
18c6ef8aac Merge pull request #4230 from yubiuser/fix_coloring
Fix coloring of pihole -t
2021-07-17 10:00:31 +02:00
Christian König
6be647a85f Fix coloring of pihole -t
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-16 21:52:12 +02:00
Adam Warner
6f7edbc92e Merge pull request #4228 from pi-hole/PromoFaux-patch-1
Delete supportedos.txt - it is not actually used anywhere can can cause confusion
2021-07-16 09:45:03 +01:00
Adam Warner
9beb3a9b6c Delete supportedos.txt - it is not actually used anywhere can can cause confusion 2021-07-16 09:17:23 +01:00
Adam Warner
3b6e6317b8 Merge pull request #4126 from lightswitch05/feature/support-and-test-debian-bullseye
Support and test Debian Bullsye (11) and Ubuntu 21.04
2021-07-15 19:11:26 +01:00
Daniel
a9b5fcd923 Add Ubuntu 21 to supportedos.txt, and github actions tests
Signed-off-by: Daniel <daniel@developerdan.com>
2021-07-15 13:49:59 +00:00
Adam Warner
38d4b2a883 add OS_CHECK_DOMAIN_NAME override to all the dockerfiles
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-14 22:41:17 +01:00
Adam Warner
e2e7d0a6aa add tests for ubuntu 21
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-14 22:36:02 +01:00
Faye Duxovni
aa5c15a728 give pihole its own logrotate state file
Signed-off-by: Faye Duxovni <duxovni@duxovni.org>

Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-07-09 20:00:10 -04:00
Adam Warner
7dea5012ce Merge pull request #4222 from pi-hole/tweak/lighttpd-config-fedora
Remove mod_compress from lighttpd config on fedora/centos
2021-07-07 22:01:23 +01:00
Daniel
fdca19e66d Support and test Debian Bullsye (11)
Signed-off-by: Daniel <daniel@developerdan.com>
2021-07-07 19:09:54 +00:00
Adam Warner
c9e341b5d4 Same change as with #4221, but on fedora config too
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-07 19:20:14 +01:00
Adam Warner
012d1e4b3d Merge pull request #4221 from lightswitch05/bugfix/remove-lighttpd-mod-compress
Remove mod_compress (mod_deflate) from lighttpd to provide backwards compatible support for Debian Bullseye (11)
2021-07-07 19:09:22 +01:00
Daniel
31a096dec2 Remove mod_compress (mod_deflate) from lighttpd to provide backwards compatible support for Debian Bullseye (11)
Signed-off-by: Daniel <daniel@developerdan.com>
2021-07-07 13:31:59 +00:00
DL6ER
a52a5e7ef2 Merge pull request #4217 from pi-hole/new/canary_domain_handling
Move Mozilla canary domain handling into FTL's namespace
2021-07-04 15:36:23 +02:00
DL6ER
a0d74d1e9d Canary domain handling is now happening in FTL where we have much finer control over it.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-07-04 13:55:47 +02:00
Adam Warner
0cbf77eb9f Merge pull request #4131 from pi-hole/fix/gravity_no_locallist
Handle pi.hole and hostname in FTL instead of local.list
2021-07-04 11:52:30 +01:00
Adam Warner
36470eb138 Merge pull request #4216 from pi-hole/fix/debugpiholelog
Debug Log bugfix
2021-07-04 01:53:49 +01:00
Adam Warner
e80e54a61a head_line -> line
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-04 01:18:46 +01:00
Adam Warner
118c0d209d Merge pull request #4162 from yubiuser/debug_tail_log
Add tail of pihole.log to debug output
2021-07-04 01:10:31 +01:00
Adam Warner
9b9e907013 Merge branch 'development' into debug_tail_log 2021-07-04 00:53:14 +01:00
Adam Warner
4ac4bc5c18 Merge branch 'development' into fix/gravity_no_locallist 2021-07-04 00:48:09 +01:00
Adam Warner
8c926d6af6 Merge pull request #4158 from MichaIng/patch-2
Remove false statement about dependency removal on Raspbian
2021-07-04 00:43:09 +01:00
Adam Warner
a1d85155fd Merge pull request #4178 from pi-hole/fix/custom_dns_removal
Add missing sed anchors when deleting lines.
2021-07-04 00:35:00 +01:00
Adam Warner
2d0619afec Merge pull request #4191 from yubiuser/fiter_pihole_t
Filter pihole -t
2021-07-04 00:31:57 +01:00
Adam Warner
ab9d589995 Merge pull request #4215 from pi-hole/new/packagecheck
Add new tests to ensure dependencies are available to the OS
2021-07-03 16:27:33 +01:00
Christian König
4fb5157719 Squashed commits
Add simple grep function to pihole -t

Signed-off-by: Christian König <ckoenig@posteo.de>

Add help info

Signed-off-by: Christian König <ckoenig@posteo.de>

Improve help info

Signed-off-by: Christian König <ckoenig@posteo.de>

Fix details

Signed-off-by: Christian König <ckoenig@posteo.de>
2021-07-03 17:13:19 +02:00
DL6ER
641eb7821b Merge pull request #4202 from jpgpi250/keep_old_database
Update gravity.sh
2021-07-03 09:14:05 +02:00
Adam Warner
87f2ae82cd Stickler gonna stickle...
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-03 00:07:37 +01:00
Adam Warner
469b715442 Add three new tests (one for each dependecy array) to check packages are available in supported OS package repos
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-07-03 00:00:54 +01:00
Adam Warner
04ffd22b4d Merge pull request #4214 from pi-hole/revert-4212-feature/include-lighttpd-mod-deflate
Revert "Include lighttpd-mod-deflate since it is no longer provided by default in Bullsye"
2021-07-02 22:23:10 +01:00
Adam Warner
c120f8a8d8 Revert "Include lighttpd-mod-deflate since it is no longer provided by default in Bullsye" 2021-07-02 22:09:41 +01:00
Adam Warner
0a5eee4d99 Merge pull request #4212 from lightswitch05/feature/include-lighttpd-mod-deflate
Include lighttpd-mod-deflate since it is no longer provided by default in Bullsye
2021-07-01 08:37:23 +01:00
Daniel
2b49988013 Include lighttpd-mod-deflate in the PIHOLE_WEB_DEPS list since it is no longer provided by default in Debian Bullseye
Signed-off-by: Daniel <daniel@developerdan.com>
2021-07-01 02:20:22 +00:00
Adam Warner
954b3e784f Merge pull request #4199 from wgyt/patch-1
Fix typo
2021-06-30 22:38:47 +01:00
Dan Schaper
0612685fac Merge pull request #4207 from pi-hole/fix/existing_logrotate
Don't overwrite existing logrotate
2021-06-21 08:23:23 -07:00
DL6ER
e3a22dcbfa Merge pull request #4206 from pi-hole/fix/dhcpv6
Be explicit in IPv6 RA values.
2021-06-21 05:10:33 +02:00
Dan Schaper
4f660966d0 Shellchecker
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-06-20 11:19:19 -07:00
Dan Schaper
7df22cd8e0 Check for logroate script existing first.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-06-20 11:18:33 -07:00
Dan Schaper
01764cc581 Explicity declare values for the RA packet.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-06-20 10:28:25 -07:00
Christian König
08cf9aa5a7 Declare and assign 'logging_enabled' separately
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-06-19 12:25:38 +02:00
Christian König
1ae67e1de8 Only inform user about disabled logging, don't skipp printing pihole.log
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-06-19 12:25:38 +02:00
Christian König
f2cba6cad1 Skip analyze_pihole_log if query logging has been disabled
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-06-19 12:25:38 +02:00
Christian König
df3c46349a Add tail of pihole.log to debug output
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-06-19 12:25:38 +02:00
jpgpi250
a2d5b8050a Update gravity.sh
Signed-off-by: jpgpi250 <jpgpi250@gmail.com>
2021-06-14 20:27:10 +02:00
William Horning
01c310a78f Fix typo
Signed-off-by: William Horning <williamhorning@wgyt.tk>
2021-06-10 19:23:58 -04:00
DL6ER
a9e761ec13 Add missing sed anchors when deleting lines.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-05-23 12:11:04 +02:00
Adam Warner
761c1cd305 Merge pull request #4175 from ashuio/development
Added docker to README
2021-05-20 18:49:01 +01:00
Ashutosh Verma
6f60555f79 Added install Method 3
Signed-off-by: Ashutosh Verma <mail@ashu.io>
2021-05-20 22:34:19 +05:30
MichaIng
c901443676 Remove false statement about dependency removal on Raspbian
The statement "All dependencies are safe to remove on Raspbian" has been added at a time where a much smaller list of dependencies were installed, all indeed relatively safe to purge. Nowadays this list has grown and includes important system packages, like iproute2, psmisc, sudo, curl and others, which are often again dependencies of other packages, like network stacks (ifupdown) and others, so that inexperienced users, following that statement, may break their systems network capabilities and more.

This message has hence been removed.

Signed-off-by: MichaIng <micha@dietpi.com>
2021-05-02 13:29:28 +02:00
Adam Warner
a51be7d498 Merge pull request #4153 from MichaIng/patch-2
Re-remove wget from dependencies
2021-05-01 00:09:19 +01:00
MichaIng
f3ceebbe06 Re-remove wget from dependencies
The dependency has been removed here: https://github.com/pi-hole/pi-hole/pull/3185
But accidentally re-added here: 982c1b0059 (diff-595630a29a855f6d667a84ca0662042e826bf3ec56322ef61d4a6ef149147d23)

wget is still not used in any Pi-hole script, hence it can be removed safely from dependencies.

Signed-off-by: MichaIng <micha@dietpi.com>
2021-04-30 20:48:12 +02:00
Adam Warner
57d9b96b53 Merge pull request #4143 from pi-hole/version-fullstops
Cosmetic change to pihole -v -c output
2021-04-25 17:47:40 +01:00
Adam Warner
5895690b58 this has been annoying me for months
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-04-24 15:38:27 +01:00
DL6ER
d26f8dd665 Merge pull request #4135 from MichaIng/patch-1
Enable PHP8 support for Debian/Ubuntu
2021-04-21 20:19:25 +02:00
MichaIng
2ba350984f Enable PHP8 support for Debian/Ubuntu
Since PHP8.0, the JSON extension is a core PHP extension and hence the php8.0-json package does not exist and is not required:
- https://www.php.net/manual/json.installation.php
- https://packages.debian.org/php8.0-json

Solves: https://discourse.pi-hole.net/t/php-8-packages-not-found/46286

Signed-off-by: MichaIng <micha@dietpi.com>
2021-04-18 15:33:05 +02:00
DL6ER
60513f93a3 Don't set IPV{4,6}_ADDRESS in conftest.py
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-18 09:26:23 +02:00
DL6ER
3b574096b8 Remove duplicated lo test
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-16 12:28:00 +02:00
DL6ER
58905a1188 Modify debugger to test name resolution on all available interfaces
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-16 12:14:05 +02:00
DL6ER
aa88be335e Acknowledge that IPV{4,6}_ADDRESS may not exist
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-16 11:44:54 +02:00
DL6ER
f90dffbf1a Do not put hostname and pi.hole into local.list - this will be handled by FTL after FTL#1111 has been merged
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-16 11:41:26 +02:00
Dan Schaper
1fb6366c41 Merge pull request #4123 from pi-hole/master
Master v5.3.1 to development
2021-04-14 14:30:30 -07:00
Dan Schaper
4736e03108 Merge pull request #4122 from pi-hole/release/v5.3.1
HotFix release v5.3.1
2021-04-14 14:10:21 -07:00
Dan Schaper
18bedc0493 Merge pull request #4121 from pi-hole/fix/port_hash
Fix port separator in IPv4 address validation code
2021-04-14 13:59:52 -07:00
DL6ER
74948ae5c1 The correct port separator is '#' not ':' in dnsmasq style. This should not have been changed in #4083 in the first place.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-04-14 22:53:12 +02:00
Dan Schaper
9b57f7fa33 Merge pull request #4120 from pi-hole/fix/splashPage
Add missing closing single quote
2021-04-14 13:50:45 -07:00
Dan Schaper
866045968d Add missing closing single quote
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-04-14 12:27:36 -07:00
Dan Schaper
f2e0cf8a92 Merge pull request #4117 from pi-hole/master
v5.8 master to dev
2021-04-14 12:24:08 -07:00
Adam Warner
4c39edbeb9 Merge pull request #4113 from pi-hole/release/v5.3
Pi-hole Core v5.3
2021-04-14 19:04:03 +01:00
Adam Warner
b388ac5bb5 Merge pull request from GHSA-3597-244c-wrpj
Add some validation to passed arguments before running the values through `sed`
2021-04-14 18:16:46 +01:00
Adam Warner
7855859726 Merge pull request #4116 from pi-hole/fix/update-readme
Update README
2021-04-14 17:57:47 +01:00
DL6ER
5df7ed2f32 Obtain FTL's PID from the PID file (#4103)
* Try to obtain FTL's PID from the PID file. If this fails, try to identify the main process using pgrep --oldest (instead of relying on pkill finding the right one by itself). This allows the script to work in even when FTL is running inside the memory checker valgrind.

* Rename FTL_PID -> FTL_PID_FILE

* Remove the pgrep fallback after discussions about that it should be more obvious to users if something strange happened to their PID file. Also, simplify the routine using a bashism in the end.

* Shorten if [[ regex ]]

* Use unset instead of emptying the PID variable

Signed-off-by: DL6ER <dl6er@dl6er.de>

Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-04-14 09:33:10 -07:00
Dan Schaper
25ded79190 Update README 2021-04-14 09:26:52 -07:00
Adam Warner
d3e00f038b Merge pull request #4004 from pi-hole/fedora_33_support
Fedora 33 Support
2021-04-13 08:41:56 +01:00
bcambl
d5f13018a7 Merge branch 'release/v5.3' into fedora_33_support
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2021-04-12 20:06:11 -06:00
Adam Warner
c6e3805bbb Merge pull request #4083 from jbzdarkid/patch-2
Improve regexes for IPv4 matching
2021-04-12 21:12:20 +01:00
Adam Warner
ea451e3c22 Merge pull request #4095 from jbaez/ft-3896
Fix error trying to access undefined variables on splash page.
2021-04-12 20:41:25 +01:00
DL6ER
b97f890a8c Merge pull request #4086 from pi-hole/fix/GRAVITDB_in_pihole-g
pihole -g should respose GRAVITYDB in pihole-FTL.conf
2021-04-11 05:18:09 +02:00
Jaime Baez
6198165df8 Fix error trying to access undefined variables on splash page.
Signed-off-by: Jaime Baez <j.baezcastillo@gmail.com>
2021-03-26 23:42:11 +01:00
jbzdarkid
8090071eff Update regex to disallow leading zeros
Also updated a comment to point to a non-experimental RFC.

Signed-off-by: jbzdarkid <jbzdarkid@gmail.com>
2021-03-21 16:27:08 -07:00
Joseph Blackman
89c80947df Improve regexes for ipv4 matching
Signed-off-by: jbzdarkid <jbzdarkid@gmail.com>
2021-03-21 16:24:35 -07:00
Adam Warner
b51751e892 Merge pull request #4084 from jbzdarkid/patch-1
Improve comments in basic-install.sh
2021-03-21 23:14:59 +00:00
Adam Warner
45d4ab4c22 Add some validation to passed arguments before running the values through sed
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2021-03-19 18:39:43 +00:00
DL6ER
f536718aaa Use possibly custom gravity.db location in the copying SQL script
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-03-18 16:46:59 +01:00
DL6ER
f1740da9ff Update gravity path in query.sh
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-03-18 09:58:19 +01:00
DL6ER
9bdbe88a66 Update gravity path in list.sh
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-03-18 09:58:19 +01:00
DL6ER
d25240fe9f pihole -g should respose GRAVITYDB in pihole-FTL.conf
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-03-18 09:00:27 +01:00
jbzdarkid
20b6f9cceb Improve comments in basic-install.sh
Signed-off-by: jbzdarkid <jbzdarkid@gmail.com>
2021-03-17 18:37:18 -07:00
Dan Schaper
f27fd9f899 Merge pull request #3982 from andras-tim/list-fix-same-wildcard-regex
Fix list: User same wildcard regex that the UI use
2021-03-17 11:20:12 -07:00
Dany
13cf0c1288 Aligned pihole logo to center, Fixed responsive issue (#4036)
* Aligned pihole logo to center, Fixed responsive issue

* removed duplicate instance of #splashpage

Signed-off-by: Dany Gauthier <danygauthier57@yahoo.ca>
2021-03-17 11:18:50 -07:00
Adam Warner
ae762574e5 Merge pull request #4070 from pi-hole/fix/pihole-g-r
Fix `pihole -g -r`
2021-03-03 14:43:42 +00:00
DL6ER
126b9ae381 Add missing three new columns to pihole -g -r
Signed-off-by: DL6ER <dl6er@dl6er.de>
2021-03-02 20:08:09 +01:00
DL6ER
57fe3b6621 Merge pull request #3951 from pi-hole/new/gravity_adlist_infos
Store gravity details in gravity.db adlist table
2021-02-28 17:01:19 +01:00
Adam Warner
56fa9714b5 Merge pull request #4010 from mtzfederico/master
Updates lighttpd config to allow a persistent port change on IPv6
2021-02-28 14:42:21 +00:00
Dan Schaper
03a8ca5c1b Merge pull request #4049 from yubiuser/tewak/teleporter_cli
Add hostname to teleporter backup file if called from cli
2021-02-16 08:02:49 -08:00
Christian König
78027bd2bf Add default noname if hostname is empty
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-02-12 20:25:01 +01:00
Christian König
7dc7cbb80e Add hostname to teleporter backup file if called from cli
Signed-off-by: Christian König <ckoenig@posteo.de>
2021-02-11 19:45:32 +01:00
Dan Schaper
debc9a69c5 Merge pull request #4021 from Flashbang007/patch-3
Fix issue with multipe default gateways when running the debug
2021-01-27 08:45:22 -08:00
Alexander Schmitz
1ab193fa9d Update piholeDebug.sh
Signed-off-by: Alexander Schmitz <Flashbang007@gmail.com>
2021-01-27 11:00:43 +01:00
Adam Warner
9ec012289f Merge pull request #4017 from mwoolweaver/patch-2
fix suspected typo in comment
2021-01-26 08:48:05 +00:00
Michael Woolweaver
c42b97ddb2 fix typo in comment
Signed-off-by: Michael Woolweaver <m.woolweaver@icloud.com>
2021-01-26 01:04:37 -06:00
mtzfederico
e5bfafefb9 Moved where external.conf is included
Signed-off-by: mtzfederico <fm@mtzfederico.com>
2021-01-22 15:53:40 -06:00
bcambl
b62495d89e update tests to fedora 33
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2021-01-21 20:20:07 -06:00
bcambl
c6810a0124 touch sysconfig network script when absent
sysconfig network scripts are missing on pure NetworkManager installs.
This commit touches a placeholder to allow the network configuration to
be generated and loaded via NetworkManager.

Signed-off-by: bcambl <blayne@blaynecampbell.com>
2021-01-19 23:06:39 -06:00
Adam Warner
8e7670db41 Merge pull request #4002 from freddii/master
fixed typos
2021-01-19 18:46:55 +00:00
freddii
7c0c30fb0b fixed typos 2021-01-19 19:33:38 +01:00
Adam Warner
cbfb58f7a2 Merge pull request #4000 from pi-hole/release/v5.2.4
Pi-hole Core v5.2.4
2021-01-19 12:29:01 +00:00
Adam Warner
0c45d23c22 Merge pull request #3997 from pi-hole/revert-3537-patch-2
Revert "Further failsafe check for available APT packages"
2021-01-19 08:19:46 +00:00
Dan Schaper
3f8fedfb16 Revert "Further failsafe check for available APT packages" 2021-01-17 11:10:24 -08:00
Adam Warner
cbc3fbdfe6 Merge pull request #3989 from pi-hole/release/v5.2.3
Pi-hole Core v5.2.3
2021-01-15 19:45:55 +00:00
Dan Schaper
020b6b8064 Merge pull request #3987 from pi-hole/fix/GitHubAPI
Use the 'Location:' header only for latest FTL tag API check.
2021-01-13 09:38:09 -08:00
Dan Schaper
523f650157 Use the 'Location:' header only.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2021-01-12 13:42:51 -08:00
Andras Tim
bfee230c79 scripts/list: User same wildcard regex that the UI use
The CLI and the UI should do the same to be able to add/remove the same
records via any supported interface.

Signed-off-by: Andras Tim <andras.tim@gmail.com>
2021-01-11 17:05:17 +01:00
DL6ER
c5ed8f8bed Merge pull request #3537 from MichaIng/patch-2
Further failsafe check for available APT packages
2021-01-07 11:56:52 +01:00
Dan Schaper
66dfa5fc1e Merge pull request #3958 from pi-hole/Fix/centos_stream
Fix release check for centos stream
2021-01-06 10:59:27 -08:00
DL6ER
1791fe22f6 Merge pull request #3912 from mdujava/basic_auth
Fix validation of adlist url
2020-12-31 12:19:32 +01:00
bcambl
a5422dbdf6 fix release check for centos stream
fixes #3947 #3953

Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-12-30 19:45:51 -06:00
DL6ER
a2625df5e2 Remove "The list is new" comment because it is superfluous
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-30 11:27:34 +01:00
DL6ER
7507d533ac Merge pull request #3954 from pi-hole/fix/chronometer_connection_reset
Fix connection mechanism between Chronometer and FTL
2020-12-30 11:13:05 +01:00
DL6ER
0944807491 Actually store correct number of domains for the individual lists (and not the sum of the so far collected number of domains)
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-29 20:36:49 +01:00
DL6ER
a216848c1d Only update time of last list change when we see a list for the first time or when it really changed content
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-29 20:28:09 +01:00
DL6ER
e033ee6664 Fix connection mechanism between Chronometer and FTL
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-29 10:29:02 +01:00
DL6ER
8c56f54a1e Compare checksum of downloaded list against older checksums to see if the list content changed since the last download
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-29 09:54:25 +01:00
DL6ER
6b33b8b4c0 Store status of downloaded list (downloaded, using cache, some error, ...) and number of (in-)valid domains on this list in the gravity database. This updates the gravity databaes to version 14.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-28 08:08:49 +01:00
DL6ER
ae1a59285d Merge pull request #3943 from yubiuser/fix/whiptail
Change wording in whiptail for adlist selection
2020-12-25 09:05:49 +01:00
Christian König
0d710fc9e3 Change wording in whiptail for adlist selection
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-12-24 21:19:14 +01:00
Adam Warner
eb86a5e3b0 Merge pull request #3937 from yubiuser/remove_malwaredomains
Remove deprecated malwaredomains list
2020-12-24 15:24:48 +00:00
DL6ER
667e938954 Merge pull request #3942 from pi-hole/master
Sync dev with master
2020-12-24 13:33:57 +01:00
Adam Warner
41bdb741b7 Merge pull request #3941 from pi-hole/release/v5.2.2
Pi-hole Core v5.2.2
2020-12-24 11:07:36 +00:00
DL6ER
a139af8184 Merge pull request #3940 from pi-hole/fix/i386-arch
Add fallback for arch detection on i386/x86_64
2020-12-24 08:38:53 +01:00
Dan Schaper
60fa93ab47 Add fallback for arch detection on i386/x86_64
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-12-23 14:59:28 -08:00
Christian König
b4102547ac Remove deprecated malwaredomains list
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-12-21 13:11:59 +01:00
Matej Dujava
ef0bdf6470 Fix validation of adlist url
Already existing regex validation will be used on url after removing @ (in case
its in separating userinfo and host).

Signed-off-by: Matej Dujava <mdujava@kocurkovo.cz>
Fixes: https://github.com/pi-hole/pi-hole/issues/3911
Fixes: 7d19ee1b: validate blocklist URL before adding to the database (#3237)
2020-12-21 12:50:02 +01:00
Adam Warner
87cf9add8c Merge pull request #3934 from mwoolweaver/patch-1
Fix typo found by #3933
2020-12-20 15:31:02 +00:00
Michael Woolweaver
3a05ac27a2 Fix typo found by #3933
Signed-off-by: Michael Woolweaver <m.woolweaver@icloud.com>
2020-12-19 17:37:17 -06:00
MichaIng
eb5661b553 Further failsafe check for available APT packages
- "apt-cache show package" succeeds as well if package is listed as (optional) dependency or conflict by another package, hence is not a 100% reliable measure.
- There is no command which explicitly checks which package/name can be selected by apt-get for install. An install simulation/dry-run is possible as it was before Pi-hole v5.1, or the whole package cache can be scraped, which is still the less time consuming solution.
- Allow to succeed if another package "provides" it, like "php7.3-apcu" provided by "php-apcu" or "awk" provided by "mawk" and "gawk", in which case the non-virtual package is selected automatically by apt-get.

For reference: 066b89fa41

Signed-off-by: MichaIng <micha@dietpi.com>
2020-12-18 23:20:24 +01:00
DL6ER
41479524f8 Merge pull request #3900 from ganto/fix/chrono-non-lte
Fix chronometer output if web interface is not installed
2020-12-12 10:08:05 +01:00
Adam Warner
357b6702ec Update advanced/Scripts/chronometer.sh
Co-authored-by: DL6ER <DL6ER@users.noreply.github.com>
2020-12-11 12:30:52 +00:00
DL6ER
dfe64d9f51 Merge pull request #3909 from onegreydot/fix/gravity_date_updated
Adding comma to the adlist table format
2020-12-10 23:02:22 +01:00
DL6ER
78cdd34992 Merge pull request #3904 from ganto/fix/debug-non-web-2
piholeDebug: Diagnose output if (Web) git directory is not found
2020-12-10 23:00:45 +01:00
DL6ER
16fb914855 Merge pull request #3902 from ganto/fix/debug-non-web
piholeDebug: Fix warning if lighttpd/php are not installed
2020-12-10 23:00:02 +01:00
Reto Gantenbein
20faa1bd1c Update pihole-FTL man-pages (#3883)
Extend latest options and adjust ordering to Web documentation

Ensure that all configuration options currently recognized by FTL 5.3.1
are properly documented in the man page of the configuration file.

Signed-off-by: Reto Gantenbein <reto.gantenbein@linuxmonk.ch>
2020-12-10 22:58:07 +01:00
user
922f795fe6 Adding comma to the adlist table format
To account for the Date Updated column in the adlist table adding a comma to the adlist to be imported into the database. This was causing intermittent failures on updates and therefore no domains would be blocked.

Signed-off-by: user <user@fedbrew.home>

 Date:      Sun Dec 6 06:03:30 2020 -0500
 Committer: user <user@fedbrew.home>

 On branch fix/gravity_date_updated
 Your branch and 'origin/fix/gravity_date_updated' have diverged,
 and have 1 and 1 different commits each, respectively.
   (use "git pull" to merge the remote branch into yours)

 Changes to be committed:
	modified:   gravity.sh

Signed-off-by: user <user@fedbrew.home>
2020-12-06 06:08:30 -05:00
Reto Gantenbein
9dc539c98b piholeDebug: More detailed diagnostics if Web interface is not found
Signed-off-by: Reto Gantenbein <reto.gantenbein@linuxmonk.ch>
2020-12-05 18:46:11 +01:00
Reto Gantenbein
18e4eb460c piholeDebug: Fix version check if lighttpd/php are not installed
Signed-off-by: Reto Gantenbein <reto.gantenbein@linuxmonk.ch>
2020-12-05 14:11:53 +01:00
Reto Gantenbein
e841347057 Fix chronometer output if web interface is not installed
Signed-off-by: Reto Gantenbein <reto.gantenbein@linuxmonk.ch>
2020-12-05 02:55:55 +01:00
DL6ER
6deac6dfce Merge pull request #3894 from pi-hole/master
Update development from Core v5.2.1 release
2020-12-02 23:10:43 +01:00
Adam Warner
0d8ece1be2 Merge pull request #3889 from pi-hole/release/v5.2.1
Pi-hole Core release v5.2.1
2020-12-02 21:37:42 +00:00
Adam Warner
8443262214 Merge pull request #3890 from ganto/fix/x86-64-arch
Ensure x86_64 processor architecture is listed as supported
2020-12-02 21:12:18 +00:00
Dan Schaper
6993a24224 Merge pull request #3888 from pi-hole/new/github-actions-test
Migrate from Travis to Github Actions
2020-12-02 13:06:36 -08:00
Adam Warner
d59eab9a6e Merge pull request #3893 from pi-hole/tweak/dontdelete
Exit installer if directory already exists when trying to clone one of our repos into it
2020-12-02 20:51:16 +00:00
Adam Warner
e47eb30a6e Update automated install/basic-install.sh
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-12-02 20:49:07 +00:00
Adam Warner
641951b3a0 add some meaningful outputSigned-off-by: Adam Warner <me@adamwarner.co.uk> 2020-12-02 20:40:51 +00:00
DL6ER
db231ded91 Merge pull request #3892 from pi-hole/fix/debug_strip_comments
Fix debugger stripping content it shouldn't
2020-12-02 21:23:26 +01:00
Adam Warner
61f13a334d Don't delete an existing directory and clone our repo in its place. TODO: Something more robust
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-12-02 20:19:59 +00:00
DL6ER
36937b1913 Strip such lines starting with a #. Do not silently truncate lines if they have a # somewhere in between (like server=127.0.0.1#5353)
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-02 20:52:39 +01:00
Reto Gantenbein
d0af1a950b Ensure x86_64 processor architecture is listed as supported
Signed-off-by: Reto Gantenbein <reto.gantenbein@linuxmonk.ch>
2020-12-02 20:44:11 +01:00
DL6ER
a217c75134 Merge pull request #3882 from pi-hole/tweak/conditional_transforms
Fix processing of CONDITIONAL_FORWARDING_REVERSE
2020-12-01 18:46:54 +01:00
Adam Warner
454c9a411c Update advanced/Scripts/webpage.sh
Signed-off-by: Adam Warner <me@adamwarner.co.uk>

Co-authored-by: DL6ER <DL6ER@users.noreply.github.com>
2020-12-01 17:27:36 +00:00
Adam Warner
f44b2f6aa3 Update advanced/Scripts/webpage.sh
Signed-off-by: Adam Warner <me@adamwarner.co.uk>

Co-authored-by: DL6ER <DL6ER@users.noreply.github.com>
2020-12-01 17:27:21 +00:00
Adam Warner
d1539335bc appease stickler-ci
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-12-01 10:13:36 +00:00
Adam Warner
44d020a54c Appease codefactor.io
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-12-01 10:09:16 +00:00
Adam Warner
3e73782f0e Remove Travis CI config
Create Github Actions config
Split tox ini into one per supported distro so they can be run seperately

Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-12-01 10:02:31 +00:00
Adam Warner
13cb0c1785 Merge pull request #3887 from pi-hole/fix/non-FQDN-checkbox
Fix "Never forward non-FQDNs" checkbox
2020-12-01 09:43:13 +00:00
DL6ER
49810262db When there is a Pi-hole domain set and "Never forward non-FQDNs" is ticked, we add to tell FTL that this domain is purely local and FTL may answer queries from /etc/hosts or DHCP but should never forward queries on that domain to any upstream servers
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-12-01 09:16:50 +01:00
Adam Warner
58bc98ca44 Update advanced/Scripts/webpage.sh
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-30 22:30:59 +00:00
Adam Warner
4093959d3e Appease stickler
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-30 21:55:07 +00:00
Adam Warner
06c5fe2a89 Set REV_SERVER_CIDR in the else condition if it is not in-addr.arpa
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-30 21:29:54 +00:00
Adam Warner
6cb8f3f403 Add some comments
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-30 21:18:25 +00:00
Adam Warner
e004d27b28 Fix processing of CONDITIONAL_FORWARDING_REVERSE
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-30 18:58:23 +00:00
DL6ER
e432fae956 Merge pull request #3877 from yubiuser/fix/lsof
Add lsof to dependencies for non Debian OS
2020-11-30 11:39:27 +01:00
Christian König
0ecb8bf5e9 Add lsof to dependencies for non Debian OS
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-29 21:05:40 +01:00
DL6ER
2c689e8642 Merge pull request #3875 from pi-hole/master
Merge Pi-hole Core v5.2 tag into development
2020-11-29 17:29:06 +01:00
Adam Warner
c2fb907490 Merge pull request #3874 from pi-hole/fix/PIHOLE_DNS_truncation
Don't delete entries including and greater than `PIHOLE_DNS_10` on update/repair
2020-11-29 15:56:30 +00:00
Adam Warner
a8e97257d7 Ensure entries of PIHOLE_DNS_10 and above are not deleted when removing PIHOLE_DNS_1 and PIHOLE_DNS_2
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-29 15:08:46 +00:00
Adam Warner
fee1b8b736 Merge pull request #3867 from pi-hole/release/v5.2
Pi-hole Core v5.2
2020-11-28 19:05:01 +00:00
Adam Warner
f13e0dacde Merge pull request #3866 from pi-hole/revert-3810-patch-5
Revert "Enable DNS forwarding loop detection"
2020-11-28 17:36:44 +00:00
DL6ER
0711f4d63a Revert "Enable DNS forwarding loop detection" 2020-11-28 18:29:32 +01:00
Adam Warner
d2e9a20d96 Merge pull request #3859 from yubiuser/tweak/debug_pihole-FTL_status
Add systemctl status --full --no-pager pihole-FTL.service to the debug log
2020-11-28 16:58:23 +00:00
Adam Warner
40ae29f5bf Merge pull request #3862 from pi-hole/tweak/debugger_message
Include the raw messages from the Pi-hole diagnosis systems in debug logs
2020-11-28 16:51:03 +00:00
Dan Schaper
31909098f8 Merge pull request #3863 from yubiuser/tweak/OpenDNS_decription
Add DNSSEC info to OpenDNS description
2020-11-24 12:42:39 -08:00
Christian König
065e5cb1fe Add DNSSEC to OpenDNS description
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-24 21:02:53 +01:00
DL6ER
d4c33e5188 Include the raw messages from the Pi-hole diagnosis systems in debug logs
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-11-24 16:06:45 +01:00
Christian König
70c48afc04 Add else statement
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-24 06:02:18 +01:00
Christian König
ec5183b553 Rename function
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-24 05:57:13 +01:00
Christian König
50316ee617 Add systemctl status --full --no-pager pihole-FTL.service to the debug log
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-23 21:09:35 +01:00
Adam Warner
c4c8e1e5e1 Merge pull request #3854 from pi-hole/tweak/buildContainersTests
Nothing to see here. I just forgot a page.
2020-11-19 11:08:30 +00:00
Adam Warner
2a82e1fec1 Nothing to see here. I just forgot a page.
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-18 23:29:08 +00:00
Adam Warner
be7bfb2cb4 Merge pull request #3851 from pi-hole/tullo-x86/fix/quad9-missing-upstream
Include secondary upstream DNS for Quad9+Filter+ECS
2020-11-18 23:24:12 +00:00
Adam Warner
8bdcb8ff0d Merge pull request #3849 from pi-hole/tweak/testOsNames
-remove duplicate OS dockerfiles
2020-11-18 22:54:39 +00:00
Adam Warner
541b53229c Include secondary upstream DNS for Quad9+Filter+ECS
Co-authored-by: Daniel Tulleman <github@be-lumino.us>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-18 22:06:03 +00:00
Adam Warner
1c2c10c4a5 Merge pull request #3761 from BastiG/development
read REV_SERVER_CIDR from environment
2020-11-18 21:56:08 +00:00
Adam Warner
e03585e0bb Merge pull request #3810 from deHakkelaar/patch-5
Enable DNS forwarding loop detection
2020-11-18 21:54:30 +00:00
Adam Warner
03b15dae35 Merge pull request #3848 from chubchubsancho/fix/unattended_install
Fix/unattended install
2020-11-18 21:51:44 +00:00
Adam Warner
c64b96e2a8 Merge pull request #3847 from pi-hole/fix/nuke
Add some output to the --nuke command
2020-11-17 09:26:26 +00:00
Adam Warner
cd8120d33f Add some output to the --nuke command
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-16 23:31:35 +00:00
Adam Warner
809e4bdb1d Set max line length for flake8 to be an (arbitary) 120 chars
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-16 23:06:02 +00:00
Adam Warner
f7982dfbe1 -remove duplicate OS dockerfiles
+rename centos->centos_8, centos7 -> centos_7
+update centos/fedora test script

Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-11-16 22:39:50 +00:00
Grégory Sanchez
e26472756f Merge branch 'development' into fix/unattended_install 2020-11-16 23:33:07 +01:00
Grégory Sanchez
6826d9f316 fix(basic-install): unattended install should finish without interaction
Fixes: https://github.com/pi-hole/pi-hole/issues/3617

Signed-off-by: Grégory Sanchez <gregory.sanchez@icloud.com>
2020-11-16 23:15:02 +01:00
Adam Warner
bd982c6f94 Merge pull request #3818 from pvogt09/feature/test_all_supported
Add test cases for all supported OS
2020-11-15 20:50:26 +00:00
Adam Warner
bd6ca0ad62 Merge pull request #3825 from yubiuser/tweak/cross
Change icon from cross to [i] for root user check
2020-11-15 20:42:05 +00:00
Adam Warner
be03f29a9e Merge pull request #3827 from hvnsweeting/development
Re-run the script as root instead of piping to bash
2020-11-15 20:39:25 +00:00
Adam Warner
354c6aab8f Merge pull request #3828 from hvnsweeting/fix-dco-link
Fix dco link
2020-11-15 20:38:02 +00:00
Adam Warner
a7c6eaca5f Merge pull request #3843 from yubiuser/tweak/debug_decscription
Be more specific about what pihole -d -a does
2020-11-15 20:15:21 +00:00
Christian König
e7d937c412 Be more specific what pihole -d -a does
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-11-15 20:31:47 +01:00
pvogt09
b375dd2c81 Update test/ubuntu_20.Dockerfile
Co-authored-by: Adam Warner <github@adamwarner.co.uk>
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-11-15 20:13:43 +01:00
Adam Warner
4abd8196ae Merge pull request #3349 from Forceflow/development
Fix for pihole -w --nuke displaying help info even if command is exec…
2020-11-08 16:10:47 +00:00
Viet Hung Nguyen
ae4e41eaaa Re-run the script as root instead of piping to bash
Signed-off-by: Viet Hung Nguyen <hvn@familug.org>
2020-10-30 23:53:31 +07:00
Viet Hung Nguyen
5d2be124a2 Replace the wiki link which now points to this file - a loop
Signed-off-by: Viet Hung Nguyen <hvn@familug.org>
2020-10-30 23:13:14 +07:00
Adam Warner
89d94ac3d1 Merge pull request #3819 from craigmayhew/landing-page-security
Fixed potential security issue with $landPage receiving variables
2020-10-30 11:44:07 +00:00
Christian König
0ae020ef82 Change icon from cross to [i]# for root user check
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-10-29 20:37:08 +01:00
Craig Mayhew
95a28ae125 unset() now also occurs for $splashPage
After some email discussion with Adam, there is a preference to also prevent $splashPage from using variables

Signed-off-by: craigmayhew <craig@mayhew.io>
2020-10-28 18:32:46 +00:00
Craig Mayhew
e5c7549f8f Fixed potential security issue with $landPage receiving variables
Signed-off-by: craigmayhew <craig@mayhew.io>
2020-10-27 14:49:46 +00:00
pvogt09
4386cc4f22 Revert "add test case for installation of dependencies for installer, core and web"
This reverts commit 60a4814ac1.

Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 12:44:57 +01:00
pvogt09
cb49ce38f5 fix stickler errors
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 12:32:23 +01:00
pvogt09
3128d14d1f update images to versions supported by pi-hole 5
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 12:02:57 +01:00
pvogt09
bef9cd3bc2 mock whiptail to add universe repo
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 11:35:49 +01:00
pvogt09
60a4814ac1 add test case for installation of dependencies for installer, core and web
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 11:35:48 +01:00
pvogt09
fec1595183 add docker containers for debian 9 and 10, ubuntu 16 and 18, fedora 28 and 29
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-27 11:34:27 +01:00
Adam Warner
3e79e0b1ab Merge pull request #3625 from pi-hole/new/tests
Update Test suite
2020-10-26 21:32:48 +00:00
Adam Warner
c80f0766c5 drop debian/fedora container versions to lowest supported
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-26 17:56:17 +00:00
Adam Warner
fb454ebe14 fix stickler complaints
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-23 23:09:07 +01:00
Adam Warner
ee556088b5 Fake OS details in /etc/os-release and confirm install fails
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-23 23:05:41 +01:00
bcambl
660c17814d E128 continuation line under-indented for visual indent
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-10-23 22:20:37 +01:00
bcambl
a7c58e7112 E302 expected 2 blank lines, found 1
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-10-23 22:20:36 +01:00
bcambl
05b6717187 test PHP optin/optout separately for CentOS 7 & 8
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-10-23 22:20:36 +01:00
bcambl
2c461460db test with both centos7 and centos8 images
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-10-23 22:20:36 +01:00
Adam Warner
5aab68ab41 Update test/test_automated_install.py
Co-authored-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-10-23 22:20:36 +01:00
Adam Warner
5648ad6b61 [Experiment] up python to 3.7
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-23 22:20:36 +01:00
Adam Warner
c9edcfa335 add test to check "os_check" works
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-23 22:18:42 +01:00
Adam Warner
33e5735053 Change base images for test containers to latest supported version
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-23 22:18:42 +01:00
deHakkelaar
ad39ba30bd Enable DNS forwarding loop detection
Found below by accident:
```
pi@ph5:~ $ man dnsmasq
[..]
       --dns-loop-detect
              Enable code to detect DNS forwarding loops; ie the  situa‐
              tion  where  a  query  sent  to one of the upstream server
              eventually returns as a new query to the dnsmasq instance.
              The  process  works  by generating TXT queries of the form
              <hex>.test and sending them to each upstream  server.  The
              hex is a UID which encodes the instance of dnsmasq sending
              the query and the upstream server to which it was sent. If
              the  query  returns  to the server which sent it, then the
              upstream server through which it was sent is disabled  and
              this  event  is  logged.  Each  time  the  set of upstream
              servers changes, the test is re-run on all  of  them,  in‐
              cluding ones which were previously disabled.
```
Seems to work just fine if I point my router 10.0.0.1 back to Pi-hole in the WAN DNS settings:
```
pi@ph5:~ $ grep server= -R /etc/dnsmasq.*
/etc/dnsmasq.d/01-pihole.conf:server=9.9.9.10
/etc/dnsmasq.d/01-pihole.conf:server=149.112.112.10
/etc/dnsmasq.d/01-pihole.conf:server=10.0.0.1
/etc/dnsmasq.d/01-pihole.conf:rev-server=10.0.0.0/24,10.0.0.2
/etc/dnsmasq.d/01-pihole.conf:server=/dehakkelaar.nl/10.0.0.2
/etc/dnsmasq.d/01-pihole.conf:server=/use-application-dns.net/
```
```
pi@ph5:~ $ sudo tee /etc/dnsmasq.d/99-my-settings.conf <<< $'dns-loop-detect'
dns-loop-detect
```
```
pi@ph5:~ $ pihole restartdns
  [✓] Restarting DNS server
```
```
pi@ph5:~ $ tail -F /var/log/pihole.log
[..]
Oct 22 18:17:41 dnsmasq[17301]: using nameserver 10.0.0.2#53 for domain dehakkelaar.nl
Oct 22 18:17:41 dnsmasq[17301]: using nameserver 10.0.0.2#53 for domain 0.0.10.in-addr.arpa
Oct 22 18:17:41 dnsmasq[17301]: NOT using nameserver 10.0.0.1#53 - query loop detected
Oct 22 18:17:41 dnsmasq[17301]: using nameserver 149.112.112.10#53
Oct 22 18:17:41 dnsmasq[17301]: using nameserver 9.9.9.10#53
```
2020-10-22 18:54:04 +02:00
DL6ER
50100017a5 Merge pull request #3794 from pi-hole/security/non_FQDNs_locality
Security enhancement for the "never forward non-FQDNs" feature
2020-10-21 21:09:05 +02:00
Adam Warner
de02bcc8a0 Merge pull request #3787 from pi-hole/verdantfire
fixed small grammatical error
2020-10-19 10:53:41 +01:00
DL6ER
83f2e2d85a Merge pull request #3801 from pi-hole/new/armv4_armv5_armv8
Add native ARMv4T, ARMv5TE and ARMv8-A support
2020-10-18 19:53:56 +02:00
DL6ER
01c9bbd3ca Improve processor detection to use the new dedicated ARMv4T, ARMv5TE and ARMv8-A binaries we provide for FTL.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-10-14 20:31:22 +02:00
DL6ER
e93d7ad8ff Merge pull request #3803 from pi-hole/privacylevel
Remove references to privacy level 4 (no longer functional)
2020-10-14 14:05:20 +09:00
Adam Warner
59b0a6af6f Remove references to privacy level 4 (no longer functional)
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-13 23:53:23 +01:00
Dan Schaper
326168509c Merge pull request #3798 from bcambl/debug_firewalld
add FirewallD configuration checks to debug script
2020-10-12 12:37:20 -07:00
bcambl
47aa1644a8 add debug checking for firewalld
Signed-off-by: bcambl <blayne@blaynecampbell.com>
2020-10-11 22:20:31 -06:00
DL6ER
08a84e51d6 Only add local=/<domain>/ when the "only forward FQDN queries" function is enabled to prevent unintended side-effects of this change
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-10-10 11:23:55 +02:00
DL6ER
d631cd8b04 Security enhancement for the "never forward non-FQDNs" feature. This should prevent all local queries from being forwarded (will show up as blocked by regex) as well as any hostname without a domain (for example one word searches from the address bar in browsers). This fixes #3303
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-10-10 11:01:01 +02:00
Adam Warner
0445559610 Accidentally a number (#3788)
Co-authored-by: MichaIng <micha@dietpi.com>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>

Co-authored-by: MichaIng <micha@dietpi.com>
2020-10-09 17:24:42 +02:00
MichaIng
615b19c3d6 web server question enhancements (#3225)
+ Do not ask to install the web server, if the web interface has been deselected before.
+ Add additional info, that PHP modules need to be installed manually, when web server is deselected and the web server user needs to be member of the "pihole" group.
+ Consequently use webroot variable instead of /var/www/html

Signed-off-by: MichaIng <micha@dietpi.com>
2020-10-09 16:12:21 +02:00
Adam Warner
948337dd8e Merge pull request #3740 from pi-hole/new/adlist_date_updated
Add date_updated field to adlist table
2020-10-09 14:04:13 +01:00
Adam Warner
fe463f15b3 Merge pull request #3741 from pi-hole/new/debug_scan_dhcp
Discover active DHCP servers during debugger run
2020-10-09 14:00:57 +01:00
Adam Warner
716e981a79 Merge pull request #3776 from yubiuser/tweak/Debug
Print tail of logs in /var/log/lighttpd in debug run as well
2020-10-09 13:50:46 +01:00
verdantfire
b88efd2527 fixed small grammatical error
Co-authored-by: Himanshu Ruhela <himanshuruhela013@gmail.com>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-10-09 13:46:25 +01:00
Christian König
568ebd67ca Update comment
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-10-03 16:17:37 +02:00
Christian König
c628c970ae Print tail of logs in /var/log/lighttpd in debug run as well
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-10-02 21:04:27 +02:00
Adam Warner
fa0815fb1d Merge pull request #3763 from yubiuser/cleanup
Remove traces of previous default adlists
2020-09-28 08:53:08 +01:00
Christian König
e9796d5671 Remove traces of previous default adlists
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-09-28 06:15:46 +02:00
Sebastian Gmeiner
8041bbf443 read REV_SERVER_CIDR from environment
Signed-off-by: Sebastian Gmeiner <sebastian@gmeiners.net>
2020-09-25 15:26:43 +02:00
Adam Warner
d6c4f0696f Merge pull request #3698 from yubiuser/remove/FreeSpaceCheck
Remove check for free disk space and associated variables
2020-09-21 08:47:41 +01:00
DirkJanIT
b88510d89a Add CACHE_SIZE to setupVars (#3170)
* Update 01-pihole.conf

Signed-off-by: DoubleOhmSeven <57564379+DoubleOhmSeven@users.noreply.github.com>

* Update basic-install.sh

Signed-off-by: DoubleOhmSeven <57564379+DoubleOhmSeven@users.noreply.github.com>

Co-authored-by: DoubleOhmSeven <57564379+DoubleOhmSeven@users.noreply.github.com>
2020-09-17 23:13:40 +02:00
Blayne Campbell
4d98e156b6 Merge pull request #3607 from cgzones/selinux
basic-install: document how to continue after SELinux check
2020-09-16 23:54:05 -06:00
DL6ER
5db45aed8b Merge pull request #3178 from jlagermann/wormhole
added instructions for forking and rebase
2020-09-08 22:58:43 +02:00
Dan Schaper
b865fa7c0a Merge pull request #3739 from pi-hole/tweak/remove_gravity_optimization
Remove extra gravity optimization flag
2020-09-07 14:23:54 -07:00
DL6ER
41e899260f Discover active DHCP servers during debugger run
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-09-07 23:17:50 +02:00
DL6ER
12b9748c43 Fine-tune adlist:adte_modified trigger and don't default new date_updated column to now but use NULL instead
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-09-07 21:11:57 +02:00
DL6ER
4fd412d7c3 Add date_updated field in adlist table set when a list changes.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-09-07 20:59:23 +02:00
DL6ER
aa7c3b6852 Remove gravity optimization. Further investigations have shown that it is useless because the standard gravity run already produces an optimal database.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-09-07 20:50:11 +02:00
Adam Warner
17ed5398e6 Merge pull request #3737 from michi-zuri/patch-2
Update index.php
2020-09-06 13:00:01 +01:00
Michael Paul Killian
5eabf4255b Sign-off for DCO
Signed-off-by: Michael Paul Killian <spammyreset-github@gmail.com>
2020-09-06 13:53:03 +02:00
Michael Paul Killian
538827397c Update index.php
See #3736
2020-09-06 11:51:33 +02:00
DL6ER
b81cbaa088 Merge pull request #3702 from pi-hole/tweak/os_check_output
Display more meaningful exit message if `dig` command fails during os_check
2020-08-23 16:08:56 +02:00
Adam Warner
e02cf6fac5 further tweaks, plus a spelling mistake correction
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-08-23 14:50:04 +01:00
Adam Warner
b8cd238fa1 Update advanced/Scripts/piholeDebug.sh
Co-authored-by: DL6ER <DL6ER@users.noreply.github.com>
2020-08-23 14:35:02 +01:00
Adam Warner
8e219cb799 Make output more meaningful in case of dig failure.
Include dig return code and response in debug run

Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-08-23 10:48:15 +01:00
Christian König
65786ba5d6 Remove check for free disk space and associated variables
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-08-18 20:16:35 +02:00
Adam Warner
42f55f5202 Merge pull request #3688 from pi-hole/tweak/os-check
Tweaks to os_check() Redux
2020-08-17 17:31:58 +01:00
Adam Warner
725f02f442 Merge pull request #3673 from yubiuser/fix/double_check_adlist_not_selected
Revert "fix #3336 by creating adlist file even if no list was selecte…
2020-08-17 17:30:31 +01:00
Dan Schaper
ebdb68a47a display_warning fixes
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-08-15 10:54:31 -07:00
Dan Schaper
623ce1fe18 Tabs and debug.sh
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-08-14 14:37:58 -07:00
Dan Schaper
57e65dd5c0 Use fewer subshells and descriptive variables.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-08-14 11:42:54 -07:00
Adam Warner
bb1a6243d6 Merge pull request #3669 from pi-hole/release/v5.1.2
Release/v5.1.2 to development
2020-08-14 16:28:53 +01:00
Dan Schaper
ad9b981e8b Merge pull request #3678 from yubiuser/fix/brokenVideoLink
Removes broken youtube link
2020-08-11 15:06:49 -07:00
Christian König
5b1eaa7e38 Removes broken youtube link
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-08-11 22:35:33 +02:00
Christian König
5c72ff75d9 Revert "fix #3336 by creating adlist file even if no list was selected by user"
This reverts commit 3c6ea2612d.

Signed-off-by: Christian König <ckoenig@posteo.de>
2020-08-10 23:52:53 +02:00
Dan Schaper
cd4072fbf8 Merge pull request #3665 from scboucher/fix_Pi-hole_temp_unit_default_value
Change default value of temp_unit to 'C'
2020-08-09 17:10:11 -07:00
Adam Warner
6b536b7428 Merge pull request #3564 from pi-hole/release/v5.1.2
Pi-hole Core v5.1.2
2020-08-09 22:22:16 +01:00
Samuel Boucher
d4dd446ba3 Update advanced/Scripts/chronometer.sh
Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
Signed-off-by: Samuel Boucher <scboucher@users.noreply.github.com>
2020-08-09 17:12:20 -04:00
Samuel Boucher
8b4921405a Upercase the temp_unit
Signed-off-by: Samuel Boucher <scboucher@users.noreply.github.com>
2020-08-09 15:09:49 -04:00
DL6ER
492a0317b0 Merge pull request #3654 from pi-hole/fix/ipv6_localhost_validator
Allow IPv6 loopback address to be added
2020-08-04 22:21:35 +02:00
DL6ER
b5983a3fc1 Do not require first element to be a hex value at any costs. It may also be a : in the valid address ::1
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-08-04 22:11:32 +02:00
Adam Warner
4bef49e2eb Merge pull request #3646 from yubiuser/tweak/compression
Check for compression only once and print result
2020-08-03 22:20:37 +01:00
Christian König
27399a762a Check for compression onyl once and print result
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-08-03 22:46:14 +02:00
DL6ER
83ecaa0fc9 Merge pull request #3636 from pi-hole/meta/remove_templates
Remove respository templates.
2020-08-03 20:44:51 +02:00
DL6ER
79ff21a2fe Merge pull request #3641 from pi-hole/new/compressed_curl
Use compression (if available) when downloading the ad lists.
2020-08-02 19:21:16 +02:00
DL6ER
87da9084e6 Use compression (if available) when downloading the ad lists.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-08-02 16:21:58 +01:00
Dan Schaper
72df833b8e Merge pull request #3639 from nfriend/nfriend-fix-about-pi-hole-link
Update "About Pi-hole" link on "Website Blocked" page
2020-08-01 18:26:24 -07:00
Nathan Friend
5a48478196 Update "About Pi-hole" link
Signed-off-by: Nathan Friend <nathan@gitlab.com>
2020-08-01 20:00:49 -05:00
Dan Schaper
8fa9096508 Remove respository templates.
Use org templates instead.

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-08-01 01:34:38 -07:00
DL6ER
319b8eef75 Merge pull request #3527 from MichaIng/patch-1
Add default locations to PATH to assure that all basic commands are available
2020-07-31 18:14:45 +02:00
Aiden Mitchell
7c53b97004 Updating FAQ_HARDWARE_REQUIREMENTS and FAQ_HARDWARE_REQUIREMENTS_PORTS (#3632)
Signed-off-by: Aiden Mitchell <aiden@bcyouthcouncil.ca>

Co-authored-by: Adam Warner <me@adamwarner.co.uk>
2020-07-30 12:57:19 -07:00
Dan Schaper
18fc45c006 Merge pull request #3634 from pi-hole/new/move_travis
.travis.yml is now a stub.
2020-07-30 11:46:37 -07:00
Dan Schaper
fa574cfd08 Set non-master to point to latest.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-07-30 10:05:27 -07:00
Dan Schaper
932cdd3329 Use the .github repository.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-07-30 09:38:50 -07:00
Dan Schaper
dc2781d1f9 .travis.yml is now a stub.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-07-30 09:26:04 -07:00
Adam Warner
48820d181c Merge pull request #3620 from yubiuser/tweak/dig_supportedOS
Report and exit if dig supportedOS returns nothing
2020-07-30 17:00:01 +01:00
Christian Göttsche
51daeaa6ab basic-install: document how to continue after SELinux check
Signed-off-by: Christian Göttsche <cgzones@googlemail.com>
2020-07-30 14:50:42 +02:00
Dan Schaper
514dc013df Merge pull request #3597 from yubiuser/tweak/OS_detection
Adds OS and version to output if unsupported OS is detected
2020-07-28 07:42:41 -07:00
Dan Schaper
548ad6375d Merge pull request #3524 from pi-hole/fix/status_checking
Fix pihole status to not rely on a TCP port test
2020-07-28 07:24:34 -07:00
Christian König
6fc7dc28a2 Count elements of array instead
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-28 10:25:57 +02:00
Christian König
b207ceeab2 Report and exit if dig supportedOS returns nothing
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-28 09:51:31 +02:00
Christian König
8380112129 Resolve conflicts
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-28 09:40:45 +02:00
Dan Schaper
dffb58ae8f Merge pull request #3596 from pi-hole/tweak/wherecheck
Wrap entire function in the check for the ENVVAR, add `ns1.pi-hole.net` to `dig` check.
2020-07-27 10:01:14 -07:00
Adam Warner
0ff32c3629 Use ns1.pi-hole.net to resolve versions.pi-hole.net so that we do not see DNS cookie issues
Co-Authored-by: Dan Schaper <dan.schaper@pi-hole.net>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-27 17:44:22 +01:00
Dan Schaper
dfd331c5b7 Merge pull request #3608 from yubiuser/fix/customDNSfile
Create custom.list during install/update if it doesn't exist
2020-07-26 12:51:19 -07:00
Dan Schaper
0a81d687e8 Update automated install/basic-install.sh 2020-07-26 12:31:11 -07:00
Christian König
dfcdfd4b0a Remove empty line
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-26 12:27:55 +02:00
Christian König
ec9f490fcc Remove separate install function, move to installConfigs(), use pihole syntax
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-24 20:32:32 +02:00
Christian König
331502e14c Add variable that got lost
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-23 20:52:21 +02:00
Christian König
18c24d985f Create custom.list during install/update if it doesn't exist
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-23 20:43:12 +02:00
Adam Warner
ddb36c013d it helps if the echo goes variable set goes in the right place
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-22 22:39:03 +01:00
Adam Warner
98dc51869e accidentally missed \\n
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-22 22:30:51 +01:00
Adam Warner
510b646736 change up the verbiage with something that works (tested)
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-22 22:29:38 +01:00
James Lagermann
da6b78f4c5 Merge branch 'development' into wormhole
changed console to bash
clone to fork

Signed-off-by: James Lagermann <james.lagermann@corelight.com>

Update CONTRIBUTING.md

Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-07-22 11:32:10 -05:00
DL6ER
61616b8c86 Merge pull request #3599 from pi-hole/fix/gravity_cronjob
Fix for gravity cronjob
2020-07-21 23:11:29 +02:00
James Lagermann
be14000778 added blanks-around-fences to correct lint errors
Signed-off-by: James Lagermann <james.lagermann@corelight.com>
2020-07-21 15:41:50 -05:00
James Lagermann
93c1a62998 Update CONTRIBUTING.md
Co-authored-by: jrschat <54955683+jrschat@users.noreply.github.com>
signed-off-by: James Lagermann <james.lagermann@corelight.com>
2020-07-21 15:41:14 -05:00
DL6ER
527fc3c5cf Also pidof -> pgrep in gravity.sh
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-21 22:03:54 +02:00
DL6ER
8f7f0881c6 Add /usr/sbin to cronjob PATH
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-21 21:21:24 +02:00
DL6ER
17aabf26f7 Also use pkill/pgrep in the FTL service script
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-21 21:21:17 +02:00
DL6ER
6ee6eea1fb Use pkill instead of the somewhat fragile combination of kill + pidof. This solves some issues especially when there are many TCP workers floating around.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-21 21:13:40 +02:00
Adam Warner
ea22774d16 Wrap entire function in the check for the ENVVAR
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-21 18:47:13 +01:00
James Lagermann
5c9fbd7d1f Merge pull request #3 from pi-hole/development
Development
2020-07-20 16:50:17 -05:00
Dan Schaper
b0ea043b6a Merge pull request #3581 from jokajak/patch-1
chore(README.md): Grammar fix
2020-07-20 13:06:29 -07:00
Josh
27366fe9f0 chore(README.md): Grammar fix
Fix small grammar issue in README.md

Signed-off-by: Jokajak <jokajak@gmail.com>
2020-07-20 15:50:27 -04:00
MichaIng
25b873cf7b Add default locations to PATH to assure that all basic commands are available
Signed-off-by: MichaIng <micha@dietpi.com>
2020-07-18 17:30:27 +02:00
Adam Warner
643d2c0f3e add missing port number validation section to valid_ip6
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-16 21:31:45 +01:00
Adam Warner
533e5dddd0 clarify examples in case of unsupported OS
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-16 18:33:53 +01:00
Adam Warner
60f0ab51c9 Merge pull request #3555 from pi-hole/release/v5.1.1
Release/v5.1.1 -> development
2020-07-16 18:29:00 +01:00
Adam Warner
56cd7c4d59 Merge pull request #3549 from pi-hole/release/v5.1.1
Pi-hole core v5.1.1
2020-07-15 23:56:47 +01:00
Adam Warner
f50cff54de *innocent whistling*
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 23:49:17 +01:00
Adam Warner
acfb092e4b fix minor bug in 5.1
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 23:38:08 +01:00
Adam Warner
e9b039139c Merge pull request #3531 from pi-hole/release/v5.1
Pi-hole Core v5.1
2020-07-15 22:35:12 +01:00
Dan Schaper
e4b2d29552 Merge pull request #3548 from pi-hole/tweak/supportedos.txt
add one
2020-07-15 14:14:32 -07:00
Adam Warner
b4ca13b3ad add one
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 22:03:07 +01:00
Adam Warner
b9b7d5f8eb Merge pull request #3547 from pi-hole/fix/debug20.04
fallback to NC if curl fails on uploadgit checkout
2020-07-15 22:01:36 +01:00
Adam Warner
849139176e fallback to NC if curl fails on uploadgit checkout
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 21:54:45 +01:00
Adam Warner
ae0d1de188 Merge pull request #3545 from pi-hole/tweak/debugoutput
Add additional information about local debug log location
2020-07-15 21:25:59 +01:00
Adam Warner
b8bba7951f Just one more newline, give it to me.
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 20:49:18 +01:00
Adam Warner
76ce5ec66b Add additional information about local debug log location
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-07-15 20:45:02 +01:00
Adam Warner
7b41b99549 Merge pull request #2887 from tlk/fix/reenable
Prevent "pihole disable $timeout" from messing up future state changes
2020-07-15 20:23:33 +01:00
DL6ER
0cc999ea1f Merge pull request #3543 from pi-hole/tweak/readme
Update README.md
2020-07-14 05:36:12 +02:00
Dan Schaper
a99eac9d10 Update README.md
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-07-13 14:29:45 -07:00
DL6ER
e76f0119b4 Merge pull request #3534 from yubiuser/tweak/saveLocation
Use gravity's adlist_id in filename when saving downloaded adlist locally
2020-07-06 15:13:05 +02:00
Adam Warner
a3ae47023f Merge pull request #3533 from pi-hole/release/v5.1
Release/v5.1
2020-07-05 13:38:54 +01:00
Adam Warner
6ff0926f4a Merge pull request #3532 from pi-hole/XhmikosR-patch-1
Fix minor typo
2020-07-05 13:36:41 +01:00
Christian König
73963fecda Use gravity's adlist_id in filename when saving downloaded adlist locally
Signed-off-by: Christian König <ckoenig@posteo.de>
2020-07-05 14:32:33 +02:00
XhmikosR
d8822b70cf Fix minor typo
Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-07-05 15:12:02 +03:00
Adam Warner
f50d59fe94 Merge pull request #3425 from XhmikosR/lighttpd
Tweak lighttpd configs
2020-07-02 10:53:56 +01:00
XhmikosR
cf1c1e2e7e Tweak lighttpd configs
* Compress more types
* Add charset=utf-8 in more text types
* Use proper media types
* Add default expire header
* Use consistent indentation

Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-07-02 12:28:26 +03:00
Adam Warner
f5a5f68a1a Merge pull request #3403 from XhmikosR/XhmikosR-patch-1
Fix/tweak blocking page
2020-07-02 10:27:16 +01:00
DL6ER
94cd7f59d4 Make verbose output the default.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-01 18:49:31 +02:00
DL6ER
6009e86947 Fix pihole status to not rely on a TCP port test. The current test can fail even when there is no error i case the max. number of TCP workers is reached.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-07-01 18:39:28 +02:00
Dan Schaper
56e0549c7a Merge pull request #3420 from XhmikosR/XhmikosR-patch-4
Markdown tweaks
2020-06-30 13:20:29 -07:00
Adam Warner
49f099e382 Merge pull request #3510 from pi-hole/fix/ip_validation_setdns
Also validate IPV6 in the `setdns` function
2020-06-25 17:58:55 +01:00
Adam Warner
3205606fc3 Also validate IPV6 in the setdns function
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-23 20:38:18 +01:00
Dan Schaper
3aaf9d89b3 Merge pull request #3260 from pi-hole/new/rev-server
Improve conditional forwarding
2020-06-21 13:26:07 -07:00
DL6ER
2c3aa9ab00 Merge pull request #3491 from pi-hole/fix_ip_address_section
Fix fresh install on dev branch not working
2020-06-21 21:58:36 +02:00
DL6ER
bf392d7a60 Merge pull request #3489 from pi-hole/ip_validation
Improve IP validation function
2020-06-21 21:56:30 +02:00
DL6ER
9bf0f2a161 Reduce handholding when trying to foresee the intentions of the user. The code does now preserve legacy behavior and users can open up the subnet manually if they like.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-06-21 21:47:30 +02:00
Adam Warner
bbfbf67fcf further simplify the function, per @dl6er's suggestion
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-15 22:52:24 +01:00
Adam Warner
fe30ce10d3 simpler regex suggested by @MichaIng
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-15 21:21:40 +01:00
Dan Schaper
3136d239df Merge pull request #3492 from pi-hole/fix/man-restartdns
Improve man pihole restartdns section
2020-06-15 10:05:05 -07:00
DL6ER
c9350fa76d Improve man pihole restartdns section.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-06-14 21:59:20 +02:00
Adam Warner
b96ce13085 Merge pull request #3490 from pi-hole/fix_os_check
Fix new os_check
2020-06-14 00:24:33 +01:00
Adam Warner
7ea6d7b92b remove ; so IFS changes don't stick
Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-14 00:17:51 +01:00
Adam Warner
011fa8c6ea fix sticklr complaint
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-13 21:47:00 +01:00
Adam Warner
1ebf0785b6 move dnsutils/bind-utils to installed deps and only check OS is supported after installing installer deps
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-13 21:33:03 +01:00
Adam Warner
0320d85028 Additionally source the install script in webpage.sh to validate IP entered on pihole -a setdns
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-13 20:57:57 +01:00
Adam Warner
95f4c632f7 expand valid_ip to allow for custom ports
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-13 20:30:03 +01:00
Dan Schaper
4b59287683 Merge pull request #3441 from pi-hole/new/os_check
Display warning if unsupported OS is detected
2020-06-05 13:39:39 -07:00
Dan Schaper
5f9dac8d2b Merge pull request #3434 from pi-hole/new/os_detect
Change OS Detection in debug script
2020-06-05 13:38:50 -07:00
Adam Warner
9844a3288f Same change as 03a8cff
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-05 21:06:25 +01:00
Adam Warner
03a8cff55e read > mapfile as suggested by @dschaper
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-05 21:01:53 +01:00
Dan Schaper
c9dd3ee2e9 Merge pull request #3470 from pi-hole/fix/escape_where_should_be_none
Replace possible "\#" by "#" to fix AdminLTE#1427
2020-06-05 12:25:53 -07:00
XhmikosR
52cb389d94 Markdown tweaks
Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-06-04 16:19:21 +03:00
DL6ER
2b1bc6a46e Replace possible "\#" by "#". This fixes AdminLTE#1427
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-06-04 09:32:40 +02:00
DL6ER
6160eb6894 This regex is too complex for bash's own replacement. Add ignore for the shellcheck rule.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-06-04 09:22:40 +02:00
DL6ER
318ca75269 Merge branch 'development' into new/rev-server 2020-06-04 08:56:08 +02:00
Adam Warner
13a49b0753 Merge pull request #3466 from pi-hole/tweak/improve_unique_domains
Allow certain domain duplicates
2020-06-03 21:41:20 +01:00
Adam Warner
58724a38a9 Improve detection and display of supported/unsupported OS in debug script
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-06-03 17:57:22 +01:00
Adam Warner
8fef35be0f Update README.md
remove dead link to gitter
2020-06-03 16:11:09 +01:00
DL6ER
202ba055ea Change UNIQUEness constraint from (domain) to (domain, type) in the domainlist table. This will allow duplicates which can be associated to different groups.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-06-02 10:49:35 +02:00
Adam Warner
5488fb0caf Merge pull request #3463 from jesterchen/patch-1
Patch 1
2020-06-01 11:29:17 +01:00
jesterchen
0a47140239 Merge branch 'patch-1' of github.com:jesterchen/pi-hole into patch-1 2020-06-01 12:06:38 +02:00
jesterchen
7248d1a504 Ensure that adlistFile is created before chmodding
If an user installs Pi-hole without selecting any adlists, the installer emits a warning and exits. By touching the file this is prevented.

Signed-off-by: jesterchen <github@jesterweb.de>
2020-06-01 12:06:02 +02:00
jesterchen
7934a9bcb4 Ensure that adlistFile is created before chmodding
If an user installs Pi-hole without selecting any adlists, the installer emits a warning and exits. By touching the file this is prevented.
2020-06-01 12:00:29 +02:00
XhmikosR
d90313fe4d Fix/tweak blocking page
* fix favicon
* add meta charset
* add html lang
* add a page title
* remove unneeded html end tags
* fix viewport tag to allow zooming
* compress the "blocked by Pi-hole" SVG
* remove trailing spaces
* switch to double colon pseudo elements (works from IE9 and newer)
* add missing vendor prefixes
* other minor tweaks
* add `Access-Control-Allow-Origin` header to all font types

Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-05-31 15:54:11 +03:00
Dan Schaper
c73001f392 Merge pull request #3412 from XhmikosR/links
Update links
2020-05-30 12:45:15 -07:00
XhmikosR
7579ab178a Update links
* use https when possible
* replace coverage with a link to the docs page in README.md
* remove obsolete affiliate link in README.md

Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-05-30 21:50:16 +03:00
Thomas L. Kjeldsen
903808a477 Improved explanation of why this script is needed
Signed-off-by: Thomas L. Kjeldsen <tlk@closureconsulting.com>
2020-05-30 03:14:03 +02:00
Thomas L. Kjeldsen
005da06b3d Use PI_HOLE_BIN_DIR as introduced in PR #2886
Signed-off-by: Thomas L. Kjeldsen <tlk@closureconsulting.com>
2020-05-30 03:13:51 +02:00
Thomas L. Kjeldsen
852f6b95f5 Prevent "pihole disable $timeout" from messing up future state changes
Signed-off-by: Thomas L. Kjeldsen <tlk@closureconsulting.com>
2020-05-30 02:58:27 +02:00
DL6ER
5dc7ec0fa0 Merge pull request #3455 from pi-hole/tweak/FTL_niceness
Add CAP_SYS_NICE to FTL's capabilities
2020-05-28 22:00:49 +02:00
DL6ER
de8976da7a Add CAP_SYS_NICE to FTL's capabilities so it can control its own niceness.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-05-28 21:18:31 +02:00
Adam Warner
e43450f56e Merge pull request #3451 from pi-hole/its-getting-awful-quiet-in-here
Remove deprecated Disconnect lists from "defaults"
2020-05-27 08:46:32 +01:00
Adam Warner
4f7bb7b811 Remove deprecated Disconnect lists from "defaults"
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-26 21:23:44 +01:00
Adam Warner
01ab82b869 Merge pull request #3446 from pgl/development
Updated gravity.sh to allow semicolons in URLs
2020-05-26 15:26:28 +01:00
Peter Lowe
dd205c55c1 Updated gravity.sh to allow semicolons
Signed-off-by: Peter Lowe <pgl@yoyo.org>
2020-05-26 15:53:10 +02:00
DL6ER
b60ec8a48f Merge pull request #3248 from MichaIng/patch-8
Start pihole-FTL after network
2020-05-25 21:27:27 +02:00
Adam Warner
acf2879057 Address sticklr complaints
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-25 17:49:19 +01:00
DL6ER
27f0fd2372 Merge pull request #3415 from fhriley/reload_privacy
Reload the lists, which will cause the cached privacy level to be upd…
2020-05-25 18:47:44 +02:00
Adam Warner
af1129fc28 Add a check at the top of the script to determine if the script is being run on a supported OS
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-25 17:40:20 +01:00
Adam Warner
ee172cd6e9 Merge pull request #3423 from pi-hole/debug-extras
Debug extras
2020-05-22 07:53:06 +01:00
Adam Warner
d0e250a616 Ensure pihole-FTL.conf is parsed, as well as external.conf for lighttpd, to rule out any custom modifications.
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-21 22:25:00 +01:00
Adam Warner
b2ba55c27b Show details of any remotes on the git repositories
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-21 21:23:26 +01:00
Dan Schaper
3f83c314b6 Merge pull request #3419 from XhmikosR/XhmikosR-patch-3
Remove csslint from Strickler CI
2020-05-21 10:11:53 -07:00
XhmikosR
5094fab491 Remove csslint from Strickler CI
There's only one CSS file and the page where it's used has become obsolete.

Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2020-05-21 17:44:32 +03:00
Frank Riley
9d04c517e6 Reload the lists, which will cause the cached privacy level to be updated.
Signed-off-by: Frank Riley <fhriley@gmail.com>
2020-05-20 15:47:53 -07:00
DL6ER
b421e422c2 Merge pull request #3351 from marank/development
Added support for CNAME record add/remove
2020-05-20 09:13:54 +02:00
Adam Warner
60afebfd03 Merge pull request #3406 from pi-hole/tweak/words
Use `toggle` instead of `select`
2020-05-19 07:46:40 +01:00
Adam Warner
414ab53d9a Use toggle instead of select to remove any hint of a doubt that the option already selected by default can be deselected
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-18 22:29:36 +01:00
MichaIng
5c17e41cf1 Start pihole-FTL after network
"$network" on a systemd-driven OS leads to "After=network-online.target" in the generated systemd unit.
This target is no guarantee that all network interfaces have been fully configured, as it depends on the related network services types, but at least it reduces the risk that those have not fully finished their job when pihole-FTL starts. If this is the case, certain issues can occur:
- https://github.com/pi-hole/pi-hole/issues/2924
- https://discourse.pi-hole.net/t/have-to-pihole-restartdns-after-reboot/28772

Runtime files are now consistently created in "/run" instead of "/var/run". The second is a symlink to the first for backwards compatibility but on none-ancient distro versions one should use "/run", systemd even prints a warnings if service files use "/var/run". The service file used "/run" and "/var/run" both, in cases for the same files/directories before, which does not directly cause issues currently, due to the symlink, but is inconsistent at best.

Signed-off-by: MichaIng <micha@dietpi.com>
2020-05-16 13:38:18 +02:00
Adam Warner
5ce8791693 Merge pull request #3388 from pvogt09/fix/no_adlist_selected
fix #3336 by creating adlist file even if no list was selected by user
2020-05-15 23:22:35 +01:00
pvogt09
3c6ea2612d fix #3336 by creating adlist file even if no list was selected by user
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-05-15 17:52:57 +02:00
Dan Schaper
10addc5923 Merge pull request #3218 from JulienOrain/patch-1
fix typo
2020-05-14 09:48:59 -07:00
Dan Schaper
9ee37cb503 Merge pull request #3369 from a-p-o/remove-shop-link
Remove store/shop link from README
2020-05-14 09:46:21 -07:00
Alex Ordonez
e1b1512183 Remove store/shop link from README
According to @dschaper, the store is no longer open:
https://www.reddit.com/r/pihole/comments/cmywyi/pi_hole_store/ew5m33s/

Signed-off-by: Alex Ordonez <me@ordonezalex.com>
2020-05-13 19:24:54 -07:00
Dan Schaper
c76435883b Merge pull request #3360 from dnicolson/fix-github-capitalisation
Fix GitHub capitalisation
2020-05-13 16:56:36 -07:00
Dan Schaper
2ede032de5 Merge pull request #3359 from dnicolson/patch-1
Update documentation links
2020-05-13 16:40:51 -07:00
Dave Nicolson
8dc8c350be Update documentation links
Signed-off-by: Dave Nicolson <david.nicolson@gmail.com>
2020-05-13 13:22:09 +02:00
Dave Nicolson
ab753e88a2 Fix GitHub capitalisation
Signed-off-by: Dave Nicolson <david.nicolson@gmail.com>
2020-05-13 12:55:00 +02:00
Adam Warner
d524f9a73b Merge pull request #3353 from MichaIng/patch-1
Only check SELinux states if "getenforce" command exists
2020-05-13 00:39:32 +01:00
MichaIng
7d79cf5cce Only check SELinux states if "getenforce" command exists
- Currently, if the SELinux config file exists, installed SELinux is assumed.
- But removing e.g. an APT package via "apt-get remove" leaves config files in place, or they could be present for other reasons.
- If the getenforce command is not present but the config file is, currently the installer exists without error message when calling getenforce due to "set -e".
- With this change, the presence of getenforce command is checked first. If it is not present, selinux-utils is not installed, which is a core part of SELinux, pulled in by selinux-basics as well. So it can be assumed that no SELinux is active if this command is missing.

Signed-off-by: MichaIng <micha@dietpi.com>
2020-05-12 23:45:56 +02:00
Adam Warner
be25b4d9c4 Merge pull request #3352 from pi-hole/merge-master-dev
Merge master dev
2020-05-12 22:27:24 +01:00
DL6ER
a1e913de7a Merge pull request #3327 from pi-hole/new/dark
Implement backend support for theming
2020-05-12 23:19:35 +02:00
Adam Warner
9e96ff37de Fix merge conflicts
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-12 22:16:43 +01:00
DL6ER
a9c66c7b45 Implement pihole -a theme option
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-05-12 23:03:49 +02:00
Matthias Rank
2b9898e9ca Fixed indentation
Signed-off-by: Matthias Rank <development@m-rank.de>
2020-05-12 21:04:30 +02:00
Matthias Rank
0add5eb291 Added support for CNAME record add/remvoe
Signed-off-by: Matthias Rank <development@m-rank.de>
2020-05-12 21:02:29 +02:00
Jeroen Baert
4cf241b42b Fix for pihole -w --nuke displaying help info even if command is executed correctly
Signed-off-by: Jeroen Baert <3607063+Forceflow@users.noreply.github.com>
2020-05-12 19:59:19 +02:00
Adam Warner
1b41a5d59a Merge pull request #3347 from pi-hole/tweak/binary_detection
Minor bugfix for Binary detection
2020-05-12 17:31:29 +01:00
Adam Warner
987ae3810d binary, here, should be l_binary
Signed-off-by: Adam Warner <me@adamwarner.co.uk>
2020-05-11 22:03:33 +01:00
Dan Schaper
742d802940 Merge pull request #3027 from XhmikosR/patch-1
Serve JS files with utf-8 charset too
2020-05-05 12:29:27 -07:00
DL6ER
fdaf815f42 Merge pull request #3203 from MichaIng/patch-1
Failsafe checks for available APT package
2020-05-05 10:27:08 +02:00
DL6ER
988b1ff02f Merge pull request #3204 from MichaIng/patch-3
Revert using hardcoded php-intl meta package
2020-05-05 10:24:56 +02:00
Adam Warner
4710963ccf Merge pull request #3312 from subdavis/development
Remove dead code
2020-05-01 16:43:34 +01:00
Brandon Davis
1540e5bfda Remove dead code
Signed-off-by: Brandon Davis <git@subdavis.com>
2020-05-01 07:52:33 -04:00
DL6ER
f4965d8493 Merge pull request #3135 from pvogt09/development
Move permission change behind git reset
2020-04-28 19:44:58 +02:00
DL6ER
c0cf8dba87 Merge pull request #3226 from MichaIng/patch-6
Do not add pihole user to web server group
2020-04-28 19:39:55 +02:00
DL6ER
a9136d752a Merge pull request #3246 from pvogt09/fix/user_exists
fixes #3217 by checking for existing pihole group
2020-04-28 19:38:12 +02:00
MichaIng
d7bac21149 Dot not add pihole user to web server group
This is and was never required and the pihole user does in fact not get any additional permissions through that group.

Signed-off-by: MichaIng <micha@dietpi.com>
2020-04-26 15:45:29 +02:00
MichaIng
dc6c53b6a3 Revert using hardcoded php-intl meta package
Using the meta package causes several issues:
- Install on Debian prior to Jessie and Ubuntu prior to Xenial is broken, since those do not serve the meta packages but php5-* packages instead.
- If $phpVer != "php", then multiple conflicting PHP versions can be installed.
- If "${phpVer}-intl" does not pull the correct package, then inherently "${phpVer}-xml" etc are wrong, too. This is theoretically possible, e.g. if PHP7.4 was installed while the webserver uses a concurrently installed PHP7.3 instance. Then the "php" shell command output can differ from what the webserver uses. This theoretical issue would need a different approach to derive $phpVer, not based on the shell command output but by asking the webserver somehow in the first place. But using $phpVer for some modules and hardcoded meta for the others can only lead to inconsistencies and issues.

Signed-off-by: MichaIng <micha@dietpi.com>
2020-04-26 15:44:13 +02:00
MichaIng
86d4c9b1e0 Failsafe checks for available APT package
When checking for available packages in APT repository, running a dry-run install can fail for other reasons, even if the package is available. Currently, in such case, wrong fallback packages are selected: https://github.com/pi-hole/pi-hole/issues/2888
"apt-cache show <pkg>" is a quicker method to check for available packages. This is now done as well to check if the fallbacks are available. If none is found, the installer exits with meaningful error message and exit code.

In rare cases, the APT list files can be missing when the installer is started. E.g. this could be on a fresh system, APT lists could have been moved to RAM or removed as a cleanup step. "apt-cache" calls will then fail, same as dry-run installs were. To assure that current package lists are checked, update the package cache directly after the Ubuntu universe repo has been added, only in the Debian/Ubuntu block. This renders the variable handling in RH/Fedora block obsolete.

Signed-off-by: MichaIng <micha@dietpi.com>
2020-04-26 15:42:43 +02:00
pvogt09
462457fe7f Merge branch 'development' into development 2020-04-24 12:09:49 +02:00
Adam Warner
d18a8b1b8a Merge pull request #3205 from MichaIng/patch-5
Reduce apt-get install verbosity
2020-04-19 15:28:48 +01:00
Adam Warner
e80990c27a Merge pull request #3282 from pi-hole/revert-3276-feature/support_for_new_cloudflare_dns_for_families
Revert "- Support for Cloudflare's new DNS for Families"
2020-04-19 14:32:32 +01:00
Adam Warner
e6dcccc7bd Revert "- Added 2 new DNS entries for the new Cloudflare DNS for families, which comes in 2 flavors (#3276)"
This reverts commit 7e1a8c1ceb.
2020-04-18 20:05:54 +01:00
Mohammed Swillam
7e1a8c1ceb - Added 2 new DNS entries for the new Cloudflare DNS for families, which comes in 2 flavors (#3276)
1- 1.1.1.2 (No Malware)
2- 1.1.1.3 (No Malware or Adult Content)

This would allow parents to have more control over the safety of their family's network.

Signed-off-by: Mohammed-Swillam <moh.sayed@hotmail.com>
2020-04-18 11:49:01 +01:00
DL6ER
093054a1eb Automatically convert legacy IP range to Class C network
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-04-09 09:49:07 +02:00
DL6ER
4130af0aab Retain rev-server settings when the feature gets disabled.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-04-09 09:05:50 +02:00
DL6ER
90a5a13197 Convert CONDITIONAL_FORWARDING to REV_SERVER settings. Try to detect intended CIDR range automatically.
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-04-08 15:35:35 +02:00
DL6ER
1632632668 Merge pull request #3259 from pi-hole/update_devel
Update development from release/v5.0
2020-04-08 12:28:29 +02:00
DL6ER
982c1b0059 Merge branch 'release/v5.0' into development
Signed-off-by: DL6ER <dl6er@dl6er.de>
2020-04-08 12:02:53 +02:00
pvogt09
40ac3e7eb7 remove pihole group during uninstall
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-04-04 19:22:37 +02:00
pvogt09
25c5661c1b fix stickler errors
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-04-03 19:22:30 +02:00
pvogt09
a993b8b34d fixes #3217 by checking for existing pihole group
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-04-03 13:18:32 +02:00
Julien Orain
6d4844a0b3 docs(typo): fix typo
Signed-off-by: Julien Orain <julien.orain@gmail.com>
2020-03-18 21:41:54 +01:00
MichaIng
bb936f4fdb Reduce apt-get install verbosity
The new version of the installer moved from debconf-apt-progress to raw apt-get output on installs to solve issues with interactive config file choices. This lead to a largely increases amount of output lines of the installer. To reduce the apt-get output to a minimum, while sustaining interactive input in case of config files, the "-qq" option can be used, which inherits "--yes": 
- https://manpages.debian.org/buster/apt/apt-get.8.en.html#OPTIONS
- https://manpages.ubuntu.com/manpages/bionic/man8/apt-get.8.html#options

Signed-off-by: MichaIng <micha@dietpi.com>
2020-03-11 11:01:28 +01:00
XhmikosR
7b8611ced0 Assorted typo fixes. (#3126)
* Assorted typo fixes.

Signed-off-by: XhmikosR <xhmikosr@gmail.com>

Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-03-08 16:53:14 -07:00
DL6ER
497bfd80a5 Update development from release/v5.0 (#3200)
* Use bash regex instead of awk.

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>

* Fix incorrect type description. (#3201)

Signed-off-by: DL6ER <dl6er@dl6er.de>

Co-authored-by: Dan Schaper <dan.schaper@pi-hole.net>
2020-03-08 16:38:53 -07:00
jnozsc
4a711340ef use py3 instead py2 (#3153)
* use py3 instead py2

Signed-off-by: jnozsc <jnozsc@gmail.com>

* use python 3.6

Signed-off-by: jnozsc <jnozsc@gmail.com>
2020-03-02 23:30:44 -08:00
Adam Warner
027b97cbfa Merge pull request #3185 from msamendinger/removewget
Remove wget from PIHOLE_DEPS
2020-03-01 21:15:32 +00:00
msamendinger
d16b472592 Remove wget from PIHOLE_DEPS
All external calls have been moved to curl, wget no longer needed as
dependency

Signed-off-by: msamendinger <git@samendinger.de>
2020-03-01 22:06:37 +01:00
James Lagermann
6e67124770 Merge branch 'development' of https://github.com/pi-hole/pi-hole 2020-02-28 17:16:44 -06:00
Adam Warner
e6bfb0fe17 Merge pull request #3152 from pi-hole/release/v5.0
Update development with latest release/v5.0 changes
2020-02-28 22:50:15 +00:00
pvogt09
b0f1333657 Move permission change behind git reset (like in update_repo()) and remove whitespace at end of line
Signed-off-by: pvogt09 <50047961+pvogt09@users.noreply.github.com>
2020-02-14 20:43:36 +01:00
XhmikosR
54d0b9a1b8 Serve JS files with utf-8 charset too
Signed-off-by: XhmikosR <xhmikosr@gmail.com>
2019-12-07 13:48:25 +02:00
88 changed files with 3324 additions and 2576 deletions

View File

@@ -1,4 +1,4 @@
# EditorConfig is awesome: http://EditorConfig.org
# EditorConfig is awesome: https://editorconfig.org/
# top-most EditorConfig file
root = true

View File

@@ -1,37 +0,0 @@
**In raising this issue, I confirm the following:** `{please fill the checkboxes, e.g: [X]}`
- [] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md).
- [] The issue I am reporting can be *replicated*.
- [] The issue I am reporting isn't a duplicate (see [FAQs](https://github.com/pi-hole/pi-hole/wiki/FAQs), [closed issues](https://github.com/pi-hole/pi-hole/issues?utf8=%E2%9C%93&q=is%3Aissue%20is%3Aclosed%20), and [open issues](https://github.com/pi-hole/pi-hole/issues)).
**How familiar are you with the the source code relevant to this issue?:**
`{Replace this with a number from 1 to 10. 1 being not familiar, and 10 being very familiar}`
---
**Expected behaviour:**
`{A detailed description of what you expect to see}`
**Actual behaviour:**
`{A detailed description and/or screenshots of what you do see}`
**Steps to reproduce:**
`{Detailed steps of how we can reproduce this}`
**Debug token provided by [uploading `pihole -d` log](https://discourse.pi-hole.net/t/the-pihole-command-with-examples/738#debug):**
`{Alphanumeric token}`
**Troubleshooting undertaken, and/or other relevant information:**
`{Steps of what you have done to fix this}`
> * `{Please delete this quoted section when opening your issue}`
> * You must follow the template instructions. Failure to do so will result in your issue being closed.
> * Please [submit any feature requests here](https://discourse.pi-hole.net/c/feature-requests), so it is votable and trackable by the community.
> * Please respect that Pi-hole is developed by volunteers, who can only reply in their spare time.
> * Detail helps us understand and resolve an issue quicker, but please ensure it's relevant.
> * _This template was created based on the work of [`udemy-dl`](https://github.com/nishad/udemy-dl/blob/master/LICENSE)._

View File

@@ -1,31 +0,0 @@
**By submitting this pull request, I confirm the following:**
*please fill any appropriate checkboxes, e.g: [X]*
- [ ] I have read and understood the [contributors guide](https://github.com/pi-hole/pi-hole/blob/master/CONTRIBUTING.md), as well as this entire template.
- [ ] I have made only one major change in my proposed changes.
- [ ] I have commented my proposed changes within the code.
- [ ] I have tested my proposed changes, and have included unit tests where possible.
- [ ] I am willing to help maintain this change if there are issues with it later.
- [ ] I give this submission freely and claim no ownership.
- [ ] It is compatible with the [EUPL 1.2 license](https://opensource.org/licenses/EUPL-1.1)
- [ ] I have squashed any insignificant commits. ([`git rebase`](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html))
Please make sure you [Sign Off](https://github.com/pi-hole/pi-hole/wiki/How-to-signoff-your-commits.) all commits. Pi-hole enforces the [DCO](https://github.com/pi-hole/pi-hole/wiki/Contributing-to-the-project).
---
**What does this PR aim to accomplish?:**
*A detailed description, screenshots (if necessary), as well as links to any relevant GitHub issues*
**How does this PR accomplish the above?:**
*A detailed description (such as a changelog) and screenshots (if necessary) of the implemented fix*
**What documentation changes (if any) are needed to support this PR?:**
*A detailed list of any necessary changes*
---
* You must follow the template instructions. Failure to do so will result in your pull request being closed.
* Please respect that Pi-hole is developed by volunteers, who can only reply in their spare time.

10
.github/dependabot.yml vendored Normal file
View File

@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: weekly
day: saturday
time: "10:00"
open-pull-requests-limit: 10
target-branch: developement

40
.github/workflows/codeql-analysis.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: "CodeQL"
on:
push:
branches:
- master
- development
pull_request:
branches:
- master
- development
schedule:
- cron: '32 11 * * 6'
jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
-
name: Checkout repository
uses: actions/checkout@v2
# Initializes the CodeQL tools for scanning.
-
name: Initialize CodeQL
uses: github/codeql-action/init@v1
with:
languages: 'python'
-
name: Autobuild
uses: github/codeql-action/autobuild@v1
-
name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1

48
.github/workflows/test.yml vendored Normal file
View File

@@ -0,0 +1,48 @@
name: Test Supported Distributions
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
jobs:
smoke-test:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
steps:
-
name: Checkout repository
uses: actions/checkout@v2
-
name: Run Smoke Tests
run: |
# Ensure scripts in repository are executable
IFS=$'\n';
for f in $(find . -name '*.sh'); do if [[ ! -x $f ]]; then echo "$f is not executable" && FAIL=1; fi ;done
unset IFS;
# If FAIL is 1 then we fail.
[[ $FAIL == 1 ]] && exit 1 || echo "Smoke Tests Passed"
distro-test:
if: github.event.pull_request.draft == false
runs-on: ubuntu-latest
needs: smoke-test
strategy:
matrix:
distro: [debian_9, debian_10, debian_11, ubuntu_16, ubuntu_18, ubuntu_20, ubuntu_21, centos_7, centos_8, fedora_32, fedora_33]
env:
DISTRO: ${{matrix.distro}}
steps:
-
name: Checkout repository
uses: actions/checkout@v2
-
name: Set up Python 3.7
uses: actions/setup-python@v2
with:
python-version: 3.7
-
name: Install dependencies
run: pip install -r test/requirements.txt
-
name: Test with tox
run: tox -c test/tox.${DISTRO}.ini

67
.gitignore vendored
View File

@@ -7,70 +7,5 @@ __pycache__
.tox
.eggs
*.egg-info
# Created by https://www.gitignore.io/api/jetbrains+iml
### JetBrains+iml ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# All idea files, with execptions
.idea
!.idea/codeStyles/*
!.idea/codeStyleSettings.xml
# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
# Gradle:
.idea/**/gradle.xml
.idea/**/libraries
# CMake
cmake-build-debug/
# Mongo Explorer plugin:
.idea/**/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Ruby plugin and RubyMine
/.rakeTasks
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### JetBrains+iml Patch ###
# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
.idea/
*.iml
.idea/misc.xml
*.ipr
# End of https://www.gitignore.io/api/jetbrains+iml

View File

@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</value>
</option>
<MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>

View File

@@ -1,7 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<MarkdownNavigatorCodeStyleSettings>
<option name="RIGHT_MARGIN" value="72" />
</MarkdownNavigatorCodeStyleSettings>
</code_scheme>
</component>

View File

@@ -1,5 +0,0 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@@ -2,5 +2,5 @@ linters:
shellcheck:
shell: bash
phpcs:
csslint:
flake8:
max-line-length: 120

View File

@@ -1,12 +0,0 @@
sudo: required
services:
- docker
language: python
python:
- "2.7"
install:
- pip install -r requirements.txt
script:
# tox.ini handles setup, ordering of docker build first, and then run tests
- tox

View File

@@ -26,7 +26,7 @@ When requesting or submitting new features, first consider whether it might be u
- Check the codebase to ensure that your feature doesn't already exist.
- Check the pull requests to ensure that another person hasn't already submitted the feature or fix.
- Read and understand the [DCO guidelines](https://github.com/pi-hole/pi-hole/wiki/Contributing-to-the-project) for the project.
- Read and understand the [DCO guidelines](https://docs.pi-hole.net/guides/github/contributing/) for the project.
## Technical Requirements
@@ -36,3 +36,77 @@ When requesting or submitting new features, first consider whether it might be u
- Commit Unix line endings.
- Please use the Pi-hole brand: **Pi-hole** (Take a special look at the capitalized 'P' and a low 'h' with a hyphen)
- (Optional fun) keep to the theme of Star Trek/black holes/gravity.
## Forking and Cloning from GitHub to GitHub
1. Fork <https://github.com/pi-hole/pi-hole/> to a repo under a namespace you control, or have permission to use, for example: `https://github.com/<your_namespace>/<your_repo_name>/`. You can do this from the github.com website.
2. Clone `https://github.com/<your_namespace>/<your_repo_name>/` with the tool of you choice.
3. To keep your fork in sync with our repo, add an upstream remote for pi-hole/pi-hole to your repo.
```bash
git remote add upstream https://github.com/pi-hole/pi-hole.git
```
4. Checkout the `development` branch from your fork `https://github.com/<your_namespace>/<your_repo_name>/`.
5. Create a topic/branch, based on the `development` branch code. *Bonus fun to keep to the theme of Star Trek/black holes/gravity.*
6. Make your changes and commit to your topic branch in your repo.
7. Rebase your commits and squash any insignificant commits. See the notes below for an example.
8. Merge `development` your branch and fix any conflicts.
9. Open a Pull Request to merge your topic branch into our repo's `development` branch.
- Keep in mind the technical requirements from above.
## Forking and Cloning from GitHub to other code hosting sites
- Forking is a GitHub concept and cannot be done from GitHub to other git-based code hosting sites. However, those sites may be able to mirror a GitHub repo.
1. To contribute from another code hosting site, you must first complete the steps above to fork our repo to a GitHub namespace you have permission to use, for example: `https://github.com/<your_namespace>/<your_repo_name>/`.
2. Create a repo in your code hosting site, for example: `https://gitlab.com/<your_namespace>/<your_repo_name>/`
3. Follow the instructions from your code hosting site to create a mirror between `https://github.com/<your_namespace>/<your_repo_name>/` and `https://gitlab.com/<your_namespace>/<your_repo_name>/`.
4. When you are ready to create a Pull Request (PR), follow the steps `(starting at step #6)` from [Forking and Cloning from GitHub to GitHub](#forking-and-cloning-from-github-to-github) and create the PR from `https://github.com/<your_namespace>/<your_repo_name>/`.
## Notes for squashing commits with rebase
- To rebase your commits and squash previous commits, you can use:
```bash
git rebase -i your_topic_branch~(number of commits to combine)
```
- For more details visit [gitready.com](http://gitready.com/advanced/2009/02/10/squashing-commits-with-rebase.html)
1. The following would combine the last four commits in the branch `mytopic`.
```bash
git rebase -i mytopic~4
```
2. An editor window opens with the most recent commits indicated: (edit the commands to the left of the commit ID)
```gitattributes
pick 9dff55b2 existing commit comments
squash ebb1a730 existing commit comments
squash 07cc5b50 existing commit comments
reword 9dff55b2 existing commit comments
```
3. Save and close the editor. The next editor window opens: (edit the new commit message). *If you select reword for a commit, an additional editor window will open for you to edit the comment.*
```bash
new commit comments
Signed-off-by: yourname <your email address>
```
4. Save and close the editor for the rebase process to execute. The terminal output should say something like the following:
```bash
Successfully rebased and updated refs/heads/mytopic.
```
5. Once you have a successful rebase, and before you sync your local clone, you have to force push origin to update your repo:
```bash
git push -f origin
```
6. Continue on from step #7 from [Forking and Cloning from GitHub to GitHub](#forking-and-cloning-from-github-to-github)

233
README.md
View File

@@ -1,213 +1,164 @@
<!-- markdownlint-configure-file { "MD004": { "style": "consistent" } } -->
<!-- markdownlint-disable MD033 -->
#
<p align="center">
<a href="https://pi-hole.net"><img src="https://pi-hole.github.io/graphics/Vortex/Vortex_with_text.png" width="150" height="255" alt="Pi-hole"></a><br/>
<b>Network-wide ad blocking via your own Linux hardware</b><br/>
<a href="https://pi-hole.net/">
<img src="https://pi-hole.github.io/graphics/Vortex/Vortex_with_Wordmark.svg" width="150" height="260" alt="Pi-hole">
</a>
<br>
<strong>Network-wide ad blocking via your own Linux hardware</strong>
</p>
<!-- markdownlint-enable MD033 -->
The Pi-hole[®](https://pi-hole.net/trademark-rules-and-brand-guidelines/) is a [DNS sinkhole](https://en.wikipedia.org/wiki/DNS_Sinkhole) that protects your devices from unwanted content, without installing any client-side software.
The Pi-hole® is a [DNS sinkhole](https://en.wikipedia.org/wiki/DNS_Sinkhole) that protects your devices from unwanted content without installing any client-side software.
- **Easy-to-install**: our versatile installer walks you through the process, and [takes less than ten minutes](https://www.youtube.com/watch?v=vKWjx1AQYgs)
- **Easy-to-install**: our versatile installer walks you through the process and takes less than ten minutes
- **Resolute**: content is blocked in _non-browser locations_, such as ad-laden mobile apps and smart TVs
- **Responsive**: seamlessly speeds up the feel of everyday browsing by caching DNS queries
- **Lightweight**: runs smoothly with [minimal hardware and software requirements](https://discourse.pi-hole.net/t/hardware-software-requirements/273)
- **Lightweight**: runs smoothly with [minimal hardware and software requirements](https://docs.pi-hole.net/main/prerequisites/)
- **Robust**: a command line interface that is quality assured for interoperability
- **Insightful**: a beautiful responsive Web Interface dashboard to view and control your Pi-hole
- **Versatile**: can optionally function as a [DHCP server](https://discourse.pi-hole.net/t/how-do-i-use-pi-holes-built-in-dhcp-server-and-why-would-i-want-to/3026), ensuring *all* your devices are protected automatically
- **Scalable**: [capable of handling hundreds of millions of queries](https://pi-hole.net/2017/05/24/how-much-traffic-can-pi-hole-handle/) when installed on server-grade hardware
- **Modern**: blocks ads over both IPv4 and IPv6
- **Free**: open source software which helps ensure _you_ are the sole person in control of your privacy
- **Free**: open source software that helps ensure _you_ are the sole person in control of your privacy
-----
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/c558a0f8d7124c99b02b84f0f5564238)](https://www.codacy.com/app/Pi-hole/pi-hole?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=pi-hole/pi-hole&amp;utm_campaign=Badge_Grade)
[![Build Status](https://travis-ci.org/pi-hole/pi-hole.svg?branch=development)](https://travis-ci.org/pi-hole/pi-hole)
[![BountySource](https://www.bountysource.com/badge/tracker?tracker_id=3011939)](https://www.bountysource.com/trackers/3011939-pi-hole-pi-hole?utm_source=3011939&utm_medium=shield&utm_campaign=TRACKER_BADGE)
## One-Step Automated Install
Those who want to get started quickly and conveniently may install Pi-hole using the following command:
#### `curl -sSL https://install.pi-hole.net | bash`
### `curl -sSL https://install.pi-hole.net | bash`
## Alternative Install Methods
[Piping to `bash` is controversial](https://pi-hole.net/2016/07/25/curling-and-piping-to-bash), as it prevents you from [reading code that is about to run](https://github.com/pi-hole/pi-hole/blob/master/automated%20install/basic-install.sh) on your system. Therefore, we provide these alternative installation methods which allow code review before installation:
Piping to `bash` is [controversial](https://pi-hole.net/2016/07/25/curling-and-piping-to-bash), as it prevents you from [reading code that is about to run](https://github.com/pi-hole/pi-hole/blob/master/automated%20install/basic-install.sh) on your system. Therefore, we provide these alternative installation methods which allow code review before installation:
### Method 1: Clone our repository and run
```
```bash
git clone --depth 1 https://github.com/pi-hole/pi-hole.git Pi-hole
cd "Pi-hole/automated install/"
sudo bash basic-install.sh
```
### Method 2: Manually download the installer and run
```
```bash
wget -O basic-install.sh https://install.pi-hole.net
sudo bash basic-install.sh
```
### Method 3: Using Docker to deploy Pi-hole
Please refer to the [Pi-hole docker repo](https://github.com/pi-hole/docker-pi-hole) to use the Official Docker Images.
## Post-install: Make your network take advantage of Pi-hole
## [Post-install: Make your network take advantage of Pi-hole](https://docs.pi-hole.net/main/post-install/)
Once the installer has been run, you will need to [configure your router to have **DHCP clients use Pi-hole as their DNS server**](https://discourse.pi-hole.net/t/how-do-i-configure-my-devices-to-use-pi-hole-as-their-dns-server/245) which ensures that all devices connecting to your network will have content blocked without any further intervention.
If your router does not support setting the DNS server, you can [use Pi-hole's built-in DHCP server](https://discourse.pi-hole.net/t/how-do-i-use-pi-holes-built-in-dhcp-server-and-why-would-i-want-to/3026); just be sure to disable DHCP on your router first (if it has that feature available).
If your router does not support setting the DNS server, you can [use Pi-hole's built-in DHCP server](https://discourse.pi-hole.net/t/how-do-i-use-pi-holes-built-in-dhcp-server-and-why-would-i-want-to/3026); be sure to disable DHCP on your router first (if it has that feature available).
As a last resort, you can always manually set each device to use Pi-hole as their DNS server.
As a last resort, you can manually set each device to use Pi-hole as their DNS server.
-----
## Pi-hole is free, but powered by your support
There are many reoccurring costs involved with maintaining free, open source, and privacy-respecting software; expenses which [our volunteer developers](https://github.com/orgs/pi-hole/people) pitch in to cover out-of-pocket. This is just one example of how strongly we feel about our software, as well as the importance of keeping it maintained.
## Pi-hole is free but powered by your support
There are many reoccurring costs involved with maintaining free, open source, and privacy-respecting software; expenses which [our volunteer developers](https://github.com/orgs/pi-hole/people) pitch in to cover out-of-pocket. This is just one example of how strongly we feel about our software and the importance of keeping it maintained.
Make no mistake: **your support is absolutely vital to help keep us innovating!**
### Donations
Sending a donation using our links below is **extremely helpful** in offsetting a portion of our monthly expenses:
### [Donations](https://pi-hole.net/donate)
- <img src="https://pi-hole.github.io/graphics/Badges/paypal-badge-black.svg" width="24" height="24" alt="PP"/> <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=3J2L3Z4DHW9UY">Donate via PayPal</a><br/>
- <img src="https://pi-hole.github.io/graphics/Badges/bitcoin-badge-black.svg" width="24" height="24" alt="BTC"/> [Bitcoin, Bitcoin Cash, Ethereum, Litecoin](https://commerce.coinbase.com/checkout/dd304d04-f324-4a77-931b-0db61c77a41b)
Donating using our Sponsor Button is **extremely helpful** in offsetting a portion of our monthly expenses:
### Alternative support
If you'd rather not [donate](https://pi-hole.net/donate/) (_which is okay!_), there are other ways you can help support us:
- [Patreon](https://patreon.com/pihole) _Become a patron for rewards_
- [Digital Ocean](http://www.digitalocean.com/?refcode=344d234950e1) _affiliate link_
If you'd rather not donate (_which is okay!_), there are other ways you can help support us:
- [GitHub Sponsors](https://github.com/sponsors/pi-hole/)
- [Patreon](https://patreon.com/pihole)
- [Hetzner Cloud](https://hetzner.cloud/?ref=7aceisRX3AzA) _affiliate link_
- [Digital Ocean](https://www.digitalocean.com/?refcode=344d234950e1) _affiliate link_
- [Stickermule](https://www.stickermule.com/unlock?ref_id=9127301701&utm_medium=link&utm_source=invite) _earn a $10 credit after your first purchase_
- [Pi-hole Swag Store](https://pi-hole.net/shop/) _affiliate link_
- [Amazon](http://www.amazon.com/exec/obidos/redirect-home/pihole09-20) _affiliate link_
- [DNS Made Easy](https://cp.dnsmadeeasy.com/u/133706) _affiliate link_
- [Vultr](http://www.vultr.com/?ref=7190426) _affiliate link_
- Spreading the word about our software, and how you have benefited from it
- [Amazon US](http://www.amazon.com/exec/obidos/redirect-home/pihole09-20) _affiliate link_
- Spreading the word about our software and how you have benefited from it
### Contributing via GitHub
We welcome _everyone_ to contribute to issue reports, suggest new features, and create pull requests.
If you have something to add - anything from a typo through to a whole new feature, we're happy to check it out! Just make sure to fill out our template when submitting your request; the questions that it asks will help the volunteers quickly understand what you're aiming to achieve.
If you have something to add - anything from a typo through to a whole new feature, we're happy to check it out! Just make sure to fill out our template when submitting your request; the questions it asks will help the volunteers quickly understand what you're aiming to achieve.
You'll find that the [install script](https://github.com/pi-hole/pi-hole/blob/master/automated%20install/basic-install.sh) and the [debug script](https://github.com/pi-hole/pi-hole/blob/master/advanced/Scripts/piholeDebug.sh) have an abundance of comments, which will help you better understand how Pi-hole works. They're also a valuable resource to those who want to learn how to write scripts or code a program! We encourage anyone who likes to tinker to read through it and submit a pull request for us to review.
### Presentations about Pi-hole
Word-of-mouth continues to help our project grow immensely, and so we are helping make this easier for people.
If you are going to be presenting Pi-hole at a conference, meetup or even a school project, [get in touch with us](https://pi-hole.net/2017/05/17/giving-a-presentation-on-pi-hole-contact-us-first-for-some-goodies-and-support/) so we can hook you up with free swag to hand out to your audience!
-----
## Getting in touch with us
While we are primarily reachable on our <a href="https://discourse.pi-hole.net/">Discourse User Forum</a>, we can also be found on a variety of social media outlets. **Please be sure to check the FAQ's** before starting a new discussion, as we do not have the spare time to reply to every request for assistance.
<ul>
<li><a href="https://discourse.pi-hole.net/c/faqs">Frequently Asked Questions</a></li>
<li><a href="https://github.com/pi-hole/pi-hole/wiki">Pi-hole Wiki</a></li>
<li><a href="https://discourse.pi-hole.net/c/feature-requests?order=votes">Feature Requests</a></li>
<li><a href="https://discourse.pi-hole.net/">Discourse User Forum</a></li>
<li><a href="https://www.reddit.com/r/pihole/">Reddit</a></li>
<li><a href="https://gitter.im/pi-hole/pi-hole">Gitter</a> (Real-time chat)</li>
<li><a href="https://twitter.com/The_Pi_Hole">Twitter</a></li>
<li><a href="https://www.youtube.com/channel/UCT5kq9w0wSjogzJb81C9U0w">YouTube</a></li>
<li><a href="https://www.facebook.com/ThePiHole/">Facebook</a></li>
</ul>
While we are primarily reachable on our [Discourse User Forum](https://discourse.pi-hole.net/), we can also be found on various social media outlets.
**Please be sure to check the FAQs** before starting a new discussion, as we do not have the spare time to reply to every request for assistance.
- [Frequently Asked Questions](https://discourse.pi-hole.net/c/faqs)
- [Feature Requests](https://discourse.pi-hole.net/c/feature-requests?order=votes)
- [Reddit](https://www.reddit.com/r/pihole/)
- [Twitter](https://twitter.com/The_Pi_hole)
-----
## Breakdown of Features
### The Command Line Interface
The `pihole` command has all the functionality necessary to be able to fully administer the Pi-hole, without the need of the Web Interface. It's fast, user-friendly, and auditable by anyone with an understanding of `bash`.
<a href="https://pi-hole.github.io/graphics/Screenshots/blacklist-cli.gif"><img src="https://pi-hole.github.io/graphics/Screenshots/blacklist-cli.gif" alt="Pi-hole Blacklist Demo"/></a>
### [Faster-than-light Engine](https://github.com/pi-hole/ftl)
[FTLDNS](https://github.com/pi-hole/ftl) is a lightweight, purpose-built daemon used to provide statistics needed for the Web Interface, and its API can be easily integrated into your own projects. As the name implies, FTLDNS does this all *very quickly*!
Some of the statistics you can integrate include:
- Total number of domains being blocked
- Total number of DNS queries today
- Total number of ads blocked today
- Percentage of ads blocked
- Unique domains
- Queries forwarded (to your chosen upstream DNS server)
- Queries cached
- Unique clients
Access the API via [`telnet`](https://github.com/pi-hole/FTL), the Web (`admin/api.php`) and Command Line (`pihole -c -j`). You can find out [more details over here](https://discourse.pi-hole.net/t/pi-hole-api/1863).
### The Command Line Interface
The [pihole](https://docs.pi-hole.net/core/pihole-command/) command has all the functionality necessary to fully administer the Pi-hole, without the need of the Web Interface. It's fast, user-friendly, and auditable by anyone with an understanding of `bash`.
Some notable features include:
* [Whitelisting, Blacklisting and Wildcards](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#whitelisting-blacklisting-and-wildcards)
* [Debugging utility](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#debugger)
* [Viewing the live log file](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#tail)
* [Real-time Statistics via `ssh`](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#chronometer) or [your TFT LCD screen](http://www.amazon.com/exec/obidos/ASIN/B00ID39LM4/pihole09-20)
* [Updating Ad Lists](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#gravity)
* [Querying Ad Lists for blocked domains](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#query)
* [Enabling and Disabling Pi-hole](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown#enable--disable)
* ... and *many* more!
You can read our [Core Feature Breakdown](https://github.com/pi-hole/pi-hole/wiki/Core-Function-Breakdown), as well as read up on [example usage](https://discourse.pi-hole.net/t/the-pihole-command-with-examples/738) for more information.
- [Whitelisting, Blacklisting, and Regex](https://docs.pi-hole.net/core/pihole-command/#whitelisting-blacklisting-and-regex)
- [Debugging utility](https://docs.pi-hole.net/core/pihole-command/#debugger)
- [Viewing the live log file](https://docs.pi-hole.net/core/pihole-command/#tail)
- [Updating Ad Lists](https://docs.pi-hole.net/core/pihole-command/#gravity)
- [Querying Ad Lists for blocked domains](https://docs.pi-hole.net/core/pihole-command/#query)
- [Enabling and Disabling Pi-hole](https://docs.pi-hole.net/core/pihole-command/#enable-disable)
- ... and *many* more!
You can read our [Core Feature Breakdown](https://docs.pi-hole.net/core/pihole-command/#pi-hole-core) for more information.
### The Web Interface Dashboard
This [optional dashboard](https://github.com/pi-hole/AdminLTE) allows you to view stats, change settings, and configure your Pi-hole. It's the power of the Command Line Interface, with none of the learning curve!
<img src="https://pi-hole.github.io/graphics/Screenshots/pihole-dashboard.png" alt="Pi-hole Dashboard"/></a>
Some notable features include:
* Mobile friendly interface
* Password protection
* Detailed graphs and doughnut charts
* Top lists of domains and clients
* A filterable and sortable query log
* Long Term Statistics to view data over user-defined time ranges
* The ability to easily manage and configure Pi-hole features
* ... and all the main features of the Command Line Interface!
- Mobile-friendly interface
- Password protection
- Detailed graphs and doughnut charts
- Top lists of domains and clients
- A filterable and sortable query log
- Long Term Statistics to view data over user-defined time ranges
- The ability to easily manage and configure Pi-hole features
- ... and all the main features of the Command Line Interface!
There are several ways to [access the dashboard](https://discourse.pi-hole.net/t/how-do-i-access-pi-holes-dashboard-admin-interface/3168):
1. `http://<IP_ADDPRESS_OF_YOUR_PI_HOLE>/admin/`
2. `http://pi.hole/admin/` (when using Pi-hole as your DNS server)
3. `http://pi.hole/` (when using Pi-hole as your DNS server)
## Faster-than-light Engine
FTLDNS is a lightweight, purpose-built daemon used to provide statistics needed for the Web Interface, and its API can be easily integrated into your own projects. As the name implies, FTLDNS does this all *very quickly*!
Some of the statistics you can integrate include:
* Total number of domains being blocked
* Total number of DNS queries today
* Total number of ads blocked today
* Percentage of ads blocked
* Unique domains
* Queries forwarded (to your chosen upstream DNS server)
* Queries cached
* Unique clients
The API can be accessed via [`telnet`](https://github.com/pi-hole/FTL), the Web (`admin/api.php`) and Command Line (`pihole -c -j`). You can out find [more details over here](https://discourse.pi-hole.net/t/pi-hole-api/1863).
-----
## The Origin Of Pi-hole
Pi-hole being an **advertising-aware DNS/Web server**, makes use of the following technologies:
* [`dnsmasq`](http://www.thekelleys.org.uk/dnsmasq/doc.html) - a lightweight DNS and DHCP server
* [`curl`](https://curl.haxx.se) - A command line tool for transferring data with URL syntax
* [`lighttpd`](https://www.lighttpd.net) - web server designed and optimized for high performance
* [`php`](https://secure.php.net) - a popular general-purpose web scripting language
* [AdminLTE Dashboard](https://github.com/almasaeed2010/AdminLTE) - premium admin control panel based on Bootstrap 3.x
While quite outdated at this point, [this original blog post about Pi-hole](https://jacobsalmela.com/2015/06/16/block-millions-ads-network-wide-with-a-raspberry-pi-hole-2-0/) goes into **great detail** about how Pi-hole was originally set up and how it works. Syntactically, it's no longer accurate, but the same basic principles and logic still apply to Pi-hole's current state.
-----
## Coverage
- [Lifehacker: Turn A Raspberry Pi Into An Ad Blocker With A Single Command](https://www.lifehacker.com.au/2015/02/turn-a-raspberry-pi-into-an-ad-blocker-with-a-single-command/) (February, 2015)
- [MakeUseOf: Adblock Everywhere: The Raspberry Pi-Hole Way](http://www.makeuseof.com/tag/adblock-everywhere-raspberry-pi-hole-way/) (March, 2015)
- [Catchpoint: Ad-Blocking on Apple iOS9: Valuing the End User Experience](http://blog.catchpoint.com/2015/09/14/ad-blocking-apple/) (September, 2015)
- [Security Now Netcast: Pi-hole](https://www.youtube.com/watch?v=p7-osq_y8i8&t=100m26s) (October, 2015)
- [TekThing: Raspberry Pi-Hole Makes Ads Disappear!](https://youtu.be/8Co59HU2gY0?t=2m) (December, 2015)
- [Foolish Tech Show](https://youtu.be/bYyena0I9yc?t=2m4s) (December, 2015)
- [Block Ads on All Home Devices for $53.18](https://medium.com/@robleathern/block-ads-on-all-home-devices-for-53-18-a5f1ec139693#.gj1xpgr5d) (December, 2015)
- [Pi-Hole for Ubuntu 14.04](http://www.boyter.org/2015/12/pi-hole-ubuntu-14-04/) (December, 2015)
- [MacObserver Podcast 585](https://www.macobserver.com/tmo/podcast/macgeekgab-585) (December, 2015)
- [The Defrag Show: Endoscope USB Camera, The Final [HoloLens] Vote, Adblock Pi and more](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) (January, 2016)
- [Adafruit: Pi-hole is a black hole for internet ads](https://blog.adafruit.com/2016/03/04/pi-hole-is-a-black-hole-for-internet-ads-piday-raspberrypi-raspberry_pi/) (March, 2016)
- [Digital Trends: 5 Fun, Easy Projects You Can Try With a $35 Raspberry Pi](https://youtu.be/QwrKlyC2kdM?t=1m42s) (March, 2016)
- [Adafruit: Raspberry Pi Quick Look at Pi Hole ad blocking server with Tony D](https://www.youtube.com/watch?v=eg4u2j1HYlI) (June, 2016)
- [Devacron: OrangePi Zero as an Ad-Block server with Pi-Hole](http://www.devacron.com/orangepi-zero-as-an-ad-block-server-with-pi-hole/) (December, 2016)
- [Linux Pro: The Hole Truth](http://www.linuxpromagazine.com/Issues/2017/200/The-sysadmin-s-daily-grind-Pi-hole) (July, 2017)
- [Adafruit: installing Pi-hole on a Pi Zero W](https://learn.adafruit.com/pi-hole-ad-blocker-with-pi-zero-w/install-pi-hole) (August, 2017)
- [CryptoAUSTRALIA: How We Tried 5 Privacy Focused Raspberry Pi Projects](https://blog.cryptoaustralia.org.au/2017/10/05/5-privacy-focused-raspberry-pi-projects/) (October, 2017)
- [CryptoAUSTRALIA: Pi-hole Workshop](https://blog.cryptoaustralia.org.au/2017/11/02/pi-hole-network-wide-ad-blocker/) (November, 2017)
- [Know How 355: Killing ads with a Raspberry Pi-Hole!](https://www.twit.tv/shows/know-how/episodes/355) (November, 2017)
- [Hobohouse: Block Advertising on your Network with Pi-hole and Raspberry Pi](https://hobo.house/2018/02/27/block-advertising-with-pi-hole-and-raspberry-pi/) (March, 2018)
- [Scott Helme: Securing DNS across all of my devices with Pi-Hole + DNS-over-HTTPS + 1.1.1.1](https://scotthelme.co.uk/securing-dns-across-all-of-my-devices-with-pihole-dns-over-https-1-1-1-1/) (April, 2018)
- [Scott Helme: Catching and dealing with naughty devices on my home network](https://scotthelme.co.uk/catching-naughty-devices-on-my-home-network/) (April, 2018)
- [Bloomberg Business Week: Brotherhood of the Ad blockers](https://www.bloomberg.com/news/features/2018-05-10/inside-the-brotherhood-of-pi-hole-ad-blockers) (May, 2018)
- [Software Engineering Daily: Interview with the creator of Pi-hole](https://softwareengineeringdaily.com/2018/05/29/pi-hole-ad-blocker-hardware-with-jacob-salmela/) (May, 2018)
- [Raspberry Pi: Block ads at home using Pi-hole and a Raspberry Pi](https://www.raspberrypi.org/blog/pi-hole-raspberry-pi/) (July, 2018)
- [Troy Hunt: Mmm... Pi-hole...](https://www.troyhunt.com/mmm-pi-hole/) (September, 2018)
- [PEBKAK Podcast: Interview With Jacob Salmela](https://www.jerseystudios.net/2018/10/11/150-pi-hole/) (October, 2018)
-----
## Pi-hole Projects
- [The Big Blocklist Collection](https://wally3k.github.io)
- [Pie in the Sky-Hole](https://dlaa.me/blog/post/skyhole)
- [Copernicus: Windows Tray Application](https://github.com/goldbattle/copernicus)
- [Magic Mirror with DNS Filtering](https://zonksec.com/blog/magic-mirror-dns-filtering/#dnssoftware)
- [Windows DNS Swapper](https://github.com/roots84/DNS-Swapper)
1. `http://pi.hole/admin/` (when using Pi-hole as your DNS server)
2. `http://<IP_ADDPRESS_OF_YOUR_PI_HOLE>/admin/`

View File

@@ -34,11 +34,9 @@ server=@DNS2@
interface=@INT@
cache-size=10000
cache-size=@CACHE_SIZE@
log-queries
log-facility=/var/log/pihole.log
local-ttl=2
log-async

41
advanced/06-rfc6761.conf Normal file
View File

@@ -0,0 +1,41 @@
# Pi-hole: A black hole for Internet advertisements
# (c) 2021 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# RFC 6761 config file for Pi-hole
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
###############################################################################
# FILE AUTOMATICALLY POPULATED BY PI-HOLE INSTALL/UPDATE PROCEDURE. #
# ANY CHANGES MADE TO THIS FILE AFTER INSTALL WILL BE LOST ON THE NEXT UPDATE #
# #
# CHANGES SHOULD BE MADE IN A SEPARATE CONFIG FILE #
# WITHIN /etc/dnsmasq.d/yourname.conf #
###############################################################################
# RFC 6761: Caching DNS servers SHOULD recognize
# test, localhost, invalid
# names as special and SHOULD NOT attempt to look up NS records for them, or
# otherwise query authoritative DNS servers in an attempt to resolve these
# names.
server=/test/
server=/localhost/
server=/invalid/
# The same RFC requests something similar for
# 16.172.in-addr.arpa. 22.172.in-addr.arpa. 27.172.in-addr.arpa.
# 17.172.in-addr.arpa. 30.172.in-addr.arpa. 28.172.in-addr.arpa.
# 18.172.in-addr.arpa. 23.172.in-addr.arpa. 29.172.in-addr.arpa.
# 19.172.in-addr.arpa. 24.172.in-addr.arpa. 31.172.in-addr.arpa.
# 20.172.in-addr.arpa. 25.172.in-addr.arpa. 168.192.in-addr.arpa.
# Pi-hole implements this via the dnsmasq option "bogus-priv" (see
# 01-pihole.conf) because this also covers IPv6.
# OpenWRT furthermore blocks bind, local, onion domains
# see https://git.openwrt.org/?p=openwrt/openwrt.git;a=blob_plain;f=package/network/services/dnsmasq/files/rfc6761.conf;hb=HEAD
# and https://www.iana.org/assignments/special-use-domain-names/special-use-domain-names.xhtml
# We do not include the ".local" rule ourselves, see https://github.com/pi-hole/pi-hole/pull/4282#discussion_r689112972
server=/bind/
server=/onion/

View File

@@ -1,7 +1,7 @@
# Determine if terminal is capable of showing colours
# Determine if terminal is capable of showing colors
if [[ -t 1 ]] && [[ $(tput colors) -ge 8 ]]; then
# Bold and underline may not show up on all clients
# If something MUST be emphasised, use both
# If something MUST be emphasized, use both
COL_BOLD=''
COL_ULINE=''

View File

@@ -13,19 +13,21 @@ LC_NUMERIC=C
# Retrieve stats from FTL engine
pihole-FTL() {
ftl_port=$(cat /var/run/pihole-FTL.port 2> /dev/null)
local ftl_port LINE
ftl_port=$(cat /run/pihole-FTL.port 2> /dev/null)
if [[ -n "$ftl_port" ]]; then
# Open connection to FTL
exec 3<>"/dev/tcp/127.0.0.1/$ftl_port"
# Test if connection is open
if { "true" >&3; } 2> /dev/null; then
# Send command to FTL
echo -e ">$1" >&3
# Send command to FTL and ask to quit when finished
echo -e ">$1 >quit" >&3
# Read input
# Read input until we received an empty string and the connection is
# closed
read -r -t 1 LINE <&3
until [[ ! $? ]] || [[ "$LINE" == *"EOM"* ]]; do
until [[ -z "${LINE}" ]] && [[ ! -t 3 ]]; do
echo "$LINE" >&1
read -r -t 1 LINE <&3
done
@@ -72,7 +74,7 @@ printFunc() {
# Remove excess characters from main text
if [[ "$text_main_len" -gt "$text_main_max_len" ]]; then
# Trim text without colours
# Trim text without colors
text_main_trim="${text_main_nocol:0:$text_main_max_len}"
# Replace with trimmed text
text_main="${text_main/$text_main_nocol/$text_main_trim}"
@@ -88,7 +90,7 @@ printFunc() {
[[ "$spc_num" -le 0 ]] && spc_num="0"
spc=$(printf "%${spc_num}s")
#spc="${spc// /.}" # Debug: Visualise spaces
#spc="${spc// /.}" # Debug: Visualize spaces
printf "%s%s$spc" "$title" "$text_main"
@@ -131,7 +133,7 @@ get_init_stats() {
printf "%s%02d:%02d:%02d\\n" "$days" "$hrs" "$mins" "$secs"
}
# Set Colour Codes
# Set Color Codes
coltable="/opt/pihole/COL_TABLE"
if [[ -f "${coltable}" ]]; then
source ${coltable}
@@ -153,7 +155,7 @@ get_init_stats() {
sys_throttle_raw=$(vgt=$(sudo vcgencmd get_throttled); echo "${vgt##*x}")
# Active Throttle Notice: http://bit.ly/2gnunOo
# Active Throttle Notice: https://bit.ly/2gnunOo
if [[ "$sys_throttle_raw" != "0" ]]; then
case "$sys_throttle_raw" in
*0001) thr_type="${COL_YELLOW}Under Voltage";;
@@ -228,15 +230,21 @@ get_sys_stats() {
mapfile -t ph_ver_raw < <(pihole -v -c 2> /dev/null | sed -n 's/^.* v/v/p')
if [[ -n "${ph_ver_raw[0]}" ]]; then
ph_core_ver="${ph_ver_raw[0]}"
if [[ ${#ph_ver_raw[@]} -eq 2 ]]; then
# AdminLTE not installed
ph_lte_ver="(not installed)"
ph_ftl_ver="${ph_ver_raw[1]}"
else
ph_lte_ver="${ph_ver_raw[1]}"
ph_ftl_ver="${ph_ver_raw[2]}"
fi
else
ph_core_ver="-1"
fi
sys_name=$(hostname)
[[ -n "$TEMPERATUREUNIT" ]] && temp_unit="$TEMPERATUREUNIT" || temp_unit="c"
[[ -n "$TEMPERATUREUNIT" ]] && temp_unit="${TEMPERATUREUNIT^^}" || temp_unit="C"
# Get storage stats for partition mounted on /
read -r -a disk_raw <<< "$(df -B1 / 2> /dev/null | awk 'END{ print $3,$2,$5 }')"
@@ -269,7 +277,7 @@ get_sys_stats() {
scr_lines="${scr_size[0]}"
scr_cols="${scr_size[1]}"
# Determine Chronometer size behaviour
# Determine Chronometer size behavior
if [[ "$scr_cols" -ge 58 ]]; then
chrono_width="large"
elif [[ "$scr_cols" -gt 40 ]]; then
@@ -308,7 +316,7 @@ get_sys_stats() {
[[ "${cpu_freq}" == *".0"* ]] && cpu_freq="${cpu_freq/.0/}"
fi
# Determine colour for temperature
# Determine color for temperature
if [[ -n "$temp_file" ]]; then
if [[ "$temp_unit" == "C" ]]; then
cpu_temp=$(printf "%.0fc\\n" "$(calcFunc "$(< $temp_file) / 1000")")
@@ -490,10 +498,6 @@ chronoFunc() {
printFunc " RAM usage: " "$ram_perc%" "$ram_info"
printFunc " HDD usage: " "$disk_perc" "$disk_info"
if [[ "$scr_lines" -gt 17 ]] && [[ "$chrono_width" != "small" ]]; then
printFunc " LAN addr: " "${IPV4_ADDRESS/\/*/}" "$lan_info"
fi
if [[ "$DHCP_ACTIVE" == "true" ]]; then
printFunc "DHCP usage: " "$ph_dhcp_percent%" "$dhcp_info"
fi
@@ -551,7 +555,7 @@ Calculates stats and displays to an LCD
Options:
-j, --json Output stats as JSON formatted string
-r, --refresh Set update frequency (in seconds)
-e, --exit Output stats and exit witout refreshing
-e, --exit Output stats and exit without refreshing
-h, --help Display this help text"
fi

12
advanced/Scripts/database_migration/gravity-db.sh Normal file → Executable file
View File

@@ -110,4 +110,16 @@ upgrade_gravityDB(){
sqlite3 "${database}" < "${scriptPath}/11_to_12.sql"
version=12
fi
if [[ "$version" == "12" ]]; then
# Add column date_updated to adlist table
echo -e " ${INFO} Upgrading gravity database from version 12 to 13"
sqlite3 "${database}" < "${scriptPath}/12_to_13.sql"
version=13
fi
if [[ "$version" == "13" ]]; then
# Add columns number and status to adlist table
echo -e " ${INFO} Upgrading gravity database from version 13 to 14"
sqlite3 "${database}" < "${scriptPath}/13_to_14.sql"
version=14
fi
}

View File

@@ -0,0 +1,18 @@
.timeout 30000
PRAGMA FOREIGN_KEYS=OFF;
BEGIN TRANSACTION;
ALTER TABLE adlist ADD COLUMN date_updated INTEGER;
DROP TRIGGER tr_adlist_update;
CREATE TRIGGER tr_adlist_update AFTER UPDATE OF address,enabled,comment ON adlist
BEGIN
UPDATE adlist SET date_modified = (cast(strftime('%s', 'now') as int)) WHERE id = NEW.id;
END;
UPDATE info SET value = 13 WHERE property = 'version';
COMMIT;

View File

@@ -0,0 +1,13 @@
.timeout 30000
PRAGMA FOREIGN_KEYS=OFF;
BEGIN TRANSACTION;
ALTER TABLE adlist ADD COLUMN number INTEGER NOT NULL DEFAULT 0;
ALTER TABLE adlist ADD COLUMN invalid_domains INTEGER NOT NULL DEFAULT 0;
ALTER TABLE adlist ADD COLUMN status INTEGER NOT NULL DEFAULT 0;
UPDATE info SET value = 14 WHERE property = 'version';
COMMIT;

View File

@@ -1,4 +1,6 @@
#!/usr/bin/env bash
# shellcheck disable=SC1090
# Pi-hole: A black hole for Internet advertisements
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
@@ -9,11 +11,19 @@
# Please see LICENSE file for your rights under this license.
# Globals
basename=pihole
piholeDir=/etc/"${basename}"
gravityDBfile="${piholeDir}/gravity.db"
piholeDir="/etc/pihole"
GRAVITYDB="${piholeDir}/gravity.db"
# Source pihole-FTL from install script
pihole_FTL="${piholeDir}/pihole-FTL.conf"
if [[ -f "${pihole_FTL}" ]]; then
source "${pihole_FTL}"
fi
reload=false
# Set this only after sourcing pihole-FTL.conf as the gravity database path may
# have changed
gravityDBfile="${GRAVITYDB}"
noReloadRequested=false
addmode=true
verbose=true
wildcard=false
@@ -25,6 +35,7 @@ typeId=""
comment=""
declare -i domaincount
domaincount=0
reload=false
colfile="/opt/pihole/COL_TABLE"
source ${colfile}
@@ -112,7 +123,7 @@ ProcessDomainList() {
for dom in "${domList[@]}"; do
# Format domain into regex filter if requested
if [[ "${wildcard}" == true ]]; then
dom="(^|\\.)${dom//\./\\.}$"
dom="(\\.|^)${dom//\./\\.}$"
fi
# Logic: If addmode then add to desired list and remove from the other;
@@ -231,7 +242,15 @@ Displaylist() {
}
NukeList() {
count=$(sqlite3 "${gravityDBfile}" "SELECT COUNT(1) FROM domainlist WHERE type = ${typeId};")
listname="$(GetListnameFromTypeId "${typeId}")"
if [ "$count" -gt 0 ];then
sqlite3 "${gravityDBfile}" "DELETE FROM domainlist WHERE type = ${typeId};"
echo " ${TICK} Removed ${count} domain(s) from the ${listname}"
else
echo " ${INFO} ${listname} already empty. Nothing to do!"
fi
exit 0;
}
GetComment() {
@@ -250,7 +269,7 @@ while (( "$#" )); do
"--white-wild" | "white-wild" ) typeId=2; wildcard=true;;
"--wild" | "wildcard" ) typeId=3; wildcard=true;;
"--regex" | "regex" ) typeId=3;;
"-nr"| "--noreload" ) reload=false;;
"-nr"| "--noreload" ) noReloadRequested=true;;
"-d" | "--delmode" ) addmode=false;;
"-q" | "--quiet" ) verbose=false;;
"-h" | "--help" ) helpFunc;;
@@ -276,6 +295,6 @@ if $web; then
echo "DONE"
fi
if [[ "${reload}" != false ]]; then
if [[ ${reload} == true && ${noReloadRequested} == false ]]; then
pihole restartdns reload-lists
fi

View File

@@ -0,0 +1,23 @@
#!/bin/bash
# Pi-hole: A black hole for Internet advertisements
# (c) 2020 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
#
#
# The pihole disable command has the option to set a specified time before
# blocking is automatically re-enabled.
#
# Present script is responsible for the sleep & re-enable part of the job and
# is automatically terminated if it is still running when pihole is enabled by
# other means.
#
# This ensures that pihole ends up in the correct state after a sequence of
# commands suchs as: `pihole disable 30s; pihole enable; pihole disable`
readonly PI_HOLE_BIN_DIR="/usr/local/bin"
sleep "${1}"
"${PI_HOLE_BIN_DIR}"/pihole enable

View File

@@ -38,7 +38,7 @@ flushARP(){
# Truncate network_addresses table in pihole-FTL.db
# This needs to be done before we can truncate the network table due to
# foreign key contraints
# foreign key constraints
if ! output=$(sqlite3 "${DBFILE}" "DELETE FROM network_addresses" 2>&1); then
echo -e "${OVER} ${CROSS} Failed to truncate network_addresses table"
echo " Database location: ${DBFILE}"

9
advanced/Scripts/piholeCheckout.sh Normal file → Executable file
View File

@@ -3,7 +3,7 @@
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# Switch Pi-hole subsystems to a different Github branch.
# Switch Pi-hole subsystems to a different GitHub branch.
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
@@ -36,7 +36,7 @@ warning1() {
return 0
;;
*)
echo -e "\\n ${INFO} Branch change has been cancelled"
echo -e "\\n ${INFO} Branch change has been canceled"
return 1
;;
esac
@@ -84,7 +84,7 @@ checkout() {
echo -e " ${INFO} Shortcut \"dev\" detected - checking out development / devel branches..."
echo ""
echo -e " ${INFO} Pi-hole Core"
fetch_checkout_pull_branch "${PI_HOLE_FILES_DIR}" "development" || { echo " ${CROSS} Unable to pull Core developement branch"; exit 1; }
fetch_checkout_pull_branch "${PI_HOLE_FILES_DIR}" "development" || { echo " ${CROSS} Unable to pull Core development branch"; exit 1; }
if [[ "${INSTALL_WEB_INTERFACE}" == "true" ]]; then
echo ""
echo -e " ${INFO} Web interface"
@@ -166,12 +166,15 @@ checkout() {
checkout_pull_branch "${webInterfaceDir}" "${2}"
elif [[ "${1}" == "ftl" ]] ; then
local path
local oldbranch
path="${2}/${binary}"
oldbranch="$(pihole-FTL -b)"
if check_download_exists "$path"; then
echo " ${TICK} Branch ${2} exists"
echo "${2}" > /etc/pihole/ftlbranch
chmod 644 /etc/pihole/ftlbranch
echo -e " ${INFO} Switching to branch: \"${2}\" from \"${oldbranch}\""
FTLinstall "${binary}"
restart_service pihole-FTL
enable_service pihole-FTL

View File

@@ -46,8 +46,9 @@ OBFUSCATED_PLACEHOLDER="<DOMAIN OBFUSCATED>"
# FAQ URLs for use in showing the debug log
FAQ_UPDATE_PI_HOLE="${COL_CYAN}https://discourse.pi-hole.net/t/how-do-i-update-pi-hole/249${COL_NC}"
FAQ_CHECKOUT_COMMAND="${COL_CYAN}https://discourse.pi-hole.net/t/the-pihole-command-with-examples/738#checkout${COL_NC}"
FAQ_HARDWARE_REQUIREMENTS="${COL_CYAN}https://discourse.pi-hole.net/t/hardware-software-requirements/273${COL_NC}"
FAQ_HARDWARE_REQUIREMENTS_PORTS="${COL_CYAN}https://discourse.pi-hole.net/t/hardware-software-requirements/273#ports${COL_NC}"
FAQ_HARDWARE_REQUIREMENTS="${COL_CYAN}https://docs.pi-hole.net/main/prerequisites/${COL_NC}"
FAQ_HARDWARE_REQUIREMENTS_PORTS="${COL_CYAN}https://docs.pi-hole.net/main/prerequisites/#ports${COL_NC}"
FAQ_HARDWARE_REQUIREMENTS_FIREWALLD="${COL_CYAN}https://docs.pi-hole.net/main/prerequisites/#firewalld${COL_NC}"
FAQ_GATEWAY="${COL_CYAN}https://discourse.pi-hole.net/t/why-is-a-default-gateway-important-for-pi-hole/3546${COL_NC}"
FAQ_ULA="${COL_CYAN}https://discourse.pi-hole.net/t/use-ipv6-ula-addresses-for-pi-hole/2127${COL_NC}"
FAQ_FTL_COMPATIBILITY="${COL_CYAN}https://github.com/pi-hole/FTL#compatibility-list${COL_NC}"
@@ -55,11 +56,6 @@ FAQ_BAD_ADDRESS="${COL_CYAN}https://discourse.pi-hole.net/t/why-do-i-see-bad-add
# Other URLs we may use
FORUMS_URL="${COL_CYAN}https://discourse.pi-hole.net${COL_NC}"
TRICORDER_CONTEST="${COL_CYAN}https://pi-hole.net/2016/11/07/crack-our-medical-tricorder-win-a-raspberry-pi-3/${COL_NC}"
# Port numbers used for uploading the debug log
TRICORDER_NC_PORT_NUMBER=9999
TRICORDER_SSL_PORT_NUMBER=9998
# Directories required by Pi-hole
# https://discourse.pi-hole.net/t/what-files-does-pi-hole-use/1684
@@ -77,17 +73,14 @@ HTML_DIRECTORY="/var/www/html"
WEB_GIT_DIRECTORY="${HTML_DIRECTORY}/admin"
#BLOCK_PAGE_DIRECTORY="${HTML_DIRECTORY}/pihole"
SHM_DIRECTORY="/dev/shm"
ETC="/etc"
# Files required by Pi-hole
# https://discourse.pi-hole.net/t/what-files-does-pi-hole-use/1684
PIHOLE_CRON_FILE="${CRON_D_DIRECTORY}/pihole"
PIHOLE_DNS_CONFIG_FILE="${DNSMASQ_D_DIRECTORY}/01-pihole.conf"
PIHOLE_DHCP_CONFIG_FILE="${DNSMASQ_D_DIRECTORY}/02-pihole-dhcp.conf"
PIHOLE_WILDCARD_CONFIG_FILE="${DNSMASQ_D_DIRECTORY}/03-wildcard.conf"
WEB_SERVER_CONFIG_FILE="${WEB_SERVER_CONFIG_DIRECTORY}/lighttpd.conf"
#WEB_SERVER_CUSTOM_CONFIG_FILE="${WEB_SERVER_CONFIG_DIRECTORY}/external.conf"
WEB_SERVER_CUSTOM_CONFIG_FILE="${WEB_SERVER_CONFIG_DIRECTORY}/external.conf"
PIHOLE_INSTALL_LOG_FILE="${PIHOLE_DIRECTORY}/install.log"
PIHOLE_RAW_BLOCKLIST_FILES="${PIHOLE_DIRECTORY}/list.*"
@@ -124,6 +117,8 @@ get_ftl_conf_value() {
PIHOLE_GRAVITY_DB_FILE="$(get_ftl_conf_value "GRAVITYDB" "${PIHOLE_DIRECTORY}/gravity.db")"
PIHOLE_FTL_DB_FILE="$(get_ftl_conf_value "DBFILE" "${PIHOLE_DIRECTORY}/pihole-FTL.db")"
PIHOLE_COMMAND="${BIN_DIRECTORY}/pihole"
PIHOLE_COLTABLE_FILE="${BIN_DIRECTORY}/COL_TABLE"
@@ -138,7 +133,10 @@ PIHOLE_FTL_LOG="$(get_ftl_conf_value "LOGFILE" "${LOG_DIRECTORY}/pihole-FTL.log"
PIHOLE_WEB_SERVER_ACCESS_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/access.log"
PIHOLE_WEB_SERVER_ERROR_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/error.log"
# An array of operating system "pretty names" that we officialy support
RESOLVCONF="${ETC}/resolv.conf"
DNSMASQ_CONF="${ETC}/dnsmasq.conf"
# An array of operating system "pretty names" that we officially support
# We can loop through the array at any time to see if it matches a value
#SUPPORTED_OS=("Raspbian" "Ubuntu" "Fedora" "Debian" "CentOS")
@@ -162,15 +160,14 @@ PIHOLE_PROCESSES=( "lighttpd" "pihole-FTL" )
# Store the required directories in an array so it can be parsed through
REQUIRED_FILES=("${PIHOLE_CRON_FILE}"
"${PIHOLE_DNS_CONFIG_FILE}"
"${PIHOLE_DHCP_CONFIG_FILE}"
"${PIHOLE_WILDCARD_CONFIG_FILE}"
"${WEB_SERVER_CONFIG_FILE}"
"${WEB_SERVER_CUSTOM_CONFIG_FILE}"
"${PIHOLE_INSTALL_LOG_FILE}"
"${PIHOLE_RAW_BLOCKLIST_FILES}"
"${PIHOLE_LOCAL_HOSTS_FILE}"
"${PIHOLE_LOGROTATE_FILE}"
"${PIHOLE_SETUP_VARS_FILE}"
"${PIHOLE_FTL_CONF_FILE}"
"${PIHOLE_COMMAND}"
"${PIHOLE_COLTABLE_FILE}"
"${FTL_PID}"
@@ -180,7 +177,9 @@ REQUIRED_FILES=("${PIHOLE_CRON_FILE}"
"${PIHOLE_DEBUG_LOG}"
"${PIHOLE_FTL_LOG}"
"${PIHOLE_WEB_SERVER_ACCESS_LOG_FILE}"
"${PIHOLE_WEB_SERVER_ERROR_LOG_FILE}")
"${PIHOLE_WEB_SERVER_ERROR_LOG_FILE}"
"${RESOLVCONF}"
"${DNSMASQ_CONF}")
DISCLAIMER="This process collects information from your Pi-hole, and optionally uploads it to a unique and random directory on tricorder.pi-hole.net.
@@ -230,6 +229,7 @@ copy_to_debug_log() {
}
initialize_debug() {
local system_uptime
# Clear the screen so the debug log is readable
clear
show_disclaimer
@@ -237,9 +237,13 @@ initialize_debug() {
log_write "${COL_PURPLE}*** [ INITIALIZING ]${COL_NC}"
# Timestamp the start of the log
log_write "${INFO} $(date "+%Y-%m-%d:%H:%M:%S") debug log has been initialized."
# Uptime of the system
# credits to https://stackoverflow.com/questions/28353409/bash-format-uptime-to-show-days-hours-minutes
system_uptime=$(uptime | awk -F'( |,|:)+' '{if ($7=="min") m=$6; else {if ($7~/^day/){if ($9=="min") {d=$6;m=$8} else {d=$6;h=$8;m=$9}} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes"}')
log_write "${INFO} System has been running for ${system_uptime}"
}
# This is a function for visually displaying the curent test that is being run.
# This is a function for visually displaying the current test that is being run.
# Accepts one variable: the name of what is being diagnosed
# Colors do not show in the dasboard, but the icons do: [i], [✓], and [✗]
echo_current_diagnostic() {
@@ -296,11 +300,15 @@ compare_local_version_to_git_version() {
log_write "${INFO} ${pihole_component}: ${COL_YELLOW}${remote_version:-Untagged}${COL_NC} (${FAQ_UPDATE_PI_HOLE})"
fi
# Print the repo upstreams
remotes=$(git remote -v)
log_write "${INFO} Remotes: ${remotes//$'\n'/'\n '}"
# If the repo is on the master branch, they are on the stable codebase
if [[ "${remote_branch}" == "master" ]]; then
# so the color of the text is green
log_write "${INFO} Branch: ${COL_GREEN}${remote_branch}${COL_NC}"
# If it is any other branch, they are in a developement branch
# If it is any other branch, they are in a development branch
else
# So show that in yellow, signifying it's something to take a look at, but not a critical error
log_write "${INFO} Branch: ${COL_YELLOW}${remote_branch:-Detached}${COL_NC} (${FAQ_CHECKOUT_COMMAND})"
@@ -325,7 +333,17 @@ compare_local_version_to_git_version() {
return 1
fi
else
:
# There is no git directory so check if the web interface was disabled
local setup_vars_web_interface
setup_vars_web_interface=$(< ${PIHOLE_SETUP_VARS_FILE} grep ^INSTALL_WEB_INTERFACE | cut -d '=' -f2)
if [[ "${pihole_component}" == "Web" ]] && [[ "${setup_vars_web_interface}" == "false" ]]; then
log_write "${INFO} ${pihole_component}: Disabled in setupVars.conf via INSTALL_WEB_INTERFACE=false"
else
# Return an error message
log_write "${COL_RED}Directory ${git_dir} doesn't exist${COL_NC}"
# and exit with a non zero code
return 1
fi
fi
}
@@ -357,14 +375,14 @@ check_component_versions() {
get_program_version() {
local program_name="${1}"
# Create a loval variable so this function can be safely reused
# Create a local variable so this function can be safely reused
local program_version
echo_current_diagnostic "${program_name} version"
# Evalutate the program we are checking, if it is any of the ones below, show the version
# Evaluate the program we are checking, if it is any of the ones below, show the version
case "${program_name}" in
"lighttpd") program_version="$(${program_name} -v |& head -n1 | cut -d '/' -f2 | cut -d ' ' -f1)"
"lighttpd") program_version="$(${program_name} -v 2> /dev/null | head -n1 | cut -d '/' -f2 | cut -d ' ' -f1)"
;;
"php") program_version="$(${program_name} -v |& head -n1 | cut -d '-' -f1 | cut -d ' ' -f2)"
"php") program_version="$(${program_name} -v 2> /dev/null | head -n1 | cut -d '-' -f1 | cut -d ' ' -f2)"
;;
# If a match is not found, show an error
*) echo "Unrecognized program";
@@ -387,53 +405,58 @@ check_critical_program_versions() {
get_program_version "php"
}
is_os_supported() {
local os_to_check="${1}"
# Strip just the base name of the system using sed
# shellcheck disable=SC2001
the_os=$(echo "${os_to_check}" | sed 's/ .*//')
# If the variable is one of our supported OSes,
case "${the_os}" in
# Print it in green
"Raspbian") log_write "${TICK} ${COL_GREEN}${os_to_check}${COL_NC}";;
"Ubuntu") log_write "${TICK} ${COL_GREEN}${os_to_check}${COL_NC}";;
"Fedora") log_write "${TICK} ${COL_GREEN}${os_to_check}${COL_NC}";;
"Debian") log_write "${TICK} ${COL_GREEN}${os_to_check}${COL_NC}";;
"CentOS") log_write "${TICK} ${COL_GREEN}${os_to_check}${COL_NC}";;
# If not, show it in red and link to our software requirements page
*) log_write "${CROSS} ${COL_RED}${os_to_check}${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS})";
esac
}
os_check() {
# This function gets a list of supported OS versions from a TXT record at versions.pi-hole.net
# and determines whether or not the script is running on one of those systems
local remote_os_domain valid_os valid_version detected_os detected_version cmdResult digReturnCode response
remote_os_domain=${OS_CHECK_DOMAIN_NAME:-"versions.pi-hole.net"}
get_distro_attributes() {
# Put the current Internal Field Separator into another variable so it can be restored later
OLD_IFS="$IFS"
# Store the distro info in an array and make it global since the OS won't change,
# but we'll keep it within the function for better unit testing
local distro_info
#shellcheck disable=SC2016
IFS=$'\r\n' command eval 'distro_info=( $(cat /etc/*release) )'
detected_os=$(grep "\bID\b" /etc/os-release | cut -d '=' -f2 | tr -d '"')
detected_version=$(grep VERSION_ID /etc/os-release | cut -d '=' -f2 | tr -d '"')
# Set a named variable for better readability
local distro_attribute
# For each line found in an /etc/*release file,
for distro_attribute in "${distro_info[@]}"; do
# store the key in a variable
local pretty_name_key
pretty_name_key=$(echo "${distro_attribute}" | grep "PRETTY_NAME" | cut -d '=' -f1)
# we need just the OS PRETTY_NAME,
if [[ "${pretty_name_key}" == "PRETTY_NAME" ]]; then
# so save in in a variable when we find it
PRETTY_NAME_VALUE=$(echo "${distro_attribute}" | grep "PRETTY_NAME" | cut -d '=' -f2- | tr -d '"')
# then pass it as an argument that checks if the OS is supported
is_os_supported "${PRETTY_NAME_VALUE}"
else
# Since we only need the pretty name, we can just skip over anything that is not a match
:
cmdResult="$(dig +short -t txt "${remote_os_domain}" @ns1.pi-hole.net 2>&1; echo $?)"
#Get the return code of the previous command (last line)
digReturnCode="${cmdResult##*$'\n'}"
# Extract dig response
response="${cmdResult%%$'\n'*}"
IFS=" " read -r -a supportedOS < <(echo "${response}" | tr -d '"')
for distro_and_versions in "${supportedOS[@]}"
do
distro_part="${distro_and_versions%%=*}"
versions_part="${distro_and_versions##*=}"
if [[ "${detected_os^^}" =~ ${distro_part^^} ]]; then
valid_os=true
IFS="," read -r -a supportedVer <<<"${versions_part}"
for version in "${supportedVer[@]}"
do
if [[ "${detected_version}" =~ $version ]]; then
valid_version=true
break
fi
done
# Set the IFS back to what it was
IFS="$OLD_IFS"
break
fi
done
log_write "${INFO} dig return code: ${digReturnCode}"
log_write "${INFO} dig response: ${response}"
if [ "$valid_os" = true ]; then
log_write "${TICK} Distro: ${COL_GREEN}${detected_os^}${COL_NC}"
if [ "$valid_version" = true ]; then
log_write "${TICK} Version: ${COL_GREEN}${detected_version}${COL_NC}"
else
log_write "${CROSS} Version: ${COL_RED}${detected_version}${COL_NC}"
log_write "${CROSS} Error: ${COL_RED}${detected_os^} is supported but version ${detected_version} is currently unsupported (${FAQ_HARDWARE_REQUIREMENTS})${COL_NC}"
fi
else
log_write "${CROSS} Distro: ${COL_RED}${detected_os^}${COL_NC}"
log_write "${CROSS} Error: ${COL_RED}${detected_os^} is not a supported distro (${FAQ_HARDWARE_REQUIREMENTS})${COL_NC}"
fi
}
diagnose_operating_system() {
@@ -445,7 +468,7 @@ diagnose_operating_system() {
# If there is a /etc/*release file, it's probably a supported operating system, so we can
if ls /etc/*release 1> /dev/null 2>&1; then
# display the attributes to the user from the function made earlier
get_distro_attributes
os_check
else
# If it doesn't exist, it's not a system we currently support and link to FAQ
log_write "${CROSS} ${COL_RED}${error_msg}${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS})"
@@ -482,6 +505,58 @@ check_selinux() {
fi
}
check_firewalld() {
# FirewallD ships by default on Fedora/CentOS/RHEL and enabled upon clean install
# FirewallD is not configured by the installer and is the responsibility of the user
echo_current_diagnostic "FirewallD"
# Check if FirewallD service is enabled
if command -v systemctl &> /dev/null; then
# get its status via systemctl
local firewalld_status
firewalld_status=$(systemctl is-active firewalld)
log_write "${INFO} ${COL_GREEN}Firewalld service ${firewalld_status}${COL_NC}";
if [ "${firewalld_status}" == "active" ]; then
# test common required service ports
local firewalld_enabled_services
firewalld_enabled_services=$(firewall-cmd --list-services)
local firewalld_expected_services=("http" "dns" "dhcp" "dhcpv6")
for i in "${firewalld_expected_services[@]}"; do
if [[ "${firewalld_enabled_services}" =~ ${i} ]]; then
log_write "${TICK} ${COL_GREEN} Allow Service: ${i}${COL_NC}";
else
log_write "${CROSS} ${COL_RED} Allow Service: ${i}${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS_FIREWALLD})"
fi
done
# check for custom FTL FirewallD zone
local firewalld_zones
firewalld_zones=$(firewall-cmd --get-zones)
if [[ "${firewalld_zones}" =~ "ftl" ]]; then
log_write "${TICK} ${COL_GREEN}FTL Custom Zone Detected${COL_NC}";
# check FTL custom zone interface: lo
local firewalld_ftl_zone_interfaces
firewalld_ftl_zone_interfaces=$(firewall-cmd --zone=ftl --list-interfaces)
if [[ "${firewalld_ftl_zone_interfaces}" =~ "lo" ]]; then
log_write "${TICK} ${COL_GREEN} Local Interface Detected${COL_NC}";
else
log_write "${CROSS} ${COL_RED} Local Interface Not Detected${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS_FIREWALLD})"
fi
# check FTL custom zone port: 4711
local firewalld_ftl_zone_ports
firewalld_ftl_zone_ports=$(firewall-cmd --zone=ftl --list-ports)
if [[ "${firewalld_ftl_zone_ports}" =~ "4711/tcp" ]]; then
log_write "${TICK} ${COL_GREEN} FTL Port 4711/tcp Detected${COL_NC}";
else
log_write "${CROSS} ${COL_RED} FTL Port 4711/tcp Not Detected${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS_FIREWALLD})"
fi
else
log_write "${CROSS} ${COL_RED}FTL Custom Zone Not Detected${COL_NC} (${FAQ_HARDWARE_REQUIREMENTS_FIREWALLD})"
fi
fi
else
log_write "${TICK} ${COL_GREEN}Firewalld service not detected${COL_NC}";
fi
}
processor_check() {
echo_current_diagnostic "Processor"
# Store the processor type in a variable
@@ -494,7 +569,7 @@ processor_check() {
else
# Check if the architecture is currently supported for FTL
case "${PROCESSOR}" in
"amd64") log_write "${TICK} ${COL_GREEN}${PROCESSOR}${COL_NC}"
"amd64" | "x86_64") log_write "${TICK} ${COL_GREEN}${PROCESSOR}${COL_NC}"
;;
"armv6l") log_write "${TICK} ${COL_GREEN}${PROCESSOR}${COL_NC}"
;;
@@ -529,43 +604,11 @@ parse_locale() {
parse_file "${pihole_locale}"
}
does_ip_match_setup_vars() {
# Check for IPv4 or 6
local protocol="${1}"
# IP address to check for
local ip_address="${2}"
# See what IP is in the setupVars.conf file
local setup_vars_ip
setup_vars_ip=$(< ${PIHOLE_SETUP_VARS_FILE} grep IPV"${protocol}"_ADDRESS | cut -d '=' -f2)
# If it's an IPv6 address
if [[ "${protocol}" == "6" ]]; then
# Strip off the / (CIDR notation)
if [[ "${ip_address%/*}" == "${setup_vars_ip%/*}" ]]; then
# if it matches, show it in green
log_write " ${COL_GREEN}${ip_address%/*}${COL_NC} matches the IP found in ${PIHOLE_SETUP_VARS_FILE}"
else
# otherwise show it in red with an FAQ URL
log_write " ${COL_RED}${ip_address%/*}${COL_NC} does not match the IP found in ${PIHOLE_SETUP_VARS_FILE} (${FAQ_ULA})"
fi
else
# if the protocol isn't 6, it's 4 so no need to strip the CIDR notation
# since it exists in the setupVars.conf that way
if [[ "${ip_address}" == "${setup_vars_ip}" ]]; then
# show in green if it matches
log_write " ${COL_GREEN}${ip_address}${COL_NC} matches the IP found in ${PIHOLE_SETUP_VARS_FILE}"
else
# otherwise show it in red
log_write " ${COL_RED}${ip_address}${COL_NC} does not match the IP found in ${PIHOLE_SETUP_VARS_FILE} (${FAQ_ULA})"
fi
fi
}
detect_ip_addresses() {
# First argument should be a 4 or a 6
local protocol=${1}
# Use ip to show the addresses for the chosen protocol
# Store the values in an arry so they can be looped through
# Store the values in an array so they can be looped through
# Get the lines that are in the file(s) and store them in an array for parsing later
mapfile -t ip_addr_list < <(ip -"${protocol}" addr show dev "${PIHOLE_INTERFACE}" | awk -F ' ' '{ for(i=1;i<=NF;i++) if ($i ~ '/^inet/') print $(i+1) }')
@@ -577,8 +620,7 @@ detect_ip_addresses() {
log_write "${TICK} IPv${protocol} address(es) bound to the ${PIHOLE_INTERFACE} interface:"
# Since there may be more than one IP address, store them in an array
for i in "${!ip_addr_list[@]}"; do
# For each one in the list, print it out
does_ip_match_setup_vars "${protocol}" "${ip_addr_list[$i]}"
log_write " ${ip_addr_list[$i]}"
done
# Print a blank line just for formatting
log_write ""
@@ -587,13 +629,6 @@ detect_ip_addresses() {
log_write "${CROSS} ${COL_RED}No IPv${protocol} address(es) found on the ${PIHOLE_INTERFACE}${COL_NC} interface.\\n"
return 1
fi
# If the protocol is v6
if [[ "${protocol}" == "6" ]]; then
# let the user know that as long as there is one green address, things should be ok
log_write " ^ Please note that you may have more than one IP address listed."
log_write " As long as one of them is green, and it matches what is in ${PIHOLE_SETUP_VARS_FILE}, there is no need for concern.\\n"
log_write " The link to the FAQ is for an issue that sometimes occurs when the IPv6 address changes, which is why we check for it.\\n"
fi
}
ping_ipv4_or_ipv6() {
@@ -619,7 +654,7 @@ ping_gateway() {
# Check if we are using IPv4 or IPv6
# Find the default gateway using IPv4 or IPv6
local gateway
gateway="$(ip -"${protocol}" route | grep default | cut -d ' ' -f 3)"
gateway="$(ip -"${protocol}" route | grep default | grep "${PIHOLE_INTERFACE}" | cut -d ' ' -f 3)"
# If the gateway variable has a value (meaning a gateway was found),
if [[ -n "${gateway}" ]]; then
@@ -742,36 +777,20 @@ check_x_headers() {
# server is operating correctly
echo_current_diagnostic "Dashboard and block page"
# Use curl -I to get the header and parse out just the X-Pi-hole one
local block_page
block_page=$(curl -Is localhost | awk '/X-Pi-hole/' | tr -d '\r')
# Do it for the dashboard as well, as the header is different than above
local dashboard
dashboard=$(curl -Is localhost/admin/ | awk '/X-Pi-hole/' | tr -d '\r')
# Store what the X-Header shoud be in variables for comparision later
local block_page_working
block_page_working="X-Pi-hole: A black hole for Internet advertisements."
# Store what the X-Header should be in variables for comparison later
local dashboard_working
dashboard_working="X-Pi-hole: The Pi-hole Web interface is working!"
local full_curl_output_block_page
full_curl_output_block_page="$(curl -Is localhost)"
local full_curl_output_dashboard
full_curl_output_dashboard="$(curl -Is localhost/admin/)"
# If the X-header found by curl matches what is should be,
if [[ $block_page == "$block_page_working" ]]; then
# display a success message
log_write "$TICK Block page X-Header: ${COL_GREEN}${block_page}${COL_NC}"
else
# Otherwise, show an error
log_write "$CROSS Block page X-Header: ${COL_RED}X-Header does not match or could not be retrieved.${COL_NC}"
log_write "${COL_RED}${full_curl_output_block_page}${COL_NC}"
fi
# Same logic applies to the dashbord as above, if the X-Header matches what a working system shoud have,
# Same logic applies to the dashboard as above, if the X-Header matches what a working system should have,
if [[ $dashboard == "$dashboard_working" ]]; then
# then we can show a success
log_write "$TICK Web interface X-Header: ${COL_GREEN}${dashboard}${COL_NC}"
else
# Othewise, it's a failure since the X-Headers either don't exist or have been modified in some way
# Otherwise, it's a failure since the X-Headers either don't exist or have been modified in some way
log_write "$CROSS Web interface X-Header: ${COL_RED}X-Header does not match or could not be retrieved.${COL_NC}"
log_write "${COL_RED}${full_curl_output_dashboard}${COL_NC}"
fi
@@ -783,13 +802,13 @@ dig_at() {
# Store the arguments as variables with names
local protocol="${1}"
local IP="${2}"
echo_current_diagnostic "Name resolution (IPv${protocol}) using a random blocked domain and a known ad-serving domain"
# Set more local variables
# We need to test name resolution locally, via Pi-hole, and via a public resolver
local local_dig
local pihole_dig
local remote_dig
local interfaces
local addresses
# Use a static domain that we know has IPv4 and IPv6 to avoid false positives
# Sometimes the randomly chosen domains don't use IPv6, or something else is wrong with them
local remote_url="doubleclick.com"
@@ -798,15 +817,15 @@ dig_at() {
if [[ ${protocol} == "6" ]]; then
# Set the IPv6 variables and record type
local local_address="::1"
local pihole_address="${IP}"
local remote_address="2001:4860:4860::8888"
local sed_selector="inet6"
local record_type="AAAA"
# Othwerwise, it should be 4
# Otherwise, it should be 4
else
# so use the IPv4 values
local local_address="127.0.0.1"
local pihole_address="${IP}"
local remote_address="8.8.8.8"
local sed_selector="inet"
local record_type="A"
fi
@@ -816,32 +835,55 @@ dig_at() {
local random_url
random_url=$(sqlite3 "${PIHOLE_GRAVITY_DB_FILE}" "SELECT domain FROM vw_gravity ORDER BY RANDOM() LIMIT 1")
# First, do a dig on localhost to see if Pi-hole can use itself to block a domain
if local_dig=$(dig +tries=1 +time=2 -"${protocol}" "${random_url}" @${local_address} +short "${record_type}"); then
# If it can, show sucess
log_write "${TICK} ${random_url} ${COL_GREEN}is ${local_dig}${COL_NC} via ${COL_CYAN}localhost$COL_NC (${local_address})"
else
# Otherwise, show a failure
log_write "${CROSS} ${COL_RED}Failed to resolve${COL_NC} ${random_url} via ${COL_RED}localhost${COL_NC} (${local_address})"
fi
# Next we need to check if Pi-hole can resolve a domain when the query is sent to it's IP address
# This better emulates how clients will interact with Pi-hole as opposed to above where Pi-hole is
# just asing itself locally
# The default timeouts and tries are reduced in case the DNS server isn't working, so the user isn't waiting for too long
# The default timeouts and tries are reduced in case the DNS server isn't working, so the user isn't
# waiting for too long
#
# Turn off history expansion such that the "!" in the sed command cannot do silly things
set +H
# Get interfaces
# sed logic breakdown:
# / master /d;
# Removes all interfaces that are slaves of others (e.g. virtual docker interfaces)
# /UP/!d;
# Removes all interfaces which are not UP
# s/^[0-9]*: //g;
# Removes interface index
# s/: <.*//g;
# Removes everything after the interface name
interfaces="$(ip link show | sed "/ master /d;/UP/!d;s/^[0-9]*: //g;s/: <.*//g;")"
# If Pi-hole can dig itself from it's IP (not the loopback address)
if pihole_dig=$(dig +tries=1 +time=2 -"${protocol}" "${random_url}" @"${pihole_address}" +short "${record_type}"); then
# show a success
log_write "${TICK} ${random_url} ${COL_GREEN}is ${pihole_dig}${COL_NC} via ${COL_CYAN}Pi-hole${COL_NC} (${pihole_address})"
while IFS= read -r iface ; do
# Get addresses of current interface
# sed logic breakdown:
# /inet(|6) /!d;
# Removes all lines from ip a that do not contain either "inet " or "inet6 "
# s/^.*inet(|6) //g;
# Removes all leading whitespace as well as the "inet " or "inet6 " string
# s/\/.*$//g;
# Removes CIDR and everything thereafter (e.g., scope properties)
addresses="$(ip address show dev "${iface}" | sed "/${sed_selector} /!d;s/^.*${sed_selector} //g;s/\/.*$//g;")"
if [ -n "${addresses}" ]; then
while IFS= read -r local_address ; do
# Check if Pi-hole can use itself to block a domain
if local_dig=$(dig +tries=1 +time=2 -"${protocol}" "${random_url}" @"${local_address}" +short "${record_type}"); then
# If it can, show success
log_write "${TICK} ${random_url} ${COL_GREEN}is ${local_dig}${COL_NC} on ${COL_CYAN}${iface}${COL_NC} (${COL_CYAN}${local_address}${COL_NC})"
else
# Othewise, show a failure
log_write "${CROSS} ${COL_RED}Failed to resolve${COL_NC} ${random_url} via ${COL_RED}Pi-hole${COL_NC} (${pihole_address})"
# Otherwise, show a failure
log_write "${CROSS} ${COL_RED}Failed to resolve${COL_NC} ${random_url} on ${COL_RED}${iface}${COL_NC} (${COL_RED}${local_address}${COL_NC})"
fi
done <<< "${addresses}"
else
log_write "${TICK} No IPv${protocol} address available on ${COL_CYAN}${iface}${COL_NC}"
fi
done <<< "${interfaces}"
# Finally, we need to make sure legitimate queries can out to the Internet using an external, public DNS server
# We are using the static remote_url here instead of a random one because we know it works with IPv4 and IPv6
if remote_dig=$(dig +tries=1 +time=2 -"${protocol}" "${remote_url}" @${remote_address} +short "${record_type}" | head -n1); then
if remote_dig=$(dig +tries=1 +time=2 -"${protocol}" "${remote_url}" @"${remote_address}" +short "${record_type}" | head -n1); then
# If successful, the real IP of the domain will be returned instead of Pi-hole's IP
log_write "${TICK} ${remote_url} ${COL_GREEN}is ${remote_dig}${COL_NC} via ${COL_CYAN}a remote, public DNS server${COL_NC} (${remote_address})"
else
@@ -882,6 +924,18 @@ process_status(){
done
}
ftl_full_status(){
# if using systemd print the full status of pihole-FTL
echo_current_diagnostic "Pi-hole-FTL full status"
local FTL_status
if command -v systemctl &> /dev/null; then
FTL_status=$(systemctl status --full --no-pager pihole-FTL.service)
log_write " ${FTL_status}"
else
log_write "${INFO} systemctl: command not found"
fi
}
make_array_from_file() {
local filename="${1}"
# The second argument can put a limit on how many line should be read from the file
@@ -899,7 +953,7 @@ make_array_from_file() {
# Otherwise, read the file line by line
while IFS= read -r line;do
# Othwerise, strip out comments and blank lines
new_line=$(echo "${line}" | sed -e 's/#.*$//' -e '/^$/d')
new_line=$(echo "${line}" | sed -e 's/^\s*#.*$//' -e '/^$/d')
# If the line still has content (a non-zero value)
if [[ -n "${new_line}" ]]; then
# Put it into the array
@@ -944,7 +998,7 @@ parse_file() {
local file_lines
# For each line in the file,
for file_lines in "${file_info[@]}"; do
if [[ ! -z "${file_lines}" ]]; then
if [[ -n "${file_lines}" ]]; then
# don't include the Web password hash
[[ "${file_lines}" =~ ^\#.*$ || ! "${file_lines}" || "${file_lines}" == "WEBPASSWORD="* ]] && continue
# otherwise, display the lines of the file
@@ -956,20 +1010,16 @@ parse_file() {
}
check_name_resolution() {
# Check name resoltion from localhost, Pi-hole's IP, and Google's name severs
# Check name resolution from localhost, Pi-hole's IP, and Google's name severs
# using the function we created earlier
dig_at 4 "${IPV4_ADDRESS%/*}"
# If IPv6 enabled,
if [[ "${IPV6_ADDRESS}" ]]; then
# check resolution
dig_at 6 "${IPV6_ADDRESS%/*}"
fi
dig_at 4
dig_at 6
}
# This function can check a directory exists
# Pi-hole has files in several places, so we will reuse this function
dir_check() {
# Set the first argument passed to tihs function as a named variable for better readability
# Set the first argument passed to this function as a named variable for better readability
local directory="${1}"
# Display the current test that is running
echo_current_diagnostic "contents of ${COL_CYAN}${directory}${COL_NC}"
@@ -987,14 +1037,14 @@ dir_check() {
}
list_files_in_dir() {
# Set the first argument passed to tihs function as a named variable for better readability
# Set the first argument passed to this function as a named variable for better readability
local dir_to_parse="${1}"
# Store the files found in an array
mapfile -t files_found < <(ls "${dir_to_parse}")
# For each file in the array,
for each_file in "${files_found[@]}"; do
if [[ -d "${dir_to_parse}/${each_file}" ]]; then
# If it's a directoy, do nothing
# If it's a directory, do nothing
:
elif [[ "${dir_to_parse}/${each_file}" == "${PIHOLE_DEBUG_LOG}" ]] || \
[[ "${dir_to_parse}/${each_file}" == "${PIHOLE_RAW_BLOCKLIST_FILES}" ]] || \
@@ -1006,17 +1056,21 @@ list_files_in_dir() {
:
elif [[ "${dir_to_parse}" == "${SHM_DIRECTORY}" ]]; then
# SHM file - we do not want to see the content, but we want to see the files and their sizes
log_write "$(ls -ld "${dir_to_parse}"/"${each_file}")"
log_write "$(ls -lhd "${dir_to_parse}"/"${each_file}")"
elif [[ "${dir_to_parse}" == "${DNSMASQ_D_DIRECTORY}" ]]; then
# in case of the dnsmasq directory inlcuede all files in the debug output
log_write "\\n${COL_GREEN}$(ls -lhd "${dir_to_parse}"/"${each_file}")${COL_NC}"
make_array_from_file "${dir_to_parse}/${each_file}"
else
# Then, parse the file's content into an array so each line can be analyzed if need be
for i in "${!REQUIRED_FILES[@]}"; do
if [[ "${dir_to_parse}/${each_file}" == "${REQUIRED_FILES[$i]}" ]]; then
# display the filename
log_write "\\n${COL_GREEN}$(ls -ld "${dir_to_parse}"/"${each_file}")${COL_NC}"
log_write "\\n${COL_GREEN}$(ls -lhd "${dir_to_parse}"/"${each_file}")${COL_NC}"
# Check if the file we want to view has a limit (because sometimes we just need a little bit of info from the file, not the entire thing)
case "${dir_to_parse}/${each_file}" in
# If it's Web server error log, just give the first 25 lines
"${PIHOLE_WEB_SERVER_ERROR_LOG_FILE}") make_array_from_file "${dir_to_parse}/${each_file}" 25
# If it's Web server error log, give the first and last 25 lines
"${PIHOLE_WEB_SERVER_ERROR_LOG_FILE}") head_tail_log "${dir_to_parse}/${each_file}" 25
;;
# Same for the FTL log
"${PIHOLE_FTL_LOG}") head_tail_log "${dir_to_parse}/${each_file}" 35
@@ -1051,6 +1105,7 @@ show_content_of_pihole_files() {
show_content_of_files_in_dir "${WEB_SERVER_LOG_DIRECTORY}"
show_content_of_files_in_dir "${LOG_DIRECTORY}"
show_content_of_files_in_dir "${SHM_DIRECTORY}"
show_content_of_files_in_dir "${ETC}"
}
head_tail_log() {
@@ -1106,27 +1161,71 @@ show_db_entries() {
IFS="$OLD_IFS"
}
show_FTL_db_entries() {
local title="${1}"
local query="${2}"
local widths="${3}"
echo_current_diagnostic "${title}"
OLD_IFS="$IFS"
IFS=$'\r\n'
local entries=()
mapfile -t entries < <(\
sqlite3 "${PIHOLE_FTL_DB_FILE}" \
-cmd ".headers on" \
-cmd ".mode column" \
-cmd ".width ${widths}" \
"${query}"\
)
for line in "${entries[@]}"; do
log_write " ${line}"
done
IFS="$OLD_IFS"
}
check_dhcp_servers() {
echo_current_diagnostic "Discovering active DHCP servers (takes 10 seconds)"
OLD_IFS="$IFS"
IFS=$'\n'
local entries=()
mapfile -t entries < <(pihole-FTL dhcp-discover)
for line in "${entries[@]}"; do
log_write " ${line}"
done
IFS="$OLD_IFS"
}
show_groups() {
show_db_entries "Groups" "SELECT id,CASE enabled WHEN '0' THEN ' 0' WHEN '1' THEN ' 1' ELSE enabled END enabled,name,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,description FROM \"group\"" "4 7 50 19 19 50"
}
show_adlists() {
show_db_entries "Adlists" "SELECT id,CASE enabled WHEN '0' THEN ' 0' WHEN '1' THEN ' 1' ELSE enabled END enabled,GROUP_CONCAT(adlist_by_group.group_id) group_ids,address,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,comment FROM adlist LEFT JOIN adlist_by_group ON adlist.id = adlist_by_group.adlist_id GROUP BY id;" "4 7 12 100 19 19 50"
show_db_entries "Adlists" "SELECT id,CASE enabled WHEN '0' THEN ' 0' WHEN '1' THEN ' 1' ELSE enabled END enabled,GROUP_CONCAT(adlist_by_group.group_id) group_ids,address,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,comment FROM adlist LEFT JOIN adlist_by_group ON adlist.id = adlist_by_group.adlist_id GROUP BY id;" "5 7 12 100 19 19 50"
}
show_domainlist() {
show_db_entries "Domainlist (0/1 = exact white-/blacklist, 2/3 = regex white-/blacklist)" "SELECT id,CASE type WHEN '0' THEN '0 ' WHEN '1' THEN ' 1 ' WHEN '2' THEN ' 2 ' WHEN '3' THEN ' 3' ELSE type END type,CASE enabled WHEN '0' THEN ' 0' WHEN '1' THEN ' 1' ELSE enabled END enabled,GROUP_CONCAT(domainlist_by_group.group_id) group_ids,domain,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,comment FROM domainlist LEFT JOIN domainlist_by_group ON domainlist.id = domainlist_by_group.domainlist_id GROUP BY id;" "4 4 7 12 100 19 19 50"
show_db_entries "Domainlist (0/1 = exact white-/blacklist, 2/3 = regex white-/blacklist)" "SELECT id,CASE type WHEN '0' THEN '0 ' WHEN '1' THEN ' 1 ' WHEN '2' THEN ' 2 ' WHEN '3' THEN ' 3' ELSE type END type,CASE enabled WHEN '0' THEN ' 0' WHEN '1' THEN ' 1' ELSE enabled END enabled,GROUP_CONCAT(domainlist_by_group.group_id) group_ids,domain,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,comment FROM domainlist LEFT JOIN domainlist_by_group ON domainlist.id = domainlist_by_group.domainlist_id GROUP BY id;" "5 4 7 12 100 19 19 50"
}
show_clients() {
show_db_entries "Clients" "SELECT id,GROUP_CONCAT(client_by_group.group_id) group_ids,ip,datetime(date_added,'unixepoch','localtime') date_added,datetime(date_modified,'unixepoch','localtime') date_modified,comment FROM client LEFT JOIN client_by_group ON client.id = client_by_group.client_id GROUP BY id;" "4 12 100 19 19 50"
}
show_messages() {
show_FTL_db_entries "Pi-hole diagnosis messages" "SELECT id,datetime(timestamp,'unixepoch','localtime') timestamp,type,message,blob1,blob2,blob3,blob4,blob5 FROM message;" "4 19 20 60 20 20 20 20 20"
}
analyze_gravity_list() {
echo_current_diagnostic "Gravity List and Database"
echo_current_diagnostic "Gravity Database"
local gravity_permissions
gravity_permissions=$(ls -ld "${PIHOLE_GRAVITY_DB_FILE}")
gravity_permissions=$(ls -lhd "${PIHOLE_GRAVITY_DB_FILE}")
log_write "${COL_GREEN}${gravity_permissions}${COL_NC}"
show_db_entries "Info table" "SELECT property,value FROM info" "20 40"
@@ -1149,72 +1248,88 @@ analyze_gravity_list() {
IFS="$OLD_IFS"
}
analyze_pihole_log() {
echo_current_diagnostic "Pi-hole log"
local head_line
# Put the current Internal Field Separator into another variable so it can be restored later
OLD_IFS="$IFS"
# Get the lines that are in the file(s) and store them in an array for parsing later
IFS=$'\r\n'
local pihole_log_permissions
pihole_log_permissions=$(ls -ld "${PIHOLE_LOG}")
log_write "${COL_GREEN}${pihole_log_permissions}${COL_NC}"
local pihole_log_head=()
mapfile -t pihole_log_head < <(head -n 20 ${PIHOLE_LOG})
log_write " ${COL_CYAN}-----head of $(basename ${PIHOLE_LOG})------${COL_NC}"
obfuscated_pihole_log() {
local pihole_log=("$@")
local line
local error_to_check_for
local line_to_obfuscate
local obfuscated_line
for head_line in "${pihole_log_head[@]}"; do
for line in "${pihole_log[@]}"; do
# A common error in the pihole.log is when there is a non-hosts formatted file
# that the DNS server is attempting to read. Since it's not formatted
# correctly, there will be an entry for "bad address at line n"
# So we can check for that here and highlight it in red so the user can see it easily
error_to_check_for=$(echo "${head_line}" | grep 'bad address at')
error_to_check_for=$(echo "${line}" | grep 'bad address at')
# Some users may not want to have the domains they visit sent to us
# To that end, we check for lines in the log that would contain a domain name
line_to_obfuscate=$(echo "${head_line}" | grep ': query\|: forwarded\|: reply')
line_to_obfuscate=$(echo "${line}" | grep ': query\|: forwarded\|: reply')
# If the variable contains a value, it found an error in the log
if [[ -n ${error_to_check_for} ]]; then
# So we can print it in red to make it visible to the user
log_write " ${CROSS} ${COL_RED}${head_line}${COL_NC} (${FAQ_BAD_ADDRESS})"
log_write " ${CROSS} ${COL_RED}${line}${COL_NC} (${FAQ_BAD_ADDRESS})"
else
# If the variable does not a value (the current default behavior), so do not obfuscate anything
if [[ -z ${OBFUSCATE} ]]; then
log_write " ${head_line}"
log_write " ${line}"
# Othwerise, a flag was passed to this command to obfuscate domains in the log
else
# So first check if there are domains in the log that should be obfuscated
if [[ -n ${line_to_obfuscate} ]]; then
# If there are, we need to use awk to replace only the domain name (the 6th field in the log)
# so we substitue the domain for the placeholder value
# so we substitute the domain for the placeholder value
obfuscated_line=$(echo "${line_to_obfuscate}" | awk -v placeholder="${OBFUSCATED_PLACEHOLDER}" '{sub($6,placeholder); print $0}')
log_write " ${obfuscated_line}"
else
log_write " ${head_line}"
log_write " ${line}"
fi
fi
fi
done
}
analyze_pihole_log() {
echo_current_diagnostic "Pi-hole log"
local pihole_log_head=()
local pihole_log_tail=()
local pihole_log_permissions
local logging_enabled
logging_enabled=$(grep -c "^log-queries" /etc/dnsmasq.d/01-pihole.conf)
if [[ "${logging_enabled}" == "0" ]]; then
# Inform user that logging has been disabled and pihole.log does not contain queries
log_write "${INFO} Query logging is disabled"
log_write ""
fi
# Put the current Internal Field Separator into another variable so it can be restored later
OLD_IFS="$IFS"
# Get the lines that are in the file(s) and store them in an array for parsing later
IFS=$'\r\n'
pihole_log_permissions=$(ls -lhd "${PIHOLE_LOG}")
log_write "${COL_GREEN}${pihole_log_permissions}${COL_NC}"
mapfile -t pihole_log_head < <(head -n 20 ${PIHOLE_LOG})
log_write " ${COL_CYAN}-----head of $(basename ${PIHOLE_LOG})------${COL_NC}"
obfuscated_pihole_log "${pihole_log_head[@]}"
log_write ""
mapfile -t pihole_log_tail < <(tail -n 20 ${PIHOLE_LOG})
log_write " ${COL_CYAN}-----tail of $(basename ${PIHOLE_LOG})------${COL_NC}"
obfuscated_pihole_log "${pihole_log_tail[@]}"
log_write ""
# Set the IFS back to what it was
IFS="$OLD_IFS"
}
tricorder_use_nc_or_curl() {
# Users can submit their debug logs using nc (unencrypted) or curl (encrypted) if available
# Check for curl first since encryption is a good thing
if command -v curl &> /dev/null; then
# If the command exists,
curl_to_tricorder() {
# Users can submit their debug logs using curl (encrypted)
log_write " * Using ${COL_GREEN}curl${COL_NC} for transmission."
# transmit he log via TLS and store the token returned in a variable
tricorder_token=$(curl --silent --upload-file ${PIHOLE_DEBUG_LOG} https://tricorder.pi-hole.net:${TRICORDER_SSL_PORT_NUMBER})
# Otherwise,
else
# use net cat
log_write "${INFO} Using ${COL_YELLOW}netcat${COL_NC} for transmission."
# Save the token returned by our server in a variable
tricorder_token=$(< ${PIHOLE_DEBUG_LOG} nc tricorder.pi-hole.net ${TRICORDER_NC_PORT_NUMBER})
# transmit the log via TLS and store the token returned in a variable
tricorder_token=$(curl --silent --fail --show-error --upload-file ${PIHOLE_DEBUG_LOG} https://tricorder.pi-hole.net 2>&1)
if [[ "${tricorder_token}" != "https://tricorder.pi-hole.net/"* ]]; then
log_write " * ${COL_GREEN}curl${COL_NC} failed, contact Pi-hole support for assistance."
# Log curl error (if available)
if [ -n "${tricorder_token}" ]; then
log_write " * Error message: ${COL_RED}${tricorder_token}${COL_NC}\\n"
tricorder_token=""
fi
fi
}
@@ -1233,14 +1348,13 @@ upload_to_tricorder() {
# Provide information on what they should do with their token
log_write " * The debug log can be uploaded to tricorder.pi-hole.net for sharing with developers only."
log_write " * For more information, see: ${TRICORDER_CONTEST}"
log_write " * If available, we'll use openssl to upload the log, otherwise it will fall back to netcat."
# If pihole -d is running automatically (usually throught the dashboard)
# If pihole -d is running automatically (usually through the dashboard)
if [[ "${AUTOMATED}" ]]; then
# let the user know
log_write "${INFO} Debug script running in automated mode"
# and then decide again which tool to use to submit it
tricorder_use_nc_or_curl
curl_to_tricorder
# If we're not running in automated mode,
else
echo ""
@@ -1249,9 +1363,9 @@ upload_to_tricorder() {
read -r -p "[?] Would you like to upload the log? [y/N] " response
case ${response} in
# If they say yes, run our function for uploading the log
[yY][eE][sS]|[yY]) tricorder_use_nc_or_curl;;
[yY][eE][sS]|[yY]) curl_to_tricorder;;
# If they choose no, just exit out of the script
*) log_write " * Log will ${COL_GREEN}NOT${COL_NC} be uploaded to tricorder.";exit;
*) log_write " * Log will ${COL_GREEN}NOT${COL_NC} be uploaded to tricorder.\\n * A local copy of the debug log can be found at: ${COL_CYAN}${PIHOLE_DEBUG_LOG}${COL_NC}\\n";exit;
esac
fi
# Check if tricorder.pi-hole.net is reachable and provide token
@@ -1260,15 +1374,15 @@ upload_to_tricorder() {
# Again, try to make this visually striking so the user realizes they need to do something with this information
# Namely, provide the Pi-hole devs with the token
log_write ""
log_write "${COL_PURPLE}***********************************${COL_NC}"
log_write "${COL_PURPLE}***********************************${COL_NC}"
log_write "${COL_PURPLE}*****************************************************************${COL_NC}"
log_write "${COL_PURPLE}*****************************************************************${COL_NC}\\n"
log_write "${TICK} Your debug token is: ${COL_GREEN}${tricorder_token}${COL_NC}"
log_write "${COL_PURPLE}***********************************${COL_NC}"
log_write "${COL_PURPLE}***********************************${COL_NC}"
log_write "${INFO}${COL_RED} Logs are deleted 48 hours after upload.${COL_NC}\\n"
log_write "${COL_PURPLE}*****************************************************************${COL_NC}"
log_write "${COL_PURPLE}*****************************************************************${COL_NC}"
log_write ""
log_write " * Provide the token above to the Pi-hole team for assistance at"
log_write " * ${FORUMS_URL}"
log_write " * Your log will self-destruct on our server after ${COL_RED}48 hours${COL_NC}."
log_write " * Provide the token above to the Pi-hole team for assistance at ${FORUMS_URL}"
# If no token was generated
else
# Show an error and some help instructions
@@ -1289,10 +1403,13 @@ check_component_versions
check_critical_program_versions
diagnose_operating_system
check_selinux
check_firewalld
processor_check
check_networking
check_name_resolution
check_dhcp_servers
process_status
ftl_full_status
parse_setup_vars
check_x_headers
analyze_gravity_list
@@ -1301,6 +1418,7 @@ show_domainlist
show_clients
show_adlists
show_content_of_pihole_files
show_messages
parse_locale
analyze_pihole_log
copy_to_debug_log

View File

@@ -11,6 +11,11 @@
colfile="/opt/pihole/COL_TABLE"
source ${colfile}
# In case we're running at the same time as a system logrotate, use a
# separate logrotate state file to prevent stepping on each other's
# toes.
STATEFILE="/var/lib/logrotate/pihole"
# Determine database location
# Obtain DBFILE=... setting from pihole-FTL.db
# Constructed to return nothing when
@@ -32,7 +37,7 @@ if [[ "$@" == *"once"* ]]; then
# Nightly logrotation
if command -v /usr/sbin/logrotate >/dev/null; then
# Logrotate once
/usr/sbin/logrotate --force /etc/pihole/logrotate
/usr/sbin/logrotate --force --state "${STATEFILE}" /etc/pihole/logrotate
else
# Copy pihole.log over to pihole.log.1
# and empty out pihole.log
@@ -47,8 +52,8 @@ else
# Manual flushing
if command -v /usr/sbin/logrotate >/dev/null; then
# Logrotate twice to move all data out of sight of FTL
/usr/sbin/logrotate --force /etc/pihole/logrotate; sleep 3
/usr/sbin/logrotate --force /etc/pihole/logrotate
/usr/sbin/logrotate --force --state "${STATEFILE}" /etc/pihole/logrotate; sleep 3
/usr/sbin/logrotate --force --state "${STATEFILE}" /etc/pihole/logrotate
else
# Flush both pihole.log and pihole.log.1 (if existing)
echo " " > /var/log/pihole.log

View File

@@ -1,5 +1,6 @@
#!/usr/bin/env bash
# shellcheck disable=SC1090
# Pi-hole: A black hole for Internet advertisements
# (c) 2018 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
@@ -11,12 +12,21 @@
# Globals
piholeDir="/etc/pihole"
gravityDBfile="${piholeDir}/gravity.db"
GRAVITYDB="${piholeDir}/gravity.db"
options="$*"
all=""
exact=""
blockpage=""
matchType="match"
# Source pihole-FTL from install script
pihole_FTL="${piholeDir}/pihole-FTL.conf"
if [[ -f "${pihole_FTL}" ]]; then
source "${pihole_FTL}"
fi
# Set this only after sourcing pihole-FTL.conf as the gravity database path may
# have changed
gravityDBfile="${GRAVITYDB}"
colfile="/opt/pihole/COL_TABLE"
source "${colfile}"
@@ -29,7 +39,7 @@ scanList(){
# Prevent grep from printing file path
cd "$piholeDir" || exit 1
# Prevent grep -i matching slowly: http://bit.ly/2xFXtUX
# Prevent grep -i matching slowly: https://bit.ly/2xFXtUX
export LC_CTYPE=C
# /dev/null forces filename to be printed when only one list has been generated

View File

@@ -20,7 +20,7 @@ getInitSys() {
elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
SYSTEMD=0
else
echo "Unrecognised init system"
echo "Unrecognized init system"
return 1
fi
}
@@ -70,5 +70,5 @@ setupcon
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
# https://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'

View File

@@ -95,6 +95,10 @@ main() {
# shellcheck disable=1090,2154
source "${setupVars}"
# Install packages used by this installation script (necessary if users have removed e.g. git from their systems)
package_manager_detect
install_dependent_packages "${INSTALLER_DEPS[@]}"
# This is unlikely
if ! is_repo "${PI_HOLE_FILES_DIR}" ; then
echo -e "\\n ${COL_LIGHT_RED}Error: Core Pi-hole repo is missing from system!"

View File

@@ -88,7 +88,7 @@ getRemoteVersion(){
local arrCache
cachedVersions="/etc/pihole/GitHubVersions"
#If the above file exists, then we can read from that. Prevents overuse of Github API
#If the above file exists, then we can read from that. Prevents overuse of GitHub API
if [[ -f "$cachedVersions" ]]; then
IFS=' ' read -r -a arrCache < "$cachedVersions"
case $daemon in
@@ -153,7 +153,7 @@ versionOutput() {
if [[ -n "$current" ]] && [[ -n "$latest" ]]; then
output="${1^} version is $branch$current (Latest: $latest)"
elif [[ -n "$current" ]] && [[ -z "$latest" ]]; then
output="Current ${1^} version is $branch$current."
output="Current ${1^} version is $branch$current"
elif [[ -z "$current" ]] && [[ -n "$latest" ]]; then
output="Latest ${1^} version is $latest"
elif [[ "$curHash" == "N/A" ]] || [[ "$latHash" == "N/A" ]]; then
@@ -203,7 +203,7 @@ Repositories:
Options:
-c, --current Return the current version
-l, --latest Return the latest version
--hash Return the Github hash from your local repositories
--hash Return the GitHub hash from your local repositories
-h, --help Show this help dialog"
exit 0
}

View File

@@ -10,17 +10,22 @@
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
readonly setupVars="/etc/pihole/setupVars.conf"
readonly dnsmasqconfig="/etc/dnsmasq.d/01-pihole.conf"
readonly dhcpconfig="/etc/dnsmasq.d/02-pihole-dhcp.conf"
readonly FTLconf="/etc/pihole/pihole-FTL.conf"
# 03 -> wildcards
readonly dhcpstaticconfig="/etc/dnsmasq.d/04-pihole-static-dhcp.conf"
readonly PI_HOLE_BIN_DIR="/usr/local/bin"
readonly dnscustomfile="/etc/pihole/custom.list"
readonly dnscustomcnamefile="/etc/dnsmasq.d/05-pihole-custom-cname.conf"
readonly gravityDBfile="/etc/pihole/gravity.db"
# Source install script for ${setupVars}, ${PI_HOLE_BIN_DIR} and valid_ip()
readonly PI_HOLE_FILES_DIR="/etc/.pihole"
# shellcheck disable=SC2034 # used in basic-install
PH_TEST="true"
source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh"
coltable="/opt/pihole/COL_TABLE"
if [[ -f ${coltable} ]]; then
source ${coltable}
@@ -39,7 +44,8 @@ Options:
-e, email Set an administrative contact address for the Block Page
-h, --help Show this help dialog
-i, interface Specify dnsmasq's interface listening behavior
-l, privacylevel Set privacy level (0 = lowest, 4 = highest)"
-l, privacylevel Set privacy level (0 = lowest, 3 = highest)
-t, teleporter Backup configuration as an archive"
exit 0
}
@@ -48,7 +54,7 @@ add_setting() {
}
delete_setting() {
sed -i "/${1}/d" "${setupVars}"
sed -i "/^${1}/d" "${setupVars}"
}
change_setting() {
@@ -61,7 +67,7 @@ addFTLsetting() {
}
deleteFTLsetting() {
sed -i "/${1}/d" "${FTLconf}"
sed -i "/^${1}/d" "${FTLconf}"
}
changeFTLsetting() {
@@ -78,7 +84,7 @@ add_dnsmasq_setting() {
}
delete_dnsmasq_setting() {
sed -i "/${1}/d" "${dnsmasqconfig}"
sed -i "/^${1}/d" "${dnsmasqconfig}"
}
SetTemperatureUnit() {
@@ -162,9 +168,11 @@ ProcessDNSSettings() {
fi
delete_dnsmasq_setting "domain-needed"
delete_dnsmasq_setting "expand-hosts"
if [[ "${DNS_FQDN_REQUIRED}" == true ]]; then
add_dnsmasq_setting "domain-needed"
add_dnsmasq_setting "expand-hosts"
fi
delete_dnsmasq_setting "bogus-priv"
@@ -209,14 +217,79 @@ trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC68345710423
fi
if [[ "${CONDITIONAL_FORWARDING}" == true ]]; then
add_dnsmasq_setting "server=/${CONDITIONAL_FORWARDING_DOMAIN}/${CONDITIONAL_FORWARDING_IP}"
add_dnsmasq_setting "server=/${CONDITIONAL_FORWARDING_REVERSE}/${CONDITIONAL_FORWARDING_IP}"
# Convert legacy "conditional forwarding" to rev-server configuration
# Remove any existing REV_SERVER settings
delete_setting "REV_SERVER"
delete_setting "REV_SERVER_DOMAIN"
delete_setting "REV_SERVER_TARGET"
delete_setting "REV_SERVER_CIDR"
REV_SERVER=true
add_setting "REV_SERVER" "true"
REV_SERVER_DOMAIN="${CONDITIONAL_FORWARDING_DOMAIN}"
add_setting "REV_SERVER_DOMAIN" "${REV_SERVER_DOMAIN}"
REV_SERVER_TARGET="${CONDITIONAL_FORWARDING_IP}"
add_setting "REV_SERVER_TARGET" "${REV_SERVER_TARGET}"
#Convert CONDITIONAL_FORWARDING_REVERSE if necessary e.g:
# 1.1.168.192.in-addr.arpa to 192.168.1.1/32
# 1.168.192.in-addr.arpa to 192.168.1.0/24
# 168.192.in-addr.arpa to 192.168.0.0/16
# 192.in-addr.arpa to 192.0.0.0/8
if [[ "${CONDITIONAL_FORWARDING_REVERSE}" == *"in-addr.arpa" ]];then
arrRev=("${CONDITIONAL_FORWARDING_REVERSE//./ }")
case ${#arrRev[@]} in
6 ) REV_SERVER_CIDR="${arrRev[3]}.${arrRev[2]}.${arrRev[1]}.${arrRev[0]}/32";;
5 ) REV_SERVER_CIDR="${arrRev[2]}.${arrRev[1]}.${arrRev[0]}.0/24";;
4 ) REV_SERVER_CIDR="${arrRev[1]}.${arrRev[0]}.0.0/16";;
3 ) REV_SERVER_CIDR="${arrRev[0]}.0.0.0/8";;
esac
else
# Set REV_SERVER_CIDR to whatever value it was set to
REV_SERVER_CIDR="${CONDITIONAL_FORWARDING_REVERSE}"
fi
# Prevent Firefox from automatically switching over to DNS-over-HTTPS
# This follows https://support.mozilla.org/en-US/kb/configuring-networks-disable-dns-over-https
# (sourced 7th September 2019)
add_dnsmasq_setting "server=/use-application-dns.net/"
# If REV_SERVER_CIDR is not converted by the above, then use the REV_SERVER_TARGET variable to derive it
if [ -z "${REV_SERVER_CIDR}" ]; then
# Convert existing input to /24 subnet (preserves legacy behavior)
# This sed converts "192.168.1.2" to "192.168.1.0/24"
# shellcheck disable=2001
REV_SERVER_CIDR="$(sed "s+\\.[0-9]*$+\\.0/24+" <<< "${REV_SERVER_TARGET}")"
fi
add_setting "REV_SERVER_CIDR" "${REV_SERVER_CIDR}"
# Remove obsolete settings from setupVars.conf
delete_setting "CONDITIONAL_FORWARDING"
delete_setting "CONDITIONAL_FORWARDING_REVERSE"
delete_setting "CONDITIONAL_FORWARDING_DOMAIN"
delete_setting "CONDITIONAL_FORWARDING_IP"
fi
delete_dnsmasq_setting "rev-server"
if [[ "${REV_SERVER}" == true ]]; then
add_dnsmasq_setting "rev-server=${REV_SERVER_CIDR},${REV_SERVER_TARGET}"
if [ -n "${REV_SERVER_DOMAIN}" ]; then
# Forward local domain names to the CF target, too
add_dnsmasq_setting "server=/${REV_SERVER_DOMAIN}/${REV_SERVER_TARGET}"
fi
if [[ "${DNS_FQDN_REQUIRED}" != true ]]; then
# Forward unqualified names to the CF target only when the "never
# forward non-FQDN" option is unticked
add_dnsmasq_setting "server=//${REV_SERVER_TARGET}"
fi
fi
# We need to process DHCP settings here as well to account for possible
# changes in the non-FQDN forwarding. This cannot be done in 01-pihole.conf
# as we don't want to delete all local=/.../ lines so it's much safer to
# simply rewrite the entire corresponding config file (which is what the
# DHCP settings subroutie is doing)
ProcessDHCPSettings
}
SetDNSServers() {
@@ -225,7 +298,16 @@ SetDNSServers() {
IFS=',' read -r -a array <<< "${args[2]}"
for index in "${!array[@]}"
do
add_setting "PIHOLE_DNS_$((index+1))" "${array[index]}"
# Replace possible "\#" by "#". This fixes AdminLTE#1427
local ip
ip="${array[index]//\\#/#}"
if valid_ip "${ip}" || valid_ip6 "${ip}" ; then
add_setting "PIHOLE_DNS_$((index+1))" "${ip}"
else
echo -e " ${CROSS} Invalid IP has been passed"
exit 1
fi
done
if [[ "${args[3]}" == "domain-needed" ]]; then
@@ -246,16 +328,13 @@ SetDNSServers() {
change_setting "DNSSEC" "false"
fi
if [[ "${args[6]}" == "conditional_forwarding" ]]; then
change_setting "CONDITIONAL_FORWARDING" "true"
change_setting "CONDITIONAL_FORWARDING_IP" "${args[7]}"
change_setting "CONDITIONAL_FORWARDING_DOMAIN" "${args[8]}"
change_setting "CONDITIONAL_FORWARDING_REVERSE" "${args[9]}"
if [[ "${args[6]}" == "rev-server" ]]; then
change_setting "REV_SERVER" "true"
change_setting "REV_SERVER_CIDR" "${args[7]}"
change_setting "REV_SERVER_TARGET" "${args[8]}"
change_setting "REV_SERVER_DOMAIN" "${args[9]}"
else
change_setting "CONDITIONAL_FORWARDING" "false"
delete_setting "CONDITIONAL_FORWARDING_IP"
delete_setting "CONDITIONAL_FORWARDING_DOMAIN"
delete_setting "CONDITIONAL_FORWARDING_REVERSE"
change_setting "REV_SERVER" "false"
fi
ProcessDNSSettings
@@ -333,6 +412,14 @@ dhcp-leasefile=/etc/pihole/dhcp.leases
if [[ "${PIHOLE_DOMAIN}" != "none" ]]; then
echo "domain=${PIHOLE_DOMAIN}" >> "${dhcpconfig}"
# When there is a Pi-hole domain set and "Never forward non-FQDNs" is
# ticked, we add `local=/domain/` to tell FTL that this domain is purely
# local and FTL may answer queries from /etc/hosts or DHCP but should
# never forward queries on that domain to any upstream servers
if [[ "${DNS_FQDN_REQUIRED}" == true ]]; then
echo "local=/${PIHOLE_DOMAIN}/" >> "${dhcpconfig}"
fi
fi
# Sourced from setupVars
@@ -345,7 +432,7 @@ dhcp-leasefile=/etc/pihole/dhcp.leases
echo "#quiet-dhcp6
#enable-ra
dhcp-option=option6:dns-server,[::]
dhcp-range=::100,::1ff,constructor:${interface},ra-names,slaac,${leasetime}
dhcp-range=::100,::1ff,constructor:${interface},ra-names,slaac,64,3600
ra-param=*,0,0
" >> "${dhcpconfig}"
fi
@@ -400,11 +487,20 @@ SetWebUILayout() {
change_setting "WEBUIBOXEDLAYOUT" "${args[2]}"
}
SetWebUITheme() {
change_setting "WEBTHEME" "${args[2]}"
}
CheckUrl(){
local regex
local regex check_url
# Check for characters NOT allowed in URLs
regex="[^a-zA-Z0-9:/?&%=~._-]"
if [[ "${1}" =~ ${regex} ]]; then
regex="[^a-zA-Z0-9:/?&%=~._()-;]"
# this will remove first @ that is after schema and before domain
# \1 is optional schema, \2 is userinfo
check_url="$( sed -re 's#([^:/]*://)?([^/]+)@#\1\2#' <<< "$1" )"
if [[ "${check_url}" =~ ${regex} ]]; then
return 1
else
return 0
@@ -474,7 +570,13 @@ AddDHCPStaticAddress() {
RemoveDHCPStaticAddress() {
mac="${args[2]}"
if [[ "$mac" =~ ^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$ ]]; then
sed -i "/dhcp-host=${mac}.*/d" "${dhcpstaticconfig}"
else
echo " ${CROSS} Invalid Mac Passed!"
exit 1
fi
}
SetAdminEmail() {
@@ -546,8 +648,11 @@ Interfaces:
Teleporter() {
local datetimestamp
local host
datetimestamp=$(date "+%Y-%m-%d_%H-%M-%S")
php /var/www/html/admin/scripts/pi-hole/php/teleporter.php > "pi-hole-teleporter_${datetimestamp}.tar.gz"
host=$(hostname)
host="${host//./_}"
php /var/www/html/admin/scripts/pi-hole/php/teleporter.php > "pi-hole-${host:-noname}-teleporter_${datetimestamp}.tar.gz"
}
checkDomain()
@@ -592,9 +697,10 @@ clearAudit()
}
SetPrivacyLevel() {
# Set privacy level. Minimum is 0, maximum is 4
if [ "${args[2]}" -ge 0 ] && [ "${args[2]}" -le 4 ]; then
# Set privacy level. Minimum is 0, maximum is 3
if [ "${args[2]}" -ge 0 ] && [ "${args[2]}" -le 3 ]; then
changeFTLsetting "PRIVACYLEVEL" "${args[2]}"
pihole restartdns reload-lists
fi
}
@@ -614,12 +720,54 @@ RemoveCustomDNSAddress() {
ip="${args[2]}"
host="${args[3]}"
sed -i "/${ip} ${host}/d" "${dnscustomfile}"
if valid_ip "${ip}" || valid_ip6 "${ip}" ; then
sed -i "/^${ip} ${host}$/d" "${dnscustomfile}"
else
echo -e " ${CROSS} Invalid IP has been passed"
exit 1
fi
# Restart dnsmasq to update removed custom DNS entries
RestartDNS
}
AddCustomCNAMERecord() {
echo -e " ${TICK} Adding custom CNAME record..."
domain="${args[2]}"
target="${args[3]}"
echo "cname=${domain},${target}" >> "${dnscustomcnamefile}"
# Restart dnsmasq to load new custom CNAME records
RestartDNS
}
RemoveCustomCNAMERecord() {
echo -e " ${TICK} Removing custom CNAME record..."
domain="${args[2]}"
target="${args[3]}"
validDomain="$(checkDomain "${domain}")"
if [[ -n "${validDomain}" ]]; then
validTarget="$(checkDomain "${target}")"
if [[ -n "${validDomain}" ]]; then
sed -i "/cname=${validDomain},${validTarget}$/d" "${dnscustomcnamefile}"
else
echo " ${CROSS} Invalid Target Passed!"
exit 1
fi
else
echo " ${CROSS} Invalid Domain passed!"
exit 1
fi
# Restart dnsmasq to update removed custom CNAME records
RestartDNS
}
main() {
args=("$@")
@@ -638,6 +786,7 @@ main() {
"enabledhcp" ) EnableDHCP;;
"disabledhcp" ) DisableDHCP;;
"layout" ) SetWebUILayout;;
"theme" ) SetWebUITheme;;
"-h" | "--help" ) helpFunc;;
"privacymode" ) SetPrivacyMode;;
"resolve" ) ResolutionSettings;;
@@ -652,6 +801,8 @@ main() {
"-l" | "privacylevel" ) SetPrivacyLevel;;
"addcustomdns" ) AddCustomDNSAddress;;
"removecustomdns" ) RemoveCustomDNSAddress;;
"addcustomcname" ) AddCustomCNAMERecord;;
"removecustomcname" ) RemoveCustomCNAMERecord;;
* ) helpFunc;;
esac

View File

@@ -1,28 +0,0 @@
#!/usr/bin/env bash
# Pi-hole: A black hole for Internet advertisements
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# Provides an automated migration subroutine to convert Pi-hole v3.x wildcard domains to Pi-hole v4.x regex filters
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
# regexFile set in gravity.sh
wildcardFile="/etc/dnsmasq.d/03-pihole-wildcard.conf"
convert_wildcard_to_regex() {
if [ ! -f "${wildcardFile}" ]; then
return
fi
local addrlines domains uniquedomains
# Obtain wildcard domains from old file
addrlines="$(grep -oE "/.*/" ${wildcardFile})"
# Strip "/" from domain names and convert "." to regex-compatible "\."
domains="$(sed 's/\///g;s/\./\\./g' <<< "${addrlines}")"
# Remove repeated domains (may have been inserted two times due to A and AAAA blocking)
uniquedomains="$(uniq <<< "${domains}")"
# Automatically generate regex filters and remove old wildcards file
awk '{print "(^|\\.)"$0"$"}' <<< "${uniquedomains}" >> "${regexFile:?}" && rm "${wildcardFile}"
}

View File

@@ -16,11 +16,12 @@ CREATE TABLE domainlist
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
type INTEGER NOT NULL DEFAULT 0,
domain TEXT UNIQUE NOT NULL,
domain TEXT NOT NULL,
enabled BOOLEAN NOT NULL DEFAULT 1,
date_added INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
date_modified INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
comment TEXT
comment TEXT,
UNIQUE(domain, type)
);
CREATE TABLE adlist
@@ -30,7 +31,11 @@ CREATE TABLE adlist
enabled BOOLEAN NOT NULL DEFAULT 1,
date_added INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
date_modified INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
comment TEXT
comment TEXT,
date_updated INTEGER,
number INTEGER NOT NULL DEFAULT 0,
invalid_domains INTEGER NOT NULL DEFAULT 0,
status INTEGER NOT NULL DEFAULT 0
);
CREATE TABLE adlist_by_group
@@ -52,7 +57,7 @@ CREATE TABLE info
value TEXT NOT NULL
);
INSERT INTO "info" VALUES('version','12');
INSERT INTO "info" VALUES('version','14');
CREATE TABLE domain_audit
(
@@ -71,7 +76,7 @@ CREATE TABLE domainlist_by_group
CREATE TABLE client
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
ip TEXT NOL NULL UNIQUE,
ip TEXT NOT NULL UNIQUE,
date_added INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
date_modified INTEGER NOT NULL DEFAULT (cast(strftime('%s', 'now') as int)),
comment TEXT
@@ -84,9 +89,9 @@ CREATE TABLE client_by_group
PRIMARY KEY (client_id, group_id)
);
CREATE TRIGGER tr_adlist_update AFTER UPDATE ON adlist
CREATE TRIGGER tr_adlist_update AFTER UPDATE OF address,enabled,comment ON adlist
BEGIN
UPDATE adlist SET date_modified = (cast(strftime('%s', 'now') as int)) WHERE address = NEW.address;
UPDATE adlist SET date_modified = (cast(strftime('%s', 'now') as int)) WHERE id = NEW.id;
END;
CREATE TRIGGER tr_client_update AFTER UPDATE ON client

View File

@@ -1,30 +1,16 @@
#!/usr/bin/env bash
#!/usr/bin/env sh
### BEGIN INIT INFO
# Provides: pihole-FTL
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Required-Start: $remote_fs $syslog $network
# Required-Stop: $remote_fs $syslog $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: pihole-FTL daemon
# Description: Enable service provided by pihole-FTL daemon
### END INIT INFO
FTLUSER=pihole
PIDFILE=/var/run/pihole-FTL.pid
get_pid() {
# First, try to obtain PID from PIDFILE
if [ -s "${PIDFILE}" ]; then
cat "${PIDFILE}"
return
fi
# If the PIDFILE is empty or not available, obtain the PID using pidof
pidof "pihole-FTL" | awk '{print $(NF)}'
}
is_running() {
ps "$(get_pid)" > /dev/null 2>&1
pgrep -xo "pihole-FTL" > /dev/null
}
@@ -34,27 +20,18 @@ start() {
echo "pihole-FTL is already running"
else
# Touch files to ensure they exist (create if non-existing, preserve if existing)
touch /var/log/pihole-FTL.log /var/log/pihole.log
touch /run/pihole-FTL.pid /run/pihole-FTL.port
touch /etc/pihole/dhcp.leases
mkdir -p /var/run/pihole
mkdir -p /var/log/pihole
chown pihole:pihole /var/run/pihole /var/log/pihole
# Remove possible leftovers from previous pihole-FTL processes
rm -f /dev/shm/FTL-* 2> /dev/null
rm /var/run/pihole/FTL.sock 2> /dev/null
mkdir -pm 0755 /run/pihole
touch /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases
# Ensure that permissions are set so that pihole-FTL can edit all necessary files
chown pihole:pihole /run/pihole-FTL.pid /run/pihole-FTL.port
chown pihole:pihole /etc/pihole /etc/pihole/dhcp.leases 2> /dev/null
chown pihole:pihole /var/log/pihole-FTL.log /var/log/pihole.log
chmod 0644 /var/log/pihole-FTL.log /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole.log
chown pihole:pihole /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases /run/pihole /etc/pihole
chmod 0644 /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases /etc/pihole/macvendor.db
# Chown database files to the user FTL runs as. We ignore errors as the files may not (yet) exist
chown pihole:pihole /etc/pihole/pihole-FTL.db /etc/pihole/gravity.db 2> /dev/null
if setcap CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_NET_ADMIN+eip "$(which pihole-FTL)"; then
su -s /bin/sh -c "/usr/bin/pihole-FTL" "$FTLUSER"
chown -f pihole:pihole /etc/pihole/pihole-FTL.db /etc/pihole/gravity.db /etc/pihole/macvendor.db
if setcap CAP_NET_BIND_SERVICE,CAP_NET_RAW,CAP_NET_ADMIN,CAP_SYS_NICE,CAP_IPC_LOCK,CAP_CHOWN+eip "/usr/bin/pihole-FTL"; then
su -s /bin/sh -c "/usr/bin/pihole-FTL" pihole
else
echo "Warning: Starting pihole-FTL as root because setting capabilities is not supported on this system"
pihole-FTL
/usr/bin/pihole-FTL
fi
echo
fi
@@ -63,20 +40,20 @@ start() {
# Stop the service
stop() {
if is_running; then
kill "$(get_pid)"
for i in {1..5}; do
pkill -xo "pihole-FTL"
for i in 1 2 3 4 5; do
if ! is_running; then
break
fi
echo -n "."
printf "."
sleep 1
done
echo
if is_running; then
echo "Not stopped; may still be shutting down or shutdown may have failed, killing now"
kill -9 "$(get_pid)"
pkill -xo -9 "pihole-FTL"
exit 1
else
echo "Stopped"
@@ -84,6 +61,8 @@ stop() {
else
echo "Not running"
fi
# Cleanup
rm -f /run/pihole/FTL.sock /dev/shm/FTL-*
echo
}
@@ -112,7 +91,7 @@ case "$1" in
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac

View File

@@ -10,7 +10,7 @@
#
#
# This file is under source-control of the Pi-hole installation and update
# scripts, any changes made to this file will be overwritten when the softare
# scripts, any changes made to this file will be overwritten when the software
# is updated or re-installed. Please make any changes to the appropriate crontab
# or other cron file snippets.
@@ -18,19 +18,19 @@
# early morning. Download any updates from the adlists
# Squash output to log, then splat the log to stdout on error to allow for
# standard crontab job error handling.
59 1 * * 7 root PATH="$PATH:/usr/local/bin/" pihole updateGravity >/var/log/pihole_updateGravity.log || cat /var/log/pihole_updateGravity.log
59 1 * * 7 root PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updateGravity >/var/log/pihole_updateGravity.log || cat /var/log/pihole_updateGravity.log
# Pi-hole: Flush the log daily at 00:00
# The flush script will use logrotate if available
# parameter "once": logrotate only once (default is twice)
# parameter "quiet": don't print messages
00 00 * * * root PATH="$PATH:/usr/local/bin/" pihole flush once quiet
00 00 * * * root PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole flush once quiet
@reboot root /usr/sbin/logrotate /etc/pihole/logrotate
@reboot root /usr/sbin/logrotate --state /var/lib/logrotate/pihole /etc/pihole/logrotate
# Pi-hole: Grab local version and branch every 10 minutes
*/10 * * * * root PATH="$PATH:/usr/local/bin/" pihole updatechecker local
*/10 * * * * root PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updatechecker local
# Pi-hole: Grab remote version every 24 hours
59 17 * * * root PATH="$PATH:/usr/local/bin/" pihole updatechecker remote
@reboot root PATH="$PATH:/usr/local/bin/" pihole updatechecker remote reboot
59 17 * * * root PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updatechecker remote
@reboot root PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updatechecker remote reboot

View File

@@ -56,7 +56,7 @@ _pihole() {
;;
"privacylevel")
if ( [[ "$prev2" == "admin" ]] || [[ "$prev2" == "-a" ]] ); then
opts_privacy="0 1 2 3 4"
opts_privacy="0 1 2 3"
COMPREPLY=( $(compgen -W "${opts_privacy}" -- ${cur}) )
else
return 1

View File

@@ -6,45 +6,46 @@
* Please see LICENSE file for your rights under this license. */
/* Text Customisation Options ======> */
.title:before { content: "Website Blocked"; }
.altBtn:before { content: "Why am I here?"; }
.linkPH:before { content: "About Pi-hole"; }
.linkEmail:before { content: "Contact Admin"; }
.title::before { content: "Website Blocked"; }
.altBtn::before { content: "Why am I here?"; }
.linkPH::before { content: "About Pi-hole"; }
.linkEmail::before { content: "Contact Admin"; }
#bpOutput.add:before { content: "Info"; }
#bpOutput.add:after { content: "The domain is being whitelisted..."; }
#bpOutput.error:before, .unhandled:before { content: "Error"; }
#bpOutput.unhandled:after { content: "An unhandled exception occured. This may happen when your browser is unable to load jQuery, or when the webserver is denying access to the Pi-hole API."; }
#bpOutput.success:before { content: "Success"; }
#bpOutput.success:after { content: "Website has been whitelisted! You may need to flush your DNS cache"; }
#bpOutput.add::before { content: "Info"; }
#bpOutput.add::after { content: "The domain is being whitelisted..."; }
#bpOutput.error::before, .unhandled::before { content: "Error"; }
#bpOutput.unhandled::after { content: "An unhandled exception occurred. This may happen when your browser is unable to load jQuery, or when the webserver is denying access to the Pi-hole API."; }
#bpOutput.success::before { content: "Success"; }
#bpOutput.success::after { content: "Website has been whitelisted! You may need to flush your DNS cache"; }
.recentwl:before { content: "This site has been whitelisted. Please flush your DNS cache and/or restart your browser."; }
.unknown:before { content: "This website is not found in any of Pi-hole's blacklists. The reason you have arrived here is unknown."; }
.cname:before { content: "This site is an alias for "; } /* <a href="http://cname.com">cname.com</a> */
.cname:after { content: ", which may be blocked by Pi-hole."; }
.recentwl::before { content: "This site has been whitelisted. Please flush your DNS cache and/or restart your browser."; }
.unknown::before { content: "This website is not found in any of Pi-hole's blacklists. The reason you have arrived here is unknown."; }
.cname::before { content: "This site is an alias for "; } /* <a href="http://cname.com">cname.com</a> */
.cname::after { content: ", which may be blocked by Pi-hole."; }
.blacklist:before { content: "Manually Blacklisted"; }
.wildcard:before { content: "Manually Blacklisted by Wildcard"; }
.noblock:before { content: "Not found on any Blacklist"; }
.blacklist::before { content: "Manually Blacklisted"; }
.wildcard::before { content: "Manually Blacklisted by Wildcard"; }
.noblock::before { content: "Not found on any Blacklist"; }
#bpBlock:before { content: "Access to the following website has been denied:"; }
#bpFlag:before { content: "This is primarily due to being flagged as:"; }
#bpBlock::before { content: "Access to the following website has been denied:"; }
#bpFlag::before { content: "This is primarily due to being flagged as:"; }
#bpHelpTxt:before { content: "If you have an ongoing use for this website, please "; }
#bpHelpTxt a:before, #bpHelpTxt span:before { content: "ask the administrator"; }
#bpHelpTxt:after{ content: " of the Pi-hole on this network to have it whitelisted"; }
#bpHelpTxt::before { content: "If you have an ongoing use for this website, please "; }
#bpHelpTxt a::before, #bpHelpTxt span::before { content: "ask the administrator"; }
#bpHelpTxt::after{ content: " of the Pi-hole on this network to have it whitelisted"; }
#bpBack:before { content: "Back to safety"; }
#bpInfo:before { content: "Technical Info"; }
#bpFoundIn:before { content: "This site is found in "; }
#bpFoundIn span:after { content: " of "; }
#bpFoundIn:after { content: " lists:"; }
#bpWhitelist:before { content: "Whitelist"; }
#bpBack::before { content: "Back to safety"; }
#bpInfo::before { content: "Technical Info"; }
#bpFoundIn::before { content: "This site is found in "; }
#bpFoundIn span::after { content: " of "; }
#bpFoundIn::after { content: " lists:"; }
#bpWhitelist::before { content: "Whitelist"; }
footer span:before { content: "Page generated on "; }
footer span::before { content: "Page generated on "; }
/* Hide whitelisting form entirely */
/* #bpWLButtons { display: none; } */
/* Text Customisation Options <=============================== */
/* http://necolas.github.io/normalize.css ======> */
@@ -120,14 +121,20 @@ textarea, input, button { outline: none; }
font-family: "Source Sans Pro";
font-style: normal;
font-weight: 400;
src: local("Source Sans Pro"), local("SourceSansPro-Regular"), url("/admin/style/vendor/SourceSansPro/SourceSansPro-Regular.ttf") format("truetype");
font-display: swap;
src: local("Source Sans Pro Regular"), local("SourceSansPro-Regular"),
url("/admin/style/vendor/SourceSansPro/source-sans-pro-v13-latin-regular.woff2") format("woff2"),
url("/admin/style/vendor/SourceSansPro/source-sans-pro-v13-latin-regular.woff") format("woff");
}
@font-face {
font-family: "Source Sans Pro";
font-style: normal;
font-weight: 700;
src: local("Source Sans Pro Bold"), local("SourceSansPro-Bold"), url("/admin/style/vendor/SourceSansPro/SourceSansPro-Bold.ttf") format("truetype");
font-display: swap;
src: local("Source Sans Pro Bold"), local("SourceSansPro-Bold"),
url("/admin/style/vendor/SourceSansPro/source-sans-pro-v13-latin-700.woff2") format("woff2"),
url("/admin/style/vendor/SourceSansPro/source-sans-pro-v13-latin-700.woff") format("woff");
}
body {
@@ -138,7 +145,17 @@ body {
}
/* User is greeted with a splash page when browsing to Pi-hole IP address */
#splashpage { background: #222; color: rgba(255,255,255,0.7); text-align: center; }
#splashpage {
background: #222;
color: rgba(255, 255, 255, 0.7);
text-align: center;
width: 100%;
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
#splashpage img { margin: 5px; width: 256px; }
#splashpage b { color: inherit; }
@@ -167,7 +184,7 @@ h1 a {
background-color: rgba(0, 0, 0, 0.1);
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 2rem;
font-weight: normal;
font-weight: 400;
min-width: 230px;
text-align: center;
}
@@ -183,10 +200,31 @@ header #bpAlt label {
text-indent: 30px;
}
[type=checkbox][id$="Toggle"] { display: none; }
[type=checkbox][id$="Toggle"]:checked ~ #bpAbout,
[type=checkbox][id$="Toggle"]:checked ~ #bpMoreInfo {
display: block; }
[type="checkbox"][id$="Toggle"] { display: none; }
[type="checkbox"][id$="Toggle"]:checked ~ #bpAbout,
[type="checkbox"][id$="Toggle"]:checked ~ #bpMoreInfo {
display: block;
}
html, body {
height: 100%;
}
#pihole_card {
width: 400px;
height: auto;
max-width: 400px;
}
#pihole_card p, #pihole_card a {
font-size: 13pt;
text-align: center;
}
#pihole_logo_splash {
height: auto;
width: 100%;
}
/* Click anywhere else on screen to hide #bpAbout */
#bpAboutToggle:checked {
@@ -203,7 +241,7 @@ header #bpAlt label {
#bpAbout {
background: #3c8dbc;
border-bottom-left-radius: 5px;
border: 1px solid #FFF;
border: 1px solid #fff;
border-right-width: 0;
box-shadow: -1px 1px 1px rgba(0, 0, 0, 0.12);
box-sizing: border-box;
@@ -269,8 +307,8 @@ main {
padding: 15px;
}
#bpOutput:before {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='7' height='14' viewBox='0 0 7 14'%3E%3Cpath fill='%23fff' d='M6,11a1.371,1.371,0,0,1,1,1v1a1.371,1.371,0,0,1-1,1H1a1.371,1.371,0,0,1-1-1V12a1.371,1.371,0,0,1,1-1H2V8H1A1.371,1.371,0,0,1,0,7V6A1.371,1.371,0,0,1,1,5H4A1.371,1.371,0,0,1,5,6v5H6ZM3.5,0A1.5,1.5,0,1,1,2,1.5,1.5,1.5,0,0,1,3.5,0Z'/%3E%3C/svg%3E") no-repeat center left;
#bpOutput::before {
background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='7' height='14' viewBox='0 0 7 14'%3E%3Cpath fill='%23fff' d='M6 11a1.371 1.371 0 011 1v1a1.371 1.371 0 01-1 1H1a1.371 1.371 0 01-1-1v-1a1.371 1.371 0 011-1h1V8H1a1.371 1.371 0 01-1-1V6a1.371 1.371 0 011-1h3a1.371 1.371 0 011 1v5h1zM3.5 0A1.5 1.5 0 112 1.5 1.5 1.5 0 013.5 0z'/%3E%3C/svg%3E") no-repeat center left;
display: block;
font-size: 1.8rem;
text-indent: 15px;
@@ -281,8 +319,8 @@ main {
#bpOutput.error { background: #dd4b39; }
.blockMsg, .flagMsg {
font: bold 1.8rem Consolas, Courier, monospace;
padding: 5px 10px 10px 10px;
font: 700 1.8rem Consolas, Courier, monospace;
padding: 5px 10px 10px;
text-indent: 15px;
}
@@ -317,7 +355,7 @@ main {
/* Button hover dark overlay */
.buttons *:not(input):not([disabled]):hover {
background-image: linear-gradient(to bottom, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.1));
color: #FFF;
color: #fff;
}
/* Button active shadow inset */
@@ -325,30 +363,32 @@ main {
box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
}
/* Input border colour */
/* Input border color */
.buttons *:not([disabled]):hover, .buttons input:focus {
border-color: rgba(0, 0, 0, 0.25);
}
#bpButtons * { width: 50%; color: #FFF; }
#bpButtons * { width: 50%; color: #fff; }
#bpBack { background-color: #00a65a; }
#bpInfo { background-color: #3c8dbc; }
#bpWhitelist { background-color: #dd4b39; }
#blockpage .buttons [type=password][disabled] { color: rgba(0,0,0,1); }
#blockpage .buttons [type="password"][disabled] { color: rgba(0, 0, 0, 1); }
#blockpage .buttons [disabled] { color: rgba(0, 0, 0, 0.55); background-color: #e3e3e3; }
#blockpage .buttons [type=password]:-ms-input-placeholder { color: rgba(51,51,51,0.8); }
#blockpage .buttons [type="password"]:-ms-input-placeholder { color: rgba(51, 51, 51, 0.8); }
input[type=password] { font-size: 1.5rem; }
input[type="password"] { font-size: 1.5rem; }
@-webkit-keyframes slidein { from { max-height: 0; opacity: 0; } to { max-height: 300px; opacity: 1; } }
@keyframes slidein { from { max-height: 0; opacity: 0; } to { max-height: 300px; opacity: 1; } }
#bpMoreToggle:checked ~ #bpMoreInfo { display: block; margin-top: 8px; animation: slidein 0.05s linear; }
#bpMoreToggle:checked ~ #bpMoreInfo { display: block; margin-top: 8px; -webkit-animation: slidein 0.05s linear; animation: slidein 0.05s linear; }
#bpMoreInfo { display: none; margin-top: 10px; }
#bpQueryOutput {
font-size: 1.2rem;
line-height: 1.65rem;
margin: 5px 0 0 0;
margin: 5px 0 0;
overflow: auto;
padding: 0 5px;
-webkit-overflow-scrolling: touch;
@@ -372,12 +412,44 @@ footer {
/* Responsive Content */
@media only screen and (max-width: 500px) {
h1 a { font-size: 1.8rem; min-width: 170px; }
footer span:before { content: "Generated "; }
footer span { display: block; }
h1 a {
font-size: 1.8rem;
min-width: 170px;
}
footer span::before {
content: "Generated ";
}
footer span {
display: block;
}
}
@media only screen and (min-width: 1251px) {
#bpWrapper, footer { border-radius: 0 0 5px 5px; }
#bpAbout { border-right-width: 1px; }
#bpWrapper, footer {
border-radius: 0 0 5px 5px;
}
#bpAbout {
border-right-width: 1px;
}
}
@media only screen and (max-width: 400px) {
#pihole_card {
width: 100%;
height: auto;
}
#pihole_card p, #pihole_card a {
font-size: 100%;
}
}
@media only screen and (max-width: 256px) {
#pihole_logo_splash {
width: 90% !important;
height: auto;
}
}

View File

@@ -46,7 +46,7 @@
#resolv-file=
# By default, dnsmasq will send queries to any of the upstream
# servers it knows about and tries to favour servers to are known
# servers it knows about and tries to favor servers to are known
# to be up. Uncommenting this forces dnsmasq to try each query
# with each server strictly in the order they appear in
# /etc/resolv.conf
@@ -189,7 +189,7 @@
# add names to the DNS for the IPv6 address of SLAAC-configured dual-stack
# hosts. Use the DHCPv4 lease to derive the name, network segment and
# MAC address and assume that the host will also have an
# IPv6 address calculated using the SLAAC alogrithm.
# IPv6 address calculated using the SLAAC algorithm.
#dhcp-range=1234::, ra-names
# Do Router Advertisements, BUT NOT DHCP for this subnet.
@@ -210,7 +210,7 @@
#dhcp-range=1234::, ra-stateless, ra-names
# Do router advertisements for all subnets where we're doing DHCPv6
# Unless overriden by ra-stateless, ra-names, et al, the router
# Unless overridden by ra-stateless, ra-names, et al, the router
# advertisements will have the M and O bits set, so that the clients
# get addresses and configuration from DHCPv6, and the A bit reset, so the
# clients don't use SLAAC addresses.
@@ -281,7 +281,7 @@
# Give a fixed IPv6 address and name to client with
# DUID 00:01:00:01:16:d2:83:fc:92:d4:19:e2:d8:b2
# Note the MAC addresses CANNOT be used to identify DHCPv6 clients.
# Note also the they [] around the IPv6 address are obilgatory.
# Note also the they [] around the IPv6 address are obligatory.
#dhcp-host=id:00:01:00:01:16:d2:83:fc:92:d4:19:e2:d8:b2, fred, [1234::5]
# Ignore any clients which are not specified in dhcp-host lines
@@ -404,14 +404,14 @@
#dhcp-option=vendor:MSFT,2,1i
# Send the Encapsulated-vendor-class ID needed by some configurations of
# Etherboot to allow is to recognise the DHCP server.
# Etherboot to allow is to recognize the DHCP server.
#dhcp-option=vendor:Etherboot,60,"Etherboot"
# Send options to PXELinux. Note that we need to send the options even
# though they don't appear in the parameter request list, so we need
# to use dhcp-option-force here.
# See http://syslinux.zytor.com/pxe.php#special for details.
# Magic number - needed before anything else is recognised
# Magic number - needed before anything else is recognized
#dhcp-option-force=208,f1:00:74:7e
# Configuration file name
#dhcp-option-force=209,configs/common

View File

@@ -11,20 +11,11 @@ $serverName = htmlspecialchars($_SERVER["SERVER_NAME"]);
// Remove external ipv6 brackets if any
$serverName = preg_replace('/^\[(.*)\]$/', '${1}', $serverName);
if (!is_file("/etc/pihole/setupVars.conf"))
die("[ERROR] File not found: <code>/etc/pihole/setupVars.conf</code>");
// Get values from setupVars.conf
$setupVars = parse_ini_file("/etc/pihole/setupVars.conf");
$svPasswd = !empty($setupVars["WEBPASSWORD"]);
$svEmail = (!empty($setupVars["ADMIN_EMAIL"]) && filter_var($setupVars["ADMIN_EMAIL"], FILTER_VALIDATE_EMAIL)) ? $setupVars["ADMIN_EMAIL"] : "";
unset($setupVars);
// Set landing page location, found within /var/www/html/
$landPage = "../landing.php";
// Define array for hostnames to be accepted as self address for splash page
$authorizedHosts = [];
$authorizedHosts = [ "localhost" ];
if (!empty($_SERVER["FQDN"])) {
// If setenv.add-environment = ("fqdn" => "true") is configured in lighttpd,
// append $serverName to $authorizedHosts
@@ -34,336 +25,48 @@ if (!empty($_SERVER["FQDN"])) {
array_push($authorizedHosts, $_SERVER["VIRTUAL_HOST"]);
}
// Set which extension types render as Block Page (Including "" for index.ext)
$validExtTypes = array("asp", "htm", "html", "php", "rss", "xml", "");
// Get extension of current URL
$currentUrlExt = pathinfo($_SERVER["REQUEST_URI"], PATHINFO_EXTENSION);
// Set mobile friendly viewport
$viewPort = '<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>';
// Set response header
function setHeader($type = "x") {
header("X-Pi-hole: A black hole for Internet advertisements.");
if (isset($type) && $type === "js") header("Content-Type: application/javascript");
}
// Determine block page type
if ($serverName === "pi.hole"
|| (!empty($_SERVER["VIRTUAL_HOST"]) && $serverName === $_SERVER["VIRTUAL_HOST"])) {
// Redirect to Web Interface
exit(header("Location: /admin"));
} elseif (filter_var($serverName, FILTER_VALIDATE_IP) || in_array($serverName, $authorizedHosts)) {
// Set Splash Page output
$splashPage = "
<html>
// When directly browsing via IP or authorized hostname
// Render splash/landing page based off presence of $landPage file
// Unset variables so as to not be included in $landPage or $splashPage
unset($svPasswd, $svEmail, $authorizedHosts, $validExtTypes, $currentUrlExt);
// If $landPage file is present
if (is_file(getcwd()."/$landPage")) {
unset($serverName, $viewPort); // unset extra variables not to be included in $landpage
include $landPage;
exit();
}
// If $landPage file was not present, Set Splash Page output
$splashPage = <<<EOT
<!doctype html>
<html lang='en'>
<head>
$viewPort
<link rel='stylesheet' href='pihole/blockingpage.css' type='text/css'/>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<title>● $serverName</title>
<link rel='shortcut icon' href='admin/img/favicons/favicon.ico' type='image/x-icon'>
<style>
#splashpage { background: #222; color: rgba(255, 255, 255, 0.7); text-align: center; }
#splashpage img { margin: 5px; width: 256px; }
#splashpage b { color: inherit; }
</style>
</head>
<body id='splashpage'>
<img src='admin/img/logo.svg'/><br/>
Pi-<b>hole</b>: Your black hole for Internet advertisements<br/>
<img src='admin/img/logo.svg' alt='Pi-hole logo' width='256' height='377'>
<br>
<p>Pi-<strong>hole</strong>: Your black hole for Internet advertisements</p>
<a href='/admin'>Did you mean to go to the admin panel?</a>
</body>
</html>
";
// Set splash/landing page based off presence of $landPage
$renderPage = is_file(getcwd()."/$landPage") ? include $landPage : "$splashPage";
// Unset variables so as to not be included in $landPage
unset($serverName, $svPasswd, $svEmail, $authorizedHosts, $validExtTypes, $currentUrlExt, $viewPort);
// Render splash/landing page when directly browsing via IP or authorized hostname
exit($renderPage);
} elseif ($currentUrlExt === "js") {
// Serve Pi-hole Javascript for blocked domains requesting JS
exit(setHeader("js").'var x = "Pi-hole: A black hole for Internet advertisements."');
} elseif (strpos($_SERVER["REQUEST_URI"], "?") !== FALSE && isset($_SERVER["HTTP_REFERER"])) {
// Serve blank image upon receiving REQUEST_URI w/ query string & HTTP_REFERRER
// e.g: An iframe of a blocked domain
exit(setHeader().'<html>
<head><script>window.close();</script></head>
<body><img src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs="></body>
</html>');
} elseif (!in_array($currentUrlExt, $validExtTypes) || substr_count($_SERVER["REQUEST_URI"], "?")) {
// Serve SVG upon receiving non $validExtTypes URL extension or query string
// e.g: Not an iframe of a blocked domain, such as when browsing to a file/query directly
// QoL addition: Allow the SVG to be clicked on in order to quickly show the full Block Page
$blockImg = '<a href="/"><svg xmlns="http://www.w3.org/2000/svg" width="110" height="16"><defs><style>a {text-decoration: none;} circle {stroke: rgba(152,2,2,0.5); fill: none; stroke-width: 2;} rect {fill: rgba(152,2,2,0.5);} text {opacity: 0.3; font: 11px Arial;}</style></defs><circle cx="8" cy="8" r="7"/><rect x="10.3" y="-6" width="2" height="12" transform="rotate(45)"/><text x="19.3" y="12">Blocked by Pi-hole</text></svg></a>';
exit(setHeader()."<html>
<head>$viewPort</head>
<body>$blockImg</body>
</html>");
EOT;
exit($splashPage);
}
/* Start processing Block Page from here */
exit(header("HTTP/1.1 404 Not Found"));
// Define admin email address text based off $svEmail presence
$bpAskAdmin = !empty($svEmail) ? '<a href="mailto:'.$svEmail.'?subject=Site Blocked: '.$serverName.'"></a>' : "<span/>";
// Get possible non-standard location of FTL's database
$FTLsettings = parse_ini_file("/etc/pihole/pihole-FTL.conf");
if (isset($FTLsettings["GRAVITYDB"])) {
$gravityDBFile = $FTLsettings["GRAVITYDB"];
} else {
$gravityDBFile = "/etc/pihole/gravity.db";
}
// Connect to gravity.db
try {
$db = new SQLite3($gravityDBFile, SQLITE3_OPEN_READONLY);
} catch (Exception $exception) {
die("[ERROR]: Failed to connect to gravity.db");
}
// Get all adlist addresses
$adlistResults = $db->query("SELECT address FROM vw_adlist");
$adlistsUrls = array();
while ($row = $adlistResults->fetchArray()) {
array_push($adlistsUrls, $row[0]);
}
if (empty($adlistsUrls))
die("[ERROR]: There are no adlists enabled");
// Get total number of blocklists (Including Whitelist, Blacklist & Wildcard lists)
$adlistsCount = count($adlistsUrls) + 3;
// Set query timeout
ini_set("default_socket_timeout", 3);
// Logic for querying blocklists
function queryAds($serverName) {
// Determine the time it takes while querying adlists
$preQueryTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
$queryAdsURL = sprintf(
"http://127.0.0.1:%s/admin/scripts/pi-hole/php/queryads.php?domain=%s&bp",
$_SERVER["SERVER_PORT"],
$serverName
);
$queryAds = file($queryAdsURL, FILE_IGNORE_NEW_LINES);
$queryAds = array_values(array_filter(preg_replace("/data:\s+/", "", $queryAds)));
$queryTime = sprintf("%.0f", (microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]) - $preQueryTime);
// Exception Handling
try {
// Define Exceptions
if (strpos($queryAds[0], "No exact results") !== FALSE) {
// Return "none" into $queryAds array
return array("0" => "none");
} else if ($queryTime >= ini_get("default_socket_timeout")) {
// Connection Timeout
throw new Exception ("Connection timeout (".ini_get("default_socket_timeout")."s)");
} elseif (!strpos($queryAds[0], ".") !== false) {
// Unknown $queryAds output
throw new Exception ("Unhandled error message (<code>$queryAds[0]</code>)");
}
return $queryAds;
} catch (Exception $e) {
// Return exception as array
return array("0" => "error", "1" => $e->getMessage());
}
}
// Get results of queryads.php exact search
$queryAds = queryAds($serverName);
// Pass error through to Block Page
if ($queryAds[0] === "error")
die("[ERROR]: Unable to parse results from <i>queryads.php</i>: <code>".$queryAds[1]."</code>");
// Count total number of matching blocklists
$featuredTotal = count($queryAds);
// Place results into key => value array
$queryResults = null;
foreach ($queryAds as $str) {
$value = explode(" ", $str);
@$queryResults[$value[0]] .= "$value[1]";
}
// Determine if domain has been blacklisted, whitelisted, wildcarded or CNAME blocked
if (strpos($queryAds[0], "blacklist") !== FALSE) {
$notableFlagClass = "blacklist";
$adlistsUrls = array("π" => substr($queryAds[0], 2));
} elseif (strpos($queryAds[0], "whitelist") !== FALSE) {
$notableFlagClass = "noblock";
$adlistsUrls = array("π" => substr($queryAds[0], 2));
$wlInfo = "recentwl";
} elseif (strpos($queryAds[0], "wildcard") !== FALSE) {
$notableFlagClass = "wildcard";
$adlistsUrls = array("π" => substr($queryAds[0], 2));
} elseif ($queryAds[0] === "none") {
$featuredTotal = "0";
$notableFlagClass = "noblock";
// QoL addition: Determine appropriate info message if CNAME exists
// Suggests to the user that $serverName has a CNAME (alias) that may be blocked
$dnsRecord = dns_get_record("$serverName")[0];
if (array_key_exists("target", $dnsRecord)) {
$wlInfo = $dnsRecord['target'];
} else {
$wlInfo = "unknown";
}
}
// Set #bpOutput notification
$wlOutputClass = (isset($wlInfo) && $wlInfo === "recentwl") ? $wlInfo : "hidden";
$wlOutput = (isset($wlInfo) && $wlInfo !== "recentwl") ? "<a href='http://$wlInfo'>$wlInfo</a>" : "";
// Get Pi-hole Core version
$phVersion = exec("cd /etc/.pihole/ && git describe --long --tags");
// Print $execTime on development branches
// Testing for - is marginally faster than "git rev-parse --abbrev-ref HEAD"
if (explode("-", $phVersion)[1] != "0")
$execTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
// Please Note: Text is added via CSS to allow an admin to provide a localized
// language without the need to edit this file
setHeader();
?>
<!DOCTYPE html>
<!-- Pi-hole: A black hole for Internet advertisements
* (c) 2017 Pi-hole, LLC (https://pi-hole.net)
* Network-wide ad blocking via your own hardware.
*
* This file is copyright under the latest version of the EUPL. -->
<html>
<head>
<meta charset="UTF-8">
<?=$viewPort ?>
<meta name="robots" content="noindex,nofollow"/>
<meta http-equiv="x-dns-prefetch-control" content="off">
<link rel="shortcut icon" href="admin/img/favicon.png" type="image/x-icon"/>
<link rel="stylesheet" href="pihole/blockingpage.css" type="text/css"/>
<title>● <?=$serverName ?></title>
<script src="admin/scripts/vendor/jquery.min.js"></script>
<script>
window.onload = function () {
<?php
// Remove href fallback from "Back to safety" button
if ($featuredTotal > 0) {
echo '$("#bpBack").removeAttr("href");';
// Enable whitelisting if JS is available
echo '$("#bpWhitelist").prop("disabled", false);';
// Enable password input if necessary
if (!empty($svPasswd)) {
echo '$("#bpWLPassword").attr("placeholder", "Password");';
echo '$("#bpWLPassword").prop("disabled", false);';
}
// Otherwise hide the input
else {
echo '$("#bpWLPassword").hide();';
}
}
?>
}
</script>
</head>
<body id="blockpage"><div id="bpWrapper">
<header>
<h1 id="bpTitle">
<a class="title" href="/"><?php //Website Blocked ?></a>
</h1>
<div class="spc"></div>
<input id="bpAboutToggle" type="checkbox"/>
<div id="bpAbout">
<div class="aboutPH">
<div class="aboutImg"/></div>
<p>Open Source Ad Blocker
<small>Designed for Raspberry Pi</small>
</p>
</div>
<div class="aboutLink">
<a class="linkPH" href="https://github.com/pi-hole/pi-hole/wiki/What-is-Pi-hole%3F-A-simple-explanation"><?php //About PH ?></a>
<?php if (!empty($svEmail)) echo '<a class="linkEmail" href="mailto:'.$svEmail.'"></a>'; ?>
</div>
</div>
<div id="bpAlt">
<label class="altBtn" for="bpAboutToggle"><?php //Why am I here? ?></label>
</div>
</header>
<main>
<div id="bpOutput" class="<?=$wlOutputClass ?>"><?=$wlOutput ?></div>
<div id="bpBlock">
<p class="blockMsg"><?=$serverName ?></p>
</div>
<?php if(isset($notableFlagClass)) { ?>
<div id="bpFlag">
<p class="flagMsg <?=$notableFlagClass ?>"></p>
</div>
<?php } ?>
<div id="bpHelpTxt"><?=$bpAskAdmin ?></div>
<div id="bpButtons" class="buttons">
<a id="bpBack" onclick="javascript:history.back()" href="about:home"></a>
<?php if ($featuredTotal > 0) echo '<label id="bpInfo" for="bpMoreToggle"></label>'; ?>
</div>
<input id="bpMoreToggle" type="checkbox">
<div id="bpMoreInfo">
<span id="bpFoundIn"><span><?=$featuredTotal ?></span><?=$adlistsCount ?></span>
<pre id='bpQueryOutput'><?php if ($featuredTotal > 0) foreach ($queryResults as $num => $value) { echo "<span>[$num]:</span>$adlistsUrls[$num]\n"; } ?></pre>
<form id="bpWLButtons" class="buttons">
<input id="bpWLDomain" type="text" value="<?=$serverName ?>" disabled/>
<input id="bpWLPassword" type="password" placeholder="Javascript disabled" disabled/><button id="bpWhitelist" type="button" disabled></button>
</form>
</div>
</main>
<footer><span><?=date("l g:i A, F dS"); ?>.</span> Pi-hole <?=$phVersion ?> (<?=gethostname()."/".$_SERVER["SERVER_ADDR"]; if (isset($execTime)) printf("/%.2fs", $execTime); ?>)</footer>
</div>
<script>
function add() {
$("#bpOutput").removeClass("hidden error exception");
$("#bpOutput").addClass("add");
var domain = "<?=$serverName ?>";
var pw = $("#bpWLPassword");
if(domain.length === 0) {
return;
}
$.ajax({
url: "/admin/scripts/pi-hole/php/add.php",
method: "post",
data: {"domain":domain, "list":"white", "pw":pw.val()},
success: function(response) {
if(response.indexOf("Pi-hole blocking") !== -1) {
setTimeout(function(){window.location.reload(1);}, 10000);
$("#bpOutput").removeClass("add");
$("#bpOutput").addClass("success");
$("#bpOutput").html("");
} else {
$("#bpOutput").removeClass("add");
$("#bpOutput").addClass("error");
$("#bpOutput").html(""+response+"");
}
},
error: function(jqXHR, exception) {
$("#bpOutput").removeClass("add");
$("#bpOutput").addClass("exception");
$("#bpOutput").html("");
}
});
}
<?php if ($featuredTotal > 0) { ?>
$(document).keypress(function(e) {
if(e.which === 13 && $("#bpWLPassword").is(":focus")) {
add();
}
});
$("#bpWhitelist").on("click", function() {
add();
});
<?php } ?>
</script>
</body></html>

View File

@@ -20,7 +20,6 @@ server.modules = (
"mod_accesslog",
"mod_auth",
"mod_expire",
"mod_compress",
"mod_redirect",
"mod_setenv",
"mod_rewrite"
@@ -30,7 +29,7 @@ server.document-root = "/var/www/html"
server.error-handler-404 = "/pihole/index.php"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.pid-file = "/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80
@@ -41,18 +40,29 @@ index-file.names = ( "index.php", "index.html", "index.lighttpd.html"
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
mimetype.assign = ( ".png" => "image/png",
".jpg" => "image/jpeg",
mimetype.assign = (
".ico" => "image/x-icon",
".jpeg" => "image/jpeg",
".html" => "text/html",
".jpg" => "image/jpeg",
".png" => "image/png",
".svg" => "image/svg+xml",
".css" => "text/css; charset=utf-8",
".js" => "application/javascript",
".json" => "application/json",
".txt" => "text/plain",
".svg" => "image/svg+xml" )
".html" => "text/html; charset=utf-8",
".js" => "text/javascript; charset=utf-8",
".json" => "application/json; charset=utf-8",
".map" => "application/json; charset=utf-8",
".txt" => "text/plain; charset=utf-8",
".eot" => "application/vnd.ms-fontobject",
".otf" => "font/otf",
".ttc" => "font/collection",
".ttf" => "font/ttf",
".woff" => "font/woff",
".woff2" => "font/woff2"
)
# Add user chosen options held in external file
# This uses include_shell instead of an include wildcard for compatibility
include_shell "cat external.conf 2>/dev/null"
# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
@@ -68,11 +78,6 @@ $HTTP["url"] =~ "^/admin/" {
"X-Pi-hole" => "The Pi-hole Web interface is working!",
"X-Frame-Options" => "DENY"
)
$HTTP["url"] =~ ".ttf$" {
# Allow Block Page access to local fonts
setenv.add-response-header = ( "Access-Control-Allow-Origin" => "*" )
}
}
# Block . files from being served, such as .git, .github, .gitignore
@@ -80,6 +85,5 @@ $HTTP["url"] =~ "^/admin/\.(.*)" {
url.access-deny = ("")
}
# Add user chosen options held in external file
# This uses include_shell instead of an include wildcard for compatibility
include_shell "cat external.conf 2>/dev/null"
# Default expire header
expire.url = ( "" => "access plus 0 seconds" )

View File

@@ -2,7 +2,7 @@
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
# Network-wide ad blocking via your own hardware.
#
# lighttpd config for Pi-hole
# Lighttpd config for Pi-hole
#
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
@@ -18,10 +18,9 @@
server.modules = (
"mod_access",
"mod_auth",
"mod_expire",
"mod_fastcgi",
"mod_accesslog",
"mod_expire",
"mod_compress",
"mod_redirect",
"mod_setenv",
"mod_rewrite"
@@ -31,39 +30,49 @@ server.document-root = "/var/www/html"
server.error-handler-404 = "/pihole/index.php"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.pid-file = "/run/lighttpd.pid"
server.username = "lighttpd"
server.groupname = "lighttpd"
server.port = 80
accesslog.filename = "/var/log/lighttpd/access.log"
accesslog.format = "%{%s}t|%V|%r|%s|%b"
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
mimetype.assign = ( ".png" => "image/png",
".jpg" => "image/jpeg",
mimetype.assign = (
".ico" => "image/x-icon",
".jpeg" => "image/jpeg",
".html" => "text/html",
".jpg" => "image/jpeg",
".png" => "image/png",
".svg" => "image/svg+xml",
".css" => "text/css; charset=utf-8",
".js" => "application/javascript",
".json" => "application/json",
".txt" => "text/plain",
".svg" => "image/svg+xml" )
".html" => "text/html; charset=utf-8",
".js" => "text/javascript; charset=utf-8",
".json" => "application/json; charset=utf-8",
".map" => "application/json; charset=utf-8",
".txt" => "text/plain; charset=utf-8",
".eot" => "application/vnd.ms-fontobject",
".otf" => "font/otf",
".ttc" => "font/collection",
".ttf" => "font/ttf",
".woff" => "font/woff",
".woff2" => "font/woff2"
)
# Add user chosen options held in external file
# This uses include_shell instead of an include wildcard for compatibility
include_shell "cat external.conf 2>/dev/null"
# default listening port for IPv6 falls back to the IPv4 port
#include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
#include_shell "/usr/share/lighttpd/create-mime.assign.pl"
#include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
fastcgi.server = ( ".php" =>
( "localhost" =>
(
fastcgi.server = (
".php" => (
"localhost" => (
"socket" => "/tmp/php-fastcgi.socket",
"bin-path" => "/usr/bin/php-cgi"
)
@@ -77,11 +86,6 @@ $HTTP["url"] =~ "^/admin/" {
"X-Pi-hole" => "The Pi-hole Web interface is working!",
"X-Frame-Options" => "DENY"
)
$HTTP["url"] =~ ".ttf$" {
# Allow Block Page access to local fonts
setenv.add-response-header = ( "Access-Control-Allow-Origin" => "*" )
}
}
# Block . files from being served, such as .git, .github, .gitignore
@@ -89,6 +93,5 @@ $HTTP["url"] =~ "^/admin/\.(.*)" {
url.access-deny = ("")
}
# Add user chosen options held in external file
# This uses include_shell instead of an include wildcard for compatibility
include_shell "cat external.conf 2>/dev/null"
# Default expire header
expire.url = ( "" => "access plus 0 seconds" )

File diff suppressed because it is too large Load Diff

View File

@@ -14,8 +14,8 @@ while true; do
read -rp " ${QST} Are you sure you would like to remove ${COL_WHITE}Pi-hole${COL_NC}? [y/N] " yn
case ${yn} in
[Yy]* ) break;;
[Nn]* ) echo -e "${OVER} ${COL_LIGHT_GREEN}Uninstall has been cancelled${COL_NC}"; exit 0;;
* ) echo -e "${OVER} ${COL_LIGHT_GREEN}Uninstall has been cancelled${COL_NC}"; exit 0;;
[Nn]* ) echo -e "${OVER} ${COL_LIGHT_GREEN}Uninstall has been canceled${COL_NC}"; exit 0;;
* ) echo -e "${OVER} ${COL_LIGHT_GREEN}Uninstall has been canceled${COL_NC}"; exit 0;;
esac
done
@@ -31,7 +31,7 @@ else
else
echo -e " ${CROSS} ${str}
Script called with non-root privileges
The Pi-hole requires elevated privleges to uninstall"
The Pi-hole requires elevated privileges to uninstall"
exit 1
fi
fi
@@ -42,8 +42,8 @@ source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh"
# setupVars set in basic-install.sh
source "${setupVars}"
# distro_check() sourced from basic-install.sh
distro_check
# package_manager_detect() sourced from basic-install.sh
package_manager_detect
# Install packages used by the Pi-hole
DEPS=("${INSTALLER_DEPS[@]}" "${PIHOLE_DEPS[@]}")
@@ -52,7 +52,7 @@ if [[ "${INSTALL_WEB_SERVER}" == true ]]; then
DEPS+=("${PIHOLE_WEB_DEPS[@]}")
fi
# Compatability
# Compatibility
if [ -x "$(command -v apt-get)" ]; then
# Debian Family
PKG_REMOVE=("${PKG_MANAGER}" -y remove --purge)
@@ -145,6 +145,7 @@ removeNoPurge() {
${SUDO} rm -f /etc/dnsmasq.d/adList.conf &> /dev/null
${SUDO} rm -f /etc/dnsmasq.d/01-pihole.conf &> /dev/null
${SUDO} rm -f /etc/dnsmasq.d/06-rfc6761.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
@@ -188,9 +189,17 @@ removeNoPurge() {
echo -e " ${CROSS} Unable to remove 'pihole' user"
fi
fi
# If the pihole group exists, then remove
if getent group "pihole" &> /dev/null; then
if ${SUDO} groupdel pihole 2> /dev/null; then
echo -e " ${TICK} Removed 'pihole' group"
else
echo -e " ${CROSS} Unable to remove 'pihole' group"
fi
fi
echo -e "\\n We're sorry to see you go, but thanks for checking out Pi-hole!
If you need help, reach out to us on Github, Discourse, Reddit or Twitter
If you need help, reach out to us on GitHub, Discourse, Reddit or Twitter
Reinstall at any time: ${COL_WHITE}curl -sSL https://install.pi-hole.net | bash${COL_NC}
${COL_LIGHT_RED}Please reset the DNS on your router/clients to restore internet connectivity
@@ -198,11 +207,7 @@ removeNoPurge() {
}
######### SCRIPT ###########
if command -v vcgencmd &> /dev/null; then
echo -e " ${INFO} All dependencies are safe to remove on Raspbian"
else
echo -e " ${INFO} Be sure to confirm if any dependencies should not be removed"
fi
while true; do
echo -e " ${INFO} ${COL_YELLOW}The following dependencies may have been added by the Pi-hole install:"
echo -n " "

View File

@@ -1 +0,0 @@
py.test -v -f test/

View File

@@ -1,43 +0,0 @@
# 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
# Lighttpd config file for 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.
server.modules = (
"mod_access",
"mod_alias",
"mod_compress",
"mod_redirect",
"mod_rewrite"
)
server.document-root = "/var/www"
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
server.errorlog = "/var/log/lighttpd/error.log"
server.pid-file = "/var/run/lighttpd.pid"
server.username = "www-data"
server.groupname = "www-data"
server.port = 80
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
url.access-deny = ( "~", ".inc" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
compress.cache-dir = "/var/cache/lighttpd/compress/"
compress.filetype = ( "application/javascript", "text/css", "text/html", "text/plain" )
# default listening port for IPv6 falls back to the IPv4 port
include_shell "/usr/share/lighttpd/use-ipv6.pl " + server.port
include_shell "/usr/share/lighttpd/create-mime.assign.pl"
include_shell "/usr/share/lighttpd/include-conf-enabled.pl"
$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")
}

View File

@@ -1,17 +0,0 @@
# 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
# MiniDLNA config file for 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.
media_dir=V,/var/lib/minidlna/videos/
port=8200
friendly_name=pihole
serial=12345678
model_number=1
inotify=yes

View File

@@ -15,8 +15,6 @@ export LC_ALL=C
coltable="/opt/pihole/COL_TABLE"
source "${coltable}"
regexconverter="/opt/pihole/wildcard_regex_converter.sh"
source "${regexconverter}"
# shellcheck disable=SC1091
source "/etc/.pihole/advanced/Scripts/database_migration/gravity-db.sh"
@@ -35,30 +33,18 @@ localList="${piholeDir}/local.list"
VPNList="/etc/openvpn/ipp.txt"
piholeGitDir="/etc/.pihole"
gravityDBfile="${piholeDir}/gravity.db"
gravityTEMPfile="${piholeDir}/gravity_temp.db"
gravityDBfile_default="${piholeDir}/gravity.db"
# GRAVITYDB may be overwritten by source pihole-FTL.conf below
GRAVITYDB="${gravityDBfile_default}"
gravityDBschema="${piholeGitDir}/advanced/Templates/gravity.db.sql"
gravityDBcopy="${piholeGitDir}/advanced/Templates/gravity_copy.sql"
optimize_database=false
domainsExtension="domains"
resolver="pihole-FTL"
# Source setupVars from install script
setupVars="${piholeDir}/setupVars.conf"
if [[ -f "${setupVars}" ]];then
source "${setupVars}"
# Remove CIDR mask from IPv4/6 addresses
IPV4_ADDRESS="${IPV4_ADDRESS%/*}"
IPV6_ADDRESS="${IPV6_ADDRESS%/*}"
# Determine if IPv4/6 addresses exist
if [[ -z "${IPV4_ADDRESS}" ]] && [[ -z "${IPV6_ADDRESS}" ]]; then
echo -e " ${COL_LIGHT_RED}No IP addresses found! Please run 'pihole -r' to reconfigure${COL_NC}"
exit 1
fi
else
echo -e " ${COL_LIGHT_RED}Installation Failure: ${setupVars} does not exist! ${COL_NC}
Please run 'pihole -r', and choose the 'reconfigure' option to fix."
@@ -71,6 +57,13 @@ if [[ -f "${pihole_FTL}" ]]; then
source "${pihole_FTL}"
fi
# Set this only after sourcing pihole-FTL.conf as the gravity database path may
# have changed
gravityDBfile="${GRAVITYDB}"
gravityTEMPfile="${GRAVITYDB}_temp"
gravityDIR="$(dirname -- "${gravityDBfile}")"
gravityOLDfile="${gravityDIR}/gravity_old.db"
if [[ -z "${BLOCKINGMODE}" ]] ; then
BLOCKINGMODE="NULL"
fi
@@ -87,11 +80,11 @@ generate_gravity_database() {
# Copy data from old to new database file and swap them
gravity_swap_databases() {
local str
local str copyGravity
str="Building tree"
echo -ne " ${INFO} ${str}..."
# The index is intentionally not UNIQUE as prro quality adlists may contain domains more than once
# The index is intentionally not UNIQUE as poor quality adlists may contain domains more than once
output=$( { sqlite3 "${gravityTEMPfile}" "CREATE INDEX idx_gravity ON gravity (domain, adlist_id);"; } 2>&1 )
status="$?"
@@ -104,7 +97,14 @@ gravity_swap_databases() {
str="Swapping databases"
echo -ne " ${INFO} ${str}..."
output=$( { sqlite3 "${gravityTEMPfile}" < "${gravityDBcopy}"; } 2>&1 )
# Gravity copying SQL script
copyGravity="$(cat "${gravityDBcopy}")"
if [[ "${gravityDBfile}" != "${gravityDBfile_default}" ]]; then
# Replace default gravity script location by custom location
copyGravity="${copyGravity//"${gravityDBfile_default}"/"${gravityDBfile}"}"
fi
output=$( { sqlite3 "${gravityTEMPfile}" <<< "${copyGravity}"; } 2>&1 )
status="$?"
if [[ "${status}" -ne 0 ]]; then
@@ -113,8 +113,19 @@ gravity_swap_databases() {
fi
echo -e "${OVER} ${TICK} ${str}"
# Swap databases and remove old database
# Swap databases and remove or conditionally rename old database
# Number of available blocks on disk
availableBlocks=$(stat -f --format "%a" "${gravityDIR}")
# Number of blocks, used by gravity.db
gravityBlocks=$(stat --format "%b" ${gravityDBfile})
# Only keep the old database if available disk space is at least twice the size of the existing gravity.db.
# Better be safe than sorry...
if [ "${availableBlocks}" -gt "$((gravityBlocks * 2))" ] && [ -f "${gravityDBfile}" ]; then
echo -e " ${TICK} The old database remains available."
mv "${gravityDBfile}" "${gravityOLDfile}"
else
rm "${gravityDBfile}"
fi
mv "${gravityTEMPfile}" "${gravityDBfile}"
}
@@ -179,7 +190,7 @@ database_table_from_file() {
echo "${rowid},\"${domain}\",${timestamp}" >> "${tmpFile}"
elif [[ "${table}" == "adlist" ]]; then
# Adlist table format
echo "${rowid},\"${domain}\",1,${timestamp},${timestamp},\"Migrated from ${source}\"" >> "${tmpFile}"
echo "${rowid},\"${domain}\",1,${timestamp},${timestamp},\"Migrated from ${source}\",,0,0,0" >> "${tmpFile}"
else
# White-, black-, and regexlist table format
echo "${rowid},${type},\"${domain}\",1,${timestamp},${timestamp},\"Migrated from ${source}\"" >> "${tmpFile}"
@@ -209,6 +220,59 @@ database_table_from_file() {
echo -e " ${CROSS} Unable to remove ${tmpFile}"
}
# Update timestamp of last update of this list. We store this in the "old" database as all values in the new database will later be overwritten
database_adlist_updated() {
output=$( { printf ".timeout 30000\\nUPDATE adlist SET date_updated = (cast(strftime('%%s', 'now') as int)) WHERE id = %i;\\n" "${1}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
status="$?"
if [[ "${status}" -ne 0 ]]; then
echo -e "\\n ${CROSS} Unable to update timestamp of adlist with ID ${1} in database ${gravityDBfile}\\n ${output}"
gravity_Cleanup "error"
fi
}
# Check if a column with name ${2} exists in gravity table with name ${1}
gravity_column_exists() {
output=$( { printf ".timeout 30000\\nSELECT EXISTS(SELECT * FROM pragma_table_info('%s') WHERE name='%s');\\n" "${1}" "${2}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
if [[ "${output}" == "1" ]]; then
return 0 # Bash 0 is success
fi
return 1 # Bash non-0 is failure
}
# Update number of domain on this list. We store this in the "old" database as all values in the new database will later be overwritten
database_adlist_number() {
# Only try to set number of domains when this field exists in the gravity database
if ! gravity_column_exists "adlist" "number"; then
return;
fi
output=$( { printf ".timeout 30000\\nUPDATE adlist SET number = %i, invalid_domains = %i WHERE id = %i;\\n" "${num_lines}" "${num_invalid}" "${1}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
status="$?"
if [[ "${status}" -ne 0 ]]; then
echo -e "\\n ${CROSS} Unable to update number of domains in adlist with ID ${1} in database ${gravityDBfile}\\n ${output}"
gravity_Cleanup "error"
fi
}
# Update status of this list. We store this in the "old" database as all values in the new database will later be overwritten
database_adlist_status() {
# Only try to set the status when this field exists in the gravity database
if ! gravity_column_exists "adlist" "status"; then
return;
fi
output=$( { printf ".timeout 30000\\nUPDATE adlist SET status = %i WHERE id = %i;\\n" "${2}" "${1}" | sqlite3 "${gravityDBfile}"; } 2>&1 )
status="$?"
if [[ "${status}" -ne 0 ]]; then
echo -e "\\n ${CROSS} Unable to update status of adlist with ID ${1} in database ${gravityDBfile}\\n ${output}"
gravity_Cleanup "error"
fi
}
# Migrate pre-v5.0 list files to database-based Pi-hole versions
migrate_to_database() {
# Create database file only if not present
@@ -271,7 +335,7 @@ gravity_CheckDNSResolutionAvailable() {
fi
# If the /etc/resolv.conf contains resolvers other than 127.0.0.1 then the local dnsmasq will not be queried and pi.hole is NXDOMAIN.
# This means that even though name resolution is working, the getent hosts check fails and the holddown timer keeps ticking and eventualy fails
# This means that even though name resolution is working, the getent hosts check fails and the holddown timer keeps ticking and eventually fails
# So we check the output of the last command and if it failed, attempt to use dig +short as a fallback
if timeout 4 dig +short "${lookupDomain}" &> /dev/null; then
if [[ -n "${secs:-}" ]]; then
@@ -284,7 +348,7 @@ gravity_CheckDNSResolutionAvailable() {
fi
# Determine error output message
if pidof ${resolver} &> /dev/null; then
if pgrep pihole-FTL &> /dev/null; then
echo -e " ${CROSS} DNS resolution is currently unavailable"
else
echo -e " ${CROSS} DNS service is not running"
@@ -309,6 +373,10 @@ gravity_CheckDNSResolutionAvailable() {
gravity_DownloadBlocklists() {
echo -e " ${INFO} ${COL_BOLD}Neutrino emissions detected${COL_NC}..."
if [[ "${gravityDBfile}" != "${gravityDBfile_default}" ]]; then
echo -e " ${INFO} Storing gravity database in ${COL_BOLD}${gravityDBfile}${COL_NC}"
fi
# Retrieve source URLs from gravity database
# We source only enabled adlists, sqlite3 stores boolean values as 0 (false) or 1 (true)
mapfile -t sources <<< "$(sqlite3 "${gravityDBfile}" "SELECT address FROM vw_adlist;" 2> /dev/null)"
@@ -336,7 +404,7 @@ gravity_DownloadBlocklists() {
return 1
fi
local url domain agent cmd_ext str target
local url domain agent cmd_ext str target compression
echo ""
# Prepare new gravity database
@@ -355,13 +423,24 @@ gravity_DownloadBlocklists() {
target="$(mktemp -p "/tmp" --suffix=".gravity")"
# Use compression to reduce the amount of data that is transferred
# between the Pi-hole and the ad list provider. Use this feature
# only if it is supported by the locally available version of curl
if curl -V | grep -q "Features:.* libz"; then
compression="--compressed"
echo -e " ${INFO} Using libz compression\n"
else
compression=""
echo -e " ${INFO} Libz compression not available\n"
fi
# Loop through $sources and download each one
for ((i = 0; i < "${#sources[@]}"; i++)); do
url="${sources[$i]}"
domain="${sourceDomains[$i]}"
id="${sourceIDs[$i]}"
# Save the file as list.#.domain
saveLocation="${piholeDir}/list.${i}.${domain}.${domainsExtension}"
saveLocation="${piholeDir}/list.${id}.${domain}.${domainsExtension}"
activeDomains[$i]="${saveLocation}"
# Default user-agent (for Cloudflare's Browser Integrity Check: https://support.cloudflare.com/hc/en-us/articles/200170086-What-does-the-Browser-Integrity-Check-do-)
@@ -374,13 +453,18 @@ gravity_DownloadBlocklists() {
esac
echo -e " ${INFO} Target: ${url}"
local regex
local regex check_url
# Check for characters NOT allowed in URLs
regex="[^a-zA-Z0-9:/?&%=~._()-]"
if [[ "${url}" =~ ${regex} ]]; then
regex="[^a-zA-Z0-9:/?&%=~._()-;]"
# this will remove first @ that is after schema and before domain
# \1 is optional schema, \2 is userinfo
check_url="$( sed -re 's#([^:/]*://)?([^/]+)@#\1\2#' <<< "$url" )"
if [[ "${check_url}" =~ ${regex} ]]; then
echo -e " ${CROSS} Invalid Target"
else
gravity_DownloadBlocklistFromUrl "${url}" "${cmd_ext}" "${agent}" "${sourceIDs[$i]}" "${saveLocation}" "${target}"
gravity_DownloadBlocklistFromUrl "${url}" "${cmd_ext}" "${agent}" "${sourceIDs[$i]}" "${saveLocation}" "${target}" "${compression}"
fi
echo ""
done
@@ -420,6 +504,8 @@ gravity_DownloadBlocklists() {
}
total_num=0
num_lines=0
num_invalid=0
parseList() {
local adlistID="${1}" src="${2}" target="${3}" incorrect_lines
# This sed does the following things:
@@ -430,7 +516,7 @@ parseList() {
# Find (up to) five domains containing invalid characters (see above)
incorrect_lines="$(sed -e "/[^a-zA-Z0-9.\_-]/!d" "${src}" | head -n 5)"
local num_lines num_target_lines num_correct_lines num_invalid
local num_target_lines num_correct_lines num_invalid
# Get number of lines in source file
num_lines="$(grep -c "^" "${src}")"
# Get number of lines in destination file
@@ -439,9 +525,9 @@ parseList() {
total_num="$num_target_lines"
num_invalid="$(( num_lines-num_correct_lines ))"
if [[ "${num_invalid}" -eq 0 ]]; then
echo " ${INFO} Received ${num_lines} domains"
echo " ${INFO} Analyzed ${num_lines} domains"
else
echo " ${INFO} Received ${num_lines} domains, ${num_invalid} domains invalid!"
echo " ${INFO} Analyzed ${num_lines} domains, ${num_invalid} domains invalid!"
fi
# Display sample of invalid lines if we found some
@@ -452,11 +538,34 @@ parseList() {
done <<< "${incorrect_lines}"
fi
}
compareLists() {
local adlistID="${1}" target="${2}"
# Verify checksum when an older checksum exists
if [[ -s "${target}.sha1" ]]; then
if ! sha1sum --check --status --strict "${target}.sha1"; then
# The list changed upstream, we need to update the checksum
sha1sum "${target}" > "${target}.sha1"
echo " ${INFO} List has been updated"
database_adlist_status "${adlistID}" "1"
database_adlist_updated "${adlistID}"
else
echo " ${INFO} List stayed unchanged"
database_adlist_status "${adlistID}" "2"
fi
else
# No checksum available, create one for comparing on the next run
sha1sum "${target}" > "${target}.sha1"
# We assume here it was changed upstream
database_adlist_status "${adlistID}" "1"
database_adlist_updated "${adlistID}"
fi
}
# Download specified URL and perform checks on HTTP status and file content
gravity_DownloadBlocklistFromUrl() {
local url="${1}" cmd_ext="${2}" agent="${3}" adlistID="${4}" saveLocation="${5}" target="${6}"
local heisenbergCompensator="" patternBuffer str httpCode success=""
local url="${1}" cmd_ext="${2}" agent="${3}" adlistID="${4}" saveLocation="${5}" target="${6}" compression="${7}"
local heisenbergCompensator="" patternBuffer str httpCode success="" ip
# Create temp file to store content on disk instead of RAM
patternBuffer=$(mktemp -p "/tmp" --suffix=".phgpb")
@@ -474,7 +583,10 @@ gravity_DownloadBlocklistFromUrl() {
blocked=false
case $BLOCKINGMODE in
"IP-NODATA-AAAA"|"IP")
if [[ $(dig "${domain}" +short | grep "${IPV4_ADDRESS}" -c) -ge 1 ]]; then
# Get IP address of this domain
ip="$(dig "${domain}" +short)"
# Check if this IP matches any IP of the system
if [[ -n "${ip}" && $(grep -Ec "inet(|6) ${ip}" <<< "$(ip a)") -gt 0 ]]; then
blocked=true
fi;;
"NXDOMAIN")
@@ -504,8 +616,9 @@ gravity_DownloadBlocklistFromUrl() {
echo -ne " ${INFO} ${str} Pending..."
cmd_ext="--resolve $domain:$port:$ip $cmd_ext"
fi
# shellcheck disable=SC2086
httpCode=$(curl -s -L ${cmd_ext} ${heisenbergCompensator} -w "%{http_code}" -A "${agent}" "${url}" -o "${patternBuffer}" 2> /dev/null)
httpCode=$(curl -s -L ${compression} ${cmd_ext} ${heisenbergCompensator} -w "%{http_code}" -A "${agent}" "${url}" -o "${patternBuffer}" 2> /dev/null)
case $url in
# Did we "download" a local file?
@@ -534,29 +647,49 @@ gravity_DownloadBlocklistFromUrl() {
esac;;
esac
local done="false"
# Determine if the blocklist was downloaded and saved correctly
if [[ "${success}" == true ]]; then
if [[ "${httpCode}" == "304" ]]; then
# Add domains to database table file
parseList "${adlistID}" "${saveLocation}" "${target}"
database_adlist_status "${adlistID}" "2"
database_adlist_number "${adlistID}"
done="true"
# Check if $patternbuffer is a non-zero length file
elif [[ -s "${patternBuffer}" ]]; then
# Determine if blocklist is non-standard and parse as appropriate
gravity_ParseFileIntoDomains "${patternBuffer}" "${saveLocation}"
# Add domains to database table file
parseList "${adlistID}" "${saveLocation}" "${target}"
# Compare lists, are they identical?
compareLists "${adlistID}" "${saveLocation}"
# Update gravity database table (status and updated timestamp are set in
# compareLists)
database_adlist_number "${adlistID}"
done="true"
else
# Fall back to previously cached list if $patternBuffer is empty
echo -e " ${INFO} Received empty file: ${COL_LIGHT_GREEN}using previously cached list${COL_NC}"
echo -e " ${INFO} Received empty file"
fi
else
fi
# Do we need to fall back to a cached list (if available)?
if [[ "${done}" != "true" ]]; then
# Determine if cached list has read permission
if [[ -r "${saveLocation}" ]]; then
echo -e " ${CROSS} List download failed: ${COL_LIGHT_GREEN}using previously cached list${COL_NC}"
# Add domains to database table file
parseList "${adlistID}" "${saveLocation}" "${target}"
database_adlist_number "${adlistID}"
database_adlist_status "${adlistID}" "3"
else
echo -e " ${CROSS} List download failed: ${COL_LIGHT_RED}no cached list available${COL_NC}"
# Manually reset these two numbers because we do not call parseList here
num_lines=0
num_invalid=0
database_adlist_number "${adlistID}"
database_adlist_status "${adlistID}" "4"
fi
fi
}
@@ -568,7 +701,7 @@ gravity_ParseFileIntoDomains() {
# Determine if we are parsing a consolidated list
#if [[ "${source}" == "${piholeDir}/${matterAndLight}" ]]; then
# Remove comments and print only the domain name
# Most of the lists downloaded are already in hosts file format but the spacing/formating is not contigious
# Most of the lists downloaded are already in hosts file format but the spacing/formatting is not contiguous
# 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
# 1) Remove carriage returns
@@ -656,43 +789,12 @@ gravity_ShowCount() {
gravity_Table_Count "vw_regex_whitelist" "regex whitelist filters"
}
# Parse list of domains into hosts format
gravity_ParseDomainsIntoHosts() {
awk -v ipv4="$IPV4_ADDRESS" -v ipv6="$IPV6_ADDRESS" '{
# Remove windows CR line endings
sub(/\r$/, "")
# Parse each line as "ipaddr domain"
if(ipv6 && ipv4) {
print ipv4" "$0"\n"ipv6" "$0
} else if(!ipv6) {
print ipv4" "$0
} else {
print ipv6" "$0
}
}' >> "${2}" < "${1}"
}
# Create "localhost" entries into hosts format
gravity_generateLocalList() {
local hostname
if [[ -s "/etc/hostname" ]]; then
hostname=$(< "/etc/hostname")
elif command -v hostname &> /dev/null; then
hostname=$(hostname -f)
else
echo -e " ${CROSS} Unable to determine fully qualified domain name of host"
return 0
fi
echo -e "${hostname}\\npi.hole" > "${localList}.tmp"
# Empty $localList if it already exists, otherwise, create it
: > "${localList}"
echo "### Do not modify this file, it will be overwritten by pihole -g" > "${localList}"
chmod 644 "${localList}"
gravity_ParseDomainsIntoHosts "${localList}.tmp" "${localList}"
# Add additional LAN hosts provided by OpenVPN (if available)
if [[ -f "${VPNList}" ]]; then
awk -F, '{printf $2"\t"$1".vpn\n"}' "${VPNList}" >> "${localList}"
@@ -730,28 +832,13 @@ gravity_Cleanup() {
echo -e "${OVER} ${TICK} ${str}"
if ${optimize_database} ; then
str="Optimizing domains database"
echo -ne " ${INFO} ${str}..."
# Run VACUUM command on database to optimize it
output=$( { sqlite3 "${gravityDBfile}" "VACUUM;"; } 2>&1 )
status="$?"
if [[ "${status}" -ne 0 ]]; then
echo -e "\\n ${CROSS} Unable to optimize gravity database ${gravityDBfile}\\n ${output}"
error="error"
else
echo -e "${OVER} ${TICK} ${str}"
fi
fi
# Only restart DNS service if offline
if ! pidof ${resolver} &> /dev/null; then
if ! pgrep pihole-FTL &> /dev/null; then
"${PIHOLE_COMMAND}" restartdns
dnsWasOffline=true
fi
# Print Pi-hole status if an error occured
# Print Pi-hole status if an error occurred
if [[ -n "${error}" ]]; then
"${PIHOLE_COMMAND}" status
exit 1
@@ -771,12 +858,16 @@ Options:
for var in "$@"; do
case "${var}" in
"-f" | "--force" ) forceDelete=true;;
"-o" | "--optimize" ) optimize_database=true;;
"-r" | "--recreate" ) recreate_database=true;;
"-h" | "--help" ) helpFunc;;
esac
done
# Remove OLD (backup) gravity file, if it exists
if [[ -f "${gravityOLDfile}" ]]; then
rm "${gravityOLDfile}"
fi
# Trap Ctrl-C
gravity_Trap

View File

@@ -1,4 +1,4 @@
.TH "Pihole-FTL" "8" "pihole-FTL" "Pi-hole" "June 2018"
.TH "Pihole-FTL" "8" "pihole-FTL" "Pi-hole" "November 2020"
.SH "NAME"
pihole-FTL - Pi-hole : The Faster-Than-Light (FTL) Engine
.br
@@ -10,7 +10,7 @@ pihole-FTL - Pi-hole : The Faster-Than-Light (FTL) Engine
.br
\fBpihole-FTL test\fR
.br
\fBpihole-FTL -v\fR
\fBpihole-FTL -v|-vv\fR
.br
\fBpihole-FTL -t\fR
.br
@@ -22,6 +22,16 @@ pihole-FTL - Pi-hole : The Faster-Than-Light (FTL) Engine
.br
\fBpihole-FTL dnsmasq-test\fR
.br
\fBpihole-FTL regex-test str\fR
.br
\fBpihole-FTL regex-test str rgx\fR
.br
\fBpihole-FTL lua\fR
.br
\fBpihole-FTL luac\fR
.br
\fBpihole-FTL dhcp-discover\fR
.br
\fBpihole-FTL --\fR (\fBoptions\fR)
.br
@@ -65,6 +75,11 @@ Command line arguments
Don't start FTL, show only version
.br
\fB-vv\fR
.br
Don't start FTL, show verbose version information of embedded applications
.br
\fB-t, tag\fR
.br
Don't start FTL, show only git tag
@@ -90,6 +105,31 @@ Command line arguments
Test resolver config file syntax
.br
\fBregex-test str\fR
.br
Test str against all regular expressions in the database
.br
\fBregex-test str rgx\fR
.br
Test str against regular expression given by rgx
.br
\fBlua\fR
.br
Start the embedded Lua interpreter
.br
\fBluac\fR
.br
Execute the embedded Lua compiler
.br
\fBdhcp-discover\fR
.br
Discover DHCP servers in the local network
.br
\fB--\fR (options)
.br
Pass options to internal dnsmasq resolver

View File

@@ -1,4 +1,4 @@
.TH "pihole-FTL.conf" "5" "pihole-FTL.conf" "pihole-FTL.conf" "June 2018"
.TH "pihole-FTL.conf" "5" "pihole-FTL.conf" "pihole-FTL.conf" "November 2020"
.SH "NAME"
pihole-FTL.conf - FTL's config file
@@ -7,49 +7,32 @@ pihole-FTL.conf - FTL's config file
/etc/pihole/pihole-FTL.conf will be read by \fBpihole-FTL(8)\fR on startup.
.br
\fBSOCKET_LISTENING=localonly|all\fR
.br
Listen only for local socket connections or permit all connections
For each setting the option shown first is the default.
.br
\fBQUERY_DISPLAY=yes|no\fR
\fBBLOCKINGMODE=IP|IP-AAAA-NODATA|NODATA|NXDOMAIN|NULL\fR
.br
Display all queries? Set to no to hide query display
How should FTL reply to blocked queries?
IP - Pi-hole's IPs for blocked domains
IP-AAAA-NODATA - Pi-hole's IP + NODATA-IPv6 for blocked domains
NODATA - Using NODATA for blocked domains
NXDOMAIN - NXDOMAIN for blocked domains
NULL - Null IPs for blocked domains
.br
\fBAAAA_QUERY_ANALYSIS=yes|no\fR
\fBCNAME_DEEP_INSPECT=true|false\fR
.br
Allow FTL to analyze AAAA queries from pihole.log?
Use this option to disable deep CNAME inspection. This might be beneficial for very low-end devices.
.br
\fBRESOLVE_IPV6=yes|no\fR
\fBBLOCK_ESNI=true|false\fR
.br
Should FTL try to resolve IPv6 addresses to host names?
.br
\fBRESOLVE_IPV4=yes|no\fR
.br
Should FTL try to resolve IPv4 addresses to host names?
.br
\fBMAXDBDAYS=365\fR
.br
How long should queries be stored in the database?
.br
Setting this to 0 disables the database
.br
\fBDBINTERVAL=1.0\fR
.br
How often do we store queries in FTL's database [minutes]?
.br
\fBDBFILE=/etc/pihole/pihole-FTL.db\fR
.br
Specify path and filename of FTL's SQLite long-term database.
.br
Setting this to DBFILE= disables the database altogether
Block requests to _esni.* sub-domains.
.br
\fBMAXLOGAGE=24.0\fR
@@ -59,14 +42,9 @@ pihole-FTL.conf - FTL's config file
Maximum is 744 (31 days)
.br
\fBFTLPORT=4711\fR
.br
On which port should FTL be listening?
.br
\fBPRIVACYLEVEL=0|1|2|3|4\fR
.br
Which privacy level is used?
Privacy level used to collect Pi-hole statistics.
.br
0 - show everything
.br
@@ -84,13 +62,244 @@ pihole-FTL.conf - FTL's config file
Should FTL ignore queries coming from the local machine?
.br
\fBBLOCKINGMODE=IP|IP-AAAA-NODATA|NXDOMAIN|NULL\fR
\fBAAAA_QUERY_ANALYSIS=yes|no\fR
.br
How should FTL reply to blocked queries?
Should FTL analyze AAAA queries?
.br
For each setting, the option shown first is the default.
\fBANALYZE_ONLY_A_AND_AAAA=false|true\fR
.br
Should FTL only analyze A and AAAA queries?
.br
\fBSOCKET_LISTENING=localonly|all\fR
.br
Listen only for local socket connections on the API port or permit all connections.
.br
\fBFTLPORT=4711\fR
.br
On which port should FTL be listening?
.br
\fBRESOLVE_IPV6=yes|no\fR
.br
Should FTL try to resolve IPv6 addresses to hostnames?
.br
\fBRESOLVE_IPV4=yes|no\fR
.br
Should FTL try to resolve IPv4 addresses to hostnames?
.br
\fBDELAY_STARTUP=0\fR
.br
Time in seconds (between 0 and 300) to delay FTL startup.
.br
\fBNICE=-10\fR
.br
Set the niceness of the Pi-hole FTL process.
.br
Can be disabled altogether by setting a value of -999.
.br
\fBNAMES_FROM_NETDB=true|false\fR
.br
Control whether FTL should use a fallback option and try to obtain client names from checking the network table.
.br
E.g. IPv6 clients without a hostname will be compared via MAC address to known clients.
.br
\fB\fBREFRESH_HOSTNAMES=IPV4|ALL|NONE\fR
.br
Change how (and if) hourly PTR requests are made to check for changes in client and upstream server hostnames:
.br
IPV4 - Do the hourly PTR lookups only for IPv4 addresses resolving issues in networks with many short-lived PE IPv6 addresses.
.br
ALL - Do the hourly PTR lookups for all addresses. This can create a lot of PTR queries in networks with many IPv6 addresses.
.br
NONE - Don't do hourly PTR lookups. Look up hostnames once (when first seeing a client) and never again. Future hostname changes may be missed.
.br
\fBMAXNETAGE=365\fR
.br
IP addresses (and associated host names) older than the specified number of days are removed.
.br
This avoids dead entries in the network overview table.
.br
\fBEDNS0_ECS=true|false\fR
.br
Should we overwrite the query source when client information is provided through EDNS0 client subnet (ECS) information?
.br
\fBPARSE_ARP_CACHE=true|false\fR
.br
Parse ARP cache to fill network overview table.
.br
\fBDBIMPORT=yes|no\fR
.br
Should FTL load information from the database on startup to be aware of the most recent history?
.br
\fBMAXDBDAYS=365\fR
.br
How long should queries be stored in the database? Setting this to 0 disables the database
.br
\fBDBINTERVAL=1.0\fR
.br
How often do we store queries in FTL's database [minutes]?
.br
Accepts value between 0.1 (6 sec) and 1440 (1 day)
.br
\fBDBFILE=/etc/pihole/pihole-FTL.db\fR
.br
Specify path and filename of FTL's SQLite long-term database.
.br
Setting this to DBFILE= disables the database altogether
.br
\fBLOGFILE=/var/log/pihole-FTL.log\fR
.br
The location of FTL's log file.
.br
\fBPIDFILE=/run/pihole-FTL.pid\fR
.br
The file which contains the PID of FTL's main process.
.br
\fBPORTFILE=/run/pihole-FTL.port\fR
.br
Specify path and filename where the FTL process will write its API port number.
.br
\fBSOCKETFILE=/run/pihole/FTL.sock\fR
.br
The file containing the socket FTL's API is listening on.
.br
\fBSETUPVARSFILE=/etc/pihole/setupVars.conf\fR
.br
The config file of Pi-hole containing, e.g., the current blocking status (do not change).
.br
\fBMACVENDORDB=/etc/pihole/macvendor.db\fR
.br
The database containing MAC -> Vendor information for the network table.
.br
\fBGRAVITYDB=/etc/pihole/gravity.db\fR
.br
Specify path and filename of FTL's SQLite3 gravity database. This database contains all domains relevant for Pi-hole's DNS blocking.
.br
\fBDEBUG_ALL=false|true\fR
.br
Enable all debug flags. If this is set to true, all other debug config options are ignored.
.br
\fBDEBUG_DATABASE=false|true\fR
.br
Print debugging information about database actions such as SQL statements and performance.
.br
\fBDEBUG_NETWORKING=false|true\fR
.br
Prints a list of the detected network interfaces on the startup of FTL.
.br
\fBDEBUG_LOCKS=false|true\fR
.br
Print information about shared memory locks.
.br
Messages will be generated when waiting, obtaining, and releasing a lock.
.br
\fBDEBUG_QUERIES=false|true\fR
.br
Print extensive DNS query information (domains, types, replies, etc.).
.br
\fBDEBUG_FLAGS=false|true\fR
.br
Print flags of queries received by the DNS hooks.
.br
Only effective when \fBDEBUG_QUERIES\fR is enabled as well.
\fBDEBUG_SHMEM=false|true\fR
.br
Print information about shared memory buffers.
.br
Messages are either about creating or enlarging shmem objects or string injections.
.br
\fBDEBUG_GC=false|true\fR
.br
Print information about garbage collection (GC):
.br
What is to be removed, how many have been removed and how long did GC take.
.br
\fBDEBUG_ARP=false|true\fR
.br
Print information about ARP table processing:
.br
How long did parsing take, whether read MAC addresses are valid, and if the macvendor.db file exists.
.br
\fBDEBUG_REGEX=false|true\fR
.br
Controls if FTL should print extended details about regex matching.
.br
\fBDEBUG_API=false|true\fR
.br
Print extra debugging information during telnet API calls.
.br
Currently only used to send extra information when getting all queries.
.br
\fBDEBUG_OVERTIME=false|true\fR
.br
Print information about overTime memory operations, such as initializing or moving overTime slots.
.br
\fBDEBUG_EXTBLOCKED=false|true\fR
.br
Print information about why FTL decided that certain queries were recognized as being externally blocked.
.br
\fBDEBUG_CAPS=false|true\fR
.br
Print information about POSIX capabilities granted to the FTL process.
.br
The current capabilities are printed on receipt of SIGHUP i.e. after executing `killall -HUP pihole-FTL`.
.br
\fBDEBUG_DNSMASQ_LINES=false|true\fR
.br
Print file and line causing a dnsmasq event into FTL's log files.
.br
This is handy to implement additional hooks missing from FTL.
.br
\fBDEBUG_VECTORS=false|true\fR
.br
FTL uses dynamically allocated vectors for various tasks.
.br
This config option enables extensive debugging information such as information about allocation, referencing, deletion, and appending.
.br
\fBDEBUG_RESOLVER=false|true\fR
.br
Extensive information about hostname resolution like which DNS servers are used in the first and second hostname resolving tries.
.br
.SH "SEE ALSO"
\fBpihole\fR(8), \fBpihole-FTL\fR(8)

View File

@@ -56,7 +56,7 @@ Available commands and options:
\fB-w, whitelist\fR [options] [<domain1> <domain2 ...>]
.br
Adds or removes specified domain or domains tho the Whitelist
Adds or removes specified domain or domains to the Whitelist
.br
\fB-b, blacklist\fR [options] [<domain1> <domain2 ...>]
@@ -139,7 +139,7 @@ Available commands and options:
-i, interface Specify dnsmasq's interface listening behavior
.br
-l, privacylevel <level> Set privacy level
(0 = lowest, 4 = highest)
(0 = lowest, 3 = highest)
.br
\fB-c, chronometer\fR [options]
@@ -153,7 +153,7 @@ Available commands and options:
.br
-r, --refresh Set update frequency (in seconds)
.br
-e, --exit Output stats and exit witout refreshing
-e, --exit Output stats and exit without refreshing
.br
\fB-g, updateGravity\fR
@@ -224,7 +224,7 @@ Available commands and options:
.br
-l, --latest Return the latest version
.br
--hash Return the Github hash from your local
--hash Return the GitHub hash from your local
repositories
.br
@@ -257,19 +257,19 @@ Available commands and options:
\fBrestartdns\fR [options]
.br
Full restart Pi-hole subsystems
Full restart Pi-hole subsystems. Without any options (see below) a full restart causes config file parsing and history re-reading
.br
(restart options):
.br
reload Updates the lists and flushes DNS cache
reload Updates the lists (incl. HOSTS files) and flushes DNS cache. Does not reparse config files
.br
reload-lists Updates the lists WITHOUT flushing the DNS cache
reload-lists Updates the lists (excl. HOSTS files) WITHOUT flushing the DNS cache. Does not reparse config files
.br
\fBcheckout\fR [repo] [branch]
.br
Switch Pi-hole subsystems to a different Github branch
Switch Pi-hole subsystems to a different GitHub branch
.br
(repo options):

157
pihole
View File

@@ -16,12 +16,11 @@ readonly PI_HOLE_SCRIPT_DIR="/opt/pihole"
# error due to modifying a readonly variable.
setupVars="/etc/pihole/setupVars.conf"
PI_HOLE_BIN_DIR="/usr/local/bin"
readonly FTL_PID_FILE="/run/pihole-FTL.pid"
readonly colfile="${PI_HOLE_SCRIPT_DIR}/COL_TABLE"
source "${colfile}"
resolver="pihole-FTL"
webpageFunc() {
source "${PI_HOLE_SCRIPT_DIR}/webpage.sh"
main "$@"
@@ -100,27 +99,61 @@ versionFunc() {
exit 0
}
# Get PID of main pihole-FTL process
getFTLPID() {
local pid
if [ -s "${FTL_PID_FILE}" ]; then
# -s: FILE exists and has a size greater than zero
pid="$(<"$FTL_PID_FILE")"
# Exploit prevention: unset the variable if there is malicious content
# Verify that the value read from the file is numeric
[[ "$pid" =~ [^[:digit:]] ]] && unset pid
fi
# If FTL is not running, or the PID file contains malicious stuff, substitute
# negative PID to signal this to the caller
echo "${pid:=-1}"
}
restartDNS() {
local svcOption svc str output status
local svcOption svc str output status pid icon
svcOption="${1:-restart}"
# Determine if we should reload or restart
if [[ "${svcOption}" =~ "reload-lists" ]]; then
# Reloading of the lists has been requested
# Note: This will NOT re-read any *.conf files
# Note 1: This will NOT re-read any *.conf files
# Note 2: We cannot use killall here as it does
# not know about real-time signals
svc="kill -SIGRTMIN $(pidof ${resolver})"
pid="$(getFTLPID)"
if [[ "$pid" -eq "-1" ]]; then
svc="true"
str="FTL is not running"
icon="${INFO}"
else
svc="kill -RTMIN ${pid}"
str="Reloading DNS lists"
icon="${TICK}"
fi
elif [[ "${svcOption}" =~ "reload" ]]; then
# Reloading of the DNS cache has been requested
# Note: This will NOT re-read any *.conf files
svc="killall -s SIGHUP ${resolver}"
pid="$(getFTLPID)"
if [[ "$pid" -eq "-1" ]]; then
svc="true"
str="FTL is not running"
icon="${INFO}"
else
svc="kill -HUP ${pid}"
str="Flushing DNS cache"
icon="${TICK}"
fi
else
# A full restart has been requested
svc="service ${resolver} restart"
svc="service pihole-FTL restart"
str="Restarting DNS server"
icon="${TICK}"
fi
# Print output to Terminal, but not to Web Admin
@@ -130,7 +163,7 @@ restartDNS() {
status="$?"
if [[ "${status}" -eq 0 ]]; then
[[ -t 1 ]] && echo -e "${OVER} ${TICK} ${str}"
[[ -t 1 ]] && echo -e "${OVER} ${icon} ${str}"
return 0
else
[[ ! -t 1 ]] && local OVER=""
@@ -164,7 +197,7 @@ Time:
local str="Disabling blocking for ${tt} seconds"
echo -e " ${INFO} ${str}..."
local str="Blocking will be re-enabled in ${tt} seconds"
nohup bash -c "sleep ${tt}; ${PI_HOLE_BIN_DIR}/pihole enable" </dev/null &>/dev/null &
nohup "${PI_HOLE_SCRIPT_DIR}"/pihole-reenable.sh ${tt} </dev/null &>/dev/null &
else
local error=true
fi
@@ -175,7 +208,7 @@ Time:
echo -e " ${INFO} ${str}..."
local str="Blocking will be re-enabled in ${tt} minutes"
tt=$((${tt}*60))
nohup bash -c "sleep ${tt}; ${PI_HOLE_BIN_DIR}/pihole enable" </dev/null &>/dev/null &
nohup "${PI_HOLE_SCRIPT_DIR}"/pihole-reenable.sh ${tt} </dev/null &>/dev/null &
else
local error=true
fi
@@ -197,6 +230,7 @@ Time:
fi
else
# Enable Pi-hole
killall -q pihole-reenable
if grep -cq "BLOCKING_ENABLED=true" "${setupVars}"; then
echo -e " ${INFO} Blocking already enabled, nothing to do"
exit 0
@@ -208,7 +242,7 @@ Time:
echo "BLOCKING_ENABLED=true" >> "${setupVars}"
fi
restartDNS reload
restartDNS reload-lists
echo -e "${OVER} ${TICK} ${str}"
}
@@ -250,16 +284,47 @@ Options:
echo -e "${OVER} ${TICK} ${str}"
}
analyze_ports() {
# FTL is listening at least on at least one port when this
# function is getting called
echo -e " ${TICK} DNS service is listening"
# Check individual address family/protocol combinations
# For a healthy Pi-hole, they should all be up (nothing printed)
if grep -q "IPv4.*UDP" <<< "${1}"; then
echo -e " ${TICK} UDP (IPv4)"
else
echo -e " ${CROSS} UDP (IPv4)"
fi
if grep -q "IPv4.*TCP" <<< "${1}"; then
echo -e " ${TICK} TCP (IPv4)"
else
echo -e " ${CROSS} TCP (IPv4)"
fi
if grep -q "IPv6.*UDP" <<< "${1}"; then
echo -e " ${TICK} UDP (IPv6)"
else
echo -e " ${CROSS} UDP (IPv6)"
fi
if grep -q "IPv6.*TCP" <<< "${1}"; then
echo -e " ${TICK} TCP (IPv6)"
else
echo -e " ${CROSS} TCP (IPv6)"
fi
echo ""
}
statusFunc() {
# Determine if service is running on port 53 (Cr: https://superuser.com/a/806331)
if (echo > /dev/tcp/127.0.0.1/53) >/dev/null 2>&1; then
# Determine if there is a pihole service is listening on port 53
local listening
listening="$(lsof -Pni:53)"
if grep -q "pihole" <<< "${listening}"; then
if [[ "${1}" != "web" ]]; then
echo -e " ${TICK} DNS service is running"
analyze_ports "${listening}"
fi
else
case "${1}" in
"web") echo "-1";;
*) echo -e " ${CROSS} DNS service is NOT running";;
*) echo -e " ${CROSS} DNS service is NOT listening";;
esac
return 0
fi
@@ -269,13 +334,13 @@ statusFunc() {
# A config is commented out
case "${1}" in
"web") echo 0;;
*) echo -e " ${CROSS} Pi-hole blocking is Disabled";;
*) echo -e " ${CROSS} Pi-hole blocking is disabled";;
esac
elif grep -q "BLOCKING_ENABLED=true" /etc/pihole/setupVars.conf; then
# Configs are set
case "${1}" in
"web") echo 1;;
*) echo -e " ${TICK} Pi-hole blocking is Enabled";;
*) echo -e " ${TICK} Pi-hole blocking is enabled";;
esac
else
# No configs were found
@@ -298,16 +363,13 @@ tailFunc() {
fi
echo -e " ${INFO} Press Ctrl-C to exit"
# Retrieve IPv4/6 addresses
source /etc/pihole/setupVars.conf
# Strip date from each line
# Colour blocklist/blacklist/wildcard entries as red
# Colour A/AAAA/DHCP strings as white
# Colour everything else as gray
tail -f /var/log/pihole.log | sed -E \
# Color blocklist/blacklist/wildcard entries as red
# Color A/AAAA/DHCP strings as white
# Color everything else as gray
tail -f /var/log/pihole.log | grep --line-buffered "${1}" | sed -E \
-e "s,($(date +'%b %d ')| dnsmasq\[[0-9]*\]),,g" \
-e "s,(.*(blacklisted |gravity blocked ).* is (0.0.0.0|::|NXDOMAIN|${IPV4_ADDRESS%/*}|${IPV6_ADDRESS:-NULL}).*),${COL_RED}&${COL_NC}," \
-e "s,(.*(blacklisted |gravity blocked ).*),${COL_RED}&${COL_NC}," \
-e "s,.*(query\\[A|DHCP).*,${COL_NC}&${COL_NC}," \
-e "s,.*,${COL_GRAY}&${COL_NC},"
exit 0
@@ -317,7 +379,7 @@ piholeCheckoutFunc() {
if [[ "$2" == "-h" ]] || [[ "$2" == "--help" ]]; then
echo "Usage: pihole checkout [repo] [branch]
Example: 'pihole checkout master' or 'pihole checkout core dev'
Switch Pi-hole subsystems to a different Github branch
Switch Pi-hole subsystems to a different GitHub branch
Repositories:
core [branch] Change the branch of Pi-hole's core subsystem
@@ -337,34 +399,24 @@ Branches:
}
tricorderFunc() {
local tricorder_token
if [[ ! -p "/dev/stdin" ]]; then
echo -e " ${INFO} Please do not call Tricorder directly"
exit 1
fi
if ! (echo > /dev/tcp/tricorder.pi-hole.net/9998) >/dev/null 2>&1; then
echo -e " ${CROSS} Unable to connect to Pi-hole's Tricorder server"
tricorder_token=$(curl --silent --fail --show-error --upload-file "-" https://tricorder.pi-hole.net/upload < /dev/stdin 2>&1)
if [[ "${tricorder_token}" != "https://tricorder.pi-hole.net/"* ]]; then
echo -e "${CROSS} uploading failed, contact Pi-hole support for assistance."
# Log curl error (if available)
if [ -n "${tricorder_token}" ]; then
echo -e "${INFO} Error message: ${COL_RED}${tricorder_token}${COL_NC}\\n"
tricorder_token=""
fi
exit 1
fi
if command -v openssl &> /dev/null; then
openssl s_client -quiet -connect tricorder.pi-hole.net:9998 2> /dev/null < /dev/stdin
exit "$?"
else
echo -e " ${INFO} ${COL_YELLOW}Security Notice${COL_NC}: ${COL_WHITE}openssl${COL_NC} is not installed
Your debug log will be transmitted unencrypted via plain-text
There is a possibility that this could be intercepted by a third party
If you wish to cancel, press Ctrl-C to exit within 10 seconds"
secs="10"
while [[ "$secs" -gt "0" ]]; do
echo -ne "."
sleep 1
: $((secs--))
done
echo " "
nc tricorder.pi-hole.net 9999 < /dev/stdin
exit "$?"
fi
echo "Upload successful, your token is: ${COL_GREEN}${tricorder_token}${COL_NC}"
exit 0
}
updateCheckFunc() {
@@ -388,10 +440,13 @@ Whitelist/Blacklist Options:
Debugging Options:
-d, debug Start a debugging session
Add '-a' to enable automated debugging
Add '-a' to automatically upload the log to tricorder.pi-hole.net
-f, flush Flush the Pi-hole log
-r, reconfigure Reconfigure or Repair Pi-hole subsystems
-t, tail View the live output of the Pi-hole log
-t, tail [arg] View the live output of the Pi-hole log.
Add an optional argument to filter the log
(regular expressions are supported)
Options:
-a, admin Web interface options
@@ -416,7 +471,7 @@ Options:
restartdns Full restart Pi-hole subsystems
Add 'reload' to update the lists and flush the cache without restarting the DNS server
Add 'reload-lists' to only update the lists WITHOUT flushing the cache or restarting the DNS server
checkout Switch Pi-hole subsystems to a different Github branch
checkout Switch Pi-hole subsystems to a different GitHub branch
Add '-h' for more info on checkout usage
arpflush Flush information stored in Pi-hole's network tables";
exit 0
@@ -465,7 +520,7 @@ case "${1}" in
"status" ) statusFunc "$2";;
"restartdns" ) restartDNS "$2";;
"-a" | "admin" ) webpageFunc "$@";;
"-t" | "tail" ) tailFunc;;
"-t" | "tail" ) tailFunc "$2";;
"checkout" ) piholeCheckoutFunc "$@";;
"tricorder" ) tricorderFunc;;
"updatechecker" ) updateCheckFunc "$@";;

View File

@@ -7,11 +7,11 @@ From command line all you need to do is:
- `pip install tox`
- `tox`
Tox handles setting up a virtual environment for python dependancies, installing dependancies, building the docker images used by tests, and finally running tests. It's an easy way to have travis-ci like build behavior locally.
Tox handles setting up a virtual environment for python dependencies, installing dependencies, building the docker images used by tests, and finally running tests. It's an easy way to have travis-ci like build behavior locally.
## Alternative py.test method of running tests
You're responsible for setting up your virtual env and dependancies in this situation.
You're responsible for setting up your virtual env and dependencies in this situation.
```
py.test -vv -n auto -m "build_stage"

View File

@@ -12,5 +12,6 @@ RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -1,4 +1,4 @@
FROM buildpack-deps:jessie-scm
FROM centos:8
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
@@ -12,5 +12,6 @@ RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,17 @@
FROM buildpack-deps:buster-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,17 @@
FROM buildpack-deps:bullseye-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

17
test/_debian_9.Dockerfile Normal file
View File

@@ -0,0 +1,17 @@
FROM buildpack-deps:stretch-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -1,4 +1,4 @@
FROM fedora:30
FROM fedora:32
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
@@ -12,5 +12,6 @@ RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,17 @@
FROM fedora:33
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,17 @@
FROM buildpack-deps:xenial-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,17 @@
FROM buildpack-deps:bionic-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,18 @@
FROM buildpack-deps:focal-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
ENV DEBIAN_FRONTEND=noninteractive
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -0,0 +1,18 @@
FROM buildpack-deps:hirsute-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole
RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
ADD . $GITDIR
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
ENV DEBIAN_FRONTEND=noninteractive
RUN true && \
chmod +x $SCRIPTDIR/*
ENV PH_TEST true
ENV OS_CHECK_DOMAIN_NAME dev-supportedos.pi-hole.net
#sed '/# Start the installer/Q' /opt/pihole/basic-install.sh > /opt/pihole/stub_basic-install.sh && \

View File

@@ -8,15 +8,13 @@ check_output = testinfra.get_backend(
SETUPVARS = {
'PIHOLE_INTERFACE': 'eth99',
'IPV4_ADDRESS': '1.1.1.1',
'IPV6_ADDRESS': 'FE80::240:D0FF:FE48:4672',
'PIHOLE_DNS_1': '4.2.2.1',
'PIHOLE_DNS_2': '4.2.2.2'
}
tick_box = "[\x1b[1;32m\xe2\x9c\x93\x1b[0m]".decode("utf-8")
cross_box = "[\x1b[1;31m\xe2\x9c\x97\x1b[0m]".decode("utf-8")
info_box = "[i]".decode("utf-8")
tick_box = "[\x1b[1;32m\u2713\x1b[0m]"
cross_box = "[\x1b[1;31m\u2717\x1b[0m]"
info_box = "[i]"
@pytest.fixture
@@ -38,9 +36,7 @@ def Pihole(Docker):
return out
funcType = type(Docker.run)
Docker.run = funcType(run_bash,
Docker,
testinfra.backend.docker.DockerBackend)
Docker.run = funcType(run_bash, Docker)
return Docker
@@ -71,7 +67,9 @@ def args(request):
return '-t -d'
@pytest.fixture(params=['debian', 'centos', 'fedora'])
@pytest.fixture(params=[
'test_container'
])
def tag(request):
'''
consumed by image to make the test matrix
@@ -106,7 +104,7 @@ def mock_command(script, args, container):
#!/bin/bash -e
echo "\$0 \$@" >> /var/log/{script}
case "\$1" in'''.format(script=script))
for k, v in args.iteritems():
for k, v in args.items():
case = dedent('''
{arg})
echo {res}
@@ -133,7 +131,7 @@ def mock_command_2(script, args, container):
#!/bin/bash -e
echo "\$0 \$@" >> /var/log/{script}
case "\$1 \$2" in'''.format(script=script))
for k, v in args.iteritems():
for k, v in args.items():
case = dedent('''
\"{arg}\")
echo \"{res}\"

View File

@@ -1,23 +0,0 @@
''' This file starts with 000 to make it run first '''
import pytest
import testinfra
run_local = testinfra.get_backend(
"local://"
).get_module("Command").run
@pytest.mark.parametrize("image,tag", [
('test/debian.Dockerfile', 'pytest_pihole:debian'),
('test/centos.Dockerfile', 'pytest_pihole:centos'),
('test/fedora.Dockerfile', 'pytest_pihole:fedora'),
])
# mark as 'build_stage' so we can ensure images are build first when tests
# are executed in parallel. (not required when tests are executed serially)
@pytest.mark.build_stage
def test_build_pihole_image(image, tag):
build_cmd = run_local('docker build -f {} -t {} .'.format(image, tag))
if build_cmd.rc != 0:
print build_cmd.stdout
print build_cmd.stderr
assert build_cmd.rc == 0

View File

@@ -1,6 +1,6 @@
from textwrap import dedent
import re
from conftest import (
from .conftest import (
SETUPVARS,
tick_box,
info_box,
@@ -11,20 +11,20 @@ from conftest import (
)
def test_supported_operating_system(Pihole):
def test_supported_package_manager(Pihole):
'''
confirm installer exists on unsupported distribution
confirm installer exits when no supported package manager found
'''
# break supported package managers to emulate an unsupported distribution
# break supported package managers
Pihole.run('rm -rf /usr/bin/apt-get')
Pihole.run('rm -rf /usr/bin/rpm')
distro_check = Pihole.run('''
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
package_manager_detect
''')
expected_stdout = cross_box + ' OS distribution not supported'
assert expected_stdout in distro_check.stdout
# assert distro_check.rc == 1
expected_stdout = cross_box + ' No supported package manager found'
assert expected_stdout in package_manager_detect.stdout
# assert package_manager_detect.rc == 1
def test_setupVars_are_sourced_to_global_scope(Pihole):
@@ -34,7 +34,7 @@ def test_setupVars_are_sourced_to_global_scope(Pihole):
This confirms the sourced variables are in scope between functions
'''
setup_var_file = 'cat <<EOF> /etc/pihole/setupVars.conf\n'
for k, v in SETUPVARS.iteritems():
for k, v in SETUPVARS.items():
setup_var_file += "{}={}\n".format(k, v)
setup_var_file += "EOF\n"
Pihole.run(setup_var_file)
@@ -45,8 +45,6 @@ def test_setupVars_are_sourced_to_global_scope(Pihole):
# Currently debug test function only
echo "Outputting sourced variables"
echo "PIHOLE_INTERFACE=${PIHOLE_INTERFACE}"
echo "IPV4_ADDRESS=${IPV4_ADDRESS}"
echo "IPV6_ADDRESS=${IPV6_ADDRESS}"
echo "PIHOLE_DNS_1=${PIHOLE_DNS_1}"
echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}"
}
@@ -59,7 +57,7 @@ def test_setupVars_are_sourced_to_global_scope(Pihole):
output = run_script(Pihole, script).stdout
for k, v in SETUPVARS.iteritems():
for k, v in SETUPVARS.items():
assert "{}={}".format(k, v) in output
@@ -69,7 +67,7 @@ def test_setupVars_saved_to_file(Pihole):
'''
# dedent works better with this and padding matching script below
set_setup_vars = '\n'
for k, v in SETUPVARS.iteritems():
for k, v in SETUPVARS.items():
set_setup_vars += " {}={}\n".format(k, v)
Pihole.run(set_setup_vars).stdout
@@ -88,7 +86,7 @@ def test_setupVars_saved_to_file(Pihole):
output = run_script(Pihole, script).stdout
for k, v in SETUPVARS.iteritems():
for k, v in SETUPVARS.items():
assert "{}={}".format(k, v) in output
@@ -114,9 +112,9 @@ def test_installPiholeWeb_fresh_install_no_errors(Pihole):
source /opt/pihole/basic-install.sh
installPiholeWeb
''')
expected_stdout = info_box + ' Installing blocking page...'
expected_stdout = info_box + ' Installing 404 page...'
assert expected_stdout in installWeb.stdout
expected_stdout = tick_box + (' Creating directory for blocking page, '
expected_stdout = tick_box + (' Creating directory for 404 page, '
'and copying files')
assert expected_stdout in installWeb.stdout
expected_stdout = info_box + ' Backing up index.lighttpd.html'
@@ -128,7 +126,6 @@ def test_installPiholeWeb_fresh_install_no_errors(Pihole):
assert expected_stdout in installWeb.stdout
web_directory = Pihole.run('ls -r /var/www/html/pihole').stdout
assert 'index.php' in web_directory
assert 'blockingpage.css' in web_directory
def test_update_package_cache_success_no_errors(Pihole):
@@ -137,7 +134,7 @@ def test_update_package_cache_success_no_errors(Pihole):
'''
updateCache = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
package_manager_detect
update_package_cache
''')
expected_stdout = tick_box + ' Update local cache of available packages'
@@ -152,7 +149,7 @@ def test_update_package_cache_failure_no_errors(Pihole):
mock_command('apt-get', {'update': ('', '1')}, Pihole)
updateCache = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
package_manager_detect
update_package_cache
''')
expected_stdout = cross_box + ' Update local cache of available packages'
@@ -187,7 +184,55 @@ def test_FTL_detect_aarch64_no_errors(Pihole):
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Detected ARM-aarch64 architecture'
expected_stdout = tick_box + ' Detected AArch64 (64 Bit ARM) processor'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
def test_FTL_detect_armv4t_no_errors(Pihole):
'''
confirms only armv4t package is downloaded for FTL engine
'''
# mock uname to return armv4t platform
mock_command('uname', {'-m': ('armv4t', '0')}, Pihole)
# mock ldd to respond with ld-linux shared library
mock_command('ldd', {'/bin/ls': ('/lib/ld-linux.so.3', '0')}, Pihole)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
create_pihole_user
funcOutput=$(get_binary_name)
binary="pihole-FTL${funcOutput##*pihole-FTL}"
theRest="${funcOutput%pihole-FTL*}"
FTLdetect "${binary}" "${theRest}"
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + (' Detected ARMv4 processor')
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
def test_FTL_detect_armv5te_no_errors(Pihole):
'''
confirms only armv5te package is downloaded for FTL engine
'''
# mock uname to return armv5te platform
mock_command('uname', {'-m': ('armv5te', '0')}, Pihole)
# mock ldd to respond with ld-linux shared library
mock_command('ldd', {'/bin/ls': ('/lib/ld-linux.so.3', '0')}, Pihole)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
create_pihole_user
funcOutput=$(get_binary_name)
binary="pihole-FTL${funcOutput##*pihole-FTL}"
theRest="${funcOutput%pihole-FTL*}"
FTLdetect "${binary}" "${theRest}"
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + (' Detected ARMv5 (or newer) processor')
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
@@ -199,7 +244,7 @@ def test_FTL_detect_armv6l_no_errors(Pihole):
'''
# mock uname to return armv6l platform
mock_command('uname', {'-m': ('armv6l', '0')}, Pihole)
# mock ldd to respond with aarch64 shared library
# mock ldd to respond with ld-linux-armhf shared library
mock_command('ldd', {'/bin/ls': ('/lib/ld-linux-armhf.so.3', '0')}, Pihole)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
@@ -211,8 +256,8 @@ def test_FTL_detect_armv6l_no_errors(Pihole):
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + (' Detected ARM-hf architecture '
'(armv6 or lower)')
expected_stdout = tick_box + (' Detected ARMv6 processor '
'(with hard-float support)')
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
@@ -224,7 +269,7 @@ def test_FTL_detect_armv7l_no_errors(Pihole):
'''
# mock uname to return armv7l platform
mock_command('uname', {'-m': ('armv7l', '0')}, Pihole)
# mock ldd to respond with aarch64 shared library
# mock ldd to respond with ld-linux-armhf shared library
mock_command('ldd', {'/bin/ls': ('/lib/ld-linux-armhf.so.3', '0')}, Pihole)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
@@ -236,7 +281,32 @@ def test_FTL_detect_armv7l_no_errors(Pihole):
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Detected ARM-hf architecture (armv7+)'
expected_stdout = tick_box + (' Detected ARMv7 processor '
'(with hard-float support)')
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
def test_FTL_detect_armv8a_no_errors(Pihole):
'''
confirms only armv8a package is downloaded for FTL engine
'''
# mock uname to return armv8a platform
mock_command('uname', {'-m': ('armv8a', '0')}, Pihole)
# mock ldd to respond with ld-linux-armhf shared library
mock_command('ldd', {'/bin/ls': ('/lib/ld-linux-armhf.so.3', '0')}, Pihole)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
create_pihole_user
funcOutput=$(get_binary_name)
binary="pihole-FTL${funcOutput##*pihole-FTL}"
theRest="${funcOutput%pihole-FTL*}"
FTLdetect "${binary}" "${theRest}"
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Detected ARMv8 (or newer) processor'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
@@ -256,7 +326,7 @@ def test_FTL_detect_x86_64_no_errors(Pihole):
''')
expected_stdout = info_box + ' FTL Checks...'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Detected x86_64 architecture'
expected_stdout = tick_box + ' Detected x86_64 processor'
assert expected_stdout in detectPlatform.stdout
expected_stdout = tick_box + ' Downloading and Installing FTL'
assert expected_stdout in detectPlatform.stdout
@@ -274,7 +344,7 @@ def test_FTL_detect_unknown_no_errors(Pihole):
theRest="${funcOutput%pihole-FTL*}"
FTLdetect "${binary}" "${theRest}"
''')
expected_stdout = 'Not able to detect architecture (unknown: mips)'
expected_stdout = 'Not able to detect processor (unknown: mips)'
assert expected_stdout in detectPlatform.stdout
@@ -286,7 +356,7 @@ def test_FTL_download_aarch64_no_errors(Pihole):
mock_command('whiptail', {'*': ('', '0')}, Pihole)
Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
package_manager_detect
install_dependent_packages ${INSTALLER_DEPS[@]}
''')
download_binary = Pihole.run('''
@@ -350,10 +420,9 @@ def test_IPv6_only_link_local(Pihole):
)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
useIPv6dialog
find_IPv6_information
''')
expected_stdout = ('Unable to find IPv6 ULA/GUA address, '
'IPv6 adblocking will not be enabled')
expected_stdout = ('Unable to find IPv6 ULA/GUA address')
assert expected_stdout in detectPlatform.stdout
@@ -374,9 +443,9 @@ def test_IPv6_only_ULA(Pihole):
)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
useIPv6dialog
find_IPv6_information
''')
expected_stdout = 'Found IPv6 ULA address, using it for blocking IPv6 ads'
expected_stdout = 'Found IPv6 ULA address'
assert expected_stdout in detectPlatform.stdout
@@ -397,9 +466,9 @@ def test_IPv6_only_GUA(Pihole):
)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
useIPv6dialog
find_IPv6_information
''')
expected_stdout = 'Found IPv6 GUA address, using it for blocking IPv6 ads'
expected_stdout = 'Found IPv6 GUA address'
assert expected_stdout in detectPlatform.stdout
@@ -421,9 +490,9 @@ def test_IPv6_GUA_ULA_test(Pihole):
)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
useIPv6dialog
find_IPv6_information
''')
expected_stdout = 'Found IPv6 ULA address, using it for blocking IPv6 ads'
expected_stdout = 'Found IPv6 ULA address'
assert expected_stdout in detectPlatform.stdout
@@ -445,46 +514,125 @@ def test_IPv6_ULA_GUA_test(Pihole):
)
detectPlatform = Pihole.run('''
source /opt/pihole/basic-install.sh
useIPv6dialog
find_IPv6_information
''')
expected_stdout = 'Found IPv6 ULA address, using it for blocking IPv6 ads'
expected_stdout = 'Found IPv6 ULA address'
assert expected_stdout in detectPlatform.stdout
def test_validate_ip_valid(Pihole):
def test_validate_ip(Pihole):
'''
Given a valid IP address, valid_ip returns success
Tests valid_ip for various IP addresses
'''
def test_address(addr, success=True):
output = Pihole.run('''
source /opt/pihole/basic-install.sh
valid_ip "192.168.1.1"
valid_ip "{addr}"
'''.format(addr=addr))
assert output.rc == 0 if success else 1
test_address('192.168.1.1')
test_address('127.0.0.1')
test_address('255.255.255.255')
test_address('255.255.255.256', False)
test_address('255.255.256.255', False)
test_address('255.256.255.255', False)
test_address('256.255.255.255', False)
test_address('1092.168.1.1', False)
test_address('not an IP', False)
test_address('8.8.8.8#', False)
test_address('8.8.8.8#0')
test_address('8.8.8.8#1')
test_address('8.8.8.8#42')
test_address('8.8.8.8#888')
test_address('8.8.8.8#1337')
test_address('8.8.8.8#65535')
test_address('8.8.8.8#65536', False)
test_address('8.8.8.8#-1', False)
test_address('00.0.0.0', False)
test_address('010.0.0.0', False)
test_address('001.0.0.0', False)
test_address('0.0.0.0#00', False)
test_address('0.0.0.0#01', False)
test_address('0.0.0.0#001', False)
test_address('0.0.0.0#0001', False)
test_address('0.0.0.0#00001', False)
def test_os_check_fails(Pihole):
''' Confirms install fails on unsupported OS '''
Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
install_dependent_packages ${OS_CHECK_DEPS[@]}
install_dependent_packages ${INSTALLER_DEPS[@]}
cat <<EOT > /etc/os-release
ID=UnsupportedOS
VERSION_ID="2"
EOT
''')
detectOS = Pihole.run('''t
source /opt/pihole/basic-install.sh
os_check
''')
expected_stdout = 'Unsupported OS detected: UnsupportedOS'
assert expected_stdout in detectOS.stdout
def test_os_check_passes(Pihole):
''' Confirms OS meets the requirements '''
Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
install_dependent_packages ${OS_CHECK_DEPS[@]}
install_dependent_packages ${INSTALLER_DEPS[@]}
''')
detectOS = Pihole.run('''
source /opt/pihole/basic-install.sh
os_check
''')
expected_stdout = 'Supported OS detected'
assert expected_stdout in detectOS.stdout
def test_package_manager_has_installer_deps(Pihole):
''' Confirms OS is able to install the required packages for the installer'''
mock_command('whiptail', {'*': ('', '0')}, Pihole)
output = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
install_dependent_packages ${INSTALLER_DEPS[@]}
''')
assert 'No package' not in output.stdout # centos7 still exits 0...
assert output.rc == 0
def test_validate_ip_invalid_octet(Pihole):
'''
Given an invalid IP address (large octet), valid_ip returns an error
'''
def test_package_manager_has_pihole_deps(Pihole):
''' Confirms OS is able to install the required packages for Pi-hole '''
mock_command('whiptail', {'*': ('', '0')}, Pihole)
output = Pihole.run('''
source /opt/pihole/basic-install.sh
valid_ip "1092.168.1.1"
package_manager_detect
select_rpm_php
install_dependent_packages ${PIHOLE_DEPS[@]}
''')
assert output.rc == 1
assert 'No package' not in output.stdout # centos7 still exits 0...
assert output.rc == 0
def test_validate_ip_invalid_letters(Pihole):
'''
Given an invalid IP address (contains letters), valid_ip returns an error
'''
def test_package_manager_has_web_deps(Pihole):
''' Confirms OS is able to install the required packages for web '''
mock_command('whiptail', {'*': ('', '0')}, Pihole)
output = Pihole.run('''
source /opt/pihole/basic-install.sh
valid_ip "not an IP"
package_manager_detect
select_rpm_php
install_dependent_packages ${PIHOLE_WEB_DEPS[@]}
''')
assert output.rc == 1
assert 'No package' not in output.stdout # centos7 still exits 0...
assert output.rc == 0

View File

@@ -0,0 +1,63 @@
from .conftest import (
tick_box,
info_box,
mock_command,
)
def test_php_upgrade_default_optout_centos_eq_7(Pihole):
'''
confirms the default behavior to opt-out of installing PHP7 from REMI
'''
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_upgrade_user_optout_centos_eq_7(Pihole):
'''
confirms installer behavior when user opt-out of installing PHP7 from REMI
(php not currently installed)
'''
# Whiptail dialog returns Cancel for user prompt
mock_command('whiptail', {'*': ('', '1')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_upgrade_user_optin_centos_eq_7(Pihole):
'''
confirms installer behavior when user opt-in to installing PHP7 from REMI
(php not currently installed)
'''
# Whiptail dialog returns Continue for user prompt
mock_command('whiptail', {'*': ('', '0')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
assert 'opt-out' not in package_manager_detect.stdout
expected_stdout = info_box + (' Enabling Remi\'s RPM repository '
'(https://rpms.remirepo.net)')
assert expected_stdout in package_manager_detect.stdout
expected_stdout = tick_box + (' Remi\'s RPM repository has '
'been enabled for PHP7')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert remi_package.is_installed

View File

@@ -0,0 +1,68 @@
from .conftest import (
tick_box,
info_box,
mock_command,
)
def test_php_upgrade_default_continue_centos_gte_8(Pihole):
'''
confirms the latest version of CentOS continues / does not optout
(should trigger on CentOS7 only)
'''
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
unexpected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS.'
' Deprecated PHP may be in use.')
assert unexpected_stdout not in package_manager_detect.stdout
# ensure remi was not installed on latest CentOS
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_upgrade_user_optout_skipped_centos_gte_8(Pihole):
'''
confirms installer skips user opt-out of installing PHP7 from REMI on
latest CentOS (should trigger on CentOS7 only)
(php not currently installed)
'''
# Whiptail dialog returns Cancel for user prompt
mock_command('whiptail', {'*': ('', '1')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
unexpected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS.'
' Deprecated PHP may be in use.')
assert unexpected_stdout not in package_manager_detect.stdout
# ensure remi was not installed on latest CentOS
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_upgrade_user_optin_skipped_centos_gte_8(Pihole):
'''
confirms installer skips user opt-in to installing PHP7 from REMI on
latest CentOS (should trigger on CentOS7 only)
(php not currently installed)
'''
# Whiptail dialog returns Continue for user prompt
mock_command('whiptail', {'*': ('', '0')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
assert 'opt-out' not in package_manager_detect.stdout
unexpected_stdout = info_box + (' Enabling Remi\'s RPM repository '
'(https://rpms.remirepo.net)')
assert unexpected_stdout not in package_manager_detect.stdout
unexpected_stdout = tick_box + (' Remi\'s RPM repository has '
'been enabled for PHP7')
assert unexpected_stdout not in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed

View File

@@ -0,0 +1,125 @@
import pytest
from .conftest import (
tick_box,
info_box,
cross_box,
mock_command,
)
def test_release_supported_version_check_centos(Pihole):
'''
confirms installer exits on unsupported releases of CentOS
'''
# modify /etc/redhat-release to mock an unsupported CentOS release
Pihole.run('echo "CentOS Linux release 6.9" > /etc/redhat-release')
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = cross_box + (' CentOS 6 is not supported.')
assert expected_stdout in package_manager_detect.stdout
expected_stdout = 'Please update to CentOS release 7 or later'
assert expected_stdout in package_manager_detect.stdout
def test_enable_epel_repository_centos(Pihole):
'''
confirms the EPEL package repository is enabled when installed on CentOS
'''
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = info_box + (' Enabling EPEL package repository '
'(https://fedoraproject.org/wiki/EPEL)')
assert expected_stdout in package_manager_detect.stdout
expected_stdout = tick_box + ' Installed epel-release'
assert expected_stdout in package_manager_detect.stdout
epel_package = Pihole.package('epel-release')
assert epel_package.is_installed
def test_php_version_lt_7_detected_upgrade_default_optout_centos(Pihole):
'''
confirms the default behavior to opt-out of upgrading to PHP7 from REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_version_lt_7_detected_upgrade_user_optout_centos(Pihole):
'''
confirms installer behavior when user opt-out to upgrade to PHP7 via REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
# Whiptail dialog returns Cancel for user prompt
mock_command('whiptail', {'*': ('', '1')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
def test_php_version_lt_7_detected_upgrade_user_optin_centos(Pihole):
'''
confirms installer behavior when user opt-in to upgrade to PHP7 via REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
# Whiptail dialog returns Continue for user prompt
mock_command('whiptail', {'*': ('', '0')}, Pihole)
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
install_dependent_packages PIHOLE_WEB_DEPS[@]
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout not in package_manager_detect.stdout
expected_stdout = info_box + (' Enabling Remi\'s RPM repository '
'(https://rpms.remirepo.net)')
assert expected_stdout in package_manager_detect.stdout
expected_stdout = tick_box + (' Remi\'s RPM repository has '
'been enabled for PHP7')
assert expected_stdout in package_manager_detect.stdout
remi_package = Pihole.package('remi-release')
assert remi_package.is_installed
updated_php_package = Pihole.package('php')
updated_php_version = updated_php_package.version.split('.')[0]
assert int(updated_php_version) == 7

View File

@@ -0,0 +1,65 @@
from .conftest import (
tick_box,
cross_box,
mock_command,
)
def mock_selinux_config(state, Pihole):
'''
Creates a mock SELinux config file with expected content
'''
# validate state string
valid_states = ['enforcing', 'permissive', 'disabled']
assert state in valid_states
# getenforce returns the running state of SELinux
mock_command('getenforce', {'*': (state.capitalize(), '0')}, Pihole)
# create mock configuration with desired content
Pihole.run('''
mkdir /etc/selinux
echo "SELINUX={state}" > /etc/selinux/config
'''.format(state=state.lower()))
def test_selinux_enforcing_exit(Pihole):
'''
confirms installer prompts to exit when SELinux is Enforcing by default
'''
mock_selinux_config("enforcing", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = cross_box + ' Current SELinux: Enforcing'
assert expected_stdout in check_selinux.stdout
expected_stdout = 'SELinux Enforcing detected, exiting installer'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 1
def test_selinux_permissive(Pihole):
'''
confirms installer continues when SELinux is Permissive
'''
mock_selinux_config("permissive", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = tick_box + ' Current SELinux: Permissive'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 0
def test_selinux_disabled(Pihole):
'''
confirms installer continues when SELinux is Disabled
'''
mock_selinux_config("disabled", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = tick_box + ' Current SELinux: Disabled'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 0

View File

@@ -1,265 +0,0 @@
import pytest
from conftest import (
tick_box,
info_box,
cross_box,
mock_command,
mock_command_2,
)
def mock_selinux_config(state, Pihole):
'''
Creates a mock SELinux config file with expected content
'''
# validate state string
valid_states = ['enforcing', 'permissive', 'disabled']
assert state in valid_states
# getenforce returns the running state of SELinux
mock_command('getenforce', {'*': (state.capitalize(), '0')}, Pihole)
# create mock configuration with desired content
Pihole.run('''
mkdir /etc/selinux
echo "SELINUX={state}" > /etc/selinux/config
'''.format(state=state.lower()))
@pytest.mark.parametrize("tag", [('centos'), ('fedora'), ])
def test_selinux_enforcing_exit(Pihole):
'''
confirms installer prompts to exit when SELinux is Enforcing by default
'''
mock_selinux_config("enforcing", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = cross_box + ' Current SELinux: Enforcing'
assert expected_stdout in check_selinux.stdout
expected_stdout = 'SELinux Enforcing detected, exiting installer'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 1
@pytest.mark.parametrize("tag", [('centos'), ('fedora'), ])
def test_selinux_permissive(Pihole):
'''
confirms installer continues when SELinux is Permissive
'''
mock_selinux_config("permissive", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = tick_box + ' Current SELinux: Permissive'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 0
@pytest.mark.parametrize("tag", [('centos'), ('fedora'), ])
def test_selinux_disabled(Pihole):
'''
confirms installer continues when SELinux is Disabled
'''
mock_selinux_config("disabled", Pihole)
check_selinux = Pihole.run('''
source /opt/pihole/basic-install.sh
checkSelinux
''')
expected_stdout = tick_box + ' Current SELinux: Disabled'
assert expected_stdout in check_selinux.stdout
assert check_selinux.rc == 0
@pytest.mark.parametrize("tag", [('fedora'), ])
def test_epel_and_remi_not_installed_fedora(Pihole):
'''
confirms installer does not attempt to install EPEL/REMI repositories
on Fedora
'''
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
assert distro_check.stdout == ''
epel_package = Pihole.package('epel-release')
assert not epel_package.is_installed
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_release_supported_version_check_centos(Pihole):
'''
confirms installer exits on unsupported releases of CentOS
'''
# modify /etc/redhat-release to mock an unsupported CentOS release
Pihole.run('echo "CentOS Linux release 6.9" > /etc/redhat-release')
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = cross_box + (' CentOS 6 is not supported.')
assert expected_stdout in distro_check.stdout
expected_stdout = 'Please update to CentOS release 7 or later'
assert expected_stdout in distro_check.stdout
@pytest.mark.parametrize("tag", [('centos'), ])
def test_enable_epel_repository_centos(Pihole):
'''
confirms the EPEL package repository is enabled when installed on CentOS
'''
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = info_box + (' Enabling EPEL package repository '
'(https://fedoraproject.org/wiki/EPEL)')
assert expected_stdout in distro_check.stdout
expected_stdout = tick_box + ' Installed epel-release'
assert expected_stdout in distro_check.stdout
epel_package = Pihole.package('epel-release')
assert epel_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_upgrade_default_optout_centos(Pihole):
'''
confirms the default behavior to opt-out of installing PHP7 from REMI
'''
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_upgrade_user_optout_centos(Pihole):
'''
confirms installer behavior when user opt-out of installing PHP7 from REMI
(php not currently installed)
'''
# Whiptail dialog returns Cancel for user prompt
mock_command('whiptail', {'*': ('', '1')}, Pihole)
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_upgrade_user_optin_centos(Pihole):
'''
confirms installer behavior when user opt-in to installing PHP7 from REMI
(php not currently installed)
'''
# Whiptail dialog returns Continue for user prompt
mock_command('whiptail', {'*': ('', '0')}, Pihole)
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
assert 'opt-out' not in distro_check.stdout
expected_stdout = info_box + (' Enabling Remi\'s RPM repository '
'(https://rpms.remirepo.net)')
assert expected_stdout in distro_check.stdout
expected_stdout = tick_box + (' Remi\'s RPM repository has '
'been enabled for PHP7')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_version_lt_7_detected_upgrade_default_optout_centos(Pihole):
'''
confirms the default behavior to opt-out of upgrading to PHP7 from REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_version_lt_7_detected_upgrade_user_optout_centos(Pihole):
'''
confirms installer behavior when user opt-out to upgrade to PHP7 via REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
# Whiptail dialog returns Cancel for user prompt
mock_command('whiptail', {'*': ('', '1')}, Pihole)
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed
@pytest.mark.parametrize("tag", [('centos'), ])
def test_php_version_lt_7_detected_upgrade_user_optin_centos(Pihole):
'''
confirms installer behavior when user opt-in to upgrade to PHP7 via REMI
'''
# first we will install the default php version to test installer behavior
php_install = Pihole.run('yum install -y php')
assert php_install.rc == 0
php_package = Pihole.package('php')
default_centos_php_version = php_package.version.split('.')[0]
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
pytest.skip("Test deprecated . Detected default PHP version >= 7")
# Whiptail dialog returns Continue for user prompt
mock_command('whiptail', {'*': ('', '0')}, Pihole)
distro_check = Pihole.run('''
source /opt/pihole/basic-install.sh
distro_check
install_dependent_packages PIHOLE_WEB_DEPS[@]
''')
expected_stdout = info_box + (' User opt-out of PHP 7 upgrade on CentOS. '
'Deprecated PHP may be in use.')
assert expected_stdout not in distro_check.stdout
expected_stdout = info_box + (' Enabling Remi\'s RPM repository '
'(https://rpms.remirepo.net)')
assert expected_stdout in distro_check.stdout
expected_stdout = tick_box + (' Remi\'s RPM repository has '
'been enabled for PHP7')
assert expected_stdout in distro_check.stdout
remi_package = Pihole.package('remi-release')
assert remi_package.is_installed
updated_php_package = Pihole.package('php')
updated_php_version = updated_php_package.version.split('.')[0]
assert int(updated_php_version) == 7

View File

@@ -0,0 +1,16 @@
def test_epel_and_remi_not_installed_fedora(Pihole):
'''
confirms installer does not attempt to install EPEL/REMI repositories
on Fedora
'''
package_manager_detect = Pihole.run('''
source /opt/pihole/basic-install.sh
package_manager_detect
select_rpm_php
''')
assert package_manager_detect.stdout == ''
epel_package = Pihole.package('epel-release')
assert not epel_package.is_installed
remi_package = Pihole.package('remi-release')
assert not remi_package.is_installed

View File

@@ -1,18 +0,0 @@
import testinfra
run_local = testinfra.get_backend(
"local://"
).get_module("Command").run
def test_scripts_pass_shellcheck():
'''
Make sure shellcheck does not find anything wrong with our shell scripts
'''
shellcheck = ("find . -type f -name 'update.sh' "
"| while read file; do "
"shellcheck -x \"$file\" -e SC1090,SC1091; "
"done;")
results = run_local(shellcheck)
print results.stdout
assert '' == results.stdout

8
test/tox.centos_7.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _centos_7.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py ./test_centos_fedora_common_support.py ./test_centos_common_support.py ./test_centos_7_support.py

8
test/tox.centos_8.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _centos_8.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py ./test_centos_fedora_common_support.py ./test_centos_common_support.py ./test_centos_8_support.py

8
test/tox.debian_10.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _debian_10.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.debian_11.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _debian_11.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.debian_9.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _debian_9.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.fedora_32.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _fedora_32.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py ./test_centos_fedora_common_support.py ./test_fedora_support.py

8
test/tox.fedora_33.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _fedora_33.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py ./test_centos_fedora_common_support.py ./test_fedora_support.py

8
test/tox.ubuntu_16.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _ubuntu_16.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.ubuntu_18.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _ubuntu_18.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.ubuntu_20.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _ubuntu_20.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

8
test/tox.ubuntu_21.ini Normal file
View File

@@ -0,0 +1,8 @@
[tox]
envlist = py37
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f _ubuntu_21.Dockerfile -t pytest_pihole:test_container ../
pytest {posargs:-vv -n auto} ./test_automated_install.py

10
tox.ini
View File

@@ -1,10 +0,0 @@
[tox]
envlist = py27
[testenv]
whitelist_externals = docker
deps = -rrequirements.txt
commands = docker build -f test/debian.Dockerfile -t pytest_pihole:debian .
docker build -f test/centos.Dockerfile -t pytest_pihole:centos .
docker build -f test/fedora.Dockerfile -t pytest_pihole:fedora .
pytest {posargs:-vv -n auto} -m "not build_stage" ./test/