Compare commits

..

39 Commits
master ... PID

Author SHA1 Message Date
Christian König
49c0287d4e Do not exit 1 if pkill killed Pi-hole. Killing is not an error
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-14 23:25:32 +02:00
Christian König
c65c22d60d Do not create pid and port file during service startup. The files are created by FTL itself
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-14 19:47:37 +02:00
Christian König
c942e99941 Guard if no pihole-FTL.conf is present
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-13 21:45:11 +02:00
Christian König
6532f3665e Respect custom PID file location
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-13 21:31:29 +02:00
Christian König
e79ae76866 Unset the right variable
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-04 21:51:32 +02:00
Christian König
dd27e0f157 Use pid file variable also when starting
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-04 10:06:52 +02:00
Christian König
c293af7a5a Do not confuse echo and return
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-04 10:02:03 +02:00
Christian König
6b5e02fc7d Use pid file in pihole-FTL.service
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-04-04 09:41:56 +02:00
Adam Warner
0d74b27101 Merge pull request #4646 from pi-hole/tweak/debug_message
Pool identical messages in debug output
2022-04-02 13:14:44 +01:00
Adam Warner
fe9031b26f Merge pull request #4669 from pi-hole/master
sync: master to development
2022-04-02 00:05:49 +01:00
Adam Warner
063f92f8f4 Merge pull request #4667 from pi-hole/test/hirsute_eol
Hirsute buildpack EOL upstream. Adding impish.
2022-04-01 23:23:35 +01:00
Adam Warner
be6a73f102 Merge pull request #4668 from pi-hole/test/python_3.8
Bump to python action v3. v2 has many changes.
2022-04-01 23:23:24 +01:00
Dan Schaper
69e4e9a2ae Bump to python action v3. v2 has many changes.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2022-04-01 12:53:43 -07:00
Dan Schaper
4230be0c80 Hirsute buildpack EOL upstream. Adding impish.
Signed-off-by: Dan Schaper <dan.schaper@pi-hole.net>
2022-04-01 12:00:14 -07:00
yubiuser
efa99a177e Merge pull request #4664 from rdwebdesign/fix/docker_1015
Remove `@` and following character from interface name
2022-04-01 07:47:43 +02:00
RD WebDesign
5cebceadda Remove @ and following character from interface name
Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-30 21:32:18 -03:00
yubiuser
329c161054 Merge pull request #4659 from rdwebdesign/fix4656_part2
Select the protocol on the blocking page
2022-03-29 21:59:39 +02:00
RD WebDesign
f8e84b3c3f Fix stickler
Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-23 18:45:18 -03:00
RD WebDesign
c9809371ab Selecting the protocol
Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-23 18:33:15 -03:00
yubiuser
a48750e257 Merge pull request #4657 from rdwebdesign/fix4656
Add check to avoid error in PHP 8 on the blocking page
2022-03-22 00:37:57 +01:00
RD WebDesign
0d4c69cc6f Add check to avoid error in PHP 8
and return some information about the unexpected value

Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-21 18:59:46 -03:00
yubiuser
479b2bc075 Merge pull request #4655 from y0ngb1n/fix-wrong-words
Fixed wrong words in `README.md`
2022-03-17 13:46:27 +01:00
Yang Bin
2ade05d60f Fixed wrong words in README.md
Signed-off-by: Yang Bin <y0ngb1n@163.com>
2022-03-17 18:58:37 +08:00
yubiuser
ff5e788889 Merge pull request #4652 from rdwebdesign/debuglog_improvements
Improving debug log
2022-03-16 07:00:59 +01:00
RD WebDesign
ab7d83384f Allow lighttpd to stream responses to browser
Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-15 15:33:56 -03:00
Christian König
48136c5bbc Add last timestamp
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-03-14 19:54:46 +01:00
Christian König
0219e5dfe0 Pool identical messages in debug output
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-03-12 21:00:48 +01:00
Adam Warner
0631cb4984 Merge pull request #4645 from rdwebdesign/color_debug_web
Generate colorful debug logs to web interface
2022-03-12 18:02:49 +00:00
RD WebDesign
40b96e673b Allows colorful debug logs via web interface
Note: needs the AdminLTE code changes to work.

