Compare commits

...

190 Commits
v2.10 ... v2.11

Author SHA1 Message Date
Mcat12
b8545eb1df Merge pull request #1074 from pi-hole/development
[RELEASE] Pi-hole Core 2.11
2017-01-02 16:36:55 -05:00
Mcat12
76531da340 Merge pull request #1067 from pi-hole/fix/firewall_redux
Fix/firewall redux
2017-01-02 11:36:38 -05:00
Adam Warner
12bec1df68 Merge pull request #1048 from pi-hole/tweak/simplify_webpage.sh
Major simplification of webpage.sh + extend DHCP to IPv6
2017-01-02 14:28:26 +00:00
DL6ER
ad61852804 Test against empty string 2017-01-02 11:10:38 +01:00
DL6ER
dbd8aee4ee Add 'local' domain if not set in setupVers.conf 2017-01-02 11:08:54 +01:00
DL6ER
677694b01a Set 24h lease time if settings was empty before 2017-01-02 11:05:40 +01:00
DL6ER
85f0241c0d Reprocess DHCP settings after update 2017-01-02 10:50:59 +01:00
Dan Schaper
ade2185a9f Merge pull request #1073 from pi-hole/tweak/quidsup
Comment out QuidsUp
2017-01-01 15:35:55 -08:00
Dan Schaper
0d27005dda Comment out QuidsUp
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 15:31:17 -08:00
Dan Schaper
8ee2bdec4d Plain grep, escape the special characters.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 14:38:10 -08:00
Dan Schaper
de6ce276d0 Merge branch 'development' of github.com:pi-hole/pi-hole into fix/firewall_redux 2017-01-01 14:13:32 -08:00
Dan Schaper
fbea81dcd7 Merge pull request #1068 from pi-hole/fix/anti_glob
Misc tweaks to the installer script. Defensive git cloning, and ability to source the installer script.
2017-01-01 14:10:55 -08:00
Dan Schaper
502c349b8b Merge branches 'development' and 'fix/firewall_redux' of github.com:pi-hole/pi-hole into fix/firewall_redux 2017-01-01 13:47:56 -08:00
Adam Warner
5fb0aa70de Merge pull request #1008 from pi-hole/feature/track_pre-installed_packages
Feature/track pre installed packages
2017-01-01 20:29:02 +00:00
Dan Schaper
7750e1344c DRY displayFinalMessage
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 07:10:14 -08:00
Dan Schaper
8be37130e9 Move first check to main(), basic-install.sh can now be sourced.
Set `PH_TEST=true` then `source basic-install.sh`. Careful for `set -e`.

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 06:45:03 -08:00
Dan Schaper
fa055481a7 Shellcheck screen size
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 06:32:49 -08:00
Dan Schaper
d080e5d7a8 Merge branch 'fix/anti_glob' of github.com:pi-hole/pi-hole into fix/anti_glob 2017-01-01 00:18:37 -08:00
Dan Schaper
ad07655630 Defensive git cloning
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 00:14:12 -08:00
Dan Schaper
7cceb8615a make_repo more defensive.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 00:13:51 -08:00
Dan Schaper
ab9c8f4859 make_repo more defensive.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2017-01-01 00:00:48 -08:00
Dan Schaper
ffb8a74111 Defensive is_repo
`is_repo` defended

Document return codes for `is_repo()`

`is_repo` tested for 128,1,0 return values.
2017-01-01 00:00:20 -08:00
Dan Schaper
45587194e5 Regex fun
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-31 21:33:05 -08:00
Dan Schaper
ccbf391913 More intelligence in iptables rulesets. Account for Policy ACCEPT, with
default rule DROP or REJECT as last rule.

Regex the conditions to make sure we are getting the right conditions.

Reframe the logic to simplify the chains and rules

Reframe the logic to simplify the chains and rules

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-31 21:16:22 -08:00
Mcat12
7765efa6c4 Merge pull request #1063 from pi-hole/fix/chmod_scripts
All scripts set executable
2016-12-31 12:01:10 -05:00
DL6ER
02d4b6794c Merge pull request #1066 from dgnthr/patch-1
Fixed a typo in the installation script
2016-12-31 17:30:56 +01:00
Dominik G
836b717346 Fixed a typo in the installation script 2016-12-31 17:25:48 +01:00
Dan Schaper
fc596e41d4 All scripts set executable 2016-12-30 18:35:16 -08:00
Mcat12
1f9b0f7cef Merge pull request #1061 from pi-hole/fix/blockpage-whitelist-path
Adjust blocking page paths from admin restructure
2016-12-30 15:43:39 -05:00
Mcat12
7bcc15e416 Adjust blocking page paths from admin restructure 2016-12-30 15:36:53 -05:00
DL6ER
1a3bdbaabf Merge pull request #1057 from pi-hole/new/whitelistonblockingpage
Allow whitelisting from blocking page
2016-12-30 21:07:34 +01:00
Mcat12
5e35fdbc52 Save blocking page CSS to pihole directory instead of admin 2016-12-30 14:42:15 -05:00
Mcat12
ab2c486f25 Fix password Enter handling
Also remove extranious form information, since JS handles that
2016-12-30 14:13:15 -05:00
Mcat12
7fd7430d38 Use pi.hole when getting js and css
If a user is able to get to this page, they must be using Pi-hole
2016-12-30 13:43:29 -05:00
Mcat12
089b98430f Fix formatting 2016-12-30 12:59:05 -05:00
DL6ER
5c7fc05a32 Enable DHCP logging by default 2016-12-30 16:31:57 +00:00
Mcat12
ced0d3c2c0 Merge pull request #1055 from pi-hole/fix/firewall_check
Restructure firewall detection and application.
2016-12-30 11:23:30 -05:00
Mcat12
1afc5d351d Merge pull request #1058 from pi-hole/cleanup/remove_swap
Delete swapfile generator, haven't used this in a long time.
2016-12-30 11:12:28 -05:00
DL6ER
09bbc81470 Add notice that the user might have to flush his DNS cache 2016-12-30 12:27:33 +00:00
Dan Schaper
f7274addcd Delete swapfile generator, haven't used this in a long time.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-30 04:08:32 -08:00
DL6ER
09bfa2ef77 Add whitelisting on blocking page feature 2016-12-30 12:03:45 +00:00
Dan Schaper
a48518d234 Update test rig for new firewalld
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-29 16:11:13 -08:00
Dan Schaper
a4a9879643 Restructure firewall detection and application.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-29 15:57:29 -08:00
Dan Schaper
d1ccd7a460 Merge pull request #1052 from pi-hole/fix/missing_modules
Detect missing kernel modules
2016-12-29 14:51:35 -08:00
DL6ER
9181a4a1d8 Apply dhcp lease time also for IPv6 2016-12-29 14:26:23 +00:00
DL6ER
3268e1611a Backend accept and apply dhcp lease time 2016-12-29 14:19:44 +00:00
Dan Schaper
ea9ec384c6 Disambiguate nested ifs.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-29 01:35:52 -08:00
Dan Schaper
bbb958b7ed Detect RPF breaking kernel updates.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-29 01:34:49 -08:00
DL6ER
cf724176dc Do stateful DHCPv6 and SLAAC 2016-12-28 20:02:48 +00:00
DL6ER
18d1c98f08 Merge pull request #1051 from pi-hole/fix/status
Test if DNS service is listening on local port 53 when reporting status
2016-12-28 20:47:37 +01:00
DL6ER
d0cd39a25f Added space behind :53 to only match port 53 2016-12-28 20:32:56 +01:00
DL6ER
03d4fcd17d Don't actually have to reapply DHCP settings since we are going to save it in a different file we don't replace by a template 2016-12-28 16:32:24 +00:00
DL6ER
02d658be65 Look for DHCP / DNS server settings which would have to be reapplied after updating (since we overwrite 01-pihole.conf) 2016-12-28 16:31:55 +00:00
DL6ER
1e627c7e8f Make webpage.sh fully library style 2016-12-28 16:25:14 +00:00
DL6ER
9170488b0a Test if DNS service is listening on local port 53 2016-12-28 15:58:48 +00:00
Dan Schaper
b02730a5ad Merge branches 'development' and 'feature/track_pre-installed_packages' of github.com:pi-hole/pi-hole into feature/track_pre-installed_packages
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>

# Conflicts:
#	automated install/basic-install.sh
2016-12-27 22:50:00 -08:00
DL6ER
9af26cbaac Major simplification of webpage.sh 2016-12-28 02:14:47 +00:00
Dan Schaper
73741f1518 Merge pull request #1046 from pi-hole/tweak/subshells
Tweak/subshells
2016-12-27 16:00:07 -08:00
Dan Schaper
9a9cb61345 Shift epel-release to installer dependencies for CentOS
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-27 12:59:53 -08:00
Dan Schaper
6abd6d8879 Merge pull request #991 from pi-hole/webUIprivacymode
Backend for privacyMode on webUI
2016-12-27 12:46:54 -08:00
Dan Schaper
c3b51b4ceb Merge branch 'development' into feature/track_pre-installed_packages 2016-12-27 12:37:19 -08:00
DL6ER
321ea8a3a9 Merge branch 'development' into webUIprivacymode 2016-12-27 21:27:11 +01:00
Dan Schaper
4d6263872d Merge branch 'development' of github.com:pi-hole/pi-hole into tweak/subshells 2016-12-27 12:25:49 -08:00
Dan Schaper
fcdd58ac94 Merge pull request #1033 from pi-hole/updater_rewrite
update.sh code refactoring
2016-12-27 12:22:17 -08:00
Dan Schaper
ef8292d371 Merge branch 'development' into updater_rewrite 2016-12-27 11:59:52 -08:00
Dan Schaper
bc6a985f7c Merge branch 'development' of github.com:pi-hole/pi-hole into tweak/subshells 2016-12-27 11:53:46 -08:00
Dan Schaper
7320fc11d2 Check command -v directly, instead of subshelling out.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-27 11:53:23 -08:00
Dan Schaper
51f6d75db4 Merge pull request #1045 from pi-hole/tweak/always_update
Always update package cache where we can.
2016-12-27 11:51:00 -08:00
Dan Schaper
a328326e39 Formatting
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-27 11:41:07 -08:00
Dan Schaper
4eedf8a746 Always update package cache where we can.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-27 10:59:24 -08:00
Dan Schaper
c5f5252145 Merge pull request #961 from pi-hole/customblockpage
Custom Pi-Hole block page
2016-12-27 10:25:03 -08:00
Mcat12
7fadd469c9 Merge pull request #1038 from pi-hole/fix/IPV6_detection
Check IPv6 routing
2016-12-27 11:42:23 -05:00
Mcat12
823e874d20 Merge pull request #1037 from pi-hole/tweak/IPv4_multi_address
Smarter pick of IPv4 address
2016-12-27 11:42:00 -05:00
Adam Warner
739aaafa9a Merge pull request #1041 from pi-hole/development
[RELEASE] Pi-Hole Core 2.10.2
2016-12-25 23:43:35 +00:00
Dan Schaper
62d001225a Merge pull request #1040 from pi-hole/fix/updater_git-C
Remove git -C from update.sh
2016-12-25 12:28:42 -08:00
DL6ER
e50947eb58 mend 2016-12-25 21:26:06 +01:00
DL6ER
ca056d32d2 Remove git -C 2016-12-25 21:22:59 +01:00
DL6ER
63a455f4f7 Merge pull request #1039 from pi-hole/revert_crontab_change
Revert PR #1018
2016-12-25 18:35:59 +01:00
DL6ER
a0e0465036 Revert "Merge pull request #1018 from pi-hole/diginc-patch-1"
This reverts commit ff3c36a7a2, reversing
changes made to 9355a8ad0e.
2016-12-25 17:32:59 +01:00
Dan Schaper
d174a9d015 Merge branch 'feature/track_pre-installed_packages' of github.com:pi-hole/pi-hole into feature/track_pre-installed_packages 2016-12-24 17:01:38 -08:00
Dan Schaper
7eb6124721 Don't call for package installs if there are no packages to install.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:57:07 -08:00
Dan Schaper
f458780ba7 Rebase onto development
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:56:31 -08:00
Dan Schaper
8ad52806de Quiet DNF
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:54:23 -08:00
Dan Schaper
dc22a50dcc Fedora dependency installer overhaul
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>

Modify Fedora dependency installer

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

