Pi-hole Core v6.4.1 (#6585)

This commit is contained in:
Adam Warner 2026-04-03 17:54:14 +01:00 committed by GitHub
commit d3bbfea9c0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 94 additions and 40 deletions

View file

@ -29,12 +29,12 @@ jobs:
# Initializes the CodeQL tools for scanning.
-
name: Initialize CodeQL
uses: github/codeql-action/init@9e907b5e64f6b83e7804b09294d44122997950d6 #v4.32.3
uses: github/codeql-action/init@c10b8064de6f491fea524254123dbe5e09572f13 #v4.35.1
with:
languages: 'python'
-
name: Autobuild
uses: github/codeql-action/autobuild@9e907b5e64f6b83e7804b09294d44122997950d6 #v4.32.3
uses: github/codeql-action/autobuild@c10b8064de6f491fea524254123dbe5e09572f13 #v4.35.1
-
name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@9e907b5e64f6b83e7804b09294d44122997950d6 #v4.32.3
uses: github/codeql-action/analyze@c10b8064de6f491fea524254123dbe5e09572f13 #v4.35.1

View file

@ -17,7 +17,7 @@ jobs:
issues: write
steps:
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d #v10.1.1
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f #v10.2.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 30

View file

@ -17,7 +17,7 @@ jobs:
pull-requests: write
steps:
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d #v10.1.1
- uses: actions/stale@b5d41d4e1d5dceea10e7104786b73624c18a190f #v10.2.0
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Do not automatically mark PR/issue as stale

View file

@ -43,13 +43,13 @@ jobs:
ignore_words_file: .codespellignore
- name: Get editorconfig-checker
uses: editorconfig-checker/action-editorconfig-checker@4b6cd6190d435e7e084fb35e36a096e98506f7b9 #v2.1.0
uses: editorconfig-checker/action-editorconfig-checker@840e866d93b8e032123c23bac69dece044d4d84c #v2.2.0
- name: Run editorconfig-checker
run: editorconfig-checker
- name: Check python code formatting with black
uses: psf/black@6305bf1ae645ab7541be4f5028a86239316178eb #26.1.0
uses: psf/black@c6755bb741b6481d6b3d3bb563c83fa060db96c9 #26.3.1
with:
src: "./test"
options: "--check --diff --color"

View file

@ -84,7 +84,7 @@ If you'd rather not donate (_which is okay!_), there are other ways you can help
- [Patreon](https://patreon.com/pihole)
- [Hetzner Cloud](https://hetzner.cloud/?ref=7aceisRX3AzA) _affiliate link_
- [Digital Ocean](https://www.digitalocean.com/?refcode=344d234950e1) _affiliate link_
- [Stickermule](https://www.stickermule.com/unlock?ref_id=9127301701&utm_medium=link&utm_source=invite) _earn a $10 credit after your first purchase_
- [Stickermule](https://www.stickermule.com/unlock?ref_id=6055890701&utm_medium=link&utm_source=invite) _earn a $10 credit after your first purchase_
- [Amazon US](https://www.amazon.com/exec/obidos/redirect-home/pihole09-20) _affiliate link_
- Spreading the word about our software and how you have benefited from it

View file

@ -186,7 +186,9 @@ checkout() {
echo -e " ${INFO} Checking for ${COL_YELLOW}${binary}${COL_NC} binary on https://ftl.pi-hole.net"
if check_download_exists "$path"; then
local download_status
check_download_exists "$path" && download_status=0 || download_status=$?
if [ $download_status -eq 0 ]; then
echo " ${TICK} Binary exists"
echo "${2}" > /etc/pihole/ftlbranch
chmod 644 /etc/pihole/ftlbranch
@ -210,15 +212,13 @@ checkout() {
# Update local and remote versions via updatechecker
/opt/pihole/updatecheck.sh
else
local status
status=$?
if [ $status -eq 1 ]; then
if [ $download_status -eq 1 ]; then
# Binary for requested branch is not available, may still be
# int he process of being built or CI build job failed
printf " %b Binary for requested branch is not available, please try again later.\\n" "${CROSS}"
printf " If the issue persists, please contact Pi-hole Support and ask them to re-generate the binary.\\n"
exit 1
elif [ $status -eq 2 ]; then
elif [ $download_status -eq 2 ]; then
printf " %b Unable to download from ftl.pi-hole.net. Please check your Internet connection and try again later.\\n" "${CROSS}"
exit 1
else

View file

@ -41,8 +41,10 @@ else
#OVER="\r\033[K"
fi
# shellcheck source=/dev/null
. /etc/pihole/versions
# shellcheck source=./advanced/Scripts/utils.sh
source /opt/pihole/utils.sh
loadVersionFile /etc/pihole/versions
# Read the value of an FTL config key. The value is printed to stdout.
get_ftl_conf_value() {
@ -169,7 +171,7 @@ initialize_debug() {
# Display that the debug process is beginning
log_write "${COL_PURPLE}*** [ INITIALIZING ]${COL_NC}"
# Timestamp the start of the log
log_write "${INFO} $(date "+%Y-%m-%d:%H:%M:%S") debug log has been initialized."
log_write "${INFO} $(date "+%Y-%m-%d %H:%M:%S") debug log has been initialized."
# Uptime of the system
# credits to https://stackoverflow.com/questions/28353409/bash-format-uptime-to-show-days-hours-minutes
system_uptime=$(uptime | awk -F'( |,|:)+' '{if ($7=="min") m=$6; else {if ($7~/^day/){if ($9=="min") {d=$6;m=$8} else {d=$6;h=$8;m=$9}} else {h=$6;m=$7}}} {print d+0,"days,",h+0,"hours,",m+0,"minutes"}')

View file

@ -15,7 +15,7 @@ if [[ -f ${coltable} ]]; then
source ${coltable}
fi
readonly PI_HOLE_SCRIPT_DIR="/opt/pihole"
PI_HOLE_SCRIPT_DIR="/opt/pihole"
utilsfile="${PI_HOLE_SCRIPT_DIR}/utils.sh"
# shellcheck source=./advanced/Scripts/utils.sh
source "${utilsfile}"

View file

@ -42,6 +42,57 @@ addOrEditKeyValPair() {
fi
}
#######################
# Safely loads key=value pairs from the Pi-hole versions cache file.
# Unlike `source`, this function never executes file content as shell code.
# Only known keys are assigned, and values are validated against a strict
# character allowlist to prevent shell injection.
#
# Takes one argument: path to the versions file
# Returns 0 in all cases (compatible with set -e)
# Example loadVersionFile "/etc/pihole/versions"
#######################
loadVersionFile() {
local file="${1}"
local line key value
[ -f "${file}" ] || return 0
while IFS= read -r line || [ -n "${line}" ]; do
# Skip blank lines and comments
case "${line}" in
''|\#*) continue ;;
esac
# Require KEY=VALUE format (key must be non-empty)
key="${line%%=*}"
value="${line#*=}"
[ -z "${key}" ] && continue
[ "${key}" = "${line}" ] && continue # no '=' found
# Allowlist: only assign known version-file keys
case "${key}" in
CORE_VERSION|CORE_BRANCH|CORE_HASH|\
GITHUB_CORE_VERSION|GITHUB_CORE_HASH|\
WEB_VERSION|WEB_BRANCH|WEB_HASH|\
GITHUB_WEB_VERSION|GITHUB_WEB_HASH|\
FTL_VERSION|FTL_BRANCH|FTL_HASH|\
GITHUB_FTL_VERSION|GITHUB_FTL_HASH|\
DOCKER_VERSION|GITHUB_DOCKER_VERSION) ;;
*) continue ;;
esac
# Validate value: allow only characters safe in version strings and branch names.
# Permits: letters, digits, dot, hyphen, underscore, slash, plus sign, and empty string.
case "${value}" in
*[!a-zA-Z0-9._/+\-]*) continue ;;
esac
# Safe to assign: key is from the allowlist, value contains no shell metacharacters
eval "${key}=\${value}"
done < "${file}"
}
#######################
# returns FTL's PID based on the content of the pihole-FTL.pid file
#

View file

@ -8,17 +8,18 @@
# This file is copyright under the latest version of the EUPL.
# Please see LICENSE file for your rights under this license.
# Source the versions file populated by updatechecker.sh
# shellcheck source=./advanced/Scripts/utils.sh
. /opt/pihole/utils.sh
# Load the versions file populated by updatechecker.sh
cachedVersions="/etc/pihole/versions"
if [ -f ${cachedVersions} ]; then
# shellcheck source=/dev/null
. "$cachedVersions"
if [ -f "${cachedVersions}" ]; then
loadVersionFile "${cachedVersions}"
else
echo "Could not find /etc/pihole/versions. Running update now."
pihole updatechecker
# shellcheck source=/dev/null
. "$cachedVersions"
loadVersionFile "${cachedVersions}"
fi
main() {

View file

@ -2042,8 +2042,8 @@ FTLcheckUpdate() {
# Check whether or not the binary for this FTL branch actually exists. If not, then there is no update!
local status
if ! check_download_exists "${path}"; then
status=$?
check_download_exists "${path}" && status=0 || status=$?
if [ "${status}" -ne 0 ]; then
if [ "${status}" -eq 1 ]; then
printf " %b Branch \"%s\" is not available.\\n" "${INFO}" "${ftlBranch}"
printf " %b Use %bpihole checkout ftl [branchname]%b to switch to a valid branch.\\n" "${INFO}" "${COL_GREEN}" "${COL_NC}"

View file

@ -86,16 +86,17 @@ generate_gravity_database() {
# Build gravity tree
gravity_build_tree() {
local table="$1"
local str
str="Building tree"
str="Building ${table} tree"
echo -ne " ${INFO} ${str}..."
# The index is intentionally not UNIQUE as poor quality adlists may contain domains more than once
output=$({ pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "CREATE INDEX idx_gravity ON gravity (domain, adlist_id);"; } 2>&1)
output=$({ pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "CREATE INDEX idx_${table} ON ${table} (domain, adlist_id);"; } 2>&1)
status="$?"
if [[ "${status}" -ne 0 ]]; then
echo -e "\\n ${CROSS} Unable to build gravity tree in ${gravityTEMPfile}\\n ${output}"
echo -e "\\n ${CROSS} Unable to build ${table} tree in ${gravityTEMPfile}\\n ${output}"
echo -e " ${INFO} If you have a large amount of domains, make sure your Pi-hole has enough RAM available\\n"
return 1
fi
@ -844,11 +845,11 @@ gravity_Table_Count() {
local str="${2}"
local num
num="$(pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "SELECT COUNT(*) FROM ${table};")"
if [[ "${table}" == "gravity" ]]; then
if [[ "${table}" == "gravity" || "${table}" == "antigravity" ]]; then
local unique
unique="$(pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "SELECT COUNT(*) FROM (SELECT DISTINCT domain FROM ${table});")"
echo -e " ${INFO} Number of ${str}: ${num} (${COL_BOLD}${unique} unique domains${COL_NC})"
pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "INSERT OR REPLACE INTO info (property,value) VALUES ('gravity_count',${unique});"
pihole-FTL sqlite3 -ni "${gravityTEMPfile}" "INSERT OR REPLACE INTO info (property,value) VALUES ('${table}_count',${unique});"
else
echo -e " ${INFO} Number of ${str}: ${num}"
fi
@ -858,11 +859,14 @@ gravity_Table_Count() {
gravity_ShowCount() {
# Here we use the table "gravity" instead of the view "vw_gravity" for speed.
# It's safe to replace it here, because right after a gravity run both will show the exactly same number of domains.
echo ""
gravity_Table_Count "gravity" "gravity domains"
gravity_Table_Count "antigravity" "antigravity domains"
gravity_Table_Count "domainlist WHERE type = 1 AND enabled = 1" "exact denied domains"
gravity_Table_Count "domainlist WHERE type = 3 AND enabled = 1" "regex denied filters"
gravity_Table_Count "domainlist WHERE type = 0 AND enabled = 1" "exact allowed domains"
gravity_Table_Count "domainlist WHERE type = 2 AND enabled = 1" "regex allowed filters"
echo ""
}
# Trap Ctrl-C
@ -1149,7 +1153,8 @@ update_gravity_timestamp
fix_owner_permissions "${gravityTEMPfile}"
# Build the tree
timeit gravity_build_tree
timeit gravity_build_tree gravity
timeit gravity_build_tree antigravity
# Compute numbers to be displayed (do this after building the tree to get the
# numbers quickly from the tree instead of having to scan the whole database)

11
pihole
View file

@ -30,15 +30,10 @@ readonly apifile="${PI_HOLE_SCRIPT_DIR}/api.sh"
source "${apifile}"
versionsfile="/etc/pihole/versions"
if [ -f "${versionsfile}" ]; then
# Only source versionsfile if the file exits
# fixes a warning during installation where versionsfile does not exist yet
# but gravity calls `pihole -status` and thereby sourcing the file
# shellcheck source=/dev/null
source "${versionsfile}"
fi
# Load version variables without executing file content as shell code.
# loadVersionFile() only assigns known keys with validated values.
loadVersionFile "${versionsfile}"
# TODO: We can probably remove the reliance on this function too, just tell people to pihole-FTL --config webserver.api.password "password"
SetWebPassword() {
if [ -n "$2" ] ; then
readonly PASSWORD="$2"

View file

@ -2,5 +2,5 @@ pyyaml == 6.0.3
pytest == 9.0.2
pytest-xdist == 3.8.0
pytest-testinfra == 10.2.2
tox == 4.35.0
tox == 4.51.0
pytest-clarity == 1.0.1