Signed-off-by: RD WebDesign <github@rdwebdesign.com.br>
2022-03-12 02:58:46 -03:00
Adam Warner
36ca858668 Merge pull request #4641 from pi-hole/master
sync: master to development
2022-03-05 15:57:30 +00:00
Adam Warner
16b732fe8a Merge pull request #4629 from pi-hole/tweak/api_port
Tweak/api port
2022-03-05 15:47:35 +00:00
DL6ER
1bf2f8d0b7 Merge pull request #4635 from pi-hole/procps
Add procps to dependencies
2022-03-01 21:11:04 +01:00
Christian König
c756bcb9d1 Add procps to dependencies
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-03-01 09:07:51 +01:00
Christian König
42424b515b Add getFTLAPIPort function
Add ftl_api_port function

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

Use getFTLAPIPort in pihole

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

Use default portfile as fallback

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

Fix stickler

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

Correct variables

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

Apply suggestions from code review

Co-authored-by: DL6ER <DL6ER@users.noreply.github.com>

Add test getFTLAPIPort returing default port

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

Remove unused code from test_key_val_replacement_works

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

Add getFTLAPIPort_custom test

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

Fix output format

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

Add debugging

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

Remove debugging and fix function

Signed-off-by: Christian König <ckoenig@posteo.de>
2022-02-27 18:16:53 +01:00
Adam Warner
bd956b5f16 Merge pull request #4625 from pi-hole/master
sync: master to development
2022-02-20 12:42:21 +00:00
yubiuser
9db19c5e96 Merge pull request #4621 from pi-hole/new/set_rate_limit
Add backend option to set rate-limit from the dashboard
2022-02-19 21:19:57 +01:00
DL6ER
91b4233d3a Add backend option to set rate-limit from the dashboard
Signed-off-by: DL6ER <dl6er@dl6er.de>
2022-02-19 14:46:32 +01:00
Adam Warner
0b905c28c1 Merge pull request #4609 from pi-hole/fix/flush
Fix log flush with new query database schema
2022-02-13 00:38:28 +00:00
Christian König
f4286a4d12 Fix log flush with new query database schema
Signed-off-by: Christian König <ckoenig@posteo.de>
2022-02-12 23:33:19 +01:00
15 changed files with 154 additions and 23 deletions

View File

@@ -37,7 +37,7 @@ jobs:
uses: actions/checkout@v2
-
name: Set up Python 3.8
uses: actions/setup-python@v2
uses: actions/setup-python@v3
with:
python-version: 3.8
-

View File

