Compare commits
60 Commits
fix/flush
...
null-is-no
Author | SHA1 | Date | |
---|---|---|---|
|
8775720668 | ||
|
48f56d0385 | ||
|
42d3368955 | ||
|
21ae81ffdb | ||
|
b33434d02a | ||
|
d3e94cbceb | ||
|
9b4f6c84cd | ||
|
4d31d5ee11 | ||
|
9878477896 | ||
|
c0a2ab7b77 | ||
|
30ba79f6a0 | ||
|
cd3c97f113 | ||
|
e4a1f3a175 | ||
|
6121c162ff | ||
|
0d74b27101 | ||
|
7fa8cdd03e | ||
|
fe9031b26f | ||
|
326cd6a1f8 | ||
|
063f92f8f4 | ||
|
be6a73f102 | ||
|
b714c4598a | ||
|
0f192998eb | ||
|
8a5c7dec71 | ||
|
69e4e9a2ae | ||
|
4230be0c80 | ||
|
d45c9fc522 | ||
|
efa99a177e | ||
|
c2384ecc6f | ||
|
2f38452565 | ||
|
5cebceadda | ||
|
722a716de3 | ||
|
614d18cd3d | ||
|
54ce8c2622 | ||
|
329c161054 | ||
|
f8e84b3c3f | ||
|
c9809371ab | ||
|
a48750e257 | ||
|
0d4c69cc6f | ||
|
479b2bc075 | ||
|
2ade05d60f | ||
|
59fc3804be | ||
|
48138d32b6 | ||
|
ff5e788889 | ||
|
ab7d83384f | ||
|
48136c5bbc | ||
|
0219e5dfe0 | ||
|
0631cb4984 | ||
|
40b96e673b | ||
|
36ca858668 | ||
|
899cac0aac | ||
|
16b732fe8a | ||
|
1bf2f8d0b7 | ||
|
c756bcb9d1 | ||
|
42424b515b | ||
|
bd956b5f16 | ||
|
9be5199f7c | ||
|
9db19c5e96 | ||
|
91b4233d3a | ||
|
0b905c28c1 | ||
|
6ffa2ba1b2 |
2
.github/workflows/stale.yml
vendored
2
.github/workflows/stale.yml
vendored
@@ -20,6 +20,6 @@ jobs:
|
|||||||
days-before-close: 5
|
days-before-close: 5
|
||||||
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Please comment or update this issue or it will be closed in 5 days.'
|
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Please comment or update this issue or it will be closed in 5 days.'
|
||||||
stale-issue-label: 'stale'
|
stale-issue-label: 'stale'
|
||||||
exempt-issue-labels: 'Internal, Fixed in next release, Bug: Confirmed'
|
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
|
||||||
|
1
.github/workflows/sync-back-to-dev.yml
vendored
1
.github/workflows/sync-back-to-dev.yml
vendored
@@ -19,7 +19,6 @@ jobs:
|
|||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
FROM_BRANCH: 'master'
|
FROM_BRANCH: 'master'
|
||||||
TO_BRANCH: 'development'
|
TO_BRANCH: 'development'
|
||||||
CONTENT_COMPARISON: true
|
|
||||||
- name: Label the pull request to ignore for release note generation
|
- name: Label the pull request to ignore for release note generation
|
||||||
uses: actions-ecosystem/action-add-labels@v1
|
uses: actions-ecosystem/action-add-labels@v1
|
||||||
with:
|
with:
|
||||||
|
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -37,7 +37,7 @@ jobs:
|
|||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
-
|
-
|
||||||
name: Set up Python 3.8
|
name: Set up Python 3.8
|
||||||
uses: actions/setup-python@v2
|
uses: actions/setup-python@v3
|
||||||
with:
|
with:
|
||||||
python-version: 3.8
|
python-version: 3.8
|
||||||
-
|
-
|
||||||
|
@@ -161,4 +161,4 @@ Some notable features include:
|
|||||||
There are several ways to [access the dashboard](https://discourse.pi-hole.net/t/how-do-i-access-pi-holes-dashboard-admin-interface/3168):
|
There are several ways to [access the dashboard](https://discourse.pi-hole.net/t/how-do-i-access-pi-holes-dashboard-admin-interface/3168):
|
||||||
|
|
||||||
1. `http://pi.hole/admin/` (when using Pi-hole as your DNS server)
|
1. `http://pi.hole/admin/` (when using Pi-hole as your DNS server)
|
||||||
2. `http://<IP_ADDPRESS_OF_YOUR_PI_HOLE>/admin/`
|
2. `http://<IP_ADDRESS_OF_YOUR_PI_HOLE>/admin/`
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
# Determine if terminal is capable of showing colors
|
# Determine if terminal is capable of showing colors
|
||||||
if [[ -t 1 ]] && [[ $(tput colors) -ge 8 ]]; then
|
if ([[ -t 1 ]] && [[ $(tput colors) -ge 8 ]]) || [[ "${WEBCALL}" ]]; then
|
||||||
# Bold and underline may not show up on all clients
|
# Bold and underline may not show up on all clients
|
||||||
# If something MUST be emphasized, use both
|
# If something MUST be emphasized, use both
|
||||||
COL_BOLD='[1m'
|
COL_BOLD='[1m'
|
||||||
|
@@ -906,9 +906,11 @@ dig_at() {
|
|||||||
# Removes all interfaces which are not UP
|
# Removes all interfaces which are not UP
|
||||||
# s/^[0-9]*: //g;
|
# s/^[0-9]*: //g;
|
||||||
# Removes interface index
|
# Removes interface index
|
||||||
|
# s/@.*//g;
|
||||||
|
# Removes everything after @ (if found)
|
||||||
# s/: <.*//g;
|
# s/: <.*//g;
|
||||||
# Removes everything after the interface name
|
# Removes everything after the interface name
|
||||||
interfaces="$(ip link show | sed "/ master /d;/UP/!d;s/^[0-9]*: //g;s/: <.*//g;")"
|
interfaces="$(ip link show | sed "/ master /d;/UP/!d;s/^[0-9]*: //g;s/@.*//g;s/: <.*//g;")"
|
||||||
|
|
||||||
while IFS= read -r iface ; do
|
while IFS= read -r iface ; do
|
||||||
# Get addresses of current interface
|
# Get addresses of current interface
|
||||||
@@ -1273,7 +1275,7 @@ show_clients() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show_messages() {
|
show_messages() {
|
||||||
show_FTL_db_entries "Pi-hole diagnosis messages" "SELECT id,datetime(timestamp,'unixepoch','localtime') timestamp,type,message,blob1,blob2,blob3,blob4,blob5 FROM message;" "4 19 20 60 20 20 20 20 20"
|
show_FTL_db_entries "Pi-hole diagnosis messages" "SELECT count (message) as count, datetime(max(timestamp),'unixepoch','localtime') as 'last timestamp', type, message, blob1, blob2, blob3, blob4, blob5 FROM message GROUP BY type, message, blob1, blob2, blob3, blob4, blob5;" "6 19 20 60 20 20 20 20 20"
|
||||||
}
|
}
|
||||||
|
|
||||||
analyze_gravity_list() {
|
analyze_gravity_list() {
|
||||||
|
@@ -64,8 +64,8 @@ Example: 'pihole -q -exact domain.com'
|
|||||||
Query the adlists for a specified domain
|
Query the adlists for a specified domain
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
-exact Search the block lists for exact domain matches
|
-exact Search the adlists for exact domain matches
|
||||||
-all Return all query matches within a block list
|
-all Return all query matches within the adlists
|
||||||
-h, --help Show this help dialog"
|
-h, --help Show this help dialog"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
@@ -210,7 +210,7 @@ mapfile -t results <<< "$(scanDatabaseTable "${domainQuery}" "gravity")"
|
|||||||
|
|
||||||
# Handle notices
|
# Handle notices
|
||||||
if [[ -z "${wbMatch:-}" ]] && [[ -z "${wcMatch:-}" ]] && [[ -z "${results[*]}" ]]; then
|
if [[ -z "${wbMatch:-}" ]] && [[ -z "${wcMatch:-}" ]] && [[ -z "${results[*]}" ]]; then
|
||||||
echo -e " ${INFO} No ${exact/t/t }results found for ${COL_BOLD}${domainQuery}${COL_NC} within the block lists"
|
echo -e " ${INFO} No ${exact/t/t }results found for ${COL_BOLD}${domainQuery}${COL_NC} within the adlists"
|
||||||
exit 0
|
exit 0
|
||||||
elif [[ -z "${results[*]}" ]]; then
|
elif [[ -z "${results[*]}" ]]; then
|
||||||
# Result found in WL/BL/Wildcards
|
# Result found in WL/BL/Wildcards
|
||||||
|
@@ -1,4 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env sh
|
||||||
|
# shellcheck disable=SC3043 #https://github.com/koalaman/shellcheck/wiki/SC3043#exceptions
|
||||||
|
|
||||||
# Pi-hole: A black hole for Internet advertisements
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
||||||
# Network-wide ad blocking via your own hardware.
|
# Network-wide ad blocking via your own hardware.
|
||||||
@@ -15,21 +17,82 @@
|
|||||||
# - 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
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
# Takes three arguments key, value, and file.
|
# Takes Three arguments: file, key, and value.
|
||||||
|
#
|
||||||
# Checks the target file for the existence of the key
|
# Checks the target file for the existence of the key
|
||||||
# - If it exists, it changes the value
|
# - If it exists, it changes the value
|
||||||
# - If it does not exist, it adds the value
|
# - If it does not exist, it adds the value
|
||||||
#
|
#
|
||||||
# Example usage:
|
# Example usage:
|
||||||
# addOrEditKeyValuePair "BLOCKING_ENABLED" "true" "/etc/pihole/setupVars.conf"
|
# addOrEditKeyValPair "/etc/pihole/setupVars.conf" "BLOCKING_ENABLED" "true"
|
||||||
#######################
|
#######################
|
||||||
addOrEditKeyValPair() {
|
addOrEditKeyValPair() {
|
||||||
local key="${1}"
|
local file="${1}"
|
||||||
local value="${2}"
|
local key="${2}"
|
||||||
local file="${3}"
|
local value="${3}"
|
||||||
|
|
||||||
if grep -q "^${key}=" "${file}"; then
|
if grep -q "^${key}=" "${file}"; then
|
||||||
sed -i "/^${key}=/c\\${key}=${value}" "${file}"
|
# Key already exists in file, modify the value
|
||||||
|
sed -i "/^${key}=/c\\${key}=${value}" "${file}"
|
||||||
else
|
else
|
||||||
|
# Key does not already exist, add it and it's value
|
||||||
echo "${key}=${value}" >> "${file}"
|
echo "${key}=${value}" >> "${file}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# Takes two arguments: file, and key.
|
||||||
|
# Adds a key to target file
|
||||||
|
#
|
||||||
|
# Example usage:
|
||||||
|
# addKey "/etc/dnsmasq.d/01-pihole.conf" "log-queries"
|
||||||
|
#######################
|
||||||
|
addKey(){
|
||||||
|
local file="${1}"
|
||||||
|
local key="${2}"
|
||||||
|
|
||||||
|
if ! grep -q "^${key}" "${file}"; then
|
||||||
|
# Key does not exist, add it.
|
||||||
|
echo "${key}" >> "${file}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# Takes two arguments: file, and key.
|
||||||
|
# Deletes a key or key/value pair from target file
|
||||||
|
#
|
||||||
|
# Example usage:
|
||||||
|
# removeKey "/etc/pihole/setupVars.conf" "PIHOLE_DNS_1"
|
||||||
|
#######################
|
||||||
|
removeKey() {
|
||||||
|
local file="${1}"
|
||||||
|
local key="${2}"
|
||||||
|
sed -i "/^${key}/d" "${file}"
|
||||||
|
}
|
||||||
|
|
||||||
|
#######################
|
||||||
|
# returns FTL's current telnet API port
|
||||||
|
#######################
|
||||||
|
getFTLAPIPort(){
|
||||||
|
local FTLCONFFILE="/etc/pihole/pihole-FTL.conf"
|
||||||
|
local DEFAULT_PORT_FILE="/run/pihole-FTL.port"
|
||||||
|
local DEFAULT_FTL_PORT=4711
|
||||||
|
local PORTFILE
|
||||||
|
local ftl_api_port
|
||||||
|
|
||||||
|
if [ -f "$FTLCONFFILE" ]; then
|
||||||
|
# if PORTFILE is not set in pihole-FTL.conf, use the default path
|
||||||
|
PORTFILE="$( (grep "^PORTFILE=" $FTLCONFFILE || echo "$DEFAULT_PORT_FILE") | cut -d"=" -f2-)"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -s "$PORTFILE" ]; then
|
||||||
|
# -s: FILE exists and has a size greater than zero
|
||||||
|
ftl_api_port=$(cat "${PORTFILE}")
|
||||||
|
# Exploit prevention: unset the variable if there is malicious content
|
||||||
|
# Verify that the value read from the file is numeric
|
||||||
|
expr "$ftl_api_port" : "[^[:digit:]]" > /dev/null && unset ftl_api_port
|
||||||
|
fi
|
||||||
|
|
||||||
|
# echo the port found in the portfile or default to the default port
|
||||||
|
echo "${ftl_api_port:=$DEFAULT_FTL_PORT}"
|
||||||
|
}
|
||||||
|
@@ -1,5 +1,7 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# shellcheck disable=SC1090
|
# shellcheck disable=SC1090
|
||||||
|
# shellcheck disable=SC2154
|
||||||
|
|
||||||
|
|
||||||
# Pi-hole: A black hole for Internet advertisements
|
# Pi-hole: A black hole for Internet advertisements
|
||||||
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
# (c) 2017 Pi-hole, LLC (https://pi-hole.net)
|
||||||
@@ -26,6 +28,9 @@ readonly PI_HOLE_FILES_DIR="/etc/.pihole"
|
|||||||
PH_TEST="true"
|
PH_TEST="true"
|
||||||
source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh"
|
source "${PI_HOLE_FILES_DIR}/automated install/basic-install.sh"
|
||||||
|
|
||||||
|
readonly utilsfile="/opt/pihole/utils.sh"
|
||||||
|
source "${utilsfile}"
|
||||||
|
|
||||||
coltable="/opt/pihole/COL_TABLE"
|
coltable="/opt/pihole/COL_TABLE"
|
||||||
if [[ -f ${coltable} ]]; then
|
if [[ -f ${coltable} ]]; then
|
||||||
source ${coltable}
|
source ${coltable}
|
||||||
@@ -51,41 +56,35 @@ Options:
|
|||||||
}
|
}
|
||||||
|
|
||||||
add_setting() {
|
add_setting() {
|
||||||
echo "${1}=${2}" >> "${setupVars}"
|
addOrEditKeyValPair "${setupVars}" "${1}" "${2}"
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_setting() {
|
delete_setting() {
|
||||||
sed -i "/^${1}/d" "${setupVars}"
|
removeKey "${setupVars}" "${1}"
|
||||||
}
|
}
|
||||||
|
|
||||||
change_setting() {
|
change_setting() {
|
||||||
delete_setting "${1}"
|
addOrEditKeyValPair "${setupVars}" "${1}" "${2}"
|
||||||
add_setting "${1}" "${2}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addFTLsetting() {
|
addFTLsetting() {
|
||||||
echo "${1}=${2}" >> "${FTLconf}"
|
addOrEditKeyValPair "${FTLconf}" "${1}" "${2}"
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteFTLsetting() {
|
deleteFTLsetting() {
|
||||||
sed -i "/^${1}/d" "${FTLconf}"
|
removeKey "${FTLconf}" "${1}"
|
||||||
}
|
}
|
||||||
|
|
||||||
changeFTLsetting() {
|
changeFTLsetting() {
|
||||||
deleteFTLsetting "${1}"
|
addOrEditKeyValPair "${FTLconf}" "${1}" "${2}"
|
||||||
addFTLsetting "${1}" "${2}"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
add_dnsmasq_setting() {
|
add_dnsmasq_setting() {
|
||||||
if [[ "${2}" != "" ]]; then
|
addOrEditKeyValPair "${dnsmasqconfig}" "${1}" "${2}"
|
||||||
echo "${1}=${2}" >> "${dnsmasqconfig}"
|
|
||||||
else
|
|
||||||
echo "${1}" >> "${dnsmasqconfig}"
|
|
||||||
fi
|
|
||||||
}
|
}
|
||||||
|
|
||||||
delete_dnsmasq_setting() {
|
delete_dnsmasq_setting() {
|
||||||
sed -i "/^${1}/d" "${dnsmasqconfig}"
|
removeKey "${dnsmasqconfig}" "${1}"
|
||||||
}
|
}
|
||||||
|
|
||||||
SetTemperatureUnit() {
|
SetTemperatureUnit() {
|
||||||
@@ -183,7 +182,7 @@ ProcessDNSSettings() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
delete_dnsmasq_setting "dnssec"
|
delete_dnsmasq_setting "dnssec"
|
||||||
delete_dnsmasq_setting "trust-anchor="
|
delete_dnsmasq_setting "trust-anchor"
|
||||||
|
|
||||||
if [[ "${DNSSEC}" == true ]]; then
|
if [[ "${DNSSEC}" == true ]]; then
|
||||||
echo "dnssec
|
echo "dnssec
|
||||||
@@ -808,6 +807,23 @@ RemoveCustomCNAMERecord() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SetRateLimit() {
|
||||||
|
local rate_limit_count rate_limit_interval reload
|
||||||
|
rate_limit_count="${args[2]}"
|
||||||
|
rate_limit_interval="${args[3]}"
|
||||||
|
reload="${args[4]}"
|
||||||
|
|
||||||
|
# Set rate-limit setting inf valid
|
||||||
|
if [ "${rate_limit_count}" -ge 0 ] && [ "${rate_limit_interval}" -ge 0 ]; then
|
||||||
|
changeFTLsetting "RATE_LIMIT" "${rate_limit_count}/${rate_limit_interval}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Restart FTL to update rate-limit settings only if $reload not false
|
||||||
|
if [[ ! $reload == "false" ]]; then
|
||||||
|
RestartDNS
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
args=("$@")
|
args=("$@")
|
||||||
|
|
||||||
@@ -841,6 +857,7 @@ main() {
|
|||||||
"removecustomdns" ) RemoveCustomDNSAddress;;
|
"removecustomdns" ) RemoveCustomDNSAddress;;
|
||||||
"addcustomcname" ) AddCustomCNAMERecord;;
|
"addcustomcname" ) AddCustomCNAMERecord;;
|
||||||
"removecustomcname" ) RemoveCustomCNAMERecord;;
|
"removecustomcname" ) RemoveCustomCNAMERecord;;
|
||||||
|
"ratelimit" ) SetRateLimit;;
|
||||||
* ) helpFunc;;
|
* ) helpFunc;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
@@ -21,12 +21,15 @@ start() {
|
|||||||
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
|
||||||
touch /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases
|
[ ! -f /run/pihole-FTL.pid ] && install -m 644 -o pihole -g pihole /dev/null /run/pihole-FTL.pid
|
||||||
|
[ ! -f /run/pihole-FTL.port ] && install -m 644 -o pihole -g pihole /dev/null /run/pihole-FTL.port
|
||||||
|
[ ! -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 /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-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases /run/pihole /etc/pihole
|
chown pihole:pihole /run/pihole /etc/pihole /var/log/pihole.log /var/log/pihole.log /etc/pihole/dhcp.leases
|
||||||
chmod 0644 /run/pihole-FTL.pid /run/pihole-FTL.port /var/log/pihole-FTL.log /var/log/pihole.log /etc/pihole/dhcp.leases
|
|
||||||
# Ensure that permissions are set so that pihole-FTL can edit 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
|
chmod -f 0644 /etc/pihole/macvendor.db /etc/pihole/dhcp.leases /var/log/pihole-FTL.log /var/log/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
|
||||||
|
@@ -164,13 +164,35 @@ ini_set("default_socket_timeout", 3);
|
|||||||
function queryAds($serverName) {
|
function queryAds($serverName) {
|
||||||
// Determine the time it takes while querying adlists
|
// Determine the time it takes while querying adlists
|
||||||
$preQueryTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
|
$preQueryTime = microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"];
|
||||||
|
|
||||||
|
// Determine which protocol should be used
|
||||||
|
$protocol = "http";
|
||||||
|
if ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ||
|
||||||
|
(isset($_SERVER['REQUEST_SCHEME']) && $_SERVER['REQUEST_SCHEME'] === 'https') ||
|
||||||
|
(isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
|
||||||
|
) {
|
||||||
|
$protocol = "https";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Format the URL
|
||||||
$queryAdsURL = sprintf(
|
$queryAdsURL = sprintf(
|
||||||
"http://127.0.0.1:%s/admin/scripts/pi-hole/php/queryads.php?domain=%s&bp",
|
"%s://127.0.0.1:%s/admin/scripts/pi-hole/php/queryads.php?domain=%s&bp",
|
||||||
|
$protocol,
|
||||||
$_SERVER["SERVER_PORT"],
|
$_SERVER["SERVER_PORT"],
|
||||||
$serverName
|
$serverName
|
||||||
);
|
);
|
||||||
$queryAds = file($queryAdsURL, FILE_IGNORE_NEW_LINES);
|
|
||||||
$queryAds = array_values(array_filter(preg_replace("/data:\s+/", "", $queryAds)));
|
// Request the file and receive the response
|
||||||
|
$queryAdsFile = file($queryAdsURL, FILE_IGNORE_NEW_LINES);
|
||||||
|
|
||||||
|
// $queryAdsFile must be an array (to avoid PHP 8.0+ error)
|
||||||
|
if (is_array($queryAdsFile)) {
|
||||||
|
$queryAds = array_values(array_filter(preg_replace("/data:\s+/", "", $queryAdsFile)));
|
||||||
|
} else {
|
||||||
|
// if not an array, return an error message
|
||||||
|
return array("0" => "error", "1" => "<br>(".gettype($queryAdsFile).")<br>".print_r($queryAdsFile, true));
|
||||||
|
}
|
||||||
|
|
||||||
$queryTime = sprintf("%.0f", (microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]) - $preQueryTime);
|
$queryTime = sprintf("%.0f", (microtime(true)-$_SERVER["REQUEST_TIME_FLOAT"]) - $preQueryTime);
|
||||||
|
|
||||||
// Exception Handling
|
// Exception Handling
|
||||||
|
@@ -36,6 +36,11 @@ server.port = 80
|
|||||||
accesslog.filename = "/var/log/lighttpd/access.log"
|
accesslog.filename = "/var/log/lighttpd/access.log"
|
||||||
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
||||||
|
|
||||||
|
# Allow streaming response
|
||||||
|
# reference: https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_stream-response-bodyDetails
|
||||||
|
server.stream-response-body = 1
|
||||||
|
#ssl.read-ahead = "disable"
|
||||||
|
|
||||||
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
|
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
|
||||||
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
|
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
|
||||||
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
|
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
|
||||||
|
@@ -37,6 +37,11 @@ server.port = 80
|
|||||||
accesslog.filename = "/var/log/lighttpd/access.log"
|
accesslog.filename = "/var/log/lighttpd/access.log"
|
||||||
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
accesslog.format = "%{%s}t|%V|%r|%s|%b"
|
||||||
|
|
||||||
|
# Allow streaming response
|
||||||
|
# reference: https://redmine.lighttpd.net/projects/lighttpd/wiki/Server_stream-response-bodyDetails
|
||||||
|
server.stream-response-body = 1
|
||||||
|
#ssl.read-ahead = "disable"
|
||||||
|
|
||||||
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
|
index-file.names = ( "index.php", "index.html", "index.lighttpd.html" )
|
||||||
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
|
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
|
||||||
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
|
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )
|
||||||
|
@@ -259,6 +259,29 @@ os_check() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# This function waits for dpkg to unlock, which signals that the previous apt-get command has finished.
|
||||||
|
test_dpkg_lock() {
|
||||||
|
i=0
|
||||||
|
printf " %b Waiting for package manager to finish (up to 30 seconds)\\n" "${INFO}"
|
||||||
|
# fuser is a program to show which processes use the named files, sockets, or filesystems
|
||||||
|
# So while the lock is held,
|
||||||
|
while fuser /var/lib/dpkg/lock >/dev/null 2>&1
|
||||||
|
do
|
||||||
|
# we wait half a second,
|
||||||
|
sleep 0.5
|
||||||
|
# increase the iterator,
|
||||||
|
((i=i+1))
|
||||||
|
# exit if waiting for more then 30 seconds
|
||||||
|
if [[ $i -gt 60 ]]; then
|
||||||
|
printf " %b %bError: Could not verify package manager finished and released lock. %b\\n" "${CROSS}" "${COL_LIGHT_RED}" "${COL_NC}"
|
||||||
|
printf " Attempt to install packages manually and retry.\\n"
|
||||||
|
exit 1;
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
# and then report success once dpkg is unlocked.
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
# Compatibility
|
# Compatibility
|
||||||
package_manager_detect() {
|
package_manager_detect() {
|
||||||
# First check to see if apt-get is installed.
|
# First check to see if apt-get is installed.
|
||||||
@@ -287,7 +310,7 @@ package_manager_detect() {
|
|||||||
# 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 whiptail 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)
|
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)
|
||||||
# It's useful to separate this from Pi-hole, since the two repos are also setup separately
|
# It's useful to separate this from Pi-hole, since the two repos are also setup separately
|
||||||
PIHOLE_WEB_DEPS=(lighttpd "${phpVer}-common" "${phpVer}-cgi" "${phpVer}-sqlite3" "${phpVer}-xml" "${phpVer}-intl")
|
PIHOLE_WEB_DEPS=(lighttpd "${phpVer}-common" "${phpVer}-cgi" "${phpVer}-sqlite3" "${phpVer}-xml" "${phpVer}-intl")
|
||||||
@@ -302,22 +325,6 @@ package_manager_detect() {
|
|||||||
# and config file
|
# and config file
|
||||||
LIGHTTPD_CFG="lighttpd.conf.debian"
|
LIGHTTPD_CFG="lighttpd.conf.debian"
|
||||||
|
|
||||||
# This function waits for dpkg to unlock, which signals that the previous apt-get command has finished.
|
|
||||||
test_dpkg_lock() {
|
|
||||||
i=0
|
|
||||||
# fuser is a program to show which processes use the named files, sockets, or filesystems
|
|
||||||
# So while the lock is held,
|
|
||||||
while fuser /var/lib/dpkg/lock >/dev/null 2>&1
|
|
||||||
do
|
|
||||||
# we wait half a second,
|
|
||||||
sleep 0.5
|
|
||||||
# increase the iterator,
|
|
||||||
((i=i+1))
|
|
||||||
done
|
|
||||||
# and then report success once dpkg is unlocked.
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
|
|
||||||
# If apt-get is not found, check for rpm.
|
# If apt-get is not found, check for rpm.
|
||||||
elif is_command rpm ; then
|
elif is_command rpm ; then
|
||||||
# Then check if dnf or yum is the package manager
|
# Then check if dnf or yum is the package manager
|
||||||
@@ -1128,8 +1135,11 @@ chooseBlocklists() {
|
|||||||
appendToListsFile "${choice}"
|
appendToListsFile "${choice}"
|
||||||
done
|
done
|
||||||
# Create an empty adList file with appropriate permissions.
|
# Create an empty adList file with appropriate permissions.
|
||||||
touch "${adlistFile}"
|
if [ ! -f "${adlistFile}" ]; then
|
||||||
chmod 644 "${adlistFile}"
|
install -m 644 /dev/null "${adlistFile}"
|
||||||
|
else
|
||||||
|
chmod 644 "${adlistFile}"
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
# Accept a string parameter, it must be one of the default lists
|
# Accept a string parameter, it must be one of the default lists
|
||||||
@@ -1330,8 +1340,9 @@ installConfigs() {
|
|||||||
# and copy in the config file Pi-hole needs
|
# and copy in the config file Pi-hole needs
|
||||||
install -D -m 644 -T ${PI_HOLE_LOCAL_REPO}/advanced/${LIGHTTPD_CFG} "${lighttpdConfig}"
|
install -D -m 644 -T ${PI_HOLE_LOCAL_REPO}/advanced/${LIGHTTPD_CFG} "${lighttpdConfig}"
|
||||||
# Make sure the external.conf file exists, as lighttpd v1.4.50 crashes without it
|
# Make sure the external.conf file exists, as lighttpd v1.4.50 crashes without it
|
||||||
touch /etc/lighttpd/external.conf
|
if [ ! -f /etc/lighttpd/external.conf ]; then
|
||||||
chmod 644 /etc/lighttpd/external.conf
|
install -m 644 /dev/null /etc/lighttpd/external.conf
|
||||||
|
fi
|
||||||
# If there is a custom block page in the html/pihole directory, replace 404 handler in lighttpd config
|
# If there is a custom block page in the html/pihole directory, replace 404 handler in lighttpd config
|
||||||
if [[ -f "${PI_HOLE_BLOCKPAGE_DIR}/custom.php" ]]; then
|
if [[ -f "${PI_HOLE_BLOCKPAGE_DIR}/custom.php" ]]; then
|
||||||
sed -i 's/^\(server\.error-handler-404\s*=\s*\).*$/\1"\/pihole\/custom\.php"/' "${lighttpdConfig}"
|
sed -i 's/^\(server\.error-handler-404\s*=\s*\).*$/\1"\/pihole\/custom\.php"/' "${lighttpdConfig}"
|
||||||
|
59
pihole
59
pihole
@@ -226,7 +226,7 @@ Time:
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
local str="Pi-hole Disabled"
|
local str="Pi-hole Disabled"
|
||||||
addOrEditKeyValPair "BLOCKING_ENABLED" "false" "${setupVars}"
|
addOrEditKeyValPair "${setupVars}" "BLOCKING_ENABLED" "false"
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
# Enable Pi-hole
|
# Enable Pi-hole
|
||||||
@@ -238,7 +238,7 @@ Time:
|
|||||||
echo -e " ${INFO} Enabling blocking"
|
echo -e " ${INFO} Enabling blocking"
|
||||||
local str="Pi-hole Enabled"
|
local str="Pi-hole Enabled"
|
||||||
|
|
||||||
addOrEditKeyValPair "BLOCKING_ENABLED" "true" "${setupVars}"
|
addOrEditKeyValPair "${setupVars}" "BLOCKING_ENABLED" "true"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
restartDNS reload-lists
|
restartDNS reload-lists
|
||||||
@@ -260,8 +260,8 @@ Options:
|
|||||||
exit 0
|
exit 0
|
||||||
elif [[ "${1}" == "off" ]]; then
|
elif [[ "${1}" == "off" ]]; then
|
||||||
# Disable logging
|
# Disable logging
|
||||||
sed -i 's/^log-queries/#log-queries/' /etc/dnsmasq.d/01-pihole.conf
|
removeKey /etc/dnsmasq.d/01-pihole.conf "log-queries"
|
||||||
addOrEditKeyValPair "QUERY_LOGGING" "false" "${setupVars}"
|
addOrEditKeyValPair "${setupVars}" "QUERY_LOGGING" "false"
|
||||||
if [[ "${2}" != "noflush" ]]; then
|
if [[ "${2}" != "noflush" ]]; then
|
||||||
# Flush logs
|
# Flush logs
|
||||||
"${PI_HOLE_BIN_DIR}"/pihole -f
|
"${PI_HOLE_BIN_DIR}"/pihole -f
|
||||||
@@ -270,8 +270,8 @@ Options:
|
|||||||
local str="Logging has been disabled!"
|
local str="Logging has been disabled!"
|
||||||
elif [[ "${1}" == "on" ]]; then
|
elif [[ "${1}" == "on" ]]; then
|
||||||
# Enable logging
|
# Enable logging
|
||||||
sed -i 's/^#log-queries/log-queries/' /etc/dnsmasq.d/01-pihole.conf
|
addKey /etc/dnsmasq.d/01-pihole.conf "log-queries"
|
||||||
addOrEditKeyValPair "QUERY_LOGGING" "true" "${setupVars}"
|
addOrEditKeyValPair "${setupVars}" "QUERY_LOGGING" "true"
|
||||||
echo -e " ${INFO} Enabling logging..."
|
echo -e " ${INFO} Enabling logging..."
|
||||||
local str="Logging has been enabled!"
|
local str="Logging has been enabled!"
|
||||||
else
|
else
|
||||||
@@ -316,9 +316,10 @@ analyze_ports() {
|
|||||||
|
|
||||||
statusFunc() {
|
statusFunc() {
|
||||||
# Determine if there is pihole-FTL service is listening
|
# Determine if there is pihole-FTL service is listening
|
||||||
local listening pid port
|
local pid port ftl_api_port
|
||||||
|
|
||||||
pid="$(getFTLPID)"
|
pid="$(getFTLPID)"
|
||||||
|
ftl_api_port="$(getFTLAPIPort)"
|
||||||
if [[ "$pid" -eq "-1" ]]; then
|
if [[ "$pid" -eq "-1" ]]; then
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
"web") echo "-1";;
|
"web") echo "-1";;
|
||||||
@@ -326,8 +327,8 @@ statusFunc() {
|
|||||||
esac
|
esac
|
||||||
return 0
|
return 0
|
||||||
else
|
else
|
||||||
#get the port pihole-FTL is listening on by using FTL's telnet API
|
#get the DNS port pihole-FTL is listening on by using FTL's telnet API
|
||||||
port="$(echo ">dns-port >quit" | nc 127.0.0.1 4711)"
|
port="$(echo ">dns-port >quit" | nc 127.0.0.1 "$ftl_api_port")"
|
||||||
if [[ "${port}" == "0" ]]; then
|
if [[ "${port}" == "0" ]]; then
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
"web") echo "-1";;
|
"web") echo "-1";;
|
||||||
@@ -364,7 +365,7 @@ statusFunc() {
|
|||||||
# Enable blocking
|
# Enable blocking
|
||||||
"${PI_HOLE_BIN_DIR}"/pihole enable
|
"${PI_HOLE_BIN_DIR}"/pihole enable
|
||||||
fi
|
fi
|
||||||
|
exit 0
|
||||||
}
|
}
|
||||||
|
|
||||||
tailFunc() {
|
tailFunc() {
|
||||||
@@ -495,8 +496,38 @@ if [[ $# = 0 ]]; then
|
|||||||
helpFunc
|
helpFunc
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# functions that do not require sudo power
|
||||||
case "${1}" in
|
case "${1}" in
|
||||||
"-h" | "help" | "--help" ) helpFunc;;
|
"-h" | "help" | "--help" ) helpFunc;;
|
||||||
|
"-v" | "version" ) versionFunc "$@";;
|
||||||
|
"-c" | "chronometer" ) chronometerFunc "$@";;
|
||||||
|
"-q" | "query" ) queryFunc "$@";;
|
||||||
|
"status" ) statusFunc "$2";;
|
||||||
|
"-t" | "tail" ) tailFunc "$2";;
|
||||||
|
"tricorder" ) tricorderFunc;;
|
||||||
|
|
||||||
|
# we need to add all arguments that require sudo power to not trigger the * argument
|
||||||
|
"-w" | "whitelist" ) ;;
|
||||||
|
"-b" | "blacklist" ) ;;
|
||||||
|
"--wild" | "wildcard" ) ;;
|
||||||
|
"--regex" | "regex" ) ;;
|
||||||
|
"--white-regex" | "white-regex" ) ;;
|
||||||
|
"--white-wild" | "white-wild" ) ;;
|
||||||
|
"-f" | "flush" ) ;;
|
||||||
|
"-up" | "updatePihole" ) ;;
|
||||||
|
"-r" | "reconfigure" ) ;;
|
||||||
|
"-g" | "updateGravity" ) ;;
|
||||||
|
"-l" | "logging" ) ;;
|
||||||
|
"uninstall" ) ;;
|
||||||
|
"enable" ) ;;
|
||||||
|
"disable" ) ;;
|
||||||
|
"-d" | "debug" ) ;;
|
||||||
|
"restartdns" ) ;;
|
||||||
|
"-a" | "admin" ) ;;
|
||||||
|
"checkout" ) ;;
|
||||||
|
"updatechecker" ) ;;
|
||||||
|
"arpflush" ) ;;
|
||||||
|
* ) helpFunc;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
# Must be root to use this tool
|
# Must be root to use this tool
|
||||||
@@ -523,21 +554,13 @@ case "${1}" in
|
|||||||
"-up" | "updatePihole" ) updatePiholeFunc "$@";;
|
"-up" | "updatePihole" ) updatePiholeFunc "$@";;
|
||||||
"-r" | "reconfigure" ) reconfigurePiholeFunc;;
|
"-r" | "reconfigure" ) reconfigurePiholeFunc;;
|
||||||
"-g" | "updateGravity" ) updateGravityFunc "$@";;
|
"-g" | "updateGravity" ) updateGravityFunc "$@";;
|
||||||
"-c" | "chronometer" ) chronometerFunc "$@";;
|
|
||||||
"-h" | "help" ) helpFunc;;
|
|
||||||
"-v" | "version" ) versionFunc "$@";;
|
|
||||||
"-q" | "query" ) queryFunc "$@";;
|
|
||||||
"-l" | "logging" ) piholeLogging "$@";;
|
"-l" | "logging" ) piholeLogging "$@";;
|
||||||
"uninstall" ) uninstallFunc;;
|
"uninstall" ) uninstallFunc;;
|
||||||
"enable" ) piholeEnable 1;;
|
"enable" ) piholeEnable 1;;
|
||||||
"disable" ) piholeEnable 0 "$2";;
|
"disable" ) piholeEnable 0 "$2";;
|
||||||
"status" ) statusFunc "$2";;
|
|
||||||
"restartdns" ) restartDNS "$2";;
|
"restartdns" ) restartDNS "$2";;
|
||||||
"-a" | "admin" ) webpageFunc "$@";;
|
"-a" | "admin" ) webpageFunc "$@";;
|
||||||
"-t" | "tail" ) tailFunc "$2";;
|
|
||||||
"checkout" ) piholeCheckoutFunc "$@";;
|
"checkout" ) piholeCheckoutFunc "$@";;
|
||||||
"tricorder" ) tricorderFunc;;
|
|
||||||
"updatechecker" ) updateCheckFunc "$@";;
|
"updatechecker" ) updateCheckFunc "$@";;
|
||||||
"arpflush" ) arpFunc "$@";;
|
"arpflush" ) arpFunc "$@";;
|
||||||
* ) helpFunc;;
|
|
||||||
esac
|
esac
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
FROM buildpack-deps:hirsute-scm
|
FROM buildpack-deps:impish-scm
|
||||||
|
|
||||||
ENV GITDIR /etc/.pihole
|
ENV GITDIR /etc/.pihole
|
||||||
ENV SCRIPTDIR /opt/pihole
|
ENV SCRIPTDIR /opt/pihole
|
||||||
|
@@ -1,16 +1,56 @@
|
|||||||
def test_key_val_replacement_works(host):
|
def test_key_val_replacement_works(host):
|
||||||
''' Confirms addOrEditKeyValPair provides the expected output '''
|
''' Confirms addOrEditKeyValPair provides the expected output '''
|
||||||
host.run('''
|
host.run('''
|
||||||
setupvars=./testoutput
|
|
||||||
source /opt/pihole/utils.sh
|
source /opt/pihole/utils.sh
|
||||||
addOrEditKeyValPair "KEY_ONE" "value1" "./testoutput"
|
addOrEditKeyValPair "./testoutput" "KEY_ONE" "value1"
|
||||||
addOrEditKeyValPair "KEY_TWO" "value2" "./testoutput"
|
addOrEditKeyValPair "./testoutput" "KEY_TWO" "value2"
|
||||||
addOrEditKeyValPair "KEY_ONE" "value3" "./testoutput"
|
addOrEditKeyValPair "./testoutput" "KEY_ONE" "value3"
|
||||||
addOrEditKeyValPair "KEY_FOUR" "value4" "./testoutput"
|
addOrEditKeyValPair "./testoutput" "KEY_FOUR" "value4"
|
||||||
cat ./testoutput
|
addKey "./testoutput" "KEY_FIVE_NO_VALUE"
|
||||||
|
addKey "./testoutput" "KEY_FIVE_NO_VALUE"
|
||||||
''')
|
''')
|
||||||
output = host.run('''
|
output = host.run('''
|
||||||
cat ./testoutput
|
cat ./testoutput
|
||||||
''')
|
''')
|
||||||
expected_stdout = 'KEY_ONE=value3\nKEY_TWO=value2\nKEY_FOUR=value4\n'
|
expected_stdout = 'KEY_ONE=value3\nKEY_TWO=value2\nKEY_FOUR=value4\nKEY_FIVE_NO_VALUE\n'
|
||||||
|
assert expected_stdout == output.stdout
|
||||||
|
|
||||||
|
|
||||||
|
def test_key_val_removal_works(host):
|
||||||
|
''' Confirms removeKey provides the expected output '''
|
||||||
|
host.run('''
|
||||||
|
source /opt/pihole/utils.sh
|
||||||
|
addOrEditKeyValPair "./testoutput" "KEY_ONE" "value1"
|
||||||
|
addOrEditKeyValPair "./testoutput" "KEY_TWO" "value2"
|
||||||
|
addOrEditKeyValPair "./testoutput" "KEY_THREE" "value3"
|
||||||
|
removeKey "./testoutput" "KEY_TWO"
|
||||||
|
''')
|
||||||
|
output = host.run('''
|
||||||
|
cat ./testoutput
|
||||||
|
''')
|
||||||
|
expected_stdout = 'KEY_ONE=value1\nKEY_THREE=value3\n'
|
||||||
|
assert expected_stdout == output.stdout
|
||||||
|
|
||||||
|
|
||||||
|
def test_getFTLAPIPort_default(host):
|
||||||
|
''' Confirms getFTLAPIPort returns the default API port '''
|
||||||
|
output = host.run('''
|
||||||
|
source /opt/pihole/utils.sh
|
||||||
|
getFTLAPIPort
|
||||||
|
''')
|
||||||
|
expected_stdout = '4711\n'
|
||||||
|
assert expected_stdout == output.stdout
|
||||||
|
|
||||||
|
|
||||||
|
def test_getFTLAPIPort_custom(host):
|
||||||
|
''' Confirms getFTLAPIPort returns a custom API port in a custom PORTFILE location '''
|
||||||
|
host.run('''
|
||||||
|
echo "PORTFILE=/tmp/port.file" > /etc/pihole/pihole-FTL.conf
|
||||||
|
echo "1234" > /tmp/port.file
|
||||||
|
''')
|
||||||
|
output = host.run('''
|
||||||
|
source /opt/pihole/utils.sh
|
||||||
|
getFTLAPIPort
|
||||||
|
''')
|
||||||
|
expected_stdout = '1234\n'
|
||||||
assert expected_stdout == output.stdout
|
assert expected_stdout == output.stdout
|
||||||
|
Reference in New Issue
Block a user