Fedora now installs and arrays only non-installed packages. Fedora also noops the cache update, since it updates at every dnf call anyays.

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:54:20 -08:00
Dan Schaper
852341c601 Check for installation status within the parent function.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:54:16 -08:00
Dan Schaper
d5ed6c1901 Find which packages already exist and only install new packages. Set up for unintall to know what packages we installed for later removal.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 16:54:13 -08:00
DL6ER
e15548cbf5 Add --quiet to git fetch in GitCheckUpdateAvail() 2016-12-25 01:18:58 +01:00
DL6ER
5e28e6b9ac Removed remaining git -C 2016-12-25 01:17:46 +01:00
DL6ER
c78d43f640 Merge pull request #1032 from pi-hole/fix/emptypassword
Save empty password
2016-12-25 00:51:21 +01:00
Dan Schaper
da41383476 Check IPv6 to see if the route is reachable, if not, don't use.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 15:26:05 -08:00
Dan Schaper
6ff79835da If only one interface available, don't show whiptail, just use that interface.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 15:08:39 -08:00
Dan Schaper
1d608b204a Only allow UP interfaces to be selected. (DOWN interfaces would have not given IP addresses anyways.)
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 14:50:50 -08:00
Dan Schaper
c2b8bed3a8 Get the IP address that is the source for the default route out. Fixes interfaces with multiple IP's assigned getting the wrong IPv4 chosen.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 14:43:57 -08:00
Dan Schaper
3365ef7aaa is_repo() returns values to caller, silence function.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 11:54:04 -08:00
Dan Schaper
68c17b26dc Bashisms
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 11:41:42 -08:00
Dan Schaper
e647efd471 Shell script, not javascript
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-24 11:24:20 -08:00
DL6ER
15db1ffdd5 Remove variables not needed any more 2016-12-24 15:48:43 +01:00
DL6ER
4632b0f797 Updated updater logic 2016-12-24 15:40:31 +01:00
DL6ER
65c35a5530 Use new subroutine to determine if updates are available 2016-12-24 15:32:25 +01:00
DL6ER
c449a1c0e0 Added GitCheckUpdateAvail() 2016-12-24 15:19:39 +01:00
DL6ER
b020010f0d Removed some of the &> /dev/null 2016-12-24 15:08:30 +01:00
DL6ER
0276c72fe2 replace 'git -C' with long version (see #1009) 2016-12-24 15:05:57 +01:00
Dan Schaper
e4aec05d0f Merge branch 'feature/track_pre-installed_packages' of github.com:pi-hole/pi-hole into feature/track_pre-installed_packages 2016-12-23 16:54:25 -08:00
Dan Schaper
2919f852ad Import checkSelinux from master
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-23 16:30:26 -08:00
Dan Schaper
a6e3b9de37 Merge branch 'master' of github.com:pi-hole/pi-hole into feature/track_pre-installed_packages 2016-12-23 16:28:41 -08:00
DL6ER
04a9791be2 Save empty password 2016-12-23 23:41:40 +01:00
Dan Schaper
cb8df06685 Merge branch 'development' into feature/track_pre-installed_packages 2016-12-23 14:10:01 -08:00
Adam Warner
bfe5506cc1 Merge pull request #1021 from pi-hole/development
[RELEASE] Pi-Hole Core 2.10.1
2016-12-23 21:57:02 +00:00
Dan Schaper
b64066fec7 Merge conflict
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-23 13:23:09 -08:00
Mcat12
ffd31d8330 Merge pull request #1031 from pi-hole/templates
replace 1-10 checkboxes to tidy up appearance
2016-12-23 16:06:29 -05:00
Promofaux
d89254fedf replace 1-10 checkboxes to tidy up appearance 2016-12-23 19:49:39 +00:00
Mcat12
a771ddf667 Merge pull request #1030 from pi-hole/readmeTypos
Accidentally a word.
2016-12-23 14:43:56 -05:00
Promofaux
ce2e410468 Accidentally a word.
Updated link
2016-12-23 19:39:37 +00:00
Adam Warner
c1982c04ff Merge pull request #1029 from pi-hole/bogusDNS_BOGUS_PRIVentries
remove `DNS_BOGUS_PRIV` from setupVars.conf
2016-12-23 19:32:13 +00:00
Promofaux
9a62026830 remove DNS_BOGUS_PRIV from setupVars.conf 2016-12-23 19:27:02 +00:00
Adam Warner
d12efccd0b Merge pull request #1028 from pi-hole/bcambl-selinux_notification
Bcambl selinux notification
2016-12-23 17:36:33 +00:00
Mcat12
54afffed19 Remove newline
Issue was already fixed
2016-12-23 12:30:33 -05:00
Mcat12
fc8fcdbece Add newline 2016-12-23 12:28:18 -05:00
Promofaux
abd1fedc9d . 2016-12-23 17:25:55 +00:00
Promofaux
9725985037 printf to echo. idgaf 2016-12-23 17:24:33 +00:00
Promofaux
754f3359ec too many echos spoil the branch 2016-12-23 17:22:31 +00:00
Promofaux
4c131b8c28 newlines 2016-12-23 17:21:23 +00:00
Promofaux
15c674ba29 verbosity 2016-12-23 17:20:33 +00:00
Promofaux
00aff6a906 maybe 2016-12-23 17:16:03 +00:00
Promofaux
c45c3a72b5 words words words 2016-12-23 17:06:33 +00:00
Promofaux
662d450651 adjust size of whiptail dialog 2016-12-23 16:58:58 +00:00
Promofaux
a8897becd2 Make sure whiptail is installed... 2016-12-23 16:55:56 +00:00
Mcat12
d0126f4454 Merge pull request #1027 from pi-hole/Mcat12/fix/alignUpdatingRepo
Align installer output for updating repo
2016-12-23 11:54:34 -05:00
Promofaux
fdb64a5702 untested convert user prompt to whiptail 2016-12-23 16:53:42 +00:00
Mcat12
73a80ff7dc Align installer output for updating repo 2016-12-23 11:51:34 -05:00
Promofaux
a795fd698d Merge branch 'selinux_notification' of https://github.com/bcambl/pi-hole into bcambl-selinux_notification 2016-12-23 16:48:16 +00:00
bcambl
2fb0dc0a4a add warning if SELinux is Enforcing 2016-12-23 10:27:52 -06:00
DL6ER
5b4653cf39 Merge pull request #1023 from pi-hole/fix/fedora_sudo
Fix Fedora sudo permissions
2016-12-23 17:13:57 +01:00
DL6ER
aa8e1497a3 Fixed error 2016-12-23 17:12:38 +01:00
DL6ER
eb13d846ef Merge pull request #1024 from pi-hole/fix/grep_case_insensitive
Make grep case insensitive
2016-12-23 17:07:08 +01:00
DL6ER
c674a175ee Make grep case insensitive 2016-12-23 17:02:56 +01:00
DL6ER
afabf30ec6 Fix Fedora web UI support 2016-12-23 16:57:51 +01:00
DL6ER
420158494d Merge pull request #1022 from pi-hole/fix/adlists.default
Internal (/etc/pihole/adlists.default)
2016-12-23 16:08:06 +01:00
DL6ER
6b7b0e0eb3 Test if /etc/pihole/adlists.default exists 2016-12-23 16:00:48 +01:00
Adam Warner
ad70db7e0e Merge pull request #1020 from bcambl/setDNS_before_ifcfg
Set dns before ifcfg (Fixes #1019)
2016-12-23 12:12:05 +00:00
Adam Warner
ef1ce66793 Merge pull request #1013 from pi-hole/fix/chronometer
Fix chronometer.sh
2016-12-23 11:12:20 +00:00
DL6ER
c364fd80b6 Merge pull request #994 from pi-hole/errorsshouldnotescapeblackholes
Errors should not escape black holes
2016-12-23 12:05:54 +01:00
Adam Warner
3bc5d1bae0 Merge pull request #989 from pi-hole/APIresolveclientsandupstream
Implement backend for AdminLTE/#253
2016-12-23 10:37:48 +00:00
Adam Warner
e4e34acba1 Merge pull request #1017 from bcambl/ensure_repo_directory
is_repo: ensure directory exists
2016-12-23 09:44:19 +00:00
Adam Warner
ff3c36a7a2 Merge pull request #1018 from pi-hole/diginc-patch-1
pihole.cron reduce duplication
2016-12-23 09:41:48 +00:00
bcambl
1e7e3259b5 choose dns servers prior to interface configuration
upstream DNS servers must be chosen prior interface configuration.
Fixes #1019
2016-12-22 22:42:32 -06:00
Adam Hill
5e53f484be Update pihole.cron
Stop repeating the path.
2016-12-22 22:00:17 -06:00
bcambl
513bc32d87 is_repo: ensure directory exists 2016-12-22 20:00:45 -06:00
Dan Schaper
e7c944ff0b Merge branches 'development' and 'feature/track_pre-installed_packages' of github.com:pi-hole/pi-hole into feature/track_pre-installed_packages 2016-12-22 12:25:07 -08:00
Dan Schaper
9355a8ad0e Merge pull request #1011 from pi-hole/fix/sudoers
Fix: Dynamic instead of static sudoers file
2016-12-22 12:20:01 -08:00
Dan Schaper
a74e48a138 Merge pull request #1014 from pi-hole/fix/Gravity_in_shell
Execute gravity in same shell as installer, don't subshell it.
2016-12-22 12:07:12 -08:00
Dan Schaper
ea5ee7b0f9 Execute gravity in same shell as installer, don't subshell it.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-22 11:30:36 -08:00
DL6ER
bc8cf1b2d8 Fixed wrong indentation 2016-12-22 19:23:06 +01:00
DL6ER
bb28d94884 Merge branch 'development' into customblockpage
Conflicts:
	automated install/basic-install.sh
2016-12-22 19:22:09 +01:00
DL6ER
a4f58b0a22 Look for "query[" instead of "query" to avoid false-positives, like listed below
root@raspberrypi:/etc/.pihole# grep 'query' /var/log/pihole.log | grep -v 'query\['
Dec 22 16:29:50 dnsmasq[30801]: forwarded code.jquery.com to 208.67.222.222
Dec 22 16:29:50 dnsmasq[30801]: reply code.jquery.com is <CNAME>
Dec 22 16:29:50 dnsmasq[30801]: reply code.jquery.netdna-cdn.com is 94.31.29.54
Dec 22 16:29:50 dnsmasq[30801]: reply code.jquery.netdna-cdn.com is 23.111.11.3
Dec 22 16:29:50 dnsmasq[30801]: reply code.jquery.netdna-cdn.com is 198.232.125.113
2016-12-22 19:09:37 +01:00
DL6ER
bcf8139708 Removed cat where we don't need it 2016-12-22 18:55:14 +01:00
DL6ER
9b0390c9da Space to Tab 2016-12-22 18:53:44 +01:00
DL6ER
e88f58c34e Remove grpping for today's log entries, because we flush the log every day 2016-12-22 18:45:53 +01:00
Blayne Campbell
8f402f5c77 Merge pull request #1009 from bcambl/fix_1004
replace 'git -C' with long version
2016-12-22 11:44:08 -06:00
DL6ER
60054da582 Add lighttpd user (OS dependent) to sudoers file 2016-12-22 13:26:11 +01:00
DL6ER
4626b8ced5 Removed fixed username from sudoers file 2016-12-22 13:18:38 +01:00
Dan Schaper
ab7d193f98 Still causing problems with Fedora and CentOS
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-22 03:21:37 -08:00
bcambl
cbf84c1840 replace subshell with command chain 2016-12-22 04:32:42 -06:00
Dan Schaper
420fb69166 Merge pull request #1005 from pi-hole/fix/create_install_directories
Create /opt/pihole before trying to install into it.
2016-12-22 01:47:07 -08:00
bcambl
c9c28cb59a replace 'git -C' with long version
The -C argument was introduced in git 1.8.4. CentOS 7.3 at the time of this commit provides v1.8.3.1.
see: https://git.kaarsemaker.net/git/commit/44e1e4d67d5148c245db362cc48c3cc6c2ec82ca/

Fixes #1004
2016-12-22 03:37:34 -06:00
Dan Schaper
9073f34b30 Quiet DNF
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-22 00:44:10 -08:00
Dan Schaper
fb5578c0d4 Fedora dependency installer overhaul
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>

Modify Fedora dependency installer

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

Fedora now installs and arrays only non-installed packages. Fedora also noops the cache update, since it updates at every dnf call anyays.

Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-22 00:29:04 -08:00
Dan Schaper
4244f716e0 Create /opt/pihole before trying to install into it.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-21 23:04:57 -08:00
Dan Schaper
07a4f970d4 Check for installation status within the parent function.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-21 22:57:42 -08:00
Dan Schaper
2335097c99 Find which packages already exist and only install new packages. Set up for unintall to know what packages we installed for later removal.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2016-12-21 22:20:23 -08:00
DL6ER
cd0c3f9418 Better output if file has not been downloaded because it has not been changed 2016-12-17 23:46:28 +01:00
DL6ER
efaee2b68b Improvements for gravity (errors shouldn't be able to escape the black hole if even light cannot do this!) 2016-12-17 23:33:09 +01:00
DL6ER
7a243f890e Backend for privacyMode on webUI 2016-12-16 17:33:01 +01:00
DL6ER
afabb5957b Implement backend for https://github.com/pi-hole/AdminLTE/pull/253 2016-12-15 18:55:40 +01:00
DL6ER
3c4a9bba78 Minor change 2016-12-15 10:38:24 +01:00
DL6ER
505c9e8979 Minor change 2016-12-06 14:08:45 +01:00
DL6ER
75deb02961 Don't query pihole if page is hidden anyhow 2016-12-06 14:05:48 +01:00
DL6ER
480211033d Detect if blocking page is loaded within frame or iframe. If so, hide everything 2016-12-06 14:05:02 +01:00
DL6ER
5374f652dd No need to modify lighttpd config file, since we overwrite it anyways 2016-12-06 08:43:24 +01:00
DL6ER
ca9321624c Added padding for ad list results 2016-12-05 14:40:48 +01:00
DL6ER
40f18df90f Simplified CSS, removed external contents 2016-12-05 14:39:07 +01:00
DL6ER
0d63cfd6c3 Add 1x1 pixel GIF image. Can apparently be used to trick some of the please-don't-use-adblocker pages as many of them contain code like if ($('Ad').height() == 0) { prevent access to this page; } 2016-12-05 12:34:30 +01:00
DL6ER
3d6b22de6c Update index.php to include more detailed output 2016-12-05 12:12:01 +01:00
DL6ER
fc233fcdd3 Fixed typo 2016-12-05 12:10:05 +01:00
DL6ER
20370d4348 Update CSS file 2016-12-05 11:26:21 +01:00
DL6ER
0f90671241 Updated index.php to use CSS file unter admin/ 2016-12-05 10:51:41 +01:00
DL6ER
a866c4e388 Place blockingpage.css (former index.css) unter admin/ so we can load it also from some blocked sub-directories 2016-12-05 10:50:19 +01:00
DL6ER
e7241a989c Include CSS file 2016-12-04 22:20:51 +01:00
DL6ER
6e788668f9 Updated index.php 2016-12-04 22:17:33 +01:00
DL6ER
b246dba7e7 Rename index.html to index.php 2016-12-04 21:41:26 +01:00
21 changed files with 855 additions and 439 deletions

View File

@@ -6,16 +6,7 @@
**How familiar are you with the codebase?:**
- [] 1 (very unfamiliar)
- [] 2
- [] 3
- [] 4
- [] 5
- [] 6
- [] 7
- [] 8
- [] 9
- [] 10 (very familiar)
_{replace this text with a number from 1 to 10, with 1 being not familiar, and 10 being very familiar}_
---
**[FEATURE REQUEST | QUESTION | OTHER]:**

View File

@@ -10,16 +10,7 @@
**How familiar are you with the codebase?:**
- [] 1 (very unfamiliar)
- [] 2
- [] 3
- [] 4
- [] 5
- [] 6
- [] 7
- [] 8
- [] 9
- [] 10 (very familiar)
_{replace this text with a number from 1 to 10, with 1 being not familiar, and 10 being very familiar}_
---
_{replace this line with your pull request content}_

View File

@@ -15,8 +15,11 @@
<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>
</project>

View File

@@ -10,7 +10,7 @@
## The multi-platform, network-wide ad blocker
Block ads for **all** your devices _without_ the need to install client-side software. The Pi-hole blocks ads the DNS-level, so all your devices are protected.
Block ads for **all** your devices _without_ the need to install client-side software. The Pi-hole blocks ads at the DNS-level, so all your devices are protected.
- Web Browsers
- Cell Phones
@@ -53,7 +53,7 @@ wget -O basic-install.sh https://install.pi-hole.net
bash basic-install.sh
```
Once installed, [configure your router to have **DHCP clients use the Pi as their DNS server**](http://pi-hole.net/faq/can-i-set-the-pi-hole-to-be-the-dns-server-at-my-router-so-i-dont-have-to-change-settings-for-my-devices/) and then any device that connects to your network will have ads blocked without any further configuration. Alternatively, you can manually set each device to [use the Raspberry Pi as its DNS server](http://pi-hole.net/faq/how-do-i-use-the-pi-hole-as-my-dns-server/).
Once installed, [configure your router to have **DHCP clients use the Pi as their DNS server**](https://discourse.pi-hole.net/t/how-do-i-configure-my-devices-to-use-pi-hole-as-their-dns-server/245) and then any device that connects to your network will have ads blocked without any further configuration. Alternatively, you can manually set each device to [use the Raspberry Pi as its DNS server](http://pi-hole.net/faq/how-do-i-use-the-pi-hole-as-my-dns-server/).
## Installing the Pi-hole (Click to Watch!)
<p align="center">

View File

@@ -37,7 +37,7 @@ https://hosts-file.net/ad_servers.txt
#http://securemecca.com/Downloads/hosts.txt
# Quidsup's tracker list
https://raw.githubusercontent.com/quidsup/notrack/master/trackers.txt
#https://raw.githubusercontent.com/quidsup/notrack/master/trackers.txt
# Block the BBC News website Breaking News banner
#https://raw.githubusercontent.com/BreakingTheNews/BreakingTheNews.github.io/master/hosts

View File

@@ -15,8 +15,6 @@
piLog="/var/log/pihole.log"
gravity="/etc/pihole/gravity.list"
today=$(date "+%b %e")
. /etc/pihole/setupVars.conf
CalcBlockedDomains() {
@@ -35,7 +33,7 @@ CalcBlockedDomains() {
CalcQueriesToday() {
if [ -e "${piLog}" ]; then
queriesToday=$(cat "${piLog}" | grep "${today}" | awk '/query/ {print $6}' | wc -l)
queriesToday=$(awk '/query\[/ {print $6}' < "${piLog}" | wc -l)
else
queriesToday="Err."
fi
@@ -43,7 +41,7 @@ CalcQueriesToday() {
CalcblockedToday() {
if [ -e "${piLog}" ] && [ -e "${gravity}" ];then
blockedToday=$(cat ${piLog} | awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' | wc -l)
blockedToday=$(awk '/\/etc\/pihole\/gravity.list/ && !/address/ {print $6}' < "${piLog}" | wc -l)
else
blockedToday="Err."
fi
@@ -104,7 +102,7 @@ normalChrono() {
echo "Blocking: ${blockedDomainsTotal}"
echo "Queries: ${queriesToday}" #same total calculation as dashboard
echo "Pi-holed: ${blockedToday} (${percentBlockedToday}%)"
echo "Pi-holed: ${blockedToday} (${percentBlockedToday}%)"
sleep 5
done

100
advanced/Scripts/update.sh Normal file → Executable file
View File

@@ -22,9 +22,15 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole"
is_repo() {
# Use git to check if directory is currently under VCS, return the value
local directory="${1}"
local curdir
local rc
git -C "${directory}" status --short &> /dev/null
return
curdir="${PWD}"
cd "${directory}" &> /dev/null || return 1
git status --short &> /dev/null
rc=$?
cd "${curdir}" &> /dev/null || return 1
return "${rc}"
}
prep_repo() {
@@ -40,22 +46,24 @@ make_repo() {
local remoteRepo="${2}"
local directory="${1}"
(prep_repo "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}" > /dev/null)
(prep_repo "${directory}" && git clone -q --depth 1 "${remoteRepo}" "${directory}")
return
}
update_repo() {
local directory="${1}"
local retVal=0
# Pull the latest commits
local curdir
curdir="${PWD}"
cd "${directory}" &> /dev/null || return 1
# Pull the latest commits
# Stash all files not tracked for later retrieval
git -C "${directory}" stash --all --quiet &> /dev/null || ${retVal}=1
git stash --all --quiet
# Force a clean working directory for cloning
git -C "${directory}" clean --force -d &> /dev/null || ${retVal}=1
git clean --force -d
# Fetch latest changes and apply
git -C "${directory}" pull --quiet &> /dev/null || ${retVal}=1
return ${retVal}
git pull --quiet
cd "${curdir}" &> /dev/null || return 1
}
getGitFiles() {
@@ -76,33 +84,59 @@ getGitFiles() {
fi
}
GitCheckUpdateAvail() {
local directory="${1}"
curdir=$PWD;
cd "${directory}"
# Fetch latest changes in this repo
git fetch --quiet origin
status="$(git status -sb)"
# Change back to original directory
cd "${curdir}"
if [[ $status == *"behind"* ]]; then
# Local branch is behind remote branch -> Update
return 0
else
# Local branch is up-to-date or in a situation
# where this updater cannot be used (like on a
# branch that exists only locally)
return 1
fi
}
main() {
local pihole_version_current
local pihole_version_latest
local web_version_current
local web_version_latest
if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then #This is unlikely
#This is unlikely
if ! is_repo "${PI_HOLE_FILES_DIR}" || ! is_repo "${ADMIN_INTERFACE_DIR}" ; then
echo "::: Critical Error: One or more Pi-Hole repos are missing from system!"
echo "::: Please re-run install script from https://github.com/pi-hole/pi-hole"
exit 1;
fi
echo "::: Checking for updates..."
# Checks Pi-hole version string in format vX.X.X
pihole_version_current="$(/usr/local/bin/pihole version --pihole --current)"
pihole_version_latest="$(/usr/local/bin/pihole version --pihole --latest)"
web_version_current="$(/usr/local/bin/pihole version --admin --current)"
web_version_latest="$(/usr/local/bin/pihole version --admin --latest)"
if [[ "${pihole_version_latest}" == "-1" || "${web_version_latest}" == "-1" ]]; then
echo "*** Unable to contact GitHub for latest version. Please try again later, contact support if this continues."
exit 1
if GitCheckUpdateAvail "${PI_HOLE_FILES_DIR}" ; then
core_update=true
echo "::: Pi-hole Core: update available"
else
core_update=false
echo "::: Pi-hole Core: up to date"
fi
if GitCheckUpdateAvail "${ADMIN_INTERFACE_DIR}" ; then
web_update=true
echo "::: Web Interface: update available"
else
web_update=false
echo "::: Web Interface: up to date"
fi
# Logic
# If latest versions are blank - we've probably hit Github rate limit (stop running `pihole -up so often!):
# Update anyway
# If Core up to date AND web up to date:
# Do nothing
# If Core up to date AND web NOT up to date:
@@ -112,46 +146,40 @@ main() {
# if Core NOT up to date AND web NOT up to date:
# pull pihole repo run install --unattended
if [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then
echo ":::"
echo "::: Pi-hole version is $pihole_version_current"
echo "::: Web Admin version is $web_version_current"
if ! ${core_update} && ! ${web_update} ; then
echo ":::"
echo "::: Everything is up to date!"
exit 0
elif [[ "${pihole_version_current}" == "${pihole_version_latest}" ]] && [[ "${web_version_current}" < "${web_version_latest}" ]]; then
elif ! ${core_update} && ${web_update} ; then
echo ":::"
echo "::: Pi-hole Web Admin files out of date"
getGitFiles "${ADMIN_INTERFACE_DIR}" "${ADMIN_INTERFACE_GIT_URL}"
web_updated=true
elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" == "${web_version_latest}" ]]; then
elif ${core_update} && ! ${web_update} ; then
echo ":::"
echo "::: Pi-hole core files out of date"
getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}"
/etc/.pihole/automated\ install/basic-install.sh --reconfigure --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1
core_updated=true
elif [[ "${pihole_version_current}" < "${pihole_version_latest}" ]] && [[ "${web_version_current}" < "${web_version_latest}" ]]; then
elif ${core_update} && ${web_update} ; then
echo ":::"
echo "::: Updating Everything"
getGitFiles "${PI_HOLE_FILES_DIR}" "${PI_HOLE_GIT_URL}"
/etc/.pihole/automated\ install/basic-install.sh --unattended || echo "Unable to complete update, contact Pi-hole" && exit 1
web_updated=true
core_updated=true
else
echo "*** Update script has malfunctioned, fallthrough reached. Please contact support"
exit 1
fi
if [[ "${web_updated}" == true ]]; then
if [[ "${web_update}" == true ]]; then
web_version_current="$(/usr/local/bin/pihole version --admin --current)"
echo ":::"
echo "::: Web Admin version is now at ${web_version_current}"
echo "::: If you had made any changes in '/var/www/html/admin/', they have been stashed using 'git stash'"
fi
if [[ "${core_updated}" == true ]]; then
if [[ "${core_update}" == true ]]; then
pihole_version_current="$(/usr/local/bin/pihole version --pihole --current)"
echo ":::"
echo "::: Pi-hole version is now at ${pihole_version_current}"

0
advanced/Scripts/version.sh Normal file → Executable file
View File

View File

@@ -9,7 +9,9 @@
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
args=("$@")
readonly setupVars="/etc/pihole/setupVars.conf"
readonly dnsmasqconfig="/etc/dnsmasq.d/01-pihole.conf"
readonly dhcpconfig="/etc/dnsmasq.d/02-pihole-dhcp.conf"
helpFunc() {
cat << EOM
@@ -27,12 +29,34 @@ EOM
exit 0
}
add_setting() {
echo "${1}=${2}" >> "${setupVars}"
}
delete_setting() {
sed -i "/${1}/d" "${setupVars}"
}
change_setting() {
delete_setting "${1}"
add_setting "${1}" "${2}"
}
add_dnsmasq_setting() {
if [[ "${2}" != "" ]]; then
echo "${1}=${2}" >> "${dnsmasqconfig}"
else
echo "${1}" >> "${dnsmasqconfig}"
fi
}
delete_dnsmasq_setting() {
sed -i "/${1}/d" "${dnsmasqconfig}"
}
SetTemperatureUnit(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/TEMPERATUREUNIT/d' /etc/pihole/setupVars.conf
# Save setting to file
echo "TEMPERATUREUNIT=${unit}" >> /etc/pihole/setupVars.conf
change_setting "TEMPERATUREUNIT" "${unit}"
}
@@ -50,65 +74,70 @@ SetWebPassword(){
exit 1
fi
# Remove password from file (create backup setupVars.conf.bak)
sed -i.bak '/WEBPASSWORD/d' /etc/pihole/setupVars.conf
# Set password only if there is one to be set
if (( ${#args[2]} > 0 )) ; then
# Compute password hash twice to avoid rainbow table vulnerability
hash=$(echo -n ${args[2]} | sha256sum | sed 's/\s.*$//')
hash=$(echo -n ${hash} | sha256sum | sed 's/\s.*$//')
# Save hash to file
echo "WEBPASSWORD=${hash}" >> /etc/pihole/setupVars.conf
change_setting "WEBPASSWORD" "${hash}"
echo "New password set"
else
change_setting "WEBPASSWORD" ""
echo "Password removed"
fi
}
ProcessDNSSettings() {
source "${setupVars}"
delete_dnsmasq_setting "server="
add_dnsmasq_setting "server" "${PIHOLE_DNS_1}"
if [[ "${PIHOLE_DNS_2}" != "" ]]; then
add_dnsmasq_setting "server" "${PIHOLE_DNS_2}"
fi
delete_dnsmasq_setting "domain-needed"
if [[ "${DNS_FQDN_REQUIRED}" == true ]]; then
add_dnsmasq_setting "domain-needed"
fi
delete_dnsmasq_setting "bogus-priv"
if [[ "${DNS_BOGUS_PRIV}" == true ]]; then
add_dnsmasq_setting "bogus-priv"
fi
}
SetDNSServers(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/PIHOLE_DNS_1/d;/PIHOLE_DNS_2/d;/DNS_FQDN_REQUIRED/d;' /etc/pihole/setupVars.conf
# Save setting to file
echo "PIHOLE_DNS_1=${args[2]}" >> /etc/pihole/setupVars.conf
change_setting "PIHOLE_DNS_1" "${args[2]}"
if [[ "${args[3]}" != "none" ]]; then
echo "PIHOLE_DNS_2=${args[3]}" >> /etc/pihole/setupVars.conf
change_setting "PIHOLE_DNS_2" "${args[3]}"
else
echo "PIHOLE_DNS_2=" >> /etc/pihole/setupVars.conf
change_setting "PIHOLE_DNS_2" ""
fi
# Replace within actual dnsmasq config file
sed -i '/server=/d;' /etc/dnsmasq.d/01-pihole.conf
echo "server=${args[2]}" >> /etc/dnsmasq.d/01-pihole.conf
if [[ "${args[3]}" != "none" ]]; then
echo "server=${args[3]}" >> /etc/dnsmasq.d/01-pihole.conf
fi
# Remove domain-needed entry
sed -i '/domain-needed/d;' /etc/dnsmasq.d/01-pihole.conf
# Readd it if required
if [[ "${args[4]}" == "domain-needed" ]]; then
echo "domain-needed" >> /etc/dnsmasq.d/01-pihole.conf
echo "DNS_FQDN_REQUIRED=true" >> /etc/pihole/setupVars.conf
change_setting "DNS_FQDN_REQUIRED" "true"
else
# Leave it deleted if not wanted
echo "DNS_FQDN_REQUIRED=false" >> /etc/pihole/setupVars.conf
change_setting "DNS_FQDN_REQUIRED" "false"
fi
# Remove bogus-priv entry
sed -i '/bogus-priv/d;' /etc/dnsmasq.d/01-pihole.conf
# Readd it if required
if [[ "${args[5]}" == "bogus-priv" ]]; then
echo "bogus-priv" >> /etc/dnsmasq.d/01-pihole.conf
echo "DNS_BOGUS_PRIV=true" >> /etc/pihole/setupVars.conf
if [[ "${args[4]}" == "bogus-priv" || "${args[5]}" == "bogus-priv" ]]; then
change_setting "DNS_BOGUS_PRIV" "true"
else
# Leave it deleted if not wanted
echo "DNS_BOGUS_PRIV=false" >> /etc/pihole/setupVars.conf
change_setting "DNS_BOGUS_PRIV" "false"
fi
ProcessDnsmasqSettings
# Restart dnsmasq to load new configuration
RestartDNS
@@ -116,18 +145,14 @@ SetDNSServers(){
SetExcludeDomains(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/API_EXCLUDE_DOMAINS/d;' /etc/pihole/setupVars.conf
# Save setting to file
echo "API_EXCLUDE_DOMAINS=${args[2]}" >> /etc/pihole/setupVars.conf
change_setting "API_EXCLUDE_DOMAINS" "${args[2]}"
}
SetExcludeClients(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/API_EXCLUDE_CLIENTS/d;' /etc/pihole/setupVars.conf
# Save setting to file
echo "API_EXCLUDE_CLIENTS=${args[2]}" >> /etc/pihole/setupVars.conf
change_setting "API_EXCLUDE_CLIENTS" "${args[2]}"
}
Reboot(){
@@ -148,95 +173,146 @@ RestartDNS(){
SetQueryLogOptions(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/API_QUERY_LOG_SHOW/d;' /etc/pihole/setupVars.conf
# Save setting to file
echo "API_QUERY_LOG_SHOW=${args[2]}" >> /etc/pihole/setupVars.conf
change_setting "API_QUERY_LOG_SHOW" "${args[2]}"
}
ProcessDHCPSettings() {
if [[ "${DHCP_ACTIVE}" == "true" ]]; then
source "${setupVars}"
interface=$(grep 'PIHOLE_INTERFACE=' /etc/pihole/setupVars.conf | sed "s/.*=//")
# Use eth0 as fallback interface
if [ -z ${interface} ]; then
interface="eth0"
fi
if [[ "${PIHOLE_DOMAIN}" == "" ]]; then
PIHOLE_DOMAIN="local"
change_setting "PIHOLE_DOMAIN" "${PIHOLE_DOMAIN}"
fi
if [[ "${DHCP_LEASETIME}" == "0" ]]; then
leasetime="infinite"
elif [[ "${DHCP_LEASETIME}" == "" ]]; then
leasetime="24h"
change_setting "DHCP_LEASETIME" "${leasetime}"
else
leasetime="${DHCP_LEASETIME}h"
fi
# Write settings to file
echo "###############################################################################
# DHCP SERVER CONFIG FILE AUTOMATICALLY POPULATED BY PI-HOLE WEB INTERFACE. #
# ANY CHANGES MADE TO THIS FILE WILL BE LOST ON CHANGE #
###############################################################################
dhcp-authoritative
dhcp-range=${DHCP_START},${DHCP_END},${leasetime}
dhcp-option=option:router,${DHCP_ROUTER}
dhcp-leasefile=/etc/pihole/dhcp.leases
domain=${PIHOLE_DOMAIN}
#quiet-dhcp
#quiet-dhcp6
#enable-ra
dhcp-option=option6:dns-server,[::]
dhcp-range=::100,::1ff,constructor:${interface},ra-names,slaac,${leasetime}
ra-param=*,0,0
" > "${dhcpconfig}"
else
rm "${dhcpconfig}"
fi
}
EnableDHCP(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/DHCP_/d;' /etc/pihole/setupVars.conf
echo "DHCP_ACTIVE=true" >> /etc/pihole/setupVars.conf
echo "DHCP_START=${args[2]}" >> /etc/pihole/setupVars.conf
echo "DHCP_END=${args[3]}" >> /etc/pihole/setupVars.conf
echo "DHCP_ROUTER=${args[4]}" >> /etc/pihole/setupVars.conf
change_setting "DHCP_ACTIVE" "true"
change_setting "DHCP_START" "${args[2]}"
change_setting "DHCP_END" "${args[3]}"
change_setting "DHCP_ROUTER" "${args[4]}"
change_setting "DHCP_LEASETIME" "${args[5]}"
change_setting "PIHOLE_DOMAIN" "${args[6]}"
# Remove setting from file
sed -i '/dhcp-/d;/quiet-dhcp/d;' /etc/dnsmasq.d/01-pihole.conf
# Save setting to file
echo "dhcp-range=${args[2]},${args[3]},infinite" >> /etc/dnsmasq.d/01-pihole.conf
echo "dhcp-option=option:router,${args[4]}" >> /etc/dnsmasq.d/01-pihole.conf
# Changes the behaviour from strict RFC compliance so that DHCP requests on unknown leases from unknown hosts are not ignored. This allows new hosts to get a lease without a tedious timeout under all circumstances. It also allows dnsmasq to rebuild its lease database without each client needing to reacquire a lease, if the database is lost.
echo "dhcp-authoritative" >> /etc/dnsmasq.d/01-pihole.conf
# Use the specified file to store DHCP lease information
echo "dhcp-leasefile=/etc/pihole/dhcp.leases" >> /etc/dnsmasq.d/01-pihole.conf
# Suppress logging of the routine operation of these protocols. Errors and problems will still be logged, though.
echo "quiet-dhcp" >> /etc/dnsmasq.d/01-pihole.conf
echo "quiet-dhcp6" >> /etc/dnsmasq.d/01-pihole.conf
# Remove possible old setting from file
delete_dnsmasq_setting "dhcp-"
delete_dnsmasq_setting "quiet-dhcp"
ProcessDHCPSettings
RestartDNS
}
DisableDHCP(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/DHCP_ACTIVE/d;' /etc/pihole/setupVars.conf
echo "DHCP_ACTIVE=false" >> /etc/pihole/setupVars.conf
change_setting "DHCP_ACTIVE" "false"
# Remove setting from file
sed -i '/dhcp-/d;/quiet-dhcp/d;' /etc/dnsmasq.d/01-pihole.conf
# Remove possible old setting from file
delete_dnsmasq_setting "dhcp-"
delete_dnsmasq_setting "quiet-dhcp"
ProcessDHCPSettings
RestartDNS
}
SetWebUILayout(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/WEBUIBOXEDLAYOUT/d;' /etc/pihole/setupVars.conf
echo "WEBUIBOXEDLAYOUT=${args[2]}" >> /etc/pihole/setupVars.conf
change_setting "WEBUIBOXEDLAYOUT" "${args[2]}"
}
SetDNSDomainName(){
SetPrivacyMode(){
# Remove setting from file (create backup setupVars.conf.bak)
sed -i.bak '/PIHOLE_DOMAIN/d;' /etc/pihole/setupVars.conf
# Save setting to file
echo "PIHOLE_DOMAIN=${args[2]}" >> /etc/pihole/setupVars.conf
# Replace within actual dnsmasq config file
sed -i '/domain=/d;' /etc/dnsmasq.d/01-pihole.conf
echo "domain=${args[2]}" >> /etc/dnsmasq.d/01-pihole.conf
# Restart dnsmasq to load new configuration
RestartDNS
if [[ "${args[2]}" == "true" ]] ; then
change_setting "API_PRIVACY_MODE" "true"
else
change_setting "API_PRIVACY_MODE" "false"
fi
}
case "${args[1]}" in
"-p" | "password" ) SetWebPassword;;
"-c" | "celsius" ) unit="C"; SetTemperatureUnit;;
"-f" | "fahrenheit" ) unit="F"; SetTemperatureUnit;;
"-k" | "kelvin" ) unit="K"; SetTemperatureUnit;;
"setdns" ) SetDNSServers;;
"setexcludedomains" ) SetExcludeDomains;;
"setexcludeclients" ) SetExcludeClients;;
"reboot" ) Reboot;;
"restartdns" ) RestartDNS;;
"setquerylog" ) SetQueryLogOptions;;
"enabledhcp" ) EnableDHCP;;
"disabledhcp" ) DisableDHCP;;
"layout" ) SetWebUILayout;;
"-h" | "--help" ) helpFunc;;
"domainname" ) SetDNSDomainName;;
* ) helpFunc;;
esac
ResolutionSettings() {
shift
typ="${args[2]}"
state="${args[3]}"
if [[ $# = 0 ]]; then
helpFunc
fi
if [[ "${typ}" == "forward" ]]; then
change_setting "API_GET_UPSTREAM_DNS_HOSTNAME" "${state}"
elif [[ "${typ}" == "clients" ]]; then
change_setting "API_GET_CLIENT_HOSTNAME" "${state}"
fi
}
main() {
args=("$@")
case "${args[1]}" in
"-p" | "password" ) SetWebPassword;;
"-c" | "celsius" ) unit="C"; SetTemperatureUnit;;
"-f" | "fahrenheit" ) unit="F"; SetTemperatureUnit;;
"-k" | "kelvin" ) unit="K"; SetTemperatureUnit;;
"setdns" ) SetDNSServers;;
"setexcludedomains" ) SetExcludeDomains;;
"setexcludeclients" ) SetExcludeClients;;
"reboot" ) Reboot;;
"restartdns" ) RestartDNS;;
"setquerylog" ) SetQueryLogOptions;;
"enabledhcp" ) EnableDHCP;;
"disabledhcp" ) DisableDHCP;;
"layout" ) SetWebUILayout;;
"-h" | "--help" ) helpFunc;;
"privacymode" ) SetPrivacyMode;;
"resolve" ) ResolutionSettings;;
* ) helpFunc;;
esac
shift
if [[ $# = 0 ]]; then
helpFunc
fi
}

136
advanced/blockingpage.css Normal file
View File

@@ -0,0 +1,136 @@
/* CSS Reset */
html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { margin: 0; padding: 0; border: 0; font-size: 100%; font: inherit; vertical-align: baseline; }
article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section { display: block; }
body { line-height: 1; }
ol, ul { list-style: none; }
blockquote, q { quotes: none; }
blockquote:before, blockquote:after, q:before, q:after { content: ''; content: none; }
table { border-collapse: collapse; border-spacing: 0; }
html { height: 100%; overflow-x: hidden; }
/* General Style */
a { color: rgba(0,60,120,0.95); text-decoration: none; } /* 1E3C5A */
a:hover { color: rgba(210,120,0,0.95); transition-duration: .2s; } /* 255, 128, 0 */
divs a { border-bottom: 1px dashed rgba(30,60,90,0.3); }
b { font-weight: bold; }
i { font-style: italic; }
footer, pre, td { font-family: monospace; padding-left: 15px; }
/*body, header { background: #E1E1E1; }*/
body {
background-image: -webkit-linear-gradient(top, rgba(240,240,240,0.95), rgba(190,190,190,0.95));
background-image: linear-gradient(to bottom, rgba(240,240,240,0.95), rgba(190,190,190,0.95));
background-attachment: fixed;
color: rgba(64,64,64,0.95);
font: 14px, sans-serif;
line-height: 1em;
}
header {
min-width: 320px;
width: 100%;
text-shadow: 0 1px rgba(255,255,255,0.6);
display: table;
table-layout: fixed;
border: 1px solid rgba(0,0,0,0.25);
border-top-color: rgba(255,255,255,0.85);
border-style: solid none;
background-image: -webkit-linear-gradient(top, rgba(240,240,240,0.95), rgba(220,220,220,0.95));
background-image: linear-gradient(to bottom, rgba(240,240,240,0.95), rgba(220,220,220,0.95));
box-shadow: 0 0 1px 1px rgba(0,0,0,0.04);
}
header h1, header div {
display: table-cell;
color: inherit;
font-weight: bold;
vertical-align: middle;
white-space: nowrap;
overflow: hidden;
box-sizing: border-box;
}
header h1 {
font-size: 22px;
font-weight: bold;
width: 100%;
padding: 8px 0;
text-indent: 32px;
background: url("http://pi.hole/admin/img/logo.svg") left no-repeat;
background-size: 30px 22px;
}
header h1 a, h1 a:hover { color: inherit; }
header .alt { width: 85px; font-size: 0.8em; padding-right: 4px; text-align: right; line-height: 1.25em; }
.active { color: green; }
.inactive { color: red; }
main {
display: block;
width: 80%;
padding: 10px;
font-size: 1em;
background-color: rgba(255,255,255,0.85);
margin: 8px auto;
box-sizing: border-box;
border: 1px solid rgba(0,0,0,0.25);
box-shadow: 4px 4px rgba(0,0,0,0.1);
line-height: 1.2em;
border-radius: 8px;
}
h2 { /* Rgba is shared with .transparent th */
font: 1.15em sans-serif;
background-color: rgba(255,0,0,0.4);
text-shadow: none;
line-height: 1.1em;
padding-bottom: 1px;
margin-top: 8px;
margin-bottom: 4px;
background: -webkit-linear-gradient(left, rgba(0,0,0,0.25), transparent 80%) no-repeat;
background: linear-gradient(to right, rgba(0,0,0,0.25), transparent 80%) no-repeat;
background-size: 100% 1px;
background-position: 0 17px;
}
h2:first-child { margin-top: 0; }
h2 ~ *:not(h2) { margin-left: 4px; }
li { padding: 2px 0; }
li::before { content: "\00BB\00a0"; }
li a { position: relative; top: 1px; } /* Center bullet-point arrows */
/* Button Style */
.buttons a, button, input, .transparent th a { /* Swapped rgba is shared with input[type='url'] */
display: inline-block;
color: rgba(32,32,32,0.9);
font-weight: bold;
text-align: center;
cursor: pointer;
text-shadow: 0 1px rgba(255,255,255,0.2);
line-height: 0.86em;
font-size: 1em;
padding: 4px 8px;
background: #FAFAFA;
background-image: -webkit-linear-gradient(top, rgba(255,255,255,0.05), rgba(0,0,0,0.05));
background-image: linear-gradient(to bottom, rgba(255,255,255,0.05), rgba(0,0,0,0.05));
border: 1px solid rgba(0,0,0,0.25);
border-radius: 4px;
box-shadow: 0 1px 0 rgba(0,0,0,0.04);
}
.buttons { white-space: nowrap; width: 100%; display: table; }
.buttons33 { white-space: nowrap; width: 33.333%; display: table; text-align: center; margin-left: 33.333% }
.mini a { width: 50%; }
a.safe { background-color: rgba(0,220,0,0.5); }
button.safe { background-color: rgba(0,220,0,0.5); }
a.warn { background-color: rgba(220,0,0,0.5); }
.blocked a, .mini a { display: table-cell; }
.blocked a.safe50 { width: 50%; background-color: rgba(0,220,0,0.5); }
.blocked a.safe33 { width: 33.333%; background-color: rgba(0,220,0,0.5); }
/* Types of text */
.msg { white-space: pre; overflow: auto; -webkit-overflow-scrolling: touch; display: block; line-height: 1.2em; font-weight: bold; font-size: 1.15em; margin: 4px 8px 8px 8px; white-space: pre-line; }
footer { font-size: 0.8em; text-align: center; width: 87%; margin: 4px auto; }

View File

@@ -1,12 +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
# Swap file config
#
# 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.
CONF_SWAPSIZE=500

View File

@@ -1,7 +0,0 @@
<html>
<head>
<script>window.close();</script>
</head>
<body>
</body>
</html>

162
advanced/index.php Normal file
View File

@@ -0,0 +1,162 @@
<?php
/* Detailed Pi-Hole Block Page: Show "Website Blocked" if user browses to site, but not to image/file requests based on the work of WaLLy3K for DietPi & Pi-Hole */
$uri = escapeshellcmd($_SERVER['REQUEST_URI']);
$serverName = escapeshellcmd($_SERVER['SERVER_NAME']);
// Retrieve server URI extension (EG: jpg, exe, php)
$uriExt = pathinfo($uri, PATHINFO_EXTENSION);
// Define which URL extensions get rendered as "Website Blocked"
$webExt = array('asp', 'htm', 'html', 'php', 'rss', 'xml');
if(in_array($uriExt, $webExt) || empty($uriExt))
{
// Requested resource has an extension listed in $webExt
// or no extension (index access to some folder incl. the root dir)
$showPage = true;
}
else
{
// Something else
$showPage = false;
}
// Handle incoming URI types
if (!$showPage)
{
?>
<html>
<head>
<script>window.close();</script></head>
<body>
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">
</body>
</html>
<?php
die();
}
// Get Pi-Hole version
$piHoleVersion = exec('cd /etc/.pihole/ && git describe --tags --abbrev=0');
// Don't show the URI if it is the root directory
if($uri == "/")
{
$uri = "";
}
?>
<!DOCTYPE html>
<head>
<meta charset='UTF-8'/>
<title>Website Blocked</title>
<link rel='stylesheet' href='http://pi.hole/pihole/blockingpage.css'/>
<link rel='shortcut icon' href='http://pi.hole/admin/img/favicon.png' type='image/png'/>
<meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0, user-scalable=no'/>
<meta name='robots' content='noindex,nofollow'/>
</head>
<body id="body">
<header>
<h1><a href='/'>Website Blocked</a></h1>
</header>
<main>
<div>Access to the following site has been blocked:<br/>
<span class='pre msg'><?php echo $serverName.$uri; ?></span></div>
<div>If you have an ongoing use for this website, please ask the owner of the Pi-hole in your network to have it whitelisted.</div>
<input id="domain" type="hidden" value="<?php echo $serverName; ?>">
<input id="quiet" type="hidden" value="yes">
<button id="btnSearch" class="buttons blocked" type="button" style="visibility: hidden;"></button>
This page is blocked because it is explicitly contained within the following block list(s):
<pre id="output" style="width: 100%; height: 100%;" hidden="true"></pre><br/>
<div class='buttons blocked'>
<a class='safe33' href='javascript:history.back()'>Go back</a>
<a class='safe33' id="whitelisting">Whitelist this page</a>
<a class='safe33' href='javascript:window.close()'>Close window</a>
</div>
<div style="width: 98%; text-align: center; padding: 10px;" hidden="true" id="whitelistingform">Password required!<br/>
<form>
<input name="list" type="hidden" value="white"><br/>
Domain:<br/>
<input name="domain" value="<?php echo $serverName ?>" disabled><br/><br/>
Password:<br/>
<input type="password" id="pw" name="pw"><br/><br/>
<button class="buttons33 safe" id="btnAdd" type="button">Whitelist</button>
</form><br/>
<pre id="whitelistingoutput" style="width: 100%; height: 100%; padding: 5px;" hidden="true"></pre><br/>
</div>
</main>
<footer>Generated <?php echo date('D g:i A, M d'); ?> by Pi-hole <?php echo $piHoleVersion; ?></footer>
<script src="http://pi.hole/admin/scripts/vendor/jquery.min.js"></script>
<script src="http://pi.hole/admin/scripts/pi-hole/js/queryads.js"></script>
<script>
function inIframe () {
try {
return window.self !== window.top;
} catch (e) {
return true;
}
}
// Try to detect if page is loaded within iframe
if(inIframe())
{
// Within iframe
// hide content of page
$('#body').hide();
// remove background
document.body.style.backgroundImage = "none";
}
else
{
// Query adlists
$( "#btnSearch" ).click();
}
$( "#whitelisting" ).on( "click", function(){ $( "#whitelistingform" ).removeAttr( "hidden" ); });
function add() {
var domain = $("#domain");
var pw = $("#pw");
if(domain.val().length === 0){
return;
}
$.ajax({
url: "admin/scripts/pi-hole/php/add.php",
method: "post",
data: {"domain":domain.val(), "list":"white", "pw":pw.val()},
success: function(response) {
$( "#whitelistingoutput" ).removeAttr( "hidden" );
if(response.indexOf("Pi-hole blocking") !== -1)
{
// Reload page after 5 seconds
setTimeout(function(){window.location.reload(1);}, 5000);
$( "#whitelistingoutput" ).html("---> Success <---<br/>You may have to flush your DNS cache");
}
else
{
$( "#whitelistingoutput" ).html("---> "+response+" <---");
}
},
error: function(jqXHR, exception) {
$( "#whitelistingoutput" ).removeAttr( "hidden" );
$( "#whitelistingoutput" ).html("---> Unknown Error <---");
}
});
}
// Handle enter button for adding domains
$(document).keypress(function(e) {
if(e.which === 13 && $("#pw").is(":focus")) {
add();
}
});
// Handle buttons
$("#btnAdd").on("click", function() {
add();
});
</script>
</body>
</html>

View File

@@ -21,7 +21,7 @@ server.modules = (
)
server.document-root = "/var/www/html"
server.error-handler-404 = "pihole/index.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"

View File

@@ -22,7 +22,7 @@ server.modules = (
)
server.document-root = "/var/www/html"
server.error-handler-404 = "pihole/index.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"

View File

@@ -9,4 +9,3 @@
# the Free Software Foundation, either version 2 of the License, or
# (at your option) any later version.
www-data ALL=NOPASSWD: /usr/local/bin/pihole

View File

@@ -1,87 +0,0 @@
module pihole 1.0;
require {
type var_log_t;
type unconfined_t;
type init_t;
type auditd_t;
type syslogd_t;
type NetworkManager_t;
type mdadm_t;
type tuned_t;
type avahi_t;
type irqbalance_t;
type system_dbusd_t;
type kernel_t;
type httpd_sys_script_t;
type systemd_logind_t;
type httpd_t;
type policykit_t;
type dnsmasq_t;
type udev_t;
type postfix_pickup_t;
type sshd_t;
type crond_t;
type getty_t;
type lvm_t;
type postfix_qmgr_t;
type postfix_master_t;
class dir { getattr search };
class file { read open setattr };
}
#============= dnsmasq_t ==============
allow dnsmasq_t var_log_t:file { open setattr };
#============= httpd_t ==============
allow httpd_t var_log_t:file { read open };
#============= httpd_sys_script_t (class: dir) ==============
allow httpd_sys_script_t NetworkManager_t:dir { getattr search };
allow httpd_sys_script_t auditd_t:dir { getattr search };
allow httpd_sys_script_t avahi_t:dir { getattr search };
allow httpd_sys_script_t crond_t:dir { getattr search };
allow httpd_sys_script_t dnsmasq_t:dir { getattr search };
allow httpd_sys_script_t getty_t:dir { getattr search };
allow httpd_sys_script_t httpd_t:dir { getattr search };
allow httpd_sys_script_t init_t:dir { getattr search };
allow httpd_sys_script_t irqbalance_t:dir { getattr search };
allow httpd_sys_script_t kernel_t:dir { getattr search };
allow httpd_sys_script_t lvm_t:dir { getattr search };
allow httpd_sys_script_t mdadm_t:dir { getattr search };
allow httpd_sys_script_t policykit_t:dir { getattr search };
allow httpd_sys_script_t postfix_master_t:dir { getattr search };
allow httpd_sys_script_t postfix_pickup_t:dir { getattr search };
allow httpd_sys_script_t postfix_qmgr_t:dir { getattr search };
allow httpd_sys_script_t sshd_t:dir { getattr search };
allow httpd_sys_script_t syslogd_t:dir { getattr search };
allow httpd_sys_script_t system_dbusd_t:dir { getattr search };
allow httpd_sys_script_t systemd_logind_t:dir { getattr search };
allow httpd_sys_script_t tuned_t:dir { getattr search };
allow httpd_sys_script_t udev_t:dir { getattr search };
allow httpd_sys_script_t unconfined_t:dir { getattr search };
#============= httpd_sys_script_t (class: file) ==============
allow httpd_sys_script_t NetworkManager_t:file { read open };
allow httpd_sys_script_t auditd_t:file { read open };
allow httpd_sys_script_t avahi_t:file { read open };
allow httpd_sys_script_t crond_t:file { read open };
allow httpd_sys_script_t dnsmasq_t:file { read open };
allow httpd_sys_script_t getty_t:file { read open };
allow httpd_sys_script_t httpd_t:file { read open };
allow httpd_sys_script_t init_t:file { read open };
allow httpd_sys_script_t irqbalance_t:file { read open };
allow httpd_sys_script_t kernel_t:file { read open };
allow httpd_sys_script_t lvm_t:file { read open };
allow httpd_sys_script_t mdadm_t:file { read open };
allow httpd_sys_script_t policykit_t:file { read open };
allow httpd_sys_script_t postfix_master_t:file { read open };
allow httpd_sys_script_t postfix_pickup_t:file { read open };
allow httpd_sys_script_t postfix_qmgr_t:file { read open };
allow httpd_sys_script_t sshd_t:file { read open };
allow httpd_sys_script_t syslogd_t:file { read open };
allow httpd_sys_script_t system_dbusd_t:file { read open };
allow httpd_sys_script_t systemd_logind_t:file { read open };
allow httpd_sys_script_t tuned_t:file { read open };
allow httpd_sys_script_t udev_t:file { read open };
allow httpd_sys_script_t unconfined_t:file { read open };

View File

@@ -21,6 +21,7 @@ set -e
tmpLog=/tmp/pihole-install.log
instalLogLoc=/etc/pihole/install.log
setupVars=/etc/pihole/setupVars.conf
lighttpdConfig=/etc/lighttpd/lighttpd.conf
webInterfaceGitUrl="https://github.com/pi-hole/AdminLTE.git"
webInterfaceDir="/var/www/html/admin"
@@ -35,8 +36,8 @@ QUERY_LOGGING=true
# Find the rows and columns will default to 80x24 is it can not be detected
screen_size=$(stty size 2>/dev/null || echo 24 80)
rows=$(echo $screen_size | awk '{print $1}')
columns=$(echo $screen_size | awk '{print $2}')
rows=$(echo "${screen_size}" | awk '{print $1}')
columns=$(echo "${screen_size}" | awk '{print $2}')
# Divide by two so the dialogs take up half of the screen, which looks nice.
r=$(( rows / 2 ))
@@ -50,35 +51,12 @@ skipSpaceCheck=false
reconfigure=false
runUnattended=false
######## FIRST CHECK ########
# Must be root to install
echo ":::"
if [[ ${EUID} -eq 0 ]]; then
echo "::: You are root."
else
echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures"
echo "::: system networking, it requires elevated rights. Please check the contents of the script for"
echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source."
echo ":::"
echo "::: Detecting the presence of the sudo utility for continuation of this install..."
if [ -x "$(command -v sudo)" ]; then
echo "::: Utility sudo located."
exec curl -sSL https://install.pi-hole.net | sudo bash "$@"
exit $?
else
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
exit 1
fi
fi
# Compatibility
if [[ $(command -v apt-get) ]]; then
if command -v apt-get &> /dev/null; then
#Debian Family
#############################################
PKG_MANAGER="apt-get"
PKG_CACHE="/var/lib/apt/lists/"
UPDATE_PKG_CACHE="${PKG_MANAGER} update"
PKG_INSTALL="${PKG_MANAGER} --yes --no-install-recommends install"
# grep -c will return 1 retVal on 0 matches, block this throwing the set -e with an OR TRUE
@@ -97,35 +75,29 @@ if [[ $(command -v apt-get) ]]; then
LIGHTTPD_CFG="lighttpd.conf.debian"
DNSMASQ_USER="dnsmasq"
package_check_install() {
dpkg-query -W -f='${Status}' "${1}" 2>/dev/null | grep -c "ok installed" || ${PKG_INSTALL} "${1}"
}
elif [ $(command -v rpm) ]; then
elif command -v rpm &> /dev/null; then
# Fedora Family
if [ $(command -v dnf) ]; then
if command -v dnf &> /dev/null; then
PKG_MANAGER="dnf"
else
PKG_MANAGER="yum"
fi
PKG_CACHE="/var/cache/${PKG_MANAGER}"
UPDATE_PKG_CACHE="${PKG_MANAGER} check-update"
# Fedora and family update cache on every PKG_INSTALL call, no need for a separate update.
UPDATE_PKG_CACHE=":"
PKG_INSTALL="${PKG_MANAGER} install -y"
PKG_COUNT="${PKG_MANAGER} check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l"
INSTALLER_DEPS=(git iproute net-tools newt procps-ng)
PIHOLE_DEPS=(bc bind-utils cronie curl dnsmasq epel-release findutils lighttpd lighttpd-fastcgi nmap-ncat php php-common php-cli sudo unzip wget)
PIHOLE_DEPS=(bc bind-utils cronie curl dnsmasq findutils lighttpd lighttpd-fastcgi nmap-ncat php php-common php-cli sudo unzip wget)
if grep -q 'Fedora' /etc/redhat-release; then
remove_deps=(epel-release);
PIHOLE_DEPS=( ${PIHOLE_DEPS[@]/$remove_deps} );
if ! grep -q 'Fedora' /etc/redhat-release; then
INSTALLER_DEPS=("${INSTALLER_DEPS[@]}" "epel-release");
fi
LIGHTTPD_USER="lighttpd"
LIGHTTPD_GROUP="lighttpd"
LIGHTTPD_CFG="lighttpd.conf.fedora"
DNSMASQ_USER="nobody"
package_check_install() {
rpm -qa | grep ^"${1}"- > /dev/null || ${PKG_INSTALL} "${1}"
}
else
echo "OS distribution not supported"
exit
@@ -133,30 +105,51 @@ fi
####### FUNCTIONS ##########
is_repo() {
# Use git to check if directory is currently under VCS, return the value
# Use git to check if directory is currently under VCS, return the value 128
# if directory is not a repo. Return 1 if directory does not exist.
local directory="${1}"
git -C "${directory}" status --short &> /dev/null
return
local curdir
local rc
curdir="${PWD}"
if [[ -d "${directory}" ]]; then
# git -C is not used here to support git versions older than 1.8.4
cd "${directory}"
git status --short &> /dev/null || rc=$?
else
# non-zero return code if directory does not exist
rc=1
fi
cd "${curdir}"
return "${rc:-0}"
}
make_repo() {
local directory="${1}"
local remoteRepo="${2}"
# Remove the non-repod interface and clone the interface
echo -n "::: Cloning $remoteRepo into $directory..."
rm -rf "${directory}"
git clone -q --depth 1 "${remoteRepo}" "${directory}" &> /dev/null
echo -n "::: Cloning ${remoteRepo} into ${directory}..."
# Clean out the directory if it exists for git to clone into
if [[ -d "${directory}" ]]; then
rm -rf "${directory}"
fi
git clone -q --depth 1 "${remoteRepo}" "${directory}" &> /dev/null || return $?
echo " done!"
return 0
}
update_repo() {
local directory="${1}"
# Pull the latest commits
echo -n "::: Updating repo in $1..."
cd "${directory}" || exit 1
git stash -q &> /dev/null
git pull -q &> /dev/null
echo " done!"
echo -n "::: Updating repo in ${1}..."
if [[ -d "${directory}" ]]; then
cd "${directory}"
git stash -q &> /dev/null || true # Okay for stash failure
git pull -q &> /dev/null || return $?
echo " done!"
fi
return 0
}
getGitFiles() {
@@ -167,22 +160,23 @@ getGitFiles() {
echo ":::"
echo "::: Checking for existing repository..."
if is_repo "${directory}"; then
update_repo "${directory}"
update_repo "${directory}" || return 1
else
make_repo "${directory}" "${remoteRepo}"
make_repo "${directory}" "${remoteRepo}" || return 1
fi
return 0
}
find_IPv4_information() {
# Find IP used to route to outside world
IPv4dev=$(ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++)if($i~/dev/)print $(i+1)}')
IPV4_ADDRESS=$(ip -o -f inet addr show dev "$IPv4dev" | awk '{print $4}' | awk 'END {print}')
IPV4_ADDRESS=$(ip route get 8.8.8.8| awk '{print $7}')
IPv4gw=$(ip route get 8.8.8.8 | awk '{print $3}')
}
get_available_interfaces() {
# Get available interfaces. Consider only getting UP interfaces in the future, and leaving DOWN interfaces out of list.
availableInterfaces=$(ip -o link | awk '{print $2}' | grep -v "lo" | cut -d':' -f1 | cut -d'@' -f1)
# Get available UP interfaces.
availableInterfaces=$(ip -o link | grep "state UP" | awk '{print $2}' | cut -d':' -f1 | cut -d'@' -f1)
}
welcomeDialogs() {
@@ -241,6 +235,11 @@ chooseInterface() {
# Loop sentinel variable
local firstLoop=1
if [[ $(echo ${availableInterfaces} | wc -l) -eq 1 ]]; then
PIHOLE_INTERFACE=${availableInterfaces}
return
fi
while read -r line; do
mode="OFF"
if [[ ${firstLoop} -eq 1 ]]; then
@@ -267,8 +266,11 @@ chooseInterface() {
useIPv6dialog() {
# Show the IPv6 address used for blocking
IPV6_ADDRESS=$(ip -6 route get 2001:4860:4860::8888 | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$IPV6_ADDRESS will be used to block ads." ${r} ${c}
IPV6_ADDRESS=$(ip -6 route get 2001:4860:4860::8888 | grep -v "unreachable" | awk -F " " '{ for(i=1;i<=NF;i++) if ($i == "src") print $(i+1) }')
if [[ ! -z "${IPV6_ADDRESS}" ]]; then
whiptail --msgbox --backtitle "IPv6..." --title "IPv6 Supported" "$IPV6_ADDRESS will be used to block ads." ${r} ${c}
fi
}
@@ -406,7 +408,7 @@ setStaticIPv4() {
echo "USERCTL=no"
}> "${IFCFG_FILE}"
ip addr replace dev "${PIHOLE_INTERFACE}" "${IPV4_ADDRESS}"
if [ -x "$(command -v nmcli)" ];then
if command -v nmcli &> /dev/null;then
# Tell NetworkManager to read our new sysconfig file
nmcli con load "${IFCFG_FILE}" > /dev/null
fi
@@ -534,7 +536,7 @@ setLogging() {
local LogChoices
LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?\n (Disabling will render graphs on the Admin page useless):" ${r} ${c} 6)
LogChooseOptions=("On (Reccomended)" "" on
LogChooseOptions=("On (Recommended)" "" on
Off "" off)
LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) || (echo "::: Cancel selected. Exiting..." && exit 1)
case ${LogChoices} in
@@ -628,6 +630,7 @@ installScripts() {
# Install files from local core repository
if is_repo "${PI_HOLE_LOCAL_REPO}"; then
cd "${PI_HOLE_LOCAL_REPO}"
install -o "${USER}" -Dm755 -d /opt/pihole
install -o "${USER}" -Dm755 -t /opt/pihole/ gravity.sh
install -o "${USER}" -Dm755 -t /opt/pihole/ ./advanced/Scripts/*.sh
install -o "${USER}" -Dm755 -t /opt/pihole/ ./automated\ install/uninstall.sh
@@ -665,7 +668,7 @@ stop_service() {
# Can softfail, as process may not be installed when this is called
echo ":::"
echo -n "::: Stopping ${1} service..."
if [ -x "$(command -v systemctl)" ]; then
if command -v systemctl &> /dev/null; then
systemctl stop "${1}" &> /dev/null || true
else
service "${1}" stop &> /dev/null || true
@@ -678,7 +681,7 @@ start_service() {
# This should not fail, it's an error if it does
echo ":::"
echo -n "::: Starting ${1} service..."
if [ -x "$(command -v systemctl)" ]; then
if command -v systemctl &> /dev/null; then
systemctl restart "${1}" &> /dev/null
else
service "${1}" restart &> /dev/null
@@ -690,7 +693,7 @@ enable_service() {
# Enable service so that it will start with next reboot
echo ":::"
echo -n "::: Enabling ${1} service to start on reboot..."
if [ -x "$(command -v systemctl)" ]; then
if command -v systemctl &> /dev/null; then
systemctl enable "${1}" &> /dev/null
else
update-rc.d "${1}" defaults &> /dev/null
@@ -702,19 +705,13 @@ update_pacakge_cache() {
#Running apt-get update/upgrade with minimal output can cause some issues with
#requiring user input (e.g password for phpmyadmin see #218)
#Check to see if apt-get update has already been run today
#it needs to have been run at least once on new installs!
timestamp=$(stat -c %Y ${PKG_CACHE})
timestampAsDate=$(date -d @"${timestamp}" "+%b %e")
today=$(date "+%b %e")
#Update package cache on apt based OSes. Do this every time since
#it's quick and packages can be updated at any time.
if [ ! "${today}" == "${timestampAsDate}" ]; then
#update package lists
echo ":::"
echo -n "::: ${PKG_MANAGER} update has not been run today. Running now..."
${UPDATE_PKG_CACHE} &> /dev/null
echo " done!"
fi
echo ":::"
echo -n "::: Updating local cache of available packages..."
${UPDATE_PKG_CACHE} &> /dev/null
echo " done!"
}
notify_package_updates_available() {
@@ -725,12 +722,16 @@ notify_package_updates_available() {
updatesToInstall=$(eval "${PKG_COUNT}")
echo " done!"
echo ":::"
if [[ ${updatesToInstall} -eq "0" ]]; then
echo "::: Your system is up to date! Continuing with Pi-hole installation..."
if [[ -d "/lib/modules/$(uname -r)" ]]; then
if [[ ${updatesToInstall} -eq "0" ]]; then
echo "::: Your system is up to date! Continuing with Pi-hole installation..."
else
echo "::: There are ${updatesToInstall} updates available for your system!"
echo "::: We recommend you update your OS after installing Pi-Hole! "
echo ":::"
fi
else
echo "::: There are ${updatesToInstall} updates available for your system!"
echo "::: We recommend you update your OS after installing Pi-Hole! "
echo ":::"
echo "::: Kernel update detected, please reboot your system and try again if your installation fails."
fi
}
@@ -738,16 +739,45 @@ install_dependent_packages() {
# Install packages passed in via argument array
# No spinner - conflicts with set -e
declare -a argArray1=("${!1}")
declare -a installArray
# Debian based package install - debconf will download the entire package list
# so we just create an array of packages not currently installed to cut down on the
# amount of download traffic.
# NOTE: We may be able to use this installArray in the future to create a list of package that were
# installed by us, and remove only the installed packages, and not the entire list.
if command -v debconf-apt-progress &> /dev/null; then
debconf-apt-progress -- ${PKG_INSTALL} "${argArray1[@]}"
else
for i in "${argArray1[@]}"; do
echo -n "::: Checking for $i..."
package_check_install "${i}" &> /dev/null
echo " installed!"
if dpkg-query -W -f='${Status}' "${i}" 2>/dev/null | grep "ok installed" &> /dev/null; then
echo " installed!"
else
echo " added to install list!"
installArray+=("${i}")
fi
done
if [[ ${#installArray[@]} -gt 0 ]]; then
debconf-apt-progress -- ${PKG_INSTALL} "${installArray[@]}"
return
fi
return 0
fi
#Fedora/CentOS
for i in "${argArray1[@]}"; do
echo -n "::: Checking for $i..."
if ${PKG_MANAGER} -q list installed "${i}" &> /dev/null; then
echo " installed!"
else
echo " added to install list!"
installArray+=("${i}")
fi
done
if [[ ${#installArray[@]} -gt 0 ]]; then
${PKG_INSTALL} "${installArray[@]}" &> /dev/null
return
fi
return 0
}
CreateLogFile() {
@@ -769,11 +799,11 @@ installPiholeWeb() {
echo ":::"
echo "::: Installing pihole custom index page..."
if [ -d "/var/www/html/pihole" ]; then
if [ -f "/var/www/html/pihole/index.html" ]; then
echo "::: Existing index.html detected, not overwriting"
if [ -f "/var/www/html/pihole/index.php" ]; then
echo "::: Existing index.php detected, not overwriting"
else
echo -n "::: index.html missing, replacing... "
cp /etc/.pihole/advanced/index.html /var/www/html/pihole/
echo -n "::: index.php missing, replacing... "
cp /etc/.pihole/advanced/index.php /var/www/html/pihole/
echo " done!"
fi
@@ -785,6 +815,14 @@ installPiholeWeb() {
echo " done!"
fi
if [ -f "/var/www/html/pihole/blockingpage.css" ]; then
echo "::: Existing blockingpage.css detected, not overwriting"
else
echo -n "::: index.css missing, replacing... "
cp /etc/.pihole/advanced/blockingpage.css /var/www/html/pihole
echo " done!"
fi
else
mkdir /var/www/html/pihole
if [ -f /var/www/html/index.lighttpd.html ]; then
@@ -800,6 +838,15 @@ installPiholeWeb() {
echo -n "::: Installing sudoer file..."
mkdir -p /etc/sudoers.d/
cp /etc/.pihole/advanced/pihole.sudo /etc/sudoers.d/pihole
# Add lighttpd user (OS dependent) to sudoers file
echo "${LIGHTTPD_USER} ALL=NOPASSWD: /usr/local/bin/pihole" >> /etc/sudoers.d/pihole
if [[ "$LIGHTTPD_USER" == "lighttpd" ]]; then
# Allow executing pihole via sudo with Fedora
# Usually /usr/local/bin is not permitted as directory for sudoable programms
echo "Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin" >> /etc/sudoers.d/pihole
fi
chmod 0440 /etc/sudoers.d/pihole
echo " done!"
}
@@ -820,8 +867,12 @@ runGravity() {
echo "::: Cleaning up previous install (preserving whitelist/blacklist)"
rm /etc/pihole/list.*
fi
# Test if /etc/pihole/adlists.default exists
if [[ ! -e /etc/pihole/adlists.default ]]; then
cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
fi
echo "::: Running gravity.sh"
/opt/pihole/gravity.sh
{ /opt/pihole/gravity.sh; }
}
create_pihole_user() {
@@ -832,16 +883,23 @@ create_pihole_user() {
configureFirewall() {
# Allow HTTP and DNS traffic
if [ -x "$(command -v firewall-cmd)" ]; then
firewall-cmd --state &> /dev/null && ( echo "::: Configuring firewalld for httpd and dnsmasq.." && firewall-cmd --permanent --add-port=80/tcp && firewall-cmd --permanent --add-port=53/tcp \
&& firewall-cmd --permanent --add-port=53/udp && firewall-cmd --reload) || echo "::: FirewallD not enabled"
elif [ -x "$(command -v iptables)" ]; then
echo "::: Configuring iptables for httpd and dnsmasq.."
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
if firewall-cmd --state &> /dev/null; then
echo "::: Configuring FirewallD for httpd and dnsmasq.."
firewall-cmd --permanent --add-port=80/tcp --add-port=53/tcp --add-port=53/udp
firewall-cmd --reload
# Check for proper kernel modules to prevent failure
elif modinfo ip_tables &> /dev/null; then
# If chain Policy is not ACCEPT or last Rule is not ACCEPT
# then check and insert our Rules above the DROP/REJECT Rule.
if iptables -S INPUT | head -n1 | grep -qv '^-P.*ACCEPT$' || iptables -S INPUT | tail -n1 | grep -qv '^-\(A\|P\).*ACCEPT$'; then
# Check chain first, otherwise a new rule will duplicate old ones
echo "::: Configuring iptables for httpd and dnsmasq.."
iptables -C INPUT -p tcp -m tcp --dport 80 -j ACCEPT &> /dev/null || iptables -I INPUT 1 -p tcp -m tcp --dport 80 -j ACCEPT
iptables -C INPUT -p tcp -m tcp --dport 53 -j ACCEPT &> /dev/null || iptables -I INPUT 1 -p tcp -m tcp --dport 53 -j ACCEPT
iptables -C INPUT -p udp -m udp --dport 53 -j ACCEPT &> /dev/null || iptables -I INPUT 1 -p udp -m udp --dport 53 -j ACCEPT
fi
else
echo "::: No firewall detected.. skipping firewall configuration."
echo "::: No active firewall detected.. skipping firewall configuration."
fi
}
@@ -858,6 +916,18 @@ finalExports() {
echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}"
echo "QUERY_LOGGING=${QUERY_LOGGING}"
}>> "${setupVars}"
# Look for DNS server settings which would have to be reapplied
source "${setupVars}"
source "/etc/.pihole/advanced/Scripts/webpage.sh"
if [[ "${DNS_FQDN_REQUIRED}" != "" ]] ; then
ProcessDNSSettings
fi
if [[ "${DHCP_ACTIVE}" != "" ]] ; then
ProcessDHCPSettings
fi
}
installPihole() {
@@ -877,7 +947,6 @@ installPihole() {
installScripts
installConfigs
CreateLogFile
configureSelinux
installPiholeWeb
installCron
configureFirewall
@@ -908,7 +977,6 @@ updatePihole() {
installScripts
installConfigs
CreateLogFile
configureSelinux
installPiholeWeb
installCron
configureFirewall
@@ -916,50 +984,41 @@ updatePihole() {
runGravity
}
configureSelinux() {
if [ -x "$(command -v getenforce)" ]; then
printf "\n::: SELinux Detected\n"
printf ":::\tChecking for SELinux policy development packages..."
package_check_install "selinux-policy-devel" > /dev/null
echo " installed!"
printf ":::\tEnabling httpd server side includes (SSI).. "
setsebool -P httpd_ssi_exec on &> /dev/null && echo "Success" || echo "SELinux not enabled"
printf "\n:::\tCompiling Pi-Hole SELinux policy..\n"
if ! [ -x "$(command -v systemctl)" ]; then
sed -i.bak '/systemd/d' /etc/.pihole/advanced/selinux/pihole.te
checkSelinux() {
if command -v getenforce &> /dev/null; then
echo ":::"
echo -n "::: SELinux Support Detected... Mode: "
enforceMode=$(getenforce)
echo "${enforceMode}"
if [[ "${enforceMode}" == "Enforcing" ]]; then
if (whiptail --title "SELinux Enforcing Detected" --yesno "SELinux is being Enforced on your system!\n\nPi-hole currently does not support SELinux, but you may still continue with the installation.\n\nNote: Admin UI Will not function fully without setting your policies correctly\n\nContinue installing Pi-hole?" ${r} ${c}); then
echo ":::"
echo "::: Continuing installation with SELinux Enforcing."
echo "::: Please refer to official SELinux documentation to create a custom policy."
else
echo ":::"
echo "::: Not continuing install after SELinux Enforcing detected."
exit 1
fi
fi
checkmodule -M -m -o /etc/pihole/pihole.mod /etc/.pihole/advanced/selinux/pihole.te
semodule_package -o /etc/pihole/pihole.pp -m /etc/pihole/pihole.mod
semodule -i /etc/pihole/pihole.pp
rm -f /etc/pihole/pihole.mod
semodule -l | grep pihole &> /dev/null && echo "::: Installed Pi-Hole SELinux policy" || echo "::: Warning: Pi-Hole SELinux policy did not install."
fi
}
displayFinalMessage() {
if (( ${#1} > 0 )) ; then
# Final completion message to user
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
IPv4: ${IPV4_ADDRESS%/*}
IPv6: ${IPV6_ADDRESS}
IPv6: ${IPV6_ADDRESS:-"Not Configured"}
If you set a new IP address, you should restart the Pi.
The install log is in /etc/pihole.
View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin
The currently set password is ${1}" ${r} ${c}
else
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
IPv4: ${IPV4_ADDRESS%/*}
IPv6: ${IPV6_ADDRESS}
If you set a new IP address, you should restart the Pi.
The install log is in /etc/pihole.
View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin" ${r} ${c}
fi
Your Admin Webpage login password is ${1:-"NOT SET"}" ${r} ${c}
}
update_dialogs() {
@@ -998,7 +1057,30 @@ update_dialogs() {
}
main() {
# Check arguments for the undocumented flags
######## FIRST CHECK ########
# Must be root to install
echo ":::"
if [[ ${EUID} -eq 0 ]]; then
echo "::: You are root."
else
echo "::: Script called with non-root privileges. The Pi-hole installs server packages and configures"
echo "::: system networking, it requires elevated rights. Please check the contents of the script for"
echo "::: any concerns with this requirement. Please be sure to download this script from a trusted source."
echo ":::"
echo "::: Detecting the presence of the sudo utility for continuation of this install..."
if command -v sudo &> /dev/null; then
echo "::: Utility sudo located."
exec curl -sSL https://install.pi-hole.net | sudo bash "$@"
exit $?
else
echo "::: sudo is needed for the Web interface to run pihole commands. Please run this script as root and it will be automatically installed."
exit 1
fi
fi
# Check arguments for the undocumented flags
for var in "$@"; do
case "$var" in
"--reconfigure" ) reconfigure=true;;
@@ -1033,12 +1115,21 @@ main() {
# Install packages used by this installation script
install_dependent_packages INSTALLER_DEPS[@]
# Check if SELinux is Enforcing
checkSelinux
if [[ "${reconfigure}" == true ]]; then
echo "::: --reconfigure passed to install script. Not downloading/updating local repos"
else
# Get Git files for Core and Admin
getGitFiles ${PI_HOLE_LOCAL_REPO} ${piholeGitUrl}
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl}
getGitFiles ${PI_HOLE_LOCAL_REPO} ${piholeGitUrl} || \
{ echo "!!! Unable to clone ${piholeGitUrl} into ${PI_HOLE_LOCAL_REPO}, unable to continue."; \
exit 1; \
}
getGitFiles ${webInterfaceDir} ${webInterfaceGitUrl} || \
{ echo "!!! Unable to clone ${webInterfaceGitUrl} into ${webInterfaceDir}, unable to continue."; \
exit 1; \
}
fi
if [[ ${useUpdateVars} == false ]]; then
@@ -1053,10 +1144,10 @@ main() {
get_available_interfaces
# Find interfaces and let the user choose one
chooseInterface
# Let the user decide if they want to block ads over IPv4 and/or IPv6
use4andor6
# Decide what upstream DNS Servers to use
setDNS
# Let the user decide if they want to block ads over IPv4 and/or IPv6
use4andor6
# Let the user decide if they want query logging enabled...
setLogging

View File

@@ -104,16 +104,30 @@ gravity_collapse() {
# patternCheck - check to see if curl downloaded any new files.
gravity_patternCheck() {
patternBuffer=$1
# check if the patternbuffer is a non-zero length file
if [[ -s "${patternBuffer}" ]]; then
# Some of the blocklists are copyright, they need to be downloaded
# and stored as is. They can be processed for content after they
# have been saved.
mv "${patternBuffer}" "${saveLocation}"
echo " List updated, transport successful!"
success=$2
error=$3
if [ $success = true ]; then
# check if download was successful but list has not been modified
if [ "${error}" == "304" ]; then
echo "::: No changes detected, transport skipped!"
# check if the patternbuffer is a non-zero length file
elif [[ -s "${patternBuffer}" ]]; then
# Some of the blocklists are copyright, they need to be downloaded
# and stored as is. They can be processed for content after they
# have been saved.
mv "${patternBuffer}" "${saveLocation}"
echo "::: List updated, transport successful!"
else
# Empty file -> use previously downloaded list
echo "::: Received empty file, using cached one (list not updated!)"
fi
else
# curl didn't download any host files, probably because of the date check
echo " No changes detected, transport skipped!"
# check if cached list exists
if [[ -r "${saveLocation}" ]]; then
echo "::: List download failed, using cached list (list not updated!)"
else
echo "::: Download failed and no cached list available (list will not be considered)"
fi
fi
}
@@ -132,9 +146,27 @@ gravity_transport() {
fi
# Silently curl url
curl -s -L ${cmd_ext} ${heisenbergCompensator} -A "${agent}" ${url} > ${patternBuffer}
# Check for list updates
gravity_patternCheck "${patternBuffer}"
err=$(curl -s -L ${cmd_ext} ${heisenbergCompensator} -w %{http_code} -A "${agent}" ${url} -o ${patternBuffer})
echo " done"
# Analyze http response
echo -n "::: Status: "
case "$err" in
"200" ) echo "Success (OK)"; success=true;;
"304" ) echo "Not modified"; success=true;;
"403" ) echo "Forbidden"; success=false;;
"404" ) echo "Not found"; success=false;;
"408" ) echo "Time-out"; success=false;;
"451" ) echo "Unavailable For Legal Reasons"; success=false;;
"521" ) echo "Web Server Is Down (Cloudflare)"; success=false;;
"522" ) echo "Connection Timed Out (Cloudflare)"; success=false;;
"500" ) echo "Internal Server Error"; success=false;;
* ) echo "Status $err"; success=false;;
esac
# Process result
gravity_patternCheck "${patternBuffer}" ${success} "${err}"
}
# spinup - main gravity function
@@ -181,7 +213,10 @@ gravity_Schwarzchild() {
echo -n "::: Aggregating list of domains..."
truncate -s 0 ${piholeDir}/${matterAndLight}
for i in "${activeDomains[@]}"; do
cat "${i}" | tr -d '\r' >> ${piholeDir}/${matterAndLight}
# Only assimilate list if it is available (download might have faild permanently)
if [[ -r "${i}" ]]; then
cat "${i}" | tr -d '\r' >> ${piholeDir}/${matterAndLight}
fi
done
echo " done!"
}
@@ -353,7 +388,7 @@ if [[ "${forceGrav}" == true ]]; then
fi
#Overwrite adlists.default from /etc/.pihole in case any changes have been made. Changes should be saved in /etc/adlists.list
cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
#cp /etc/.pihole/adlists.default /etc/pihole/adlists.default
gravity_collapse
gravity_spinup
if [[ "${skipDownload}" == false ]]; then

20
pihole
View File

@@ -23,7 +23,8 @@ if [[ ! $EUID -eq 0 ]];then
fi
webpageFunc() {
/opt/pihole/webpage.sh "$@"
source /opt/pihole/webpage.sh
main "$@"
exit 0
}
@@ -72,9 +73,9 @@ scanList(){
list="${2}"
method="${3}"
if [[ ${method} == "-exact" ]] ; then
grep -E "(^|\s)${domain}($|\s)" "${list}"
grep -i -E "(^|\s)${domain}($|\s)" "${list}"
else
grep "${domain}" "${list}"
grep -i "${domain}" "${list}"
fi
}
@@ -185,6 +186,19 @@ piholeLogging() {
}
piholeStatus() {
if [[ $(netstat -plnt | grep -c ':53 ') > 0 ]]; then
if [[ "${1}" != "web" ]] ; then
echo "::: DNS service is running"
fi
else
if [[ "${1}" == "web" ]] ; then
echo "-1";
else
echo "::: DNS service is NOT running"
fi
return
fi
if [[ $(grep -i "^#addn-hosts=/" /etc/dnsmasq.d/01-pihole.conf) ]] ; then
#list is commented out
if [[ "${1}" == "web" ]] ; then

View File

@@ -71,13 +71,11 @@ def test_configureFirewall_firewalld_no_errors(Pihole):
source /opt/pihole/basic-install.sh
configureFirewall
''')
expected_stdout = '::: Configuring firewalld for httpd and dnsmasq.'
expected_stdout = '::: Configuring FirewallD for httpd and dnsmasq.'
assert expected_stdout in configureFirewall.stdout
firewall_calls = Pihole.run('cat /var/log/firewall-cmd').stdout
assert 'firewall-cmd --state' in firewall_calls
assert 'firewall-cmd --permanent --add-port=80/tcp' in firewall_calls
assert 'firewall-cmd --permanent --add-port=53/tcp' in firewall_calls
assert 'firewall-cmd --permanent --add-port=53/udp' in firewall_calls
assert 'firewall-cmd --permanent --add-port=80/tcp --add-port=53/tcp --add-port=53/udp' in firewall_calls
assert 'firewall-cmd --reload' in firewall_calls