@@ -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):
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/`

View File

@@ -1,5 +1,5 @@
# 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
# If something MUST be emphasized, use both
COL_BOLD=''

View File

@@ -906,9 +906,11 @@ dig_at() {
# Removes all interfaces which are not UP
# s/^[0-9]*: //g;
# Removes interface index
# s/@.*//g;
# Removes everything after @ (if found)
# s/: <.*//g;
# 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
# Get addresses of current interface
@@ -1273,7 +1275,7 @@ show_clients() {
}
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() {

View File

@@ -63,7 +63,7 @@ else
fi
fi
# Delete most recent 24 hours from FTL's database, leave even older data intact (don't wipe out all history)
deleted=$(pihole-FTL sqlite3 "${DBFILE}" "DELETE FROM queries WHERE timestamp >= strftime('%s','now')-86400; select changes() from queries limit 1")
deleted=$(pihole-FTL sqlite3 "${DBFILE}" "DELETE FROM query_storage WHERE timestamp >= strftime('%s','now')-86400; select changes() from query_storage limit 1")
# Restart pihole-FTL to force reloading history
sudo pihole restartdns

View File

@@ -33,3 +33,30 @@ addOrEditKeyValPair() {
echo "${key}=${value}" >> "${file}"
fi
}
#######################
# returns FTL's current telnet API port
#######################
getFTLAPIPort(){
local -r FTLCONFFILE="/etc/pihole/pihole-FTL.conf"
local -r DEFAULT_PORT_FILE="/run/pihole-FTL.port"
local -r 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=$(<"$PORTFILE")
# Exploit prevention: unset the variable if there is malicious content
# Verify that the value read from the file is numeric
[[ "$ftl_api_port" =~ [^[:digit:]] ]] && 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}"
}

View File

@@ -808,6 +808,23 @@ RemoveCustomCNAMERecord() {
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() {
args=("$@")
@@ -841,6 +858,7 @@ main() {
"removecustomdns" ) RemoveCustomDNSAddress;;
"addcustomcname" ) AddCustomCNAMERecord;;
"removecustomcname" ) RemoveCustomCNAMERecord;;
"ratelimit" ) SetRateLimit;;
* ) helpFunc;;
esac

View File

@@ -9,8 +9,39 @@
# Description: Enable service provided by pihole-FTL daemon
### END INIT INFO
# Get PID of main pihole-FTL process
FTLCONFFILE="/etc/pihole/pihole-FTL.conf"
DEFAULT_PID_FILE="/run/pihole-FTL.pid"
getFTLPID() {
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
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 to the caller
echo "${FTL_PID:=-1}"
}
is_running() {
pgrep -xo "pihole-FTL" > /dev/null
FTL_PID="$(getFTLPID)"
if [ "$FTL_PID" -eq "-1" ]; then
return 1
else
echo 0
fi
}
@@ -21,8 +52,6 @@ start() {
else
# Touch files to ensure they exist (create if non-existing, preserve if existing)
mkdir -pm 0755 /run/pihole
[ ! -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
@@ -47,7 +76,7 @@ start() {
# Stop the service
stop() {
if is_running; then
pkill -xo "pihole-FTL"
pkill -F "${FTL_PID_FILE}"
for i in 1 2 3 4 5; do
if ! is_running; then
break
@@ -60,8 +89,8 @@ stop() {
if is_running; then
echo "Not stopped; may still be shutting down or shutdown may have failed, killing now"
pkill -xo -9 "pihole-FTL"
exit 1
pkill -9 -F "${FTL_PID_FILE}"
exit 0
else
echo "Stopped"
fi
@@ -69,7 +98,7 @@ stop() {
echo "Not running"
fi
# Cleanup
rm -f /run/pihole/FTL.sock /dev/shm/FTL-*
rm -f /run/pihole/FTL.sock /dev/shm/FTL-* "${FTL_PID_FILE}"
echo
}

View File

@@ -164,13 +164,35 @@ ini_set("default_socket_timeout", 3);
function queryAds($serverName) {
// Determine the time it takes while querying adlists
$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(
"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"],
$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);
// Exception Handling

View File

@@ -36,6 +36,11 @@ server.port = 80
accesslog.filename = "/var/log/lighttpd/access.log"
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" )
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

View File

@@ -37,6 +37,11 @@ server.port = 80
accesslog.filename = "/var/log/lighttpd/access.log"
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" )
url.access-deny = ( "~", ".inc", ".md", ".yml", ".ini" )
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi" )

View File

@@ -287,7 +287,7 @@ package_manager_detect() {
# Packages required to run this install script (stored as an array)
INSTALLER_DEPS=(git iproute2 whiptail ca-certificates)
# 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)
# 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")

7
pihole
View File

@@ -316,9 +316,10 @@ analyze_ports() {
statusFunc() {
# Determine if there is pihole-FTL service is listening
local listening pid port
local pid port ftl_api_port
pid="$(getFTLPID)"
ftl_api_port="$(getFTLAPIPort)"
if [[ "$pid" -eq "-1" ]]; then
case "${1}" in
"web") echo "-1";;
@@ -326,8 +327,8 @@ statusFunc() {
esac
return 0
else
#get the port pihole-FTL is listening on by using FTL's telnet API
port="$(echo ">dns-port >quit" | nc 127.0.0.1 4711)"
#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 "$ftl_api_port")"
if [[ "${port}" == "0" ]]; then
case "${1}" in
"web") echo "-1";;

View File

@@ -1,4 +1,4 @@
FROM buildpack-deps:hirsute-scm
FROM buildpack-deps:impish-scm
ENV GITDIR /etc/.pihole
ENV SCRIPTDIR /opt/pihole

View File

@@ -1,16 +1,38 @@
def test_key_val_replacement_works(host):
''' Confirms addOrEditKeyValPair provides the expected output '''
host.run('''
setupvars=./testoutput
source /opt/pihole/utils.sh
addOrEditKeyValPair "KEY_ONE" "value1" "./testoutput"
addOrEditKeyValPair "KEY_TWO" "value2" "./testoutput"
addOrEditKeyValPair "KEY_ONE" "value3" "./testoutput"
addOrEditKeyValPair "KEY_FOUR" "value4" "./testoutput"
cat ./testoutput
''')
output = host.run('''
cat ./testoutput
''')
expected_stdout = 'KEY_ONE=value3\nKEY_TWO=value2\nKEY_FOUR=value4\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