mirror of
https://github.com/pi-hole/pi-hole
synced 2025-07-15 11:38:05 +00:00
commit
1be082a0e1
3
.codespellignore
Normal file
3
.codespellignore
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
doubleclick
|
||||||
|
wan
|
||||||
|
nwe
|
@ -13,26 +13,8 @@ tab_width = 4
|
|||||||
charset = utf-8
|
charset = utf-8
|
||||||
trim_trailing_whitespace = true
|
trim_trailing_whitespace = true
|
||||||
|
|
||||||
# Matches multiple files with brace expansion notation
|
[*.yml]
|
||||||
# Set default charset
|
tab_width = 2
|
||||||
[*.{js,py}]
|
|
||||||
charset = utf-8
|
|
||||||
|
|
||||||
# 4 space indentation
|
[*.md]
|
||||||
[*.py]
|
tab_width = 2
|
||||||
indent_style = space
|
|
||||||
indent_size = 4
|
|
||||||
|
|
||||||
# Tab indentation (no size specified)
|
|
||||||
[Makefile]
|
|
||||||
indent_style = tab
|
|
||||||
|
|
||||||
# Indentation override for all JS under lib directory
|
|
||||||
[scripts/**.js]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
|
||||||
# Matches the exact files either package.json or .travis.yml
|
|
||||||
[{package.json,.travis.yml}]
|
|
||||||
indent_style = space
|
|
||||||
indent_size = 2
|
|
||||||
|
2
.github/dependabot.yml
vendored
2
.github/dependabot.yml
vendored
@ -8,3 +8,5 @@ updates:
|
|||||||
time: "10:00"
|
time: "10:00"
|
||||||
open-pull-requests-limit: 10
|
open-pull-requests-limit: 10
|
||||||
target-branch: development
|
target-branch: development
|
||||||
|
reviewers:
|
||||||
|
- "pi-hole/core-maintainers"
|
||||||
|
8
.github/workflows/codeql-analysis.yml
vendored
8
.github/workflows/codeql-analysis.yml
vendored
@ -25,16 +25,16 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout repository
|
name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
# Initializes the CodeQL tools for scanning.
|
# Initializes the CodeQL tools for scanning.
|
||||||
-
|
-
|
||||||
name: Initialize CodeQL
|
name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@v1
|
uses: github/codeql-action/init@v2
|
||||||
with:
|
with:
|
||||||
languages: 'python'
|
languages: 'python'
|
||||||
-
|
-
|
||||||
name: Autobuild
|
name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@v1
|
uses: github/codeql-action/autobuild@v2
|
||||||
-
|
-
|
||||||
name: Perform CodeQL Analysis
|
name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@v1
|
uses: github/codeql-action/analyze@v2
|
||||||
|
6
.github/workflows/stale.yml
vendored
6
.github/workflows/stale.yml
vendored
@ -2,7 +2,7 @@ name: Mark stale issues
|
|||||||
|
|
||||||
on:
|
on:
|
||||||
schedule:
|
schedule:
|
||||||
- cron: '0 * * * *'
|
- cron: '0 8 * * *'
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -13,7 +13,7 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@v4
|
- uses: actions/stale@v5
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
days-before-stale: 30
|
days-before-stale: 30
|
||||||
@ -23,4 +23,4 @@ jobs:
|
|||||||
exempt-issue-labels: 'Internal, Fixed in next release, Bug: Confirmed, Documentation Needed'
|
exempt-issue-labels: 'Internal, Fixed in next release, Bug: Confirmed, Documentation Needed'
|
||||||
exempt-all-issue-assignees: true
|
exempt-all-issue-assignees: true
|
||||||
operations-per-run: 300
|
operations-per-run: 300
|
||||||
stale-issue-reason: 'not_planned'
|
close-issue-reason: 'not_planned'
|
||||||
|
2
.github/workflows/sync-back-to-dev.yml
vendored
2
.github/workflows/sync-back-to-dev.yml
vendored
@ -11,7 +11,7 @@ jobs:
|
|||||||
name: Syncing branches
|
name: Syncing branches
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
- name: Opening pull request
|
- name: Opening pull request
|
||||||
id: pull
|
id: pull
|
||||||
uses: tretuna/sync-branches@1.4.0
|
uses: tretuna/sync-branches@1.4.0
|
||||||
|
29
.github/workflows/test.yml
vendored
29
.github/workflows/test.yml
vendored
@ -8,39 +8,50 @@ permissions:
|
|||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
smoke-test:
|
smoke-tests:
|
||||||
if: github.event.pull_request.draft == false
|
if: github.event.pull_request.draft == false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout repository
|
name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
-
|
-
|
||||||
name: Run Smoke Tests
|
name: Check scripts in repository are executable
|
||||||
run: |
|
run: |
|
||||||
# Ensure scripts in repository are executable
|
|
||||||
IFS=$'\n';
|
IFS=$'\n';
|
||||||
for f in $(find . -name '*.sh'); do if [[ ! -x $f ]]; then echo "$f is not executable" && FAIL=1; fi ;done
|
for f in $(find . -name '*.sh'); do if [[ ! -x $f ]]; then echo "$f is not executable" && FAIL=1; fi ;done
|
||||||
unset IFS;
|
unset IFS;
|
||||||
# If FAIL is 1 then we fail.
|
# If FAIL is 1 then we fail.
|
||||||
[[ $FAIL == 1 ]] && exit 1 || echo "Smoke Tests Passed"
|
[[ $FAIL == 1 ]] && exit 1 || echo "Scripts are executable!"
|
||||||
|
-
|
||||||
|
name: Spell-Checking
|
||||||
|
uses: codespell-project/actions-codespell@master
|
||||||
|
with:
|
||||||
|
ignore_words_file: .codespellignore
|
||||||
|
-
|
||||||
|
name: Get editorconfig-checker
|
||||||
|
uses: editorconfig-checker/action-editorconfig-checker@main
|
||||||
|
-
|
||||||
|
name: Run editorconfig-checker
|
||||||
|
run: editorconfig-checker
|
||||||
|
|
||||||
|
|
||||||
distro-test:
|
distro-test:
|
||||||
if: github.event.pull_request.draft == false
|
if: github.event.pull_request.draft == false
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
needs: smoke-test
|
needs: smoke-tests
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
distro: [debian_9, debian_10, debian_11, ubuntu_16, ubuntu_18, ubuntu_20, ubuntu_21, centos_7, centos_8, fedora_33, fedora_34]
|
distro: [debian_10, debian_11, ubuntu_18, ubuntu_20, ubuntu_21, ubuntu_22, centos_7, centos_8, fedora_34]
|
||||||
env:
|
env:
|
||||||
DISTRO: ${{matrix.distro}}
|
DISTRO: ${{matrix.distro}}
|
||||||
steps:
|
steps:
|
||||||
-
|
-
|
||||||
name: Checkout repository
|
name: Checkout repository
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v3
|
||||||
-
|
-
|
||||||
name: Set up Python 3.8
|
name: Set up Python 3.8
|
||||||
uses: actions/setup-python@v3
|
uses: actions/setup-python@v4
|
||||||
with:
|
with:
|
||||||
python-version: 3.8
|
python-version: 3.8
|
||||||
-
|
-
|
||||||
|
@ -1,6 +1,10 @@
|
|||||||
|
---
|
||||||
linters:
|
linters:
|
||||||
shellcheck:
|
shellcheck:
|
||||||
shell: bash
|
shell: bash
|
||||||
phpcs:
|
phpcs:
|
||||||
flake8:
|
flake8:
|
||||||
max-line-length: 120
|
max-line-length: 120
|
||||||
|
yamllint:
|
||||||
|
config: ./.yamllint.conf
|
||||||
|
remarklint:
|
||||||
|
3
.yamllint.conf
Normal file
3
.yamllint.conf
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
rules:
|
||||||
|
line-length: disable
|
||||||
|
document-start: disable
|
@ -3,5 +3,3 @@
|
|||||||
Please read and understand the contribution guide before creating an issue or pull request.
|
Please read and understand the contribution guide before creating an issue or pull request.
|
||||||
|
|
||||||
The guide can be found here: [https://docs.pi-hole.net/guides/github/contributing/](https://docs.pi-hole.net/guides/github/contributing/)
|
The guide can be found here: [https://docs.pi-hole.net/guides/github/contributing/](https://docs.pi-hole.net/guides/github/contributing/)
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,6 +37,6 @@ interface=@INT@
|
|||||||
cache-size=@CACHE_SIZE@
|
cache-size=@CACHE_SIZE@
|
||||||
|
|
||||||
log-queries
|
log-queries
|
||||||
log-facility=/var/log/pihole.log
|
log-facility=/var/log/pihole/pihole.log
|
||||||
|
|
||||||
log-async
|
log-async
|
||||||
|
@ -100,21 +100,29 @@ Options:
|
|||||||
ValidateDomain() {
|
ValidateDomain() {
|
||||||
# Convert to lowercase
|
# Convert to lowercase
|
||||||
domain="${1,,}"
|
domain="${1,,}"
|
||||||
|
local str validDomain
|
||||||
|
|
||||||
# Check validity of domain (don't check for regex entries)
|
# Check validity of domain (don't check for regex entries)
|
||||||
if [[ "${#domain}" -le 253 ]]; then
|
|
||||||
if [[ ( "${typeId}" == "${regex_blacklist}" || "${typeId}" == "${regex_whitelist}" ) && "${wildcard}" == false ]]; then
|
if [[ ( "${typeId}" == "${regex_blacklist}" || "${typeId}" == "${regex_whitelist}" ) && "${wildcard}" == false ]]; then
|
||||||
validDomain="${domain}"
|
validDomain="${domain}"
|
||||||
else
|
else
|
||||||
|
# Check max length
|
||||||
|
if [[ "${#domain}" -le 253 ]]; then
|
||||||
validDomain=$(grep -P "^((-|_)*[a-z\\d]((-|_)*[a-z\\d])*(-|_)*)(\\.(-|_)*([a-z\\d]((-|_)*[a-z\\d])*))*$" <<< "${domain}") # Valid chars check
|
validDomain=$(grep -P "^((-|_)*[a-z\\d]((-|_)*[a-z\\d])*(-|_)*)(\\.(-|_)*([a-z\\d]((-|_)*[a-z\\d])*))*$" <<< "${domain}") # Valid chars check
|
||||||
validDomain=$(grep -P "^[^\\.]{1,63}(\\.[^\\.]{1,63})*$" <<< "${validDomain}") # Length of each label
|
validDomain=$(grep -P "^[^\\.]{1,63}(\\.[^\\.]{1,63})*$" <<< "${validDomain}") # Length of each label
|
||||||
|
# set error string
|
||||||
|
str="is not a valid argument or domain name!"
|
||||||
|
else
|
||||||
|
validDomain=
|
||||||
|
str="is too long!"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ -n "${validDomain}" ]]; then
|
if [[ -n "${validDomain}" ]]; then
|
||||||
domList=("${domList[@]}" "${validDomain}")
|
domList=("${domList[@]}" "${validDomain}")
|
||||||
else
|
else
|
||||||
echo -e " ${CROSS} ${domain} is not a valid argument or domain name!"
|
echo -e " ${CROSS} ${domain} ${str}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
domaincount=$((domaincount+1))
|
domaincount=$((domaincount+1))
|
||||||
|
@ -66,8 +66,8 @@ PIHOLE_DIRECTORY="/etc/pihole"
|
|||||||
PIHOLE_SCRIPTS_DIRECTORY="/opt/pihole"
|
PIHOLE_SCRIPTS_DIRECTORY="/opt/pihole"
|
||||||
BIN_DIRECTORY="/usr/local/bin"
|
BIN_DIRECTORY="/usr/local/bin"
|
||||||
RUN_DIRECTORY="/run"
|
RUN_DIRECTORY="/run"
|
||||||
LOG_DIRECTORY="/var/log"
|
LOG_DIRECTORY="/var/log/pihole"
|
||||||
WEB_SERVER_LOG_DIRECTORY="${LOG_DIRECTORY}/lighttpd"
|
WEB_SERVER_LOG_DIRECTORY="/var/log/lighttpd"
|
||||||
WEB_SERVER_CONFIG_DIRECTORY="/etc/lighttpd"
|
WEB_SERVER_CONFIG_DIRECTORY="/etc/lighttpd"
|
||||||
HTML_DIRECTORY="/var/www/html"
|
HTML_DIRECTORY="/var/www/html"
|
||||||
WEB_GIT_DIRECTORY="${HTML_DIRECTORY}/admin"
|
WEB_GIT_DIRECTORY="${HTML_DIRECTORY}/admin"
|
||||||
@ -129,36 +129,17 @@ FTL_PORT="${RUN_DIRECTORY}/pihole-FTL.port"
|
|||||||
PIHOLE_LOG="${LOG_DIRECTORY}/pihole.log"
|
PIHOLE_LOG="${LOG_DIRECTORY}/pihole.log"
|
||||||
PIHOLE_LOG_GZIPS="${LOG_DIRECTORY}/pihole.log.[0-9].*"
|
PIHOLE_LOG_GZIPS="${LOG_DIRECTORY}/pihole.log.[0-9].*"
|
||||||
PIHOLE_DEBUG_LOG="${LOG_DIRECTORY}/pihole_debug.log"
|
PIHOLE_DEBUG_LOG="${LOG_DIRECTORY}/pihole_debug.log"
|
||||||
PIHOLE_FTL_LOG="$(get_ftl_conf_value "LOGFILE" "${LOG_DIRECTORY}/pihole-FTL.log")"
|
PIHOLE_FTL_LOG="$(get_ftl_conf_value "LOGFILE" "${LOG_DIRECTORY}/FTL.log")"
|
||||||
|
|
||||||
PIHOLE_WEB_SERVER_ACCESS_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/access.log"
|
PIHOLE_WEB_SERVER_ACCESS_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/access-pihole.log"
|
||||||
PIHOLE_WEB_SERVER_ERROR_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/error.log"
|
PIHOLE_WEB_SERVER_ERROR_LOG_FILE="${WEB_SERVER_LOG_DIRECTORY}/error-pihole.log"
|
||||||
|
|
||||||
RESOLVCONF="${ETC}/resolv.conf"
|
RESOLVCONF="${ETC}/resolv.conf"
|
||||||
DNSMASQ_CONF="${ETC}/dnsmasq.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")
|
|
||||||
|
|
||||||
# Store Pi-hole's processes in an array for easy use and parsing
|
# Store Pi-hole's processes in an array for easy use and parsing
|
||||||
PIHOLE_PROCESSES=( "lighttpd" "pihole-FTL" )
|
PIHOLE_PROCESSES=( "lighttpd" "pihole-FTL" )
|
||||||
|
|
||||||
# Store the required directories in an array so it can be parsed through
|
|
||||||
#REQUIRED_DIRECTORIES=("${CORE_GIT_DIRECTORY}"
|
|
||||||
#"${CRON_D_DIRECTORY}"
|
|
||||||
#"${DNSMASQ_D_DIRECTORY}"
|
|
||||||
#"${PIHOLE_DIRECTORY}"
|
|
||||||
#"${PIHOLE_SCRIPTS_DIRECTORY}"
|
|
||||||
#"${BIN_DIRECTORY}"
|
|
||||||
#"${RUN_DIRECTORY}"
|
|
||||||
#"${LOG_DIRECTORY}"
|
|
||||||
#"${WEB_SERVER_LOG_DIRECTORY}"
|
|
||||||
#"${WEB_SERVER_CONFIG_DIRECTORY}"
|
|
||||||
#"${HTML_DIRECTORY}"
|
|
||||||
#"${WEB_GIT_DIRECTORY}"
|
|
||||||
#"${BLOCK_PAGE_DIRECTORY}")
|
|
||||||
|
|
||||||
# Store the required directories in an array so it can be parsed through
|
# Store the required directories in an array so it can be parsed through
|
||||||
REQUIRED_FILES=("${PIHOLE_CRON_FILE}"
|
REQUIRED_FILES=("${PIHOLE_CRON_FILE}"
|
||||||
"${WEB_SERVER_CONFIG_FILE}"
|
"${WEB_SERVER_CONFIG_FILE}"
|
||||||
@ -603,7 +584,7 @@ disk_usage() {
|
|||||||
# Additinal keywords can be added, separated by "|"
|
# Additinal keywords can be added, separated by "|"
|
||||||
hide="curlftpfs"
|
hide="curlftpfs"
|
||||||
|
|
||||||
# only show those lines not containg a sensitive phrase
|
# only show those lines not containing a sensitive phrase
|
||||||
for line in "${file_system[@]}"; do
|
for line in "${file_system[@]}"; do
|
||||||
if [[ ! $line =~ $hide ]]; then
|
if [[ ! $line =~ $hide ]]; then
|
||||||
log_write " ${line}"
|
log_write " ${line}"
|
||||||
@ -1394,7 +1375,7 @@ curl_to_tricorder() {
|
|||||||
upload_to_tricorder() {
|
upload_to_tricorder() {
|
||||||
local username="pihole"
|
local username="pihole"
|
||||||
# Set the permissions and owner
|
# Set the permissions and owner
|
||||||
chmod 644 ${PIHOLE_DEBUG_LOG}
|
chmod 640 ${PIHOLE_DEBUG_LOG}
|
||||||
chown "$USER":"${username}" ${PIHOLE_DEBUG_LOG}
|
chown "$USER":"${username}" ${PIHOLE_DEBUG_LOG}
|
||||||
|
|
||||||
# Let the user know debugging is complete with something strikingly visual
|
# Let the user know debugging is complete with something strikingly visual
|
||||||
|
@ -31,7 +31,7 @@ if [ -z "$DBFILE" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$@" != *"quiet"* ]]; then
|
if [[ "$@" != *"quiet"* ]]; then
|
||||||
echo -ne " ${INFO} Flushing /var/log/pihole.log ..."
|
echo -ne " ${INFO} Flushing /var/log/pihole/pihole.log ..."
|
||||||
fi
|
fi
|
||||||
if [[ "$@" == *"once"* ]]; then
|
if [[ "$@" == *"once"* ]]; then
|
||||||
# Nightly logrotation
|
# Nightly logrotation
|
||||||
@ -44,9 +44,9 @@ if [[ "$@" == *"once"* ]]; then
|
|||||||
# Note that moving the file is not an option, as
|
# Note that moving the file is not an option, as
|
||||||
# dnsmasq would happily continue writing into the
|
# dnsmasq would happily continue writing into the
|
||||||
# moved file (it will have the same file handler)
|
# moved file (it will have the same file handler)
|
||||||
cp -p /var/log/pihole.log /var/log/pihole.log.1
|
cp -p /var/log/pihole/pihole.log /var/log/pihole/pihole.log.1
|
||||||
echo " " > /var/log/pihole.log
|
echo " " > /var/log/pihole/pihole.log
|
||||||
chmod 644 /var/log/pihole.log
|
chmod 640 /var/log/pihole/pihole.log
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Manual flushing
|
# Manual flushing
|
||||||
@ -56,10 +56,10 @@ else
|
|||||||
/usr/sbin/logrotate --force --state "${STATEFILE}" /etc/pihole/logrotate
|
/usr/sbin/logrotate --force --state "${STATEFILE}" /etc/pihole/logrotate
|
||||||
else
|
else
|
||||||
# Flush both pihole.log and pihole.log.1 (if existing)
|
# Flush both pihole.log and pihole.log.1 (if existing)
|
||||||
echo " " > /var/log/pihole.log
|
echo " " > /var/log/pihole/pihole.log
|
||||||
if [ -f /var/log/pihole.log.1 ]; then
|
if [ -f /var/log/pihole/pihole.log.1 ]; then
|
||||||
echo " " > /var/log/pihole.log.1
|
echo " " > /var/log/pihole/pihole.log.1
|
||||||
chmod 644 /var/log/pihole.log.1
|
chmod 640 /var/log/pihole/pihole.log.1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
# Delete most recent 24 hours from FTL's database, leave even older data intact (don't wipe out all history)
|
# Delete most recent 24 hours from FTL's database, leave even older data intact (don't wipe out all history)
|
||||||
@ -70,6 +70,6 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ "$@" != *"quiet"* ]]; then
|
if [[ "$@" != *"quiet"* ]]; then
|
||||||
echo -e "${OVER} ${TICK} Flushed /var/log/pihole.log"
|
echo -e "${OVER} ${TICK} Flushed /var/log/pihole/pihole.log"
|
||||||
echo -e " ${TICK} Deleted ${deleted} queries from database"
|
echo -e " ${TICK} Deleted ${deleted} queries from database"
|
||||||
fi
|
fi
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
# Basic Housekeeping rules
|
# Basic Housekeeping rules
|
||||||
# - Functions must be self contained
|
# - Functions must be self contained
|
||||||
# - Functions must be added in alphabetical order
|
# - Functions should be grouped with other similar functions
|
||||||
# - Functions must be documented
|
# - Functions must be documented
|
||||||
# - New functions must have a test added for them in test/test_any_utils.py
|
# - New functions must have a test added for them in test/test_any_utils.py
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ trust-anchor=.,20326,8,2,E06D44B80B8F1D39A95C0B0D7C65D08458E880409BBC68345710423
|
|||||||
# changes in the non-FQDN forwarding. This cannot be done in 01-pihole.conf
|
# 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
|
# 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
|
# simply rewrite the entire corresponding config file (which is what the
|
||||||
# DHCP settings subroutie is doing)
|
# DHCP settings subroutine is doing)
|
||||||
ProcessDHCPSettings
|
ProcessDHCPSettings
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,8 +440,8 @@ dhcp-leasefile=/etc/pihole/dhcp.leases
|
|||||||
echo "#quiet-dhcp6
|
echo "#quiet-dhcp6
|
||||||
#enable-ra
|
#enable-ra
|
||||||
dhcp-option=option6:dns-server,[::]
|
dhcp-option=option6:dns-server,[::]
|
||||||
dhcp-range=::100,::1ff,constructor:${interface},ra-names,slaac,64,3600
|
dhcp-range=::,constructor:${interface},ra-names,ra-stateless,64
|
||||||
ra-param=*,0,0
|
|
||||||
" >> "${dhcpconfig}"
|
" >> "${dhcpconfig}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@ -650,7 +650,8 @@ Teleporter() {
|
|||||||
host="${host//./_}"
|
host="${host//./_}"
|
||||||
filename="pi-hole-${host:-noname}-teleporter_${datetimestamp}.tar.gz"
|
filename="pi-hole-${host:-noname}-teleporter_${datetimestamp}.tar.gz"
|
||||||
fi
|
fi
|
||||||
php /var/www/html/admin/scripts/pi-hole/php/teleporter.php > "${filename}"
|
# webroot is sourced from basic-install above
|
||||||
|
php "${webroot}/admin/scripts/pi-hole/php/teleporter.php" > "${filename}"
|
||||||
}
|
}
|
||||||
|
|
||||||
checkDomain()
|
checkDomain()
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/var/log/pihole.log {
|
/var/log/pihole/pihole.log {
|
||||||
# su #
|
# su #
|
||||||
daily
|
daily
|
||||||
copytruncate
|
copytruncate
|
||||||
@ -9,7 +9,7 @@
|
|||||||
nomail
|
nomail
|
||||||
}
|
}
|
||||||
|
|
||||||
/var/log/pihole-FTL.log {
|
/var/log/pihole/FTL.log {
|
||||||
# su #
|
# su #
|
||||||
weekly
|
weekly
|
||||||
copytruncate
|
copytruncate
|
||||||
|
@ -9,8 +9,55 @@
|
|||||||
# Description: Enable service provided by pihole-FTL daemon
|
# Description: Enable service provided by pihole-FTL daemon
|
||||||
### END INIT INFO
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Global variables
|
||||||
|
FTLCONFFILE="/etc/pihole/pihole-FTL.conf"
|
||||||
|
DEFAULT_PID_FILE="/run/pihole-FTL.pid"
|
||||||
|
DEFAULT_PORT_FILE="/run/pihole-FTL.port"
|
||||||
|
FTL_PID=''
|
||||||
|
|
||||||
|
# Get the file path of the pihole-FTL.pid file
|
||||||
|
getFTLPIDFile() {
|
||||||
|
if [ -s "${FTLCONFFILE}" ]; then
|
||||||
|
# if PIDFILE is not set in pihole-FTL.conf, use the default path
|
||||||
|
FTL_PID_FILE="$({ grep '^PIDFILE=' "${FTLCONFFILE}" || echo "${DEFAULT_PID_FILE}"; } | cut -d'=' -f2-)"
|
||||||
|
else
|
||||||
|
# if there is no pihole-FTL.conf, use the default path
|
||||||
|
FTL_PID_FILE="${DEFAULT_PID_FILE}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the PID of the FTL process based on the content of the pihole-FTL.pid file
|
||||||
|
getFTLPID() {
|
||||||
|
if [ -s "${FTL_PID_FILE}" ]; then
|
||||||
|
# -s: FILE exists and has a size greater than zero
|
||||||
|
FTL_PID="$(cat "${FTL_PID_FILE}")"
|
||||||
|
# Exploit prevention: unset the variable if there is malicious content
|
||||||
|
# Verify that the value read from the file is numeric
|
||||||
|
expr "${FTL_PID}" : "[^[:digit:]]" > /dev/null && unset FTL_PID
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If FTL is not running, or the PID file contains malicious stuff, substitute
|
||||||
|
# negative PID to signal this
|
||||||
|
FTL_PID=${FTL_PID:=-1}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Get the file path of the pihole-FTL.port file
|
||||||
|
getFTLPortFile() {
|
||||||
|
if [ -s "${FTLCONFFILE}" ]; then
|
||||||
|
# if PORTFILE is not set in pihole-FTL.conf, use the default path
|
||||||
|
FTL_PORT_FILE="$({ grep '^PORTFILE=' "${FTLCONFFILE}" || echo "${DEFAULT_PORT_FILE}"; } | cut -d'=' -f2-)"
|
||||||
|
else
|
||||||
|
# if there is no pihole-FTL.conf, use the default path
|
||||||
|
FTL_PORT_FILE="${DEFAULT_PORT_FILE}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
is_running() {
|
is_running() {
|
||||||
pgrep -xo "pihole-FTL" > /dev/null
|
if [ -d "/proc/${FTL_PID}" ]; then
|
||||||
|
return 0
|
||||||
|
fi
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -20,20 +67,34 @@ start() {
|
|||||||
echo "pihole-FTL is already running"
|
echo "pihole-FTL is already running"
|
||||||
else
|
else
|
||||||
# Touch files to ensure they exist (create if non-existing, preserve if existing)
|
# Touch files to ensure they exist (create if non-existing, preserve if existing)
|
||||||
mkdir -pm 0755 /run/pihole
|
mkdir -pm 0755 /run/pihole /var/log/pihole
|
||||||
[ ! -f /run/pihole-FTL.pid ] && install -m 644 -o pihole -g pihole /dev/null /run/pihole-FTL.pid
|
[ ! -f "${FTL_PID_FILE}" ] && install -m 644 -o pihole -g pihole /dev/null "${FTL_PID_FILE}"
|
||||||
[ ! -f /run/pihole-FTL.port ] && install -m 644 -o pihole -g pihole /dev/null /run/pihole-FTL.port
|
[ ! -f "${FTL_PORT_FILE}" ] && install -m 644 -o pihole -g pihole /dev/null "${FTL_PORT_FILE}"
|
||||||
[ ! -f /var/log/pihole-FTL.log ] && install -m 644 -o pihole -g pihole /dev/null /var/log/pihole-FTL.log
|
[ ! -f /var/log/pihole/FTL.log ] && install -m 644 -o pihole -g pihole /dev/null /var/log/pihole/FTL.log
|
||||||
[ ! -f /var/log/pihole.log ] && install -m 644 -o pihole -g pihole /dev/null /var/log/pihole.log
|
[ ! -f /var/log/pihole/pihole.log ] && install -m 640 -o pihole -g pihole /dev/null /var/log/pihole/pihole.log
|
||||||
[ ! -f /etc/pihole/dhcp.leases ] && install -m 644 -o pihole -g pihole /dev/null /etc/pihole/dhcp.leases
|
[ ! -f /etc/pihole/dhcp.leases ] && install -m 644 -o pihole -g pihole /dev/null /etc/pihole/dhcp.leases
|
||||||
# Ensure that permissions are set so that pihole-FTL can edit all necessary files
|
# Ensure that permissions are set so that pihole-FTL can edit all necessary files
|
||||||
chown pihole:pihole /run/pihole /etc/pihole /var/log/pihole.log /var/log/pihole.log /etc/pihole/dhcp.leases
|
chown pihole:pihole /run/pihole /etc/pihole /var/log/pihole /var/log/pihole/FTL.log /var/log/pihole/pihole.log /etc/pihole/dhcp.leases
|
||||||
# Ensure that permissions are set so that pihole-FTL can edit the files. We ignore errors as the file may not (yet) exist
|
# Ensure that permissions are set so that pihole-FTL can edit the files. We ignore errors as the file may not (yet) exist
|
||||||
chmod -f 0644 /etc/pihole/macvendor.db /etc/pihole/dhcp.leases /var/log/pihole-FTL.log /var/log/pihole.log
|
chmod -f 0644 /etc/pihole/macvendor.db /etc/pihole/dhcp.leases /var/log/pihole/FTL.log
|
||||||
|
chmod -f 0640 /var/log/pihole/pihole.log
|
||||||
# Chown database files to the user FTL runs as. We ignore errors as the files may not (yet) exist
|
# Chown database files to the user FTL runs as. We ignore errors as the files may not (yet) exist
|
||||||
chown -f pihole:pihole /etc/pihole/pihole-FTL.db /etc/pihole/gravity.db /etc/pihole/macvendor.db
|
chown -f pihole:pihole /etc/pihole/pihole-FTL.db /etc/pihole/gravity.db /etc/pihole/macvendor.db
|
||||||
# Chown database file permissions so that the pihole group (web interface) can edit the file. We ignore errors as the files may not (yet) exist
|
# Chown database file permissions so that the pihole group (web interface) can edit the file. We ignore errors as the files may not (yet) exist
|
||||||
chmod -f 0664 /etc/pihole/pihole-FTL.db
|
chmod -f 0664 /etc/pihole/pihole-FTL.db
|
||||||
|
|
||||||
|
# Backward compatibility for user-scripts that still expect log files in /var/log instead of /var/log/pihole/
|
||||||
|
# Should be removed with Pi-hole v6.0
|
||||||
|
if [ ! -f /var/log/pihole.log ]; then
|
||||||
|
ln -s /var/log/pihole/pihole.log /var/log/pihole.log
|
||||||
|
chown -h pihole:pihole /var/log/pihole.log
|
||||||
|
|
||||||
|
fi
|
||||||
|
if [ ! -f /var/log/pihole-FTL.log ]; then
|
||||||
|
ln -s /var/log/pihole/FTL.log /var/log/pihole-FTL.log
|
||||||
|
chown -h pihole:pihole /var/log/pihole-FTL.log
|
||||||
|
fi
|
||||||
|
|
||||||
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
|
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
|
su -s /bin/sh -c "/usr/bin/pihole-FTL" pihole
|
||||||
else
|
else
|
||||||
@ -47,7 +108,7 @@ start() {
|
|||||||
# Stop the service
|
# Stop the service
|
||||||
stop() {
|
stop() {
|
||||||
if is_running; then
|
if is_running; then
|
||||||
pkill -xo "pihole-FTL"
|
kill "${FTL_PID}"
|
||||||
for i in 1 2 3 4 5; do
|
for i in 1 2 3 4 5; do
|
||||||
if ! is_running; then
|
if ! is_running; then
|
||||||
break
|
break
|
||||||
@ -60,8 +121,7 @@ stop() {
|
|||||||
|
|
||||||
if is_running; then
|
if is_running; then
|
||||||
echo "Not stopped; may still be shutting down or shutdown may have failed, killing now"
|
echo "Not stopped; may still be shutting down or shutdown may have failed, killing now"
|
||||||
pkill -xo -9 "pihole-FTL"
|
kill -9 "${FTL_PID}"
|
||||||
exit 1
|
|
||||||
else
|
else
|
||||||
echo "Stopped"
|
echo "Stopped"
|
||||||
fi
|
fi
|
||||||
@ -69,7 +129,7 @@ stop() {
|
|||||||
echo "Not running"
|
echo "Not running"
|
||||||
fi
|
fi
|
||||||
# Cleanup
|
# Cleanup
|
||||||
rm -f /run/pihole/FTL.sock /dev/shm/FTL-*
|
rm -f /run/pihole/FTL.sock /dev/shm/FTL-* "${FTL_PID_FILE}" "${FTL_PORT_FILE}"
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,6 +146,14 @@ status() {
|
|||||||
|
|
||||||
|
|
||||||
### main logic ###
|
### main logic ###
|
||||||
|
|
||||||
|
# Get file paths
|
||||||
|
getFTLPIDFile
|
||||||
|
getFTLPortFile
|
||||||
|
|
||||||
|
# Get FTL's current PID
|
||||||
|
getFTLPID
|
||||||
|
|
||||||
case "$1" in
|
case "$1" in
|
||||||
stop)
|
stop)
|
||||||
stop
|
stop
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
# early morning. Download any updates from the adlists
|
# early morning. Download any updates from the adlists
|
||||||
# Squash output to log, then splat the log to stdout on error to allow for
|
# Squash output to log, then splat the log to stdout on error to allow for
|
||||||
# standard crontab job error handling.
|
# standard crontab job error handling.
|
||||||
59 1 * * 7 root PATH="$PATH:/usr/sbin:/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/pihole_updateGravity.log || cat /var/log/pihole/pihole_updateGravity.log
|
||||||
|
|
||||||
# Pi-hole: Flush the log daily at 00:00
|
# Pi-hole: Flush the log daily at 00:00
|
||||||
# The flush script will use logrotate if available
|
# The flush script will use logrotate if available
|
||||||
|
@ -507,7 +507,7 @@
|
|||||||
# (using /etc/hosts) then that name can be specified as the
|
# (using /etc/hosts) then that name can be specified as the
|
||||||
# tftp_servername (the third option to dhcp-boot) and in that
|
# tftp_servername (the third option to dhcp-boot) and in that
|
||||||
# case dnsmasq resolves this name and returns the resultant IP
|
# case dnsmasq resolves this name and returns the resultant IP
|
||||||
# addresses in round robin fasion. This facility can be used to
|
# addresses in round robin fashion. This facility can be used to
|
||||||
# load balance the tftp load among a set of servers.
|
# load balance the tftp load among a set of servers.
|
||||||
#dhcp-boot=/var/ftpd/pxelinux.0,boothost,tftp_server_name
|
#dhcp-boot=/var/ftpd/pxelinux.0,boothost,tftp_server_name
|
||||||
|
|
||||||
|
@ -28,12 +28,12 @@ server.modules = (
|
|||||||
server.document-root = "/var/www/html"
|
server.document-root = "/var/www/html"
|
||||||
server.error-handler-404 = "/pihole/index.php"
|
server.error-handler-404 = "/pihole/index.php"
|
||||||
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
|
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
|
||||||
server.errorlog = "/var/log/lighttpd/error.log"
|
server.errorlog = "/var/log/lighttpd/error-pihole.log"
|
||||||
server.pid-file = "/run/lighttpd.pid"
|
server.pid-file = "/run/lighttpd.pid"
|
||||||
server.username = "www-data"
|
server.username = "www-data"
|
||||||
server.groupname = "www-data"
|
server.groupname = "www-data"
|
||||||
server.port = 80
|
server.port = 80
|
||||||
accesslog.filename = "/var/log/lighttpd/access.log"
|
accesslog.filename = "/var/log/lighttpd/access-pihole.log"
|
||||||
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
||||||
|
|
||||||
# Allow streaming response
|
# Allow streaming response
|
||||||
|
@ -29,12 +29,12 @@ server.modules = (
|
|||||||
server.document-root = "/var/www/html"
|
server.document-root = "/var/www/html"
|
||||||
server.error-handler-404 = "/pihole/index.php"
|
server.error-handler-404 = "/pihole/index.php"
|
||||||
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
|
server.upload-dirs = ( "/var/cache/lighttpd/uploads" )
|
||||||
server.errorlog = "/var/log/lighttpd/error.log"
|
server.errorlog = "/var/log/lighttpd/error-pihole.log"
|
||||||
server.pid-file = "/run/lighttpd.pid"
|
server.pid-file = "/run/lighttpd.pid"
|
||||||
server.username = "lighttpd"
|
server.username = "lighttpd"
|
||||||
server.groupname = "lighttpd"
|
server.groupname = "lighttpd"
|
||||||
server.port = 80
|
server.port = 80
|
||||||
accesslog.filename = "/var/log/lighttpd/access.log"
|
accesslog.filename = "/var/log/lighttpd/access-pihole.log"
|
||||||
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
||||||
|
|
||||||
# Allow streaming response
|
# Allow streaming response
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
|
|
||||||
# Pi-hole: A black hole for Internet advertisements
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
# (c) 2017-2021 Pi-hole, LLC (https://pi-hole.net)
|
# (c) Pi-hole (https://pi-hole.net)
|
||||||
# Network-wide ad blocking via your own hardware.
|
# Network-wide ad blocking via your own hardware.
|
||||||
#
|
#
|
||||||
# Installs and Updates Pi-hole
|
# Installs and Updates Pi-hole
|
||||||
@ -32,6 +32,14 @@ export PATH+=':/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
|
|||||||
# Local variables will be in lowercase and will exist only within functions
|
# Local variables will be in lowercase and will exist only within functions
|
||||||
# It's still a work in progress, so you may see some variance in this guideline until it is complete
|
# It's still a work in progress, so you may see some variance in this guideline until it is complete
|
||||||
|
|
||||||
|
# Dialog result codes
|
||||||
|
# dialog code values can be set by environment variables, we only override if
|
||||||
|
# the env var is not set or empty.
|
||||||
|
: "${DIALOG_OK:=0}"
|
||||||
|
: "${DIALOG_CANCEL:=1}"
|
||||||
|
: "${DIALOG_ESC:=255}"
|
||||||
|
|
||||||
|
|
||||||
# List of supported DNS servers
|
# List of supported DNS servers
|
||||||
DNS_SERVERS=$(cat << EOM
|
DNS_SERVERS=$(cat << EOM
|
||||||
Google (ECS, DNSSEC);8.8.8.8;8.8.4.4;2001:4860:4860:0:0:0:0:8888;2001:4860:4860:0:0:0:0:8844
|
Google (ECS, DNSSEC);8.8.8.8;8.8.4.4;2001:4860:4860:0:0:0:0:8888;2001:4860:4860:0:0:0:0:8844
|
||||||
@ -93,7 +101,7 @@ if [ -z "${USER}" ]; then
|
|||||||
USER="$(id -un)"
|
USER="$(id -un)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# whiptail dialog dimensions: 20 rows and 70 chars width assures to fit on small screens and is known to hold all content.
|
# dialog dimensions: Let dialog handle appropriate sizing.
|
||||||
r=20
|
r=20
|
||||||
c=70
|
c=70
|
||||||
|
|
||||||
@ -195,7 +203,7 @@ os_check() {
|
|||||||
distro_part="${distro_and_versions%%=*}"
|
distro_part="${distro_and_versions%%=*}"
|
||||||
versions_part="${distro_and_versions##*=}"
|
versions_part="${distro_and_versions##*=}"
|
||||||
|
|
||||||
# If the distro part is a (case-insensistive) substring of the computer OS
|
# If the distro part is a (case-insensitive) substring of the computer OS
|
||||||
if [[ "${detected_os^^}" =~ ${distro_part^^} ]]; then
|
if [[ "${detected_os^^}" =~ ${distro_part^^} ]]; then
|
||||||
valid_os=true
|
valid_os=true
|
||||||
IFS="," read -r -a supportedVer <<<"${versions_part}"
|
IFS="," read -r -a supportedVer <<<"${versions_part}"
|
||||||
@ -234,7 +242,7 @@ os_check() {
|
|||||||
printf " If you are seeing this message and you do have a supported OS, please contact support.\\n"
|
printf " If you are seeing this message and you do have a supported OS, please contact support.\\n"
|
||||||
fi
|
fi
|
||||||
printf "\\n"
|
printf "\\n"
|
||||||
printf " %bhttps://docs.pi-hole.net/main/prerequesites/#supported-operating-systems%b\\n" "${COL_LIGHT_GREEN}" "${COL_NC}"
|
printf " %bhttps://docs.pi-hole.net/main/prerequisites/#supported-operating-systems%b\\n" "${COL_LIGHT_GREEN}" "${COL_NC}"
|
||||||
printf "\\n"
|
printf "\\n"
|
||||||
printf " If you wish to attempt to continue anyway, you can try one of the following commands to skip this check:\\n"
|
printf " If you wish to attempt to continue anyway, you can try one of the following commands to skip this check:\\n"
|
||||||
printf "\\n"
|
printf "\\n"
|
||||||
@ -284,6 +292,9 @@ test_dpkg_lock() {
|
|||||||
|
|
||||||
# Compatibility
|
# Compatibility
|
||||||
package_manager_detect() {
|
package_manager_detect() {
|
||||||
|
# TODO - pull common packages for both distributions out into a common variable, then add
|
||||||
|
# the distro-specific ones below.
|
||||||
|
|
||||||
# First check to see if apt-get is installed.
|
# First check to see if apt-get is installed.
|
||||||
if is_command apt-get ; then
|
if is_command apt-get ; then
|
||||||
# Set some global variables here
|
# Set some global variables here
|
||||||
@ -300,15 +311,24 @@ package_manager_detect() {
|
|||||||
# Check for and determine version number (major and minor) of current php install
|
# Check for and determine version number (major and minor) of current php install
|
||||||
local phpVer="php"
|
local phpVer="php"
|
||||||
if is_command php ; then
|
if is_command php ; then
|
||||||
printf " %b Existing PHP installation detected : PHP version %s\\n" "${INFO}" "$(php <<< "<?php echo PHP_VERSION ?>")"
|
phpVer="$(php <<< "<?php echo PHP_VERSION ?>")"
|
||||||
|
# Check if the first character of the string is numeric
|
||||||
|
if [[ ${phpVer:0:1} =~ [1-9] ]]; then
|
||||||
|
printf " %b Existing PHP installation detected : PHP version %s\\n" "${INFO}" "${phpVer}"
|
||||||
printf -v phpInsMajor "%d" "$(php <<< "<?php echo PHP_MAJOR_VERSION ?>")"
|
printf -v phpInsMajor "%d" "$(php <<< "<?php echo PHP_MAJOR_VERSION ?>")"
|
||||||
printf -v phpInsMinor "%d" "$(php <<< "<?php echo PHP_MINOR_VERSION ?>")"
|
printf -v phpInsMinor "%d" "$(php <<< "<?php echo PHP_MINOR_VERSION ?>")"
|
||||||
phpVer="php$phpInsMajor.$phpInsMinor"
|
phpVer="php$phpInsMajor.$phpInsMinor"
|
||||||
|
else
|
||||||
|
printf " %b No valid PHP installation detected!\\n" "${CROSS}"
|
||||||
|
printf " %b PHP version : %s\\n" "${INFO}" "${phpVer}"
|
||||||
|
printf " %b Aborting installation.\\n" "${CROSS}"
|
||||||
|
exit 1
|
||||||
fi
|
fi
|
||||||
# Packages required to perfom the os_check (stored as an array)
|
fi
|
||||||
|
# Packages required to perform the os_check (stored as an array)
|
||||||
OS_CHECK_DEPS=(grep dnsutils)
|
OS_CHECK_DEPS=(grep dnsutils)
|
||||||
# Packages required to run this install script (stored as an array)
|
# Packages required to run this install script (stored as an array)
|
||||||
INSTALLER_DEPS=(git iproute2 whiptail ca-certificates)
|
INSTALLER_DEPS=(git iproute2 dialog ca-certificates)
|
||||||
# Packages required to run Pi-hole (stored as an array)
|
# Packages required to run Pi-hole (stored as an array)
|
||||||
PIHOLE_DEPS=(cron curl iputils-ping psmisc sudo unzip idn2 libcap2-bin dns-root-data libcap2 netcat-openbsd procps)
|
PIHOLE_DEPS=(cron curl iputils-ping psmisc sudo unzip idn2 libcap2-bin dns-root-data libcap2 netcat-openbsd procps)
|
||||||
# Packages required for the Web admin interface (stored as an array)
|
# Packages required for the Web admin interface (stored as an array)
|
||||||
@ -336,9 +356,10 @@ package_manager_detect() {
|
|||||||
|
|
||||||
# These variable names match the ones for apt-get. See above for an explanation of what they are for.
|
# These variable names match the ones for apt-get. See above for an explanation of what they are for.
|
||||||
PKG_INSTALL=("${PKG_MANAGER}" install -y)
|
PKG_INSTALL=("${PKG_MANAGER}" install -y)
|
||||||
PKG_COUNT="${PKG_MANAGER} check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l"
|
# CentOS package manager returns 100 when there are packages to update so we need to || true to prevent the script from exiting.
|
||||||
|
PKG_COUNT="${PKG_MANAGER} check-update | egrep '(.i686|.x86|.noarch|.arm|.src)' | wc -l || true"
|
||||||
OS_CHECK_DEPS=(grep bind-utils)
|
OS_CHECK_DEPS=(grep bind-utils)
|
||||||
INSTALLER_DEPS=(git iproute newt procps-ng which chkconfig ca-certificates)
|
INSTALLER_DEPS=(git dialog iproute newt procps-ng which chkconfig ca-certificates)
|
||||||
PIHOLE_DEPS=(cronie curl findutils sudo unzip libidn2 psmisc libcap nmap-ncat)
|
PIHOLE_DEPS=(cronie curl findutils sudo unzip libidn2 psmisc libcap nmap-ncat)
|
||||||
PIHOLE_WEB_DEPS=(lighttpd lighttpd-fastcgi php-common php-cli php-pdo php-xml php-json php-intl)
|
PIHOLE_WEB_DEPS=(lighttpd lighttpd-fastcgi php-common php-cli php-pdo php-xml php-json php-intl)
|
||||||
LIGHTTPD_USER="lighttpd"
|
LIGHTTPD_USER="lighttpd"
|
||||||
@ -387,38 +408,58 @@ select_rpm_php(){
|
|||||||
PIHOLE_WEB_DEPS=("${CENTOS7_PIHOLE_WEB_DEPS[@]}")
|
PIHOLE_WEB_DEPS=("${CENTOS7_PIHOLE_WEB_DEPS[@]}")
|
||||||
unset CENTOS7_PIHOLE_WEB_DEPS
|
unset CENTOS7_PIHOLE_WEB_DEPS
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if rpm -qa | grep -qi 'epel'; then
|
||||||
|
printf " %b EPEL repository already installed\\n" "${TICK}"
|
||||||
|
else
|
||||||
# CentOS requires the EPEL repository to gain access to Fedora packages
|
# CentOS requires the EPEL repository to gain access to Fedora packages
|
||||||
EPEL_PKG="epel-release"
|
if [[ CURRENT_CENTOS_VERSION -eq 7 ]]; then
|
||||||
rpm -q ${EPEL_PKG} &> /dev/null || rc=$?
|
EPEL_PKG="https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm"
|
||||||
if [[ $rc -ne 0 ]]; then
|
elif [[ CURRENT_CENTOS_VERSION -eq 8 ]]; then
|
||||||
|
EPEL_PKG="https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm"
|
||||||
|
fi
|
||||||
printf " %b Enabling EPEL package repository (https://fedoraproject.org/wiki/EPEL)\\n" "${INFO}"
|
printf " %b Enabling EPEL package repository (https://fedoraproject.org/wiki/EPEL)\\n" "${INFO}"
|
||||||
"${PKG_INSTALL[@]}" ${EPEL_PKG} &> /dev/null
|
"${PKG_INSTALL[@]}" ${EPEL_PKG}
|
||||||
printf " %b Installed %s\\n" "${TICK}" "${EPEL_PKG}"
|
printf " %b Installed %s\\n" "${TICK}" "${EPEL_PKG}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# The default php on CentOS 7.x is 5.4 which is EOL
|
# The default php on CentOS 7.x is 5.4 which is EOL
|
||||||
# Check if the version of PHP available via installed repositories is >= to PHP 7
|
# Check if the version of PHP available via installed repositories is >= to PHP 7
|
||||||
AVAILABLE_PHP_VERSION=$("${PKG_MANAGER}" info php | grep -i version | grep -o '[0-9]\+' | head -1)
|
AVAILABLE_PHP_VERSION=$("${PKG_MANAGER}" info php | grep -i version | grep -o '[0-9]\+' | head -1)
|
||||||
if [[ $AVAILABLE_PHP_VERSION -ge $SUPPORTED_CENTOS_PHP_VERSION ]]; then
|
if [[ $AVAILABLE_PHP_VERSION -ge $SUPPORTED_CENTOS_PHP_VERSION ]]; then
|
||||||
# Since PHP 7 is available by default, install via default PHP package names
|
# Since PHP 7 is available by default, install via default PHP package names
|
||||||
: # do nothing as PHP is current
|
: # do nothing as PHP is current
|
||||||
|
printf "PHP 7 is installed"
|
||||||
else
|
else
|
||||||
REMI_PKG="remi-release"
|
REMI_PKG="remi-release"
|
||||||
REMI_REPO="remi-php72"
|
REMI_REPO="remi-php72"
|
||||||
rpm -q ${REMI_PKG} &> /dev/null || rc=$?
|
REMI_REPO_URL="https://rpms.remirepo.net/enterprise/${REMI_PKG}-$(rpm -E '%{rhel}').rpm"
|
||||||
if [[ $rc -ne 0 ]]; then
|
|
||||||
# The PHP version available via default repositories is older than version 7
|
# The PHP version available via default repositories is older than version 7
|
||||||
if ! whiptail --defaultno --title "PHP 7 Update (recommended)" --yesno "PHP 7.x is recommended for both security and language features.\\nWould you like to install PHP7 via Remi's RPM repository?\\n\\nSee: https://rpms.remirepo.net for more information" "${r}" "${c}"; then
|
dialog --no-shadow --keep-tite \
|
||||||
# User decided to NOT update PHP from REMI, attempt to install the default available PHP version
|
--title "PHP 7 Update (recommended)" \
|
||||||
printf " %b User opt-out of PHP 7 upgrade on CentOS. Deprecated PHP may be in use.\\n" "${INFO}"
|
--defaultno \
|
||||||
: # continue with unsupported php version
|
--yesno "PHP 7.x is recommended for both security and language features.\
|
||||||
|
\\n\\nWould you like to install PHP7 via Remi's RPM repository?\
|
||||||
|
\\n\\nSee: https://rpms.remirepo.net for more information"\
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_OK}" )
|
||||||
|
printf " %b Installing PHP 7 via Remi's RPM repository\\n" "${INFO}"
|
||||||
|
"${PKG_INSTALL[@]}" "yum-utils" &> /dev/null
|
||||||
|
if rpm -q ${REMI_PKG} &> /dev/null; then
|
||||||
|
printf " %b Remi's RPM repository is already installed\\n" "${TICK}"
|
||||||
else
|
else
|
||||||
printf " %b Enabling Remi's RPM repository (https://rpms.remirepo.net)\\n" "${INFO}"
|
printf " %b Enabling Remi's RPM repository (https://rpms.remirepo.net)\\n" "${INFO}"
|
||||||
"${PKG_INSTALL[@]}" "https://rpms.remirepo.net/enterprise/${REMI_PKG}-$(rpm -E '%{rhel}').rpm" &> /dev/null
|
yum -y install "${REMI_REPO_URL}"
|
||||||
# enable the PHP 7 repository via yum-config-manager (provided by yum-utils)
|
printf " %b Installed %s from %s\\n" "${TICK}" "${REMI_PKG}" "${REMI_REPO_URL}"
|
||||||
"${PKG_INSTALL[@]}" "yum-utils" &> /dev/null
|
|
||||||
yum-config-manager --enable ${REMI_REPO} &> /dev/null
|
|
||||||
printf " %b Remi's RPM repository has been enabled for PHP7\\n" "${TICK}"
|
printf " %b Remi's RPM repository has been enabled for PHP7\\n" "${TICK}"
|
||||||
|
fi
|
||||||
|
yum-config-manager --disable 'remi-php*'
|
||||||
|
yum-config-manager --enable "${REMI_REPO}"
|
||||||
|
|
||||||
# trigger an install/update of PHP to ensure previous version of PHP is updated from REMI
|
# trigger an install/update of PHP to ensure previous version of PHP is updated from REMI
|
||||||
if "${PKG_INSTALL[@]}" "php-cli" &> /dev/null; then
|
if "${PKG_INSTALL[@]}" "php-cli" &> /dev/null; then
|
||||||
printf " %b PHP7 installed/updated via Remi's RPM repository\\n" "${TICK}"
|
printf " %b PHP7 installed/updated via Remi's RPM repository\\n" "${TICK}"
|
||||||
@ -426,15 +467,49 @@ select_rpm_php(){
|
|||||||
printf " %b There was a problem updating to PHP7 via Remi's RPM repository\\n" "${CROSS}"
|
printf " %b There was a problem updating to PHP7 via Remi's RPM repository\\n" "${CROSS}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
# User chose not to install PHP 7 via Remi's RPM repository
|
||||||
|
"${DIALOG_CANCEL}")
|
||||||
|
# User decided to NOT update PHP from REMI, attempt to install the default available PHP version
|
||||||
|
printf " %b User opt-out of PHP 7 upgrade on CentOS. Deprecated PHP may be in use.\\n" "${INFO}"
|
||||||
|
;;
|
||||||
|
|
||||||
|
# User closed the dialog window
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
printf " %b Escape pressed, exiting installer at Remi dialog window\\n" "${CROSS}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
fi # Warn user of unsupported version of Fedora or CentOS
|
|
||||||
if ! whiptail --defaultno --title "Unsupported RPM based distribution" --yesno "Would you like to continue installation on an unsupported RPM based distribution?\\n\\nPlease ensure the following packages have been installed manually:\\n\\n- lighttpd\\n- lighttpd-fastcgi\\n- PHP version 7+" "${r}" "${c}"; then
|
|
||||||
printf " %b Aborting installation due to unsupported RPM based distribution\\n" "${CROSS}"
|
|
||||||
exit
|
|
||||||
else
|
else
|
||||||
printf " %b Continuing installation with unsupported RPM based distribution\\n" "${INFO}"
|
# Warn user of unsupported version of Fedora or CentOS
|
||||||
fi
|
dialog --no-shadow --keep-tite \
|
||||||
fi
|
--title "Unsupported RPM based distribution" \
|
||||||
|
--defaultno \
|
||||||
|
--no-button "Exit" \
|
||||||
|
--yes-button "Continue" \
|
||||||
|
--yesno "Would you like to continue installation on an unsupported RPM based distribution?\
|
||||||
|
\\n\\nPlease ensure the following packages have been installed manually:\
|
||||||
|
\\n\\n- lighttpd\\n- lighttpd-fastcgi\\n- PHP version 7+"\
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
|
case ${result} in
|
||||||
|
# User chose to continue installation on an unsupported RPM based distribution
|
||||||
|
"${DIALOG_OK}")
|
||||||
|
printf " %b User opted to continue installation on an unsupported RPM based distribution.\\n" "${INFO}"
|
||||||
|
;;
|
||||||
|
# User chose not to continue installation on an unsupported RPM based distribution
|
||||||
|
"${DIALOG_CANCEL}")
|
||||||
|
printf " %b User opted not to continue installation on an unsupported RPM based distribution.\\n" "${INFO}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
printf " %b Escape pressed, exiting installer at unsupported RPM based distribution dialog window\\n" "${CROSS}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -625,40 +700,45 @@ get_available_interfaces() {
|
|||||||
# A function for displaying the dialogs the user sees when first running the installer
|
# A function for displaying the dialogs the user sees when first running the installer
|
||||||
welcomeDialogs() {
|
welcomeDialogs() {
|
||||||
# Display the welcome dialog using an appropriately sized window via the calculation conducted earlier in the script
|
# Display the welcome dialog using an appropriately sized window via the calculation conducted earlier in the script
|
||||||
whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "\\n\\nThis installer will transform your device into a network-wide ad blocker!" "${r}" "${c}"
|
dialog --no-shadow --clear --keep-tite \
|
||||||
|
--backtitle "Welcome" \
|
||||||
|
--title "Pi-hole Automated Installer" \
|
||||||
|
--msgbox "\\n\\nThis installer will transform your device into a network-wide ad blocker!" \
|
||||||
|
"${r}" "${c}" \
|
||||||
|
--and-widget --clear \
|
||||||
|
--backtitle "Support Pi-hole" \
|
||||||
|
--title "Open Source Software" \
|
||||||
|
--msgbox "\\n\\nThe Pi-hole is free, but powered by your donations: https://pi-hole.net/donate/" \
|
||||||
|
"${r}" "${c}" \
|
||||||
|
--and-widget --clear \
|
||||||
|
--colors \
|
||||||
|
--backtitle "Initiating network interface" \
|
||||||
|
--title "Static IP Needed" \
|
||||||
|
--no-button "Exit" --yes-button "Continue" \
|
||||||
|
--defaultno \
|
||||||
|
--yesno "\\n\\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.\\n\\n\
|
||||||
|
\\Zb\\Z1IMPORTANT:\\Zn If you have not already done so, you must ensure that this device has a static IP.\\n\\n\
|
||||||
|
Depending on your operating system, there are many ways to achieve this, through DHCP reservation, or by manually assigning one.\\n\\n\
|
||||||
|
Please continue when the static addressing has been configured."\
|
||||||
|
"${r}" "${c}" && result=0 || result="$?"
|
||||||
|
|
||||||
# Request that users donate if they enjoy the software since we all work on it in our free time
|
case "${result}" in
|
||||||
whiptail --msgbox --backtitle "Plea" --title "Free and open source" "\\n\\nThe Pi-hole is free, but powered by your donations: https://pi-hole.net/donate/" "${r}" "${c}"
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
|
||||||
# Explain the need for a static address
|
|
||||||
if whiptail --defaultno --backtitle "Initiating network interface" --title "Static IP Needed" --yesno "\\n\\nThe Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
|
|
||||||
|
|
||||||
IMPORTANT: If you have not already done so, you must ensure that this device has a static IP. Either through DHCP reservation, or by manually assigning one. Depending on your operating system, there are many ways to achieve this.
|
|
||||||
|
|
||||||
Choose yes to indicate that you have understood this message, and wish to continue" "${r}" "${c}"; then
|
|
||||||
#Nothing to do, continue
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
printf " %b Installer exited at static IP message.\\n" "${INFO}"
|
printf " %b Installer exited at static IP message.\\n" "${INFO}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# A function that lets the user pick an interface to use with Pi-hole
|
# A function that lets the user pick an interface to use with Pi-hole
|
||||||
chooseInterface() {
|
chooseInterface() {
|
||||||
# Turn the available interfaces into an array so it can be used with a whiptail dialog
|
# Turn the available interfaces into a string so it can be used with dialog
|
||||||
local interfacesArray=()
|
local interfacesList
|
||||||
# Number of available interfaces
|
# Number of available interfaces
|
||||||
local interfaceCount
|
local interfaceCount
|
||||||
# Whiptail variable storage
|
|
||||||
local chooseInterfaceCmd
|
|
||||||
# Temporary Whiptail options storage
|
|
||||||
local chooseInterfaceOptions
|
|
||||||
# Loop sentinel variable
|
|
||||||
local firstLoop=1
|
|
||||||
|
|
||||||
# Find out how many interfaces are available to choose from
|
# POSIX compliant way to get the number of elements in an array
|
||||||
interfaceCount=$(wc -l <<< "${availableInterfaces}")
|
interfaceCount=$(printf "%s\n" "${availableInterfaces}" | wc -l)
|
||||||
|
|
||||||
# If there is one interface,
|
# If there is one interface,
|
||||||
if [[ "${interfaceCount}" -eq 1 ]]; then
|
if [[ "${interfaceCount}" -eq 1 ]]; then
|
||||||
@ -666,33 +746,33 @@ chooseInterface() {
|
|||||||
PIHOLE_INTERFACE="${availableInterfaces}"
|
PIHOLE_INTERFACE="${availableInterfaces}"
|
||||||
# Otherwise,
|
# Otherwise,
|
||||||
else
|
else
|
||||||
|
# Set status for the first entry to be selected
|
||||||
|
status="ON"
|
||||||
|
|
||||||
# While reading through the available interfaces
|
# While reading through the available interfaces
|
||||||
while read -r line; do
|
for interface in ${availableInterfaces}; do
|
||||||
# Use a variable to set the option as OFF to begin with
|
# Put all these interfaces into a string
|
||||||
mode="OFF"
|
interfacesList="${interfacesList}${interface} available ${status} "
|
||||||
# If it's the first loop,
|
# All further interfaces are deselected
|
||||||
if [[ "${firstLoop}" -eq 1 ]]; then
|
status="OFF"
|
||||||
# set this as the interface to use (ON)
|
|
||||||
firstLoop=0
|
|
||||||
mode="ON"
|
|
||||||
fi
|
|
||||||
# Put all these interfaces into an array
|
|
||||||
interfacesArray+=("${line}" "available" "${mode}")
|
|
||||||
# Feed the available interfaces into this while loop
|
|
||||||
done <<< "${availableInterfaces}"
|
|
||||||
# The whiptail command that will be run, stored in a variable
|
|
||||||
chooseInterfaceCmd=(whiptail --separate-output --radiolist "Choose An Interface (press space to toggle selection)" "${r}" "${c}" 6)
|
|
||||||
# Now run the command using the interfaces saved into the array
|
|
||||||
chooseInterfaceOptions=$("${chooseInterfaceCmd[@]}" "${interfacesArray[@]}" 2>&1 >/dev/tty) || \
|
|
||||||
# If the user chooses Cancel, exit
|
|
||||||
{ printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; exit 1; }
|
|
||||||
# For each interface
|
|
||||||
for desiredInterface in ${chooseInterfaceOptions}; do
|
|
||||||
# Set the one the user selected as the interface to use
|
|
||||||
PIHOLE_INTERFACE=${desiredInterface}
|
|
||||||
# and show this information to the user
|
|
||||||
printf " %b Using interface: %s\\n" "${INFO}" "${PIHOLE_INTERFACE}"
|
|
||||||
done
|
done
|
||||||
|
# shellcheck disable=SC2086
|
||||||
|
# Disable check for double quote here as we are passing a string with spaces
|
||||||
|
PIHOLE_INTERFACE=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
|
--cancel-label "Exit" --ok-label "Select" \
|
||||||
|
--radiolist "Choose An Interface (press space to toggle selection)" \
|
||||||
|
${r} ${c} "${interfaceCount}" ${interfacesList})
|
||||||
|
|
||||||
|
result=$?
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}"|"${DIALOG_ESC}")
|
||||||
|
# Show an error message and exit
|
||||||
|
printf " %b %s\\n" "${CROSS}" "No interface selected, exiting installer"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
printf " %b Using interface: %s\\n" "${INFO}" "${PIHOLE_INTERFACE}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -778,57 +858,94 @@ getStaticIPv4Settings() {
|
|||||||
local ipSettingsCorrect
|
local ipSettingsCorrect
|
||||||
local DHCPChoice
|
local DHCPChoice
|
||||||
# Ask if the user wants to use DHCP settings as their static IP
|
# Ask if the user wants to use DHCP settings as their static IP
|
||||||
# This is useful for users that are using DHCP reservations; then we can just use the information gathered via our functions
|
# This is useful for users that are using DHCP reservations; we can use the information gathered
|
||||||
DHCPChoice=$(whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --menu --separate-output "Do you want to use your current network settings as a static address? \\n
|
DHCPChoice=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
IP address: ${IPV4_ADDRESS} \\n
|
--cancel-label "Exit" --ok-label "Continue" \
|
||||||
Gateway: ${IPv4gw} \\n" "${r}" "${c}" 3\
|
--backtitle "Calibrating network interface" \
|
||||||
|
--title "Static IP Address" \
|
||||||
|
--menu "Do you want to use your current network settings as a static address?\\n \
|
||||||
|
IP address: ${IPV4_ADDRESS}\\n \
|
||||||
|
Gateway: ${IPv4gw}\\n" \
|
||||||
|
"${r}" "${c}" 3 \
|
||||||
"Yes" "Set static IP using current values" \
|
"Yes" "Set static IP using current values" \
|
||||||
"No" "Set static IP using custom values" \
|
"No" "Set static IP using custom values" \
|
||||||
"Skip" "I will set a static IP later, or have already done so" 3>&2 2>&1 1>&3) || \
|
"Skip" "I will set a static IP later, or have already done so")
|
||||||
{ printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; exit 1; }
|
|
||||||
|
result=$?
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
case ${DHCPChoice} in
|
case ${DHCPChoice} in
|
||||||
|
"Skip")
|
||||||
|
return
|
||||||
|
;;
|
||||||
"Yes")
|
"Yes")
|
||||||
# If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict.
|
# If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict.
|
||||||
whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that.
|
dialog --no-shadow --keep-tite \
|
||||||
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.
|
--cancel-label "Exit" \
|
||||||
It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address." "${r}" "${c}"
|
--backtitle "IP information" \
|
||||||
# Nothing else to do since the variables are already set above
|
--title "FYI: IP Conflict" \
|
||||||
setDHCPCD
|
--msgbox "\\nIt is possible your router could still try to assign this IP to a device, which would cause a conflict\
|
||||||
|
But in most cases the router is smart enough to not do that.\
|
||||||
|
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.\
|
||||||
|
It is also possible to use a DHCP reservation, but if you are going to do that, you might as well set a static address."\
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
;;
|
;;
|
||||||
|
|
||||||
"No")
|
"No")
|
||||||
# Otherwise, we need to ask the user to input their desired settings.
|
# Otherwise, we need to ask the user to input their desired settings.
|
||||||
# Start by getting the IPv4 address (pre-filling it with info gathered from DHCP)
|
# Start by getting the IPv4 address (pre-filling it with info gathered from DHCP)
|
||||||
# Start a loop to let the user enter their information with the chance to go back and edit it if necessary
|
# Start a loop to let the user enter their information with the chance to go back and edit it if necessary
|
||||||
|
ipSettingsCorrect=false
|
||||||
until [[ "${ipSettingsCorrect}" = True ]]; do
|
until [[ "${ipSettingsCorrect}" = True ]]; do
|
||||||
|
|
||||||
# Ask for the IPv4 address
|
# Ask for the IPv4 address
|
||||||
IPV4_ADDRESS=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" "${r}" "${c}" "${IPV4_ADDRESS}" 3>&1 1>&2 2>&3) || \
|
_staticIPv4Temp=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
# Canceling IPv4 settings window
|
--cancer-label "Exit" \
|
||||||
{ ipSettingsCorrect=False; echo -e " ${COL_LIGHT_RED}Cancel was selected, exiting installer${COL_NC}"; exit 1; }
|
--ok-label "Continue" \
|
||||||
printf " %b Your static IPv4 address: %s\\n" "${INFO}" "${IPV4_ADDRESS}"
|
--backtitle "Calibrating network interface" \
|
||||||
|
--title "IPv4 Address" \
|
||||||
|
--form "\\nEnter your desired IPv4 address" \
|
||||||
|
"${r}" "${c}" 0 \
|
||||||
|
"IPv4 Address:" 1 1 "${IPV4_ADDRESS}" 1 15 19 0 \
|
||||||
|
"IPv4 Gateway:" 2 1 "${IPv4gw}" 2 15 19 0)
|
||||||
|
|
||||||
# Ask for the gateway
|
result=$?
|
||||||
IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" "${r}" "${c}" "${IPv4gw}" 3>&1 1>&2 2>&3) || \
|
case ${result} in
|
||||||
# Canceling gateway settings window
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
{ ipSettingsCorrect=False; echo -e " ${COL_LIGHT_RED}Cancel was selected, exiting installer${COL_NC}"; exit 1; }
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
printf " %b Your static IPv4 gateway: %s\\n" "${INFO}" "${IPv4gw}"
|
exit 1
|
||||||
|
|
||||||
# Give the user a chance to review their settings before moving on
|
|
||||||
if whiptail --backtitle "Calibrating network interface" --title "Static IP Address" --yesno "Are these settings correct?
|
|
||||||
IP address: ${IPV4_ADDRESS}
|
|
||||||
Gateway: ${IPv4gw}" "${r}" "${c}"; then
|
|
||||||
# After that's done, the loop ends and we move on
|
|
||||||
ipSettingsCorrect=True
|
|
||||||
else
|
|
||||||
# If the settings are wrong, the loop continues
|
|
||||||
ipSettingsCorrect=False
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
setDHCPCD
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
IPV4_ADDRESS=${_staticIPv4Temp%$'\n'*}
|
||||||
|
IPv4gw=${_staticIPv4Temp#*$'\n'}
|
||||||
|
|
||||||
|
# Give the user a chance to review their settings before moving on
|
||||||
|
dialog --no-shadow --keep-tite \
|
||||||
|
--no-label "Edit IP" \
|
||||||
|
--backtitle "Calibrating network interface" \
|
||||||
|
--title "Static IP Address" \
|
||||||
|
--defaultno \
|
||||||
|
--yesno "Are these settings correct?
|
||||||
|
IP address: ${IPV4_ADDRESS}
|
||||||
|
Gateway: ${IPv4gw}" \
|
||||||
|
"${r}" "${c}" && ipSettingsCorrect=True
|
||||||
|
done
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
setDHCPCD
|
||||||
}
|
}
|
||||||
|
|
||||||
# Configure networking via dhcpcd
|
# Configure networking via dhcpcd
|
||||||
@ -918,11 +1035,19 @@ setDNS() {
|
|||||||
DNSChooseOptions[DNSServerCount]=""
|
DNSChooseOptions[DNSServerCount]=""
|
||||||
# Restore the IFS to what it was
|
# Restore the IFS to what it was
|
||||||
IFS=${OIFS}
|
IFS=${OIFS}
|
||||||
# In a whiptail dialog, show the options
|
# In a dialog, show the options
|
||||||
DNSchoices=$(whiptail --separate-output --menu "Select Upstream DNS Provider. To use your own, select Custom." "${r}" "${c}" 7 \
|
DNSchoices=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
"${DNSChooseOptions[@]}" 2>&1 >/dev/tty) || \
|
--cancel-label "Exit" \
|
||||||
# Exit if the user selects "Cancel"
|
--menu "Select Upstream DNS Provider. To use your own, select Custom." "${r}" "${c}" 7 \
|
||||||
{ printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; exit 1; }
|
"${DNSChooseOptions[@]}")
|
||||||
|
|
||||||
|
result=$?
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# Depending on the user's choice, set the GLOBAL variables to the IP of the respective provider
|
# Depending on the user's choice, set the GLOBAL variables to the IP of the respective provider
|
||||||
if [[ "${DNSchoices}" == "Custom" ]]
|
if [[ "${DNSchoices}" == "Custom" ]]
|
||||||
@ -936,7 +1061,7 @@ setDNS() {
|
|||||||
# If the first and second upstream servers do not exist, do not prepopulate an IP address
|
# If the first and second upstream servers do not exist, do not prepopulate an IP address
|
||||||
prePopulate=""
|
prePopulate=""
|
||||||
else
|
else
|
||||||
# Otherwise, prepopulate the whiptail dialogue with the appropriate DNS value(s)
|
# Otherwise, prepopulate the dialogue with the appropriate DNS value(s)
|
||||||
prePopulate=", ${PIHOLE_DNS_2}"
|
prePopulate=", ${PIHOLE_DNS_2}"
|
||||||
fi
|
fi
|
||||||
elif [[ "${PIHOLE_DNS_1}" ]] && [[ ! "${PIHOLE_DNS_2}" ]]; then
|
elif [[ "${PIHOLE_DNS_1}" ]] && [[ ! "${PIHOLE_DNS_2}" ]]; then
|
||||||
@ -946,8 +1071,22 @@ setDNS() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Prompt the user to enter custom upstream servers
|
# Prompt the user to enter custom upstream servers
|
||||||
piholeDNS=$(whiptail --backtitle "Specify Upstream DNS Provider(s)" --inputbox "Enter your desired upstream DNS provider(s), separated by a comma.\\n\\nFor example '8.8.8.8, 8.8.4.4'" "${r}" "${c}" "${prePopulate}" 3>&1 1>&2 2>&3) || \
|
piholeDNS=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
{ printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; exit 1; }
|
--cancel-label "Exit" \
|
||||||
|
--backtitle "Specify Upstream DNS Provider(s)" \
|
||||||
|
--inputbox "Enter your desired upstream DNS provider(s), separated by a comma.\
|
||||||
|
If you want to specify a port other than 53, separate it with a hash.\
|
||||||
|
\\n\\nFor example '8.8.8.8, 8.8.4.4' or '127.0.0.1#5335'"\
|
||||||
|
"${r}" "${c}" "${prePopulate}")
|
||||||
|
|
||||||
|
result=$?
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# Clean user input and replace whitespace with comma.
|
# Clean user input and replace whitespace with comma.
|
||||||
piholeDNS=$(sed 's/[, \t]\+/,/g' <<< "${piholeDNS}")
|
piholeDNS=$(sed 's/[, \t]\+/,/g' <<< "${piholeDNS}")
|
||||||
|
|
||||||
@ -966,7 +1105,13 @@ setDNS() {
|
|||||||
# If either of the DNS servers are invalid,
|
# If either of the DNS servers are invalid,
|
||||||
if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]] || [[ "${PIHOLE_DNS_2}" == "${strInvalid}" ]]; then
|
if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]] || [[ "${PIHOLE_DNS_2}" == "${strInvalid}" ]]; then
|
||||||
# explain this to the user,
|
# explain this to the user,
|
||||||
whiptail --msgbox --backtitle "Invalid IP" --title "Invalid IP" "One or both entered IP addresses were invalid. Please try again.\\n\\n DNS Server 1: $PIHOLE_DNS_1\\n DNS Server 2: ${PIHOLE_DNS_2}" ${r} ${c}
|
dialog --no-shadow --keep-tite \
|
||||||
|
--title "Invalid IP Address(es)" \
|
||||||
|
--backtitle "Invalid IP" \
|
||||||
|
--msgbox "\\nOne or both of the entered IP addresses were invalid. Please try again.\
|
||||||
|
\\n\\nInvalid IPs: ${PIHOLE_DNS_1}, ${PIHOLE_DNS_2}" \
|
||||||
|
"${r}" "${c}"
|
||||||
|
|
||||||
# set the variables back to nothing,
|
# set the variables back to nothing,
|
||||||
if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]]; then
|
if [[ "${PIHOLE_DNS_1}" == "${strInvalid}" ]]; then
|
||||||
PIHOLE_DNS_1=""
|
PIHOLE_DNS_1=""
|
||||||
@ -977,12 +1122,24 @@ setDNS() {
|
|||||||
# and continue the loop.
|
# and continue the loop.
|
||||||
DNSSettingsCorrect=False
|
DNSSettingsCorrect=False
|
||||||
else
|
else
|
||||||
# Otherwise, show the DNS setting to the user, and break the loop if they confirm them.
|
dialog --no-shadow --keep-tite \
|
||||||
if (whiptail --backtitle "Specify Upstream DNS Provider(s)" --title "Upstream DNS Provider(s)" --yesno "Are these settings correct?\\n DNS Server 1: $PIHOLE_DNS_1\\n DNS Server 2: ${PIHOLE_DNS_2}" "${r}" "${c}"); then
|
--backtitle "Specify Upstream DNS Provider(s)" \
|
||||||
|
--title "Upstream DNS Provider(s)" \
|
||||||
|
--yesno "Are these settings correct?\\n\\tDNS Server 1:\\t${PIHOLE_DNS_1}\\n\\tDNS Server 2:\\t${PIHOLE_DNS_2}" \
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_OK}")
|
||||||
DNSSettingsCorrect=True
|
DNSSettingsCorrect=True
|
||||||
else
|
;;
|
||||||
|
"${DIALOG_CANCEL}")
|
||||||
DNSSettingsCorrect=False
|
DNSSettingsCorrect=False
|
||||||
fi
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
printf " %b Escape pressed, exiting installer at DNS Settings%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
else
|
else
|
||||||
@ -1012,106 +1169,121 @@ setDNS() {
|
|||||||
|
|
||||||
# Allow the user to enable/disable logging
|
# Allow the user to enable/disable logging
|
||||||
setLogging() {
|
setLogging() {
|
||||||
# Local, named variables
|
# Ask the user if they want to enable logging
|
||||||
local LogToggleCommand
|
dialog --no-shadow --keep-tite \
|
||||||
local LogChooseOptions
|
--backtitle "Pihole Installation" \
|
||||||
local LogChoices
|
--title "Enable Logging" \
|
||||||
|
--yesno "\\n\\nWould you like to enable query logging?" \
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
# Ask if the user wants to log queries
|
case ${result} in
|
||||||
LogToggleCommand=(whiptail --separate-output --radiolist "Do you want to log queries?" "${r}" "${c}" 6)
|
"${DIALOG_OK}")
|
||||||
# The default selection is on
|
# If they chose yes,
|
||||||
LogChooseOptions=("On (Recommended)" "" on
|
printf " %b Query Logging on.\\n" "${INFO}"
|
||||||
Off "" off)
|
|
||||||
# Get the user's choice
|
|
||||||
LogChoices=$("${LogToggleCommand[@]}" "${LogChooseOptions[@]}" 2>&1 >/dev/tty) || (printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}" && exit 1)
|
|
||||||
case ${LogChoices} in
|
|
||||||
# If it's on,
|
|
||||||
"On (Recommended)")
|
|
||||||
printf " %b Logging On.\\n" "${INFO}"
|
|
||||||
# set the GLOBAL variable setting to true
|
|
||||||
QUERY_LOGGING=true
|
QUERY_LOGGING=true
|
||||||
;;
|
;;
|
||||||
# Otherwise, it's off,
|
"${DIALOG_CANCEL}")
|
||||||
Off)
|
# If they chose no,
|
||||||
printf " %b Logging Off.\\n" "${INFO}"
|
printf " %b Query Logging off.\\n" "${INFO}"
|
||||||
# set the GLOBAL variable setting to false
|
|
||||||
QUERY_LOGGING=false
|
QUERY_LOGGING=false
|
||||||
;;
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
# User pressed <ESC>
|
||||||
|
printf " %b Escape pressed, exiting installer at Query Logging choice.%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# Allow the user to set their FTL privacy level
|
# Allow the user to set their FTL privacy level
|
||||||
setPrivacyLevel() {
|
setPrivacyLevel() {
|
||||||
local LevelCommand
|
|
||||||
local LevelOptions
|
|
||||||
|
|
||||||
LevelCommand=(whiptail --separate-output --radiolist "Select a privacy mode for FTL. https://docs.pi-hole.net/ftldns/privacylevels/" "${r}" "${c}" 6)
|
|
||||||
|
|
||||||
# The default selection is level 0
|
# The default selection is level 0
|
||||||
LevelOptions=(
|
PRIVACY_LEVEL=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
"0" "Show everything" on
|
--cancel-label "Exit" \
|
||||||
"1" "Hide domains" off
|
--ok-label "Continue" \
|
||||||
"2" "Hide domains and clients" off
|
--radiolist "Select a privacy mode for FTL. https://docs.pi-hole.net/ftldns/privacylevels/" \
|
||||||
"3" "Anonymous mode" off
|
"${r}" "${c}" 6 \
|
||||||
)
|
"0" "Show everything" on \
|
||||||
|
"1" "Hide domains" off \
|
||||||
|
"2" "Hide domains and clients" off \
|
||||||
|
"3" "Anonymous mode" off)
|
||||||
|
|
||||||
# Get the user's choice
|
result=$?
|
||||||
PRIVACY_LEVEL=$("${LevelCommand[@]}" "${LevelOptions[@]}" 2>&1 >/dev/tty) || (echo -e " ${COL_LIGHT_RED}Cancel was selected, exiting installer${COL_NC}" && exit 1)
|
case ${result} in
|
||||||
|
"${DIALOG_OK}")
|
||||||
printf " %b Privacy level %d" "${INFO}" "${PRIVACY_LEVEL}"
|
printf " %b Using privacy level: %s\\n" "${INFO}" "${PRIVACY_LEVEL}"
|
||||||
|
;;
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancelled privacy level selection.%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
# Function to ask the user if they want to install the dashboard
|
# Function to ask the user if they want to install the dashboard
|
||||||
setAdminFlag() {
|
setAdminFlag() {
|
||||||
# Local, named variables
|
|
||||||
local WebToggleCommand
|
|
||||||
local WebChooseOptions
|
|
||||||
local WebChoices
|
|
||||||
|
|
||||||
# Similar to the logging function, ask what the user wants
|
# Similar to the logging function, ask what the user wants
|
||||||
WebToggleCommand=(whiptail --separate-output --radiolist "Do you wish to install the web admin interface?" "${r}" "${c}" 6)
|
dialog --no-shadow --keep-tite \
|
||||||
# with the default being enabled
|
--backtitle "Pihole Installation" \
|
||||||
WebChooseOptions=("On (Recommended)" "" on
|
--title "Admin Web Interface" \
|
||||||
Off "" off)
|
--yesno "\\n\\nDo you want to install the Admin Web Interface?" \
|
||||||
WebChoices=$("${WebToggleCommand[@]}" "${WebChooseOptions[@]}" 2>&1 >/dev/tty) || (printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}" && exit 1)
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
# Depending on their choice
|
|
||||||
case ${WebChoices} in
|
case ${result} in
|
||||||
"On (Recommended)")
|
"${DIALOG_OK}")
|
||||||
printf " %b Web Interface On\\n" "${INFO}"
|
# If they chose yes,
|
||||||
# Set it to true
|
printf " %b Installing Admin Web Interface\\n" "${INFO}"
|
||||||
|
# Set the flag to install the web interface
|
||||||
INSTALL_WEB_INTERFACE=true
|
INSTALL_WEB_INTERFACE=true
|
||||||
;;
|
;;
|
||||||
Off)
|
"${DIALOG_CANCEL}")
|
||||||
printf " %b Web Interface Off\\n" "${INFO}"
|
# If they chose no,
|
||||||
# or false
|
printf " %b Not installing Admin Web Interface\\n" "${INFO}"
|
||||||
|
# Set the flag to not install the web interface
|
||||||
INSTALL_WEB_INTERFACE=false
|
INSTALL_WEB_INTERFACE=false
|
||||||
# Deselect the web server as well, since it is obsolete then
|
|
||||||
INSTALL_WEB_SERVER=false
|
INSTALL_WEB_SERVER=false
|
||||||
;;
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
# User pressed <ESC>
|
||||||
|
printf " %b Escape pressed, exiting installer at Admin Web Interface choice.%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# If the user wants to install the Web admin interface (i.e. it has not been deselected above)
|
# If the user wants to install the Web admin interface (i.e. it has not been deselected above)
|
||||||
if [[ "${INSTALL_WEB_SERVER}" == true ]]; then
|
if [[ "${INSTALL_WEB_INTERFACE}" == true ]]; then
|
||||||
# Get list of required PHP modules, excluding base package (common) and handler (cgi)
|
# Get list of required PHP modules, excluding base package (common) and handler (cgi)
|
||||||
local i php_modules
|
local i php_modules
|
||||||
for i in "${PIHOLE_WEB_DEPS[@]}"; do [[ $i == 'php'* && $i != *'-common' && $i != *'-cgi' ]] && php_modules+=" ${i#*-}"; done
|
for i in "${PIHOLE_WEB_DEPS[@]}"; do [[ $i == 'php'* && $i != *'-common' && $i != *'-cgi' ]] && php_modules+=" ${i#*-}"; done
|
||||||
WebToggleCommand=(whiptail --separate-output --radiolist "Do you wish to install the web server (lighttpd) and required PHP modules?\\n\\nNB: If you disable this, and, do not have an existing web server and required PHP modules (${php_modules# }) installed, the web interface will not function. Additionally the web server user needs to be member of the \"pihole\" group for full functionality." "${r}" "${c}" 6)
|
dialog --no-shadow --keep-tite \
|
||||||
# Enable as default and recommended option
|
--backtitle "Pi-hole Installation" \
|
||||||
WebChooseOptions=("On (Recommended)" "" on
|
--title "Web Server" \
|
||||||
Off "" off)
|
--yesno "\\n\\nA web server is required for the Admin Web Interface.\
|
||||||
WebChoices=$("${WebToggleCommand[@]}" "${WebChooseOptions[@]}" 2>&1 >/dev/tty) || (printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}" && exit 1)
|
\\n\\nDo you want to install lighttpd and the required PHP modules?\
|
||||||
# Depending on their choice
|
\\n\\nNB: If you disable this, and, do not have an existing web server \
|
||||||
case ${WebChoices} in
|
and required PHP modules (${php_modules# }) installed, the web interface \
|
||||||
"On (Recommended)")
|
will not function. Additionally the web server user needs to be member of \
|
||||||
printf " %b Web Server On\\n" "${INFO}"
|
the \"pihole\" group for full functionality." \
|
||||||
# set it to true, as clearly seen below.
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_OK}")
|
||||||
|
# If they chose yes,
|
||||||
|
printf " %b Installing lighttpd\\n" "${INFO}"
|
||||||
|
# Set the flag to install the web server
|
||||||
INSTALL_WEB_SERVER=true
|
INSTALL_WEB_SERVER=true
|
||||||
;;
|
;;
|
||||||
Off)
|
"${DIALOG_CANCEL}")
|
||||||
printf " %b Web Server Off\\n" "${INFO}"
|
# If they chose no,
|
||||||
# or false
|
printf " %b Not installing lighttpd\\n" "${INFO}"
|
||||||
|
# Set the flag to not install the web server
|
||||||
INSTALL_WEB_SERVER=false
|
INSTALL_WEB_SERVER=false
|
||||||
;;
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
# User pressed <ESC>
|
||||||
|
printf " %b Escape pressed, exiting installer at web server choice.%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@ -1122,18 +1294,32 @@ chooseBlocklists() {
|
|||||||
if [[ -f "${adlistFile}" ]]; then
|
if [[ -f "${adlistFile}" ]]; then
|
||||||
mv "${adlistFile}" "${adlistFile}.old"
|
mv "${adlistFile}" "${adlistFile}.old"
|
||||||
fi
|
fi
|
||||||
# Let user select (or not) blocklists via a checklist
|
# Let user select (or not) blocklists
|
||||||
cmd=(whiptail --separate-output --checklist "Pi-hole relies on third party lists in order to block ads.\\n\\nYou can use the suggestion below, and/or add your own after installation\\n\\nTo deselect the suggested list, use spacebar" "${r}" "${c}" 5)
|
dialog --no-shadow --keep-tite \
|
||||||
# In an array, show the options available (all off by default):
|
--backtitle "Pi-hole Installation" \
|
||||||
options=(StevenBlack "StevenBlack's Unified Hosts List" on)
|
--title "Blocklists" \
|
||||||
|
--yesno "\\nPi-hole relies on third party lists in order to block ads.\
|
||||||
|
\\n\\nYou can use the suggestion below, and/or add your own after installation.\
|
||||||
|
\\n\\nSelect 'Yes' to include:\
|
||||||
|
\\n\\nStevenBlack's Unified Hosts List" \
|
||||||
|
"${r}" "${c}" && result=0 || result=$?
|
||||||
|
|
||||||
# In a variable, show the choices available; exit if Cancel is selected
|
case ${result} in
|
||||||
choices=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty) || { printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; rm "${adlistFile}" ;exit 1; }
|
"${DIALOG_OK}")
|
||||||
# Add all selected choices to the lists file
|
# If they chose yes,
|
||||||
for choice in ${choices}
|
printf " %b Installing StevenBlack's Unified Hosts List\\n" "${INFO}"
|
||||||
do
|
echo "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" >> "${adlistFile}"
|
||||||
appendToListsFile "${choice}"
|
;;
|
||||||
done
|
"${DIALOG_CANCEL}")
|
||||||
|
# If they chose no,
|
||||||
|
printf " %b Not installing StevenBlack's Unified Hosts List\\n" "${INFO}"
|
||||||
|
;;
|
||||||
|
"${DIALOG_ESC}")
|
||||||
|
# User pressed <ESC>
|
||||||
|
printf " %b Escape pressed, exiting installer at blocklist choice.%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
# Create an empty adList file with appropriate permissions.
|
# Create an empty adList file with appropriate permissions.
|
||||||
if [ ! -f "${adlistFile}" ]; then
|
if [ ! -f "${adlistFile}" ]; then
|
||||||
install -m 644 /dev/null "${adlistFile}"
|
install -m 644 /dev/null "${adlistFile}"
|
||||||
@ -1142,14 +1328,6 @@ chooseBlocklists() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Accept a string parameter, it must be one of the default lists
|
|
||||||
# This function saves duplication between chooseBlocklists and installDefaultBlocklists
|
|
||||||
appendToListsFile() {
|
|
||||||
case $1 in
|
|
||||||
StevenBlack ) echo "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" >> "${adlistFile}";;
|
|
||||||
esac
|
|
||||||
}
|
|
||||||
|
|
||||||
# Used only in unattended setup
|
# Used only in unattended setup
|
||||||
# If there is already the adListFile, we keep it, else we create it using all default lists
|
# If there is already the adListFile, we keep it, else we create it using all default lists
|
||||||
installDefaultBlocklists() {
|
installDefaultBlocklists() {
|
||||||
@ -1158,7 +1336,7 @@ installDefaultBlocklists() {
|
|||||||
if [[ -f "${adlistFile}" ]]; then
|
if [[ -f "${adlistFile}" ]]; then
|
||||||
return;
|
return;
|
||||||
fi
|
fi
|
||||||
appendToListsFile StevenBlack
|
echo "https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" >> "${adlistFile}"
|
||||||
}
|
}
|
||||||
|
|
||||||
# Check if /etc/dnsmasq.conf is from pi-hole. If so replace with an original and install new in .d directory
|
# Check if /etc/dnsmasq.conf is from pi-hole. If so replace with an original and install new in .d directory
|
||||||
@ -1326,6 +1504,9 @@ installConfigs() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Install pihole-FTL.service
|
||||||
|
install -T -m 0755 "${PI_HOLE_LOCAL_REPO}/advanced/Templates/pihole-FTL.service" "/etc/init.d/pihole-FTL"
|
||||||
|
|
||||||
# If the user chose to install the dashboard,
|
# If the user chose to install the dashboard,
|
||||||
if [[ "${INSTALL_WEB_SERVER}" == true ]]; then
|
if [[ "${INSTALL_WEB_SERVER}" == true ]]; then
|
||||||
# and if the Web server conf directory does not exist,
|
# and if the Web server conf directory does not exist,
|
||||||
@ -1731,29 +1912,14 @@ create_pihole_user() {
|
|||||||
|
|
||||||
# This function saves any changes to the setup variables into the setupvars.conf file for future runs
|
# This function saves any changes to the setup variables into the setupvars.conf file for future runs
|
||||||
finalExports() {
|
finalExports() {
|
||||||
# If the Web interface is not set to be installed,
|
|
||||||
if [[ "${INSTALL_WEB_INTERFACE}" == false ]]; then
|
|
||||||
# and if there is not an IPv4 address,
|
|
||||||
if [[ "${IPV4_ADDRESS}" ]]; then
|
|
||||||
# there is no block page, so set IPv4 to 0.0.0.0 (all IP addresses)
|
|
||||||
IPV4_ADDRESS="0.0.0.0"
|
|
||||||
fi
|
|
||||||
if [[ "${IPV6_ADDRESS}" ]]; then
|
|
||||||
# and IPv6 to ::/0
|
|
||||||
IPV6_ADDRESS="::/0"
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# If the setup variable file exists,
|
# If the setup variable file exists,
|
||||||
if [[ -e "${setupVars}" ]]; then
|
if [[ -e "${setupVars}" ]]; then
|
||||||
# update the variables in the file
|
# update the variables in the file
|
||||||
sed -i.update.bak '/PIHOLE_INTERFACE/d;/IPV4_ADDRESS/d;/IPV6_ADDRESS/d;/PIHOLE_DNS_1\b/d;/PIHOLE_DNS_2\b/d;/QUERY_LOGGING/d;/INSTALL_WEB_SERVER/d;/INSTALL_WEB_INTERFACE/d;/LIGHTTPD_ENABLED/d;/CACHE_SIZE/d;/DNS_FQDN_REQUIRED/d;/DNS_BOGUS_PRIV/d;/DNSMASQ_LISTENING/d;' "${setupVars}"
|
sed -i.update.bak '/PIHOLE_INTERFACE/d;/PIHOLE_DNS_1\b/d;/PIHOLE_DNS_2\b/d;/QUERY_LOGGING/d;/INSTALL_WEB_SERVER/d;/INSTALL_WEB_INTERFACE/d;/LIGHTTPD_ENABLED/d;/CACHE_SIZE/d;/DNS_FQDN_REQUIRED/d;/DNS_BOGUS_PRIV/d;/DNSMASQ_LISTENING/d;' "${setupVars}"
|
||||||
fi
|
fi
|
||||||
# echo the information to the user
|
# echo the information to the user
|
||||||
{
|
{
|
||||||
echo "PIHOLE_INTERFACE=${PIHOLE_INTERFACE}"
|
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_1=${PIHOLE_DNS_1}"
|
||||||
echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}"
|
echo "PIHOLE_DNS_2=${PIHOLE_DNS_2}"
|
||||||
echo "QUERY_LOGGING=${QUERY_LOGGING}"
|
echo "QUERY_LOGGING=${QUERY_LOGGING}"
|
||||||
@ -1935,20 +2101,17 @@ displayFinalMessage() {
|
|||||||
# If the user wants to install the dashboard,
|
# If the user wants to install the dashboard,
|
||||||
if [[ "${INSTALL_WEB_INTERFACE}" == true ]]; then
|
if [[ "${INSTALL_WEB_INTERFACE}" == true ]]; then
|
||||||
# Store a message in a variable and display it
|
# Store a message in a variable and display it
|
||||||
additional="View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin
|
additional="View the web interface at http://pi.hole/admin or http://${IPV4_ADDRESS%/*}/admin\\n\\nYour Admin Webpage login password is ${pwstring}"
|
||||||
|
|
||||||
Your Admin Webpage login password is ${pwstring}"
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Final completion message to user
|
# Final completion message to user
|
||||||
whiptail --msgbox --backtitle "Make it so." --title "Installation Complete!" "Configure your devices to use the Pi-hole as their DNS server using:
|
dialog --no-shadow --keep-tite \
|
||||||
|
--title "Installation Complete!" \
|
||||||
IPv4: ${IPV4_ADDRESS%/*}
|
--msgbox "Configure your devices to use the Pi-hole as their DNS server using:\
|
||||||
IPv6: ${IPV6_ADDRESS:-"Not Configured"}
|
\\n\\nIPv4: ${IPV4_ADDRESS%/*}\
|
||||||
|
\\nIPv6: ${IPV6_ADDRESS:-"Not Configured"}\
|
||||||
If you have not done so already, the above IP should be set to static.
|
\\nIf you have not done so already, the above IP should be set to static.\
|
||||||
|
\\n${additional}" "${r}" "${c}"
|
||||||
${additional}" "${r}" "${c}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
update_dialogs() {
|
update_dialogs() {
|
||||||
@ -1968,20 +2131,33 @@ update_dialogs() {
|
|||||||
opt2b="Resets Pi-hole and allows re-selecting settings."
|
opt2b="Resets Pi-hole and allows re-selecting settings."
|
||||||
|
|
||||||
# Display the information to the user
|
# Display the information to the user
|
||||||
UpdateCmd=$(whiptail --title "Existing Install Detected!" --menu "\\n\\nWe have detected an existing install.\\n\\nPlease choose from the following options: \\n($strAdd)" "${r}" "${c}" 2 \
|
UpdateCmd=$(dialog --no-shadow --keep-tite --output-fd 1 \
|
||||||
|
--cancel-label Exit \
|
||||||
|
--title "Existing Install Detected!" \
|
||||||
|
--menu "\\n\\nWe have detected an existing install.\
|
||||||
|
\\n\\nPlease choose from the following options:\
|
||||||
|
\\n($strAdd)"\
|
||||||
|
"${r}" "${c}" 2 \
|
||||||
"${opt1a}" "${opt1b}" \
|
"${opt1a}" "${opt1b}" \
|
||||||
"${opt2a}" "${opt2b}" 3>&2 2>&1 1>&3) || \
|
"${opt2a}" "${opt2b}" || true)
|
||||||
{ printf " %bCancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"; exit 1; }
|
|
||||||
|
result=$?
|
||||||
|
case ${result} in
|
||||||
|
"${DIALOG_CANCEL}" | "${DIALOG_ESC}")
|
||||||
|
printf " %b Cancel was selected, exiting installer%b\\n" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
# Set the variable based on if the user chooses
|
# Set the variable based on if the user chooses
|
||||||
case ${UpdateCmd} in
|
case ${UpdateCmd} in
|
||||||
# repair, or
|
# repair, or
|
||||||
${opt1a})
|
"${opt1a}")
|
||||||
printf " %b %s option selected\\n" "${INFO}" "${opt1a}"
|
printf " %b %s option selected\\n" "${INFO}" "${opt1a}"
|
||||||
useUpdateVars=true
|
useUpdateVars=true
|
||||||
;;
|
;;
|
||||||
# reconfigure,
|
# reconfigure,
|
||||||
${opt2a})
|
"${opt2a}")
|
||||||
printf " %b %s option selected\\n" "${INFO}" "${opt2a}"
|
printf " %b %s option selected\\n" "${INFO}" "${opt2a}"
|
||||||
useUpdateVars=false
|
useUpdateVars=false
|
||||||
;;
|
;;
|
||||||
@ -2117,9 +2293,6 @@ FTLinstall() {
|
|||||||
# Move into the temp ftl directory
|
# Move into the temp ftl directory
|
||||||
pushd "$(mktemp -d)" > /dev/null || { printf "Unable to make temporary directory for FTL binary download\\n"; return 1; }
|
pushd "$(mktemp -d)" > /dev/null || { printf "Unable to make temporary directory for FTL binary download\\n"; return 1; }
|
||||||
|
|
||||||
# Always replace pihole-FTL.service
|
|
||||||
install -T -m 0755 "${PI_HOLE_LOCAL_REPO}/advanced/Templates/pihole-FTL.service" "/etc/init.d/pihole-FTL"
|
|
||||||
|
|
||||||
local ftlBranch
|
local ftlBranch
|
||||||
local url
|
local url
|
||||||
|
|
||||||
@ -2453,6 +2626,9 @@ main() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Check if SELinux is Enforcing and exit before doing anything else
|
||||||
|
checkSelinux
|
||||||
|
|
||||||
# Check for supported package managers so that we may install dependencies
|
# Check for supported package managers so that we may install dependencies
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
|
|
||||||
@ -2475,14 +2651,12 @@ main() {
|
|||||||
select_rpm_php
|
select_rpm_php
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if SELinux is Enforcing
|
|
||||||
checkSelinux
|
|
||||||
|
|
||||||
# If the setup variable file exists,
|
# If the setup variable file exists,
|
||||||
if [[ -f "${setupVars}" ]]; then
|
if [[ -f "${setupVars}" ]]; then
|
||||||
# if it's running unattended,
|
# if it's running unattended,
|
||||||
if [[ "${runUnattended}" == true ]]; then
|
if [[ "${runUnattended}" == true ]]; then
|
||||||
printf " %b Performing unattended setup, no whiptail dialogs will be displayed\\n" "${INFO}"
|
printf " %b Performing unattended setup, no dialogs will be displayed\\n" "${INFO}"
|
||||||
# Use the setup variables
|
# Use the setup variables
|
||||||
useUpdateVars=true
|
useUpdateVars=true
|
||||||
# also disable debconf-apt-progress dialogs
|
# also disable debconf-apt-progress dialogs
|
||||||
@ -2613,6 +2787,31 @@ main() {
|
|||||||
# Fixes a problem reported on Ubuntu 18.04 where trying to start
|
# Fixes a problem reported on Ubuntu 18.04 where trying to start
|
||||||
# the service before enabling causes installer to exit
|
# the service before enabling causes installer to exit
|
||||||
enable_service pihole-FTL
|
enable_service pihole-FTL
|
||||||
|
|
||||||
|
# If this is an update from a previous Pi-hole installation
|
||||||
|
# we need to move any existing `pihole*` logs from `/var/log` to `/var/log/pihole`
|
||||||
|
# if /var/log/pihole.log is not a symlink (set during FTL startup) move the files
|
||||||
|
# can be removed with Pi-hole v6.0
|
||||||
|
# To be sure FTL is not running when we move the files we explicitly stop it here
|
||||||
|
|
||||||
|
stop_service pihole-FTL &> /dev/null
|
||||||
|
|
||||||
|
# Special handling for pihole-FTL.log -> pihole/FTL.log
|
||||||
|
if [ -f /var/log/pihole-FTL.log ] && [ ! -L /var/log/pihole-FTL.log ]; then
|
||||||
|
# /var/log/pihole-FTL.log -> /var/log/pihole/FTL.log
|
||||||
|
# /var/log/pihole-FTL.log.1 -> /var/log/pihole/FTL.log.1
|
||||||
|
# /var/log/pihole-FTL.log.2.gz -> /var/log/pihole/FTL.log.2.gz
|
||||||
|
# /var/log/pihole-FTL.log.3.gz -> /var/log/pihole/FTL.log.3.gz
|
||||||
|
# /var/log/pihole-FTL.log.4.gz -> /var/log/pihole/FTL.log.4.gz
|
||||||
|
# /var/log/pihole-FTL.log.5.gz -> /var/log/pihole/FTL.log.5.gz
|
||||||
|
for f in /var/log/pihole-FTL.log*; do mv "$f" "$( sed "s/pihole-/pihole\//" <<< "$f")"; done
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Remaining log files
|
||||||
|
if [ -f /var/log/pihole.log ] && [ ! -L /var/log/pihole.log ]; then
|
||||||
|
mv /var/log/pihole*.* /var/log/pihole/ 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
restart_service pihole-FTL
|
restart_service pihole-FTL
|
||||||
|
|
||||||
# Download and compile the aggregated block list
|
# Download and compile the aggregated block list
|
||||||
|
@ -146,6 +146,7 @@ removeNoPurge() {
|
|||||||
${SUDO} rm -f /etc/dnsmasq.d/01-pihole.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 -f /etc/dnsmasq.d/06-rfc6761.conf &> /dev/null
|
||||||
${SUDO} rm -rf /var/log/*pihole* &> /dev/null
|
${SUDO} rm -rf /var/log/*pihole* &> /dev/null
|
||||||
|
${SUDO} rm -rf /var/log/pihole/*pihole* &> /dev/null
|
||||||
${SUDO} rm -rf /etc/pihole/ &> /dev/null
|
${SUDO} rm -rf /etc/pihole/ &> /dev/null
|
||||||
${SUDO} rm -rf /etc/.pihole/ &> /dev/null
|
${SUDO} rm -rf /etc/.pihole/ &> /dev/null
|
||||||
${SUDO} rm -rf /opt/pihole/ &> /dev/null
|
${SUDO} rm -rf /opt/pihole/ &> /dev/null
|
||||||
|
@ -540,7 +540,7 @@ parseList() {
|
|||||||
num_target_lines_new="$(grep -c "^" "${target}")"
|
num_target_lines_new="$(grep -c "^" "${target}")"
|
||||||
# Number of new correctly added lines
|
# Number of new correctly added lines
|
||||||
num_correct_lines="$(( num_target_lines_new-num_target_lines ))"
|
num_correct_lines="$(( num_target_lines_new-num_target_lines ))"
|
||||||
# Upate number of lines in target file
|
# Update number of lines in target file
|
||||||
num_target_lines="$num_target_lines_new"
|
num_target_lines="$num_target_lines_new"
|
||||||
num_invalid="$(( num_source_lines-num_correct_lines ))"
|
num_invalid="$(( num_source_lines-num_correct_lines ))"
|
||||||
if [[ "${num_invalid}" -eq 0 ]]; then
|
if [[ "${num_invalid}" -eq 0 ]]; then
|
||||||
|
@ -187,12 +187,12 @@ Available commands and options:
|
|||||||
|
|
||||||
(Logging options):
|
(Logging options):
|
||||||
.br
|
.br
|
||||||
on Enable the Pi-hole log at /var/log/pihole.log
|
on Enable the Pi-hole log at /var/log/pihole/pihole.log
|
||||||
.br
|
.br
|
||||||
off Disable and flush the Pi-hole log at
|
off Disable and flush the Pi-hole log at
|
||||||
/var/log/pihole.log
|
/var/log/pihole/pihole.log
|
||||||
.br
|
.br
|
||||||
off noflush Disable the Pi-hole log at /var/log/pihole.log
|
off noflush Disable the Pi-hole log at /var/log/pihole/pihole.log
|
||||||
.br
|
.br
|
||||||
|
|
||||||
\fB-up, updatePihole\fR [--check-only]
|
\fB-up, updatePihole\fR [--check-only]
|
||||||
|
12
pihole
12
pihole
@ -254,9 +254,9 @@ Example: 'pihole logging on'
|
|||||||
Specify whether the Pi-hole log should be used
|
Specify whether the Pi-hole log should be used
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
on Enable the Pi-hole log at /var/log/pihole.log
|
on Enable the Pi-hole log at /var/log/pihole/pihole.log
|
||||||
off Disable and flush the Pi-hole log at /var/log/pihole.log
|
off Disable and flush the Pi-hole log at /var/log/pihole/pihole.log
|
||||||
off noflush Disable the Pi-hole log at /var/log/pihole.log"
|
off noflush Disable the Pi-hole log at /var/log/pihole/pihole.log"
|
||||||
exit 0
|
exit 0
|
||||||
elif [[ "${1}" == "off" ]]; then
|
elif [[ "${1}" == "off" ]]; then
|
||||||
# Disable logging
|
# Disable logging
|
||||||
@ -382,7 +382,7 @@ tailFunc() {
|
|||||||
# Color blocklist/blacklist/wildcard entries as red
|
# Color blocklist/blacklist/wildcard entries as red
|
||||||
# Color A/AAAA/DHCP strings as white
|
# Color A/AAAA/DHCP strings as white
|
||||||
# Color everything else as gray
|
# Color everything else as gray
|
||||||
tail -f /var/log/pihole.log | grep --line-buffered "${1}" | sed -E \
|
tail -f /var/log/pihole/pihole.log | grep --line-buffered "${1}" | sed -E \
|
||||||
-e "s,($(date +'%b %d ')| dnsmasq\[[0-9]*\]),,g" \
|
-e "s,($(date +'%b %d ')| dnsmasq\[[0-9]*\]),,g" \
|
||||||
-e "s,(.*(blacklisted |gravity blocked ).*),${COL_RED}&${COL_NC}," \
|
-e "s,(.*(blacklisted |gravity blocked ).*),${COL_RED}&${COL_NC}," \
|
||||||
-e "s,.*(query\\[A|DHCP).*,${COL_NC}&${COL_NC}," \
|
-e "s,.*(query\\[A|DHCP).*,${COL_NC}&${COL_NC}," \
|
||||||
@ -503,7 +503,7 @@ case "${1}" in
|
|||||||
"-c" | "chronometer" ) chronometerFunc "$@";;
|
"-c" | "chronometer" ) chronometerFunc "$@";;
|
||||||
"-q" | "query" ) queryFunc "$@";;
|
"-q" | "query" ) queryFunc "$@";;
|
||||||
"status" ) statusFunc "$2";;
|
"status" ) statusFunc "$2";;
|
||||||
"-t" | "tail" ) tailFunc "$2";;
|
|
||||||
"tricorder" ) tricorderFunc;;
|
"tricorder" ) tricorderFunc;;
|
||||||
|
|
||||||
# we need to add all arguments that require sudo power to not trigger the * argument
|
# we need to add all arguments that require sudo power to not trigger the * argument
|
||||||
@ -527,6 +527,7 @@ case "${1}" in
|
|||||||
"checkout" ) ;;
|
"checkout" ) ;;
|
||||||
"updatechecker" ) ;;
|
"updatechecker" ) ;;
|
||||||
"arpflush" ) ;;
|
"arpflush" ) ;;
|
||||||
|
"-t" | "tail" ) ;;
|
||||||
* ) helpFunc;;
|
* ) helpFunc;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -563,4 +564,5 @@ case "${1}" in
|
|||||||
"checkout" ) piholeCheckoutFunc "$@";;
|
"checkout" ) piholeCheckoutFunc "$@";;
|
||||||
"updatechecker" ) updateCheckFunc "$@";;
|
"updatechecker" ) updateCheckFunc "$@";;
|
||||||
"arpflush" ) arpFunc "$@";;
|
"arpflush" ) arpFunc "$@";;
|
||||||
|
"-t" | "tail" ) tailFunc "$2";;
|
||||||
esac
|
esac
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
FROM centos:7
|
FROM centos:7
|
||||||
RUN yum install -y git
|
RUN yum install -y dialog git python3
|
||||||
|
|
||||||
ENV GITDIR /etc/.pihole
|
ENV GITDIR /etc/.pihole
|
||||||
ENV SCRIPTDIR /opt/pihole
|
ENV SCRIPTDIR /opt/pihole
|
||||||
@ -9,6 +9,7 @@ ADD . $GITDIR
|
|||||||
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
|
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 PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
|
||||||
|
|
||||||
|
ADD test/centos7.epel.override /etc/yum/pluginconf.d/fastestmirror.conf
|
||||||
RUN true && \
|
RUN true && \
|
||||||
chmod +x $SCRIPTDIR/*
|
chmod +x $SCRIPTDIR/*
|
||||||
|
|
||||||
|
@ -1,18 +0,0 @@
|
|||||||
FROM fedora:33
|
|
||||||
RUN dnf install -y git
|
|
||||||
|
|
||||||
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 && \
|
|
@ -1,17 +0,0 @@
|
|||||||
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 && \
|
|
@ -1,4 +1,4 @@
|
|||||||
FROM buildpack-deps:stretch-scm
|
FROM buildpack-deps:jammy-scm
|
||||||
|
|
||||||
ENV GITDIR /etc/.pihole
|
ENV GITDIR /etc/.pihole
|
||||||
ENV SCRIPTDIR /opt/pihole
|
ENV SCRIPTDIR /opt/pihole
|
||||||
@ -7,6 +7,7 @@ RUN mkdir -p $GITDIR $SCRIPTDIR /etc/pihole
|
|||||||
ADD . $GITDIR
|
ADD . $GITDIR
|
||||||
RUN cp $GITDIR/advanced/Scripts/*.sh $GITDIR/gravity.sh $GITDIR/pihole $GITDIR/automated\ install/*.sh $SCRIPTDIR/
|
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 PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$SCRIPTDIR
|
||||||
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
|
|
||||||
RUN true && \
|
RUN true && \
|
||||||
chmod +x $SCRIPTDIR/*
|
chmod +x $SCRIPTDIR/*
|
7
test/centos7.epel.override
Normal file
7
test/centos7.epel.override
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[main]
|
||||||
|
verbose = 0
|
||||||
|
socket_timeout = 3
|
||||||
|
enabled = 1
|
||||||
|
hostfilepath = /var/cache/yum/timedhosts.txt
|
||||||
|
maxhostfileage = 1
|
||||||
|
exclude=.edu
|
@ -150,10 +150,10 @@ def get_directories_recursive(host, directory):
|
|||||||
|
|
||||||
def test_installPihole_fresh_install_readableFiles(host):
|
def test_installPihole_fresh_install_readableFiles(host):
|
||||||
'''
|
'''
|
||||||
confirms all neccessary files are readable by pihole user
|
confirms all necessary files are readable by pihole user
|
||||||
'''
|
'''
|
||||||
# Whiptail dialog returns Cancel for user prompt
|
# dialog returns Cancel for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
# mock git pull
|
# mock git pull
|
||||||
mock_command_passthrough('git', {'pull': ('', '0')}, host)
|
mock_command_passthrough('git', {'pull': ('', '0')}, host)
|
||||||
# mock systemctl to not start lighttpd and FTL
|
# mock systemctl to not start lighttpd and FTL
|
||||||
@ -393,8 +393,8 @@ def test_installPihole_fresh_install_readableBlockpage(host, test_webpage):
|
|||||||
"127.0.0.1",
|
"127.0.0.1",
|
||||||
# "pi.hole"
|
# "pi.hole"
|
||||||
]
|
]
|
||||||
# Whiptail dialog returns Cancel for user prompt
|
# dialog returns Cancel for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
|
|
||||||
# mock git pull
|
# mock git pull
|
||||||
mock_command_passthrough('git', {'pull': ('', '0')}, host)
|
mock_command_passthrough('git', {'pull': ('', '0')}, host)
|
||||||
@ -483,7 +483,6 @@ def test_installPihole_fresh_install_readableBlockpage(host, test_webpage):
|
|||||||
setup_var_file += "{}={}\n".format(k, v)
|
setup_var_file += "{}={}\n".format(k, v)
|
||||||
setup_var_file += "INSTALL_WEB_SERVER=true\n"
|
setup_var_file += "INSTALL_WEB_SERVER=true\n"
|
||||||
setup_var_file += "INSTALL_WEB_INTERFACE=true\n"
|
setup_var_file += "INSTALL_WEB_INTERFACE=true\n"
|
||||||
setup_var_file += "IPV4_ADDRESS=127.0.0.1\n"
|
|
||||||
setup_var_file += "EOF\n"
|
setup_var_file += "EOF\n"
|
||||||
host.run(setup_var_file)
|
host.run(setup_var_file)
|
||||||
installWeb = host.run('''
|
installWeb = host.run('''
|
||||||
@ -871,8 +870,8 @@ def test_FTL_download_aarch64_no_errors(host):
|
|||||||
'''
|
'''
|
||||||
confirms only aarch64 package is downloaded for FTL engine
|
confirms only aarch64 package is downloaded for FTL engine
|
||||||
'''
|
'''
|
||||||
# mock whiptail answers and ensure installer dependencies
|
# mock dialog answers and ensure installer dependencies
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
host.run('''
|
host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -905,23 +904,6 @@ def test_FTL_binary_installed_and_responsive_no_errors(host):
|
|||||||
assert expected_stdout in installed_binary.stdout
|
assert expected_stdout in installed_binary.stdout
|
||||||
|
|
||||||
|
|
||||||
# def test_FTL_support_files_installed(host):
|
|
||||||
# '''
|
|
||||||
# confirms FTL support files are installed
|
|
||||||
# '''
|
|
||||||
# support_files = host.run('''
|
|
||||||
# source /opt/pihole/basic-install.sh
|
|
||||||
# FTLdetect
|
|
||||||
# stat -c '%a %n' /var/log/pihole-FTL.log
|
|
||||||
# stat -c '%a %n' /run/pihole-FTL.port
|
|
||||||
# stat -c '%a %n' /run/pihole-FTL.pid
|
|
||||||
# ls -lac /run
|
|
||||||
# ''')
|
|
||||||
# assert '644 /run/pihole-FTL.port' in support_files.stdout
|
|
||||||
# assert '644 /run/pihole-FTL.pid' in support_files.stdout
|
|
||||||
# assert '644 /var/log/pihole-FTL.log' in support_files.stdout
|
|
||||||
|
|
||||||
|
|
||||||
def test_IPv6_only_link_local(host):
|
def test_IPv6_only_link_local(host):
|
||||||
'''
|
'''
|
||||||
confirms IPv6 blocking is disabled for Link-local address
|
confirms IPv6 blocking is disabled for Link-local address
|
||||||
@ -1118,7 +1100,7 @@ def test_os_check_passes(host):
|
|||||||
|
|
||||||
def test_package_manager_has_installer_deps(host):
|
def test_package_manager_has_installer_deps(host):
|
||||||
''' Confirms OS is able to install the required packages for the installer'''
|
''' Confirms OS is able to install the required packages for the installer'''
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
output = host.run('''
|
output = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -1131,7 +1113,7 @@ def test_package_manager_has_installer_deps(host):
|
|||||||
|
|
||||||
def test_package_manager_has_pihole_deps(host):
|
def test_package_manager_has_pihole_deps(host):
|
||||||
''' Confirms OS is able to install the required packages for Pi-hole '''
|
''' Confirms OS is able to install the required packages for Pi-hole '''
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
output = host.run('''
|
output = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -1145,7 +1127,7 @@ def test_package_manager_has_pihole_deps(host):
|
|||||||
|
|
||||||
def test_package_manager_has_web_deps(host):
|
def test_package_manager_has_web_deps(host):
|
||||||
''' Confirms OS is able to install the required packages for web '''
|
''' Confirms OS is able to install the required packages for web '''
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
output = host.run('''
|
output = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
|
@ -26,8 +26,8 @@ def test_php_upgrade_user_optout_centos_eq_7(host):
|
|||||||
confirms installer behavior when user opt-out of installing PHP7 from REMI
|
confirms installer behavior when user opt-out of installing PHP7 from REMI
|
||||||
(php not currently installed)
|
(php not currently installed)
|
||||||
'''
|
'''
|
||||||
# Whiptail dialog returns Cancel for user prompt
|
# dialog returns Cancel for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '1')}, host)
|
mock_command('dialog', {'*': ('', '1')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -45,8 +45,8 @@ def test_php_upgrade_user_optin_centos_eq_7(host):
|
|||||||
confirms installer behavior when user opt-in to installing PHP7 from REMI
|
confirms installer behavior when user opt-in to installing PHP7 from REMI
|
||||||
(php not currently installed)
|
(php not currently installed)
|
||||||
'''
|
'''
|
||||||
# Whiptail dialog returns Continue for user prompt
|
# dialog returns Continue for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
|
@ -29,8 +29,8 @@ def test_php_upgrade_user_optout_skipped_centos_gte_8(host):
|
|||||||
latest CentOS (should trigger on CentOS7 only)
|
latest CentOS (should trigger on CentOS7 only)
|
||||||
(php not currently installed)
|
(php not currently installed)
|
||||||
'''
|
'''
|
||||||
# Whiptail dialog returns Cancel for user prompt
|
# dialog dialog returns Cancel for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '1')}, host)
|
mock_command('dialog', {'*': ('', '1')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -50,8 +50,8 @@ def test_php_upgrade_user_optin_skipped_centos_gte_8(host):
|
|||||||
latest CentOS (should trigger on CentOS7 only)
|
latest CentOS (should trigger on CentOS7 only)
|
||||||
(php not currently installed)
|
(php not currently installed)
|
||||||
'''
|
'''
|
||||||
# Whiptail dialog returns Continue for user prompt
|
# dialog dialog returns Continue for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
|
@ -36,7 +36,7 @@ def test_enable_epel_repository_centos(host):
|
|||||||
expected_stdout = info_box + (' Enabling EPEL package repository '
|
expected_stdout = info_box + (' Enabling EPEL package repository '
|
||||||
'(https://fedoraproject.org/wiki/EPEL)')
|
'(https://fedoraproject.org/wiki/EPEL)')
|
||||||
assert expected_stdout in package_manager_detect.stdout
|
assert expected_stdout in package_manager_detect.stdout
|
||||||
expected_stdout = tick_box + ' Installed epel-release'
|
expected_stdout = tick_box + ' Installed'
|
||||||
assert expected_stdout in package_manager_detect.stdout
|
assert expected_stdout in package_manager_detect.stdout
|
||||||
epel_package = host.package('epel-release')
|
epel_package = host.package('epel-release')
|
||||||
assert epel_package.is_installed
|
assert epel_package.is_installed
|
||||||
@ -76,8 +76,8 @@ def test_php_version_lt_7_detected_upgrade_user_optout_centos(host):
|
|||||||
default_centos_php_version = php_package.version.split('.')[0]
|
default_centos_php_version = php_package.version.split('.')[0]
|
||||||
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
|
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
|
||||||
pytest.skip("Test deprecated . Detected default PHP version >= 7")
|
pytest.skip("Test deprecated . Detected default PHP version >= 7")
|
||||||
# Whiptail dialog returns Cancel for user prompt
|
# dialog returns Cancel for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '1')}, host)
|
mock_command('dialog', {'*': ('', '1')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
@ -101,8 +101,8 @@ def test_php_version_lt_7_detected_upgrade_user_optin_centos(host):
|
|||||||
default_centos_php_version = php_package.version.split('.')[0]
|
default_centos_php_version = php_package.version.split('.')[0]
|
||||||
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
|
if int(default_centos_php_version) >= 7: # PHP7 is supported/recommended
|
||||||
pytest.skip("Test deprecated . Detected default PHP version >= 7")
|
pytest.skip("Test deprecated . Detected default PHP version >= 7")
|
||||||
# Whiptail dialog returns Continue for user prompt
|
# dialog returns Continue for user prompt
|
||||||
mock_command('whiptail', {'*': ('', '0')}, host)
|
mock_command('dialog', {'*': ('', '0')}, host)
|
||||||
package_manager_detect = host.run('''
|
package_manager_detect = host.run('''
|
||||||
source /opt/pihole/basic-install.sh
|
source /opt/pihole/basic-install.sh
|
||||||
package_manager_detect
|
package_manager_detect
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
[tox]
|
|
||||||
envlist = py38
|
|
||||||
|
|
||||||
[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_any_automated_install.py ./test_any_utils.py
|
|
@ -1,8 +0,0 @@
|
|||||||
[tox]
|
|
||||||
envlist = py38
|
|
||||||
|
|
||||||
[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_any_automated_install.py ./test_any_utils.py ./test_centos_fedora_common_support.py ./test_fedora_support.py
|
|
@ -4,5 +4,5 @@ envlist = py38
|
|||||||
[testenv]
|
[testenv]
|
||||||
whitelist_externals = docker
|
whitelist_externals = docker
|
||||||
deps = -rrequirements.txt
|
deps = -rrequirements.txt
|
||||||
commands = docker build -f _ubuntu_16.Dockerfile -t pytest_pihole:test_container ../
|
commands = docker build -f _ubuntu_22.Dockerfile -t pytest_pihole:test_container ../
|
||||||
pytest {posargs:-vv -n auto} ./test_any_automated_install.py ./test_any_utils.py
|
pytest {posargs:-vv -n auto} ./test_any_automated_install.py ./test_any_utils.py
|
Loading…
Reference in New Issue
Block a user