mirror of
https://github.com/pi-hole/FTL.git
synced 2025-12-19 20:58:24 +00:00
242 lines
6.7 KiB
Bash
Executable File
242 lines
6.7 KiB
Bash
Executable File
#!/bin/bash
|
|
# Pi-hole: A black hole for Internet advertisements
|
|
# (c) 2020 Pi-hole, LLC (https://pi-hole.net)
|
|
# Network-wide ad blocking via your own hardware.
|
|
#
|
|
# FTL Engine
|
|
# Build script for FTL
|
|
#
|
|
# This file is copyright under the latest version of the EUPL.
|
|
# Please see LICENSE file for your rights under this license.
|
|
|
|
# Abort script if one command returns a non-zero value
|
|
set -e
|
|
|
|
# Set builddir
|
|
builddir="cmake/"
|
|
|
|
# Parse arguments
|
|
# If the first argument starts in "-D", we pass it to CMake
|
|
if [[ "${1}" == "-D"* ]]; then
|
|
cmake_args="${1}"
|
|
shift
|
|
fi
|
|
|
|
# Parse the remaining arguments
|
|
for var in "$@"
|
|
do
|
|
case "${var}" in
|
|
"clean" ) clean=1;;
|
|
"nobuild" ) nobuild=1;;
|
|
"install" ) install=1;;
|
|
"restart" ) restart=1;;
|
|
"tail" ) tail=1;;
|
|
"debug" ) debug=1;;
|
|
"dev" ) dev=1;;
|
|
"test" ) test=1;;
|
|
"clean-logs" ) clean_logs=1;;
|
|
"clang" ) clang=1;;
|
|
"ci" ) builddir="cmake_ci/";;
|
|
"-h" | "help" ) help=0;;
|
|
* ) echo -e "Unknown option: ${var}\n"; help=1;;
|
|
esac
|
|
done
|
|
|
|
# Display help text if requested
|
|
if [[ -n "${help}" ]]; then
|
|
cat << EOF
|
|
Usage: $0 [options]
|
|
Helper script simplifying the build process of Pi-hole FTL.
|
|
|
|
Shortcuts:
|
|
dev Build, install, restart, and tail logs.
|
|
debug Build, install, restart, and attach debugger.
|
|
|
|
Other options:
|
|
clean Clean the build environment before building.
|
|
nobuild Do not trigger a build, e.g., after cleaning.
|
|
install Install the built binaries (requires sudo).
|
|
restart Restart the pihole-FTL service (requires sudo).
|
|
clean-logs Clean the FTL and dnsmasq log files.
|
|
tail Tail (follow) the FTL and dnsmasq log files.
|
|
-h, help Display this help text.
|
|
|
|
Special CI options:
|
|
ci Use the CI build directory (cmake_ci/).
|
|
clang Use clang as the compiler.
|
|
test Run tests after building.
|
|
|
|
If no options are provided, the script will build the sources.
|
|
If the -d option is provided, the script will build, install, restart,
|
|
and tail the two most important log file. The -d option is intended
|
|
for development purposes.
|
|
EOF
|
|
|
|
exit "${help}"
|
|
fi
|
|
|
|
# debug, tail and dev are mutually exclusive
|
|
if [[ $((debug + tail + dev)) -gt 1 ]]; then
|
|
echo "Error: debug, tail, and dev are mutually exclusive options."
|
|
exit 1
|
|
fi
|
|
|
|
# If we are in debug mode, we also want to build, install, and restart
|
|
if [[ -n "${debug}" ]]; then
|
|
install=1
|
|
restart=1
|
|
fi
|
|
|
|
# If we are in dev mode, we want to build, install, restart, and tail the logs
|
|
# by default
|
|
if [[ -n "${dev}" ]]; then
|
|
install=1
|
|
restart=1
|
|
tail=1
|
|
fi
|
|
|
|
# Check if we need sudo
|
|
SUDO=""
|
|
if [[ -n "${install}" || -n "${restart}" || -n "${clean_logs}" ]]; then
|
|
# Check if we are root, if not, we need sudo
|
|
if [[ $(id -u) -ne 0 ]]; then
|
|
SUDO="sudo"
|
|
fi
|
|
fi
|
|
|
|
# Prepare build environment
|
|
if [[ -n "${clean}" ]]; then
|
|
echo "Cleaning build environment"
|
|
# Remove build directory
|
|
rm -rf "${builddir}"
|
|
fi
|
|
|
|
# Remove possibly outdated api/docs elements
|
|
for filename in src/api/docs/hex/* src/api/docs/hex/**/*; do
|
|
# Skip if not a file
|
|
if [ ! -f "${filename}" ]; then
|
|
continue
|
|
fi
|
|
|
|
# Get the original filename
|
|
original_filename="${filename/"src/api/docs/hex/"/"src/api/docs/content/"}"
|
|
|
|
# Remove the file if it is outdated
|
|
if [ "${filename}" -ot "${original_filename}" ]; then
|
|
rm "${filename}"
|
|
fi
|
|
done
|
|
|
|
# Remove compiled LUA scripts if older than the plain ones
|
|
for scriptname in src/lua/scripts/*.lua; do
|
|
if [ -f "${scriptname}.hex" ] && [ "${scriptname}.hex" -ot "${scriptname}" ]; then
|
|
rm "${scriptname}.hex"
|
|
fi
|
|
done
|
|
|
|
# If we are asked to NOT build, we exit here
|
|
if [[ -n ${nobuild} ]]; then
|
|
exit 0
|
|
fi
|
|
|
|
# Set compiler to clang if requested
|
|
if [[ -n "${clang}" ]]; then
|
|
export CC=clang
|
|
export CXX=clang++
|
|
export STATIC="false"
|
|
fi
|
|
|
|
# Configure build, pass CMake CACHE entries if present
|
|
# Wrap multiple options in "" as first argument to ./build.sh:
|
|
# ./build.sh "-DA=1 -DB=2" install
|
|
mkdir -p "${builddir}"
|
|
cd "${builddir}"
|
|
if [[ -n ${cmake_args} ]]; then
|
|
cmake "${cmake_args}" ..
|
|
else
|
|
cmake ..
|
|
fi
|
|
|
|
# If MAKEFLAGS is unset, we set it to "-j$(nproc)"
|
|
if [[ -z "${MAKEFLAGS}" ]]; then
|
|
MAKEFLAGS="-j$(nproc)"
|
|
fi
|
|
|
|
# Build the sources
|
|
cmake --build . -- ${MAKEFLAGS}
|
|
|
|
# Checksum verification
|
|
./pihole-FTL verify
|
|
|
|
# If we are asked to install, we do this here (requires root privileges)
|
|
# Otherwise, we simply copy the binary one level down
|
|
if [[ -n "${install}" ]]; then
|
|
echo "Installing pihole-FTL"
|
|
${SUDO} cmake --install .
|
|
else
|
|
echo "Copying compiled pihole-FTL binary to repository root"
|
|
cp pihole-FTL ../
|
|
fi
|
|
|
|
# If we are asked to run tests, we do this here
|
|
if [[ -n "${test}" ]]; then
|
|
cd ..
|
|
bash test/run.sh
|
|
fi
|
|
|
|
# If we are asked to restart, we do this here
|
|
if [[ -n "${restart}" ]]; then
|
|
echo "Restarting pihole-FTL"
|
|
|
|
# First, reset the failure-counter in case a previous error caused a
|
|
# restarting loop now preventing systemd from starting FTL
|
|
${SUDO} systemctl reset-failed pihole-FTL
|
|
|
|
# Restart FTL
|
|
${SUDO} systemctl restart pihole-FTL
|
|
fi
|
|
|
|
# If we are asked to clean the logs, we do this here
|
|
if [[ -n "${clean_logs}" ]]; then
|
|
echo "Cleaning log files"
|
|
for log_file in "$(pihole-FTL --config files.log.ftl)" "$(pihole-FTL --config files.log.dnsmasq)"; do
|
|
echo "Cleaning ${log_file}"
|
|
echo "" | ${SUDO} tee "$log_file"
|
|
done
|
|
fi
|
|
|
|
# If we want to attach the debugger, we do this here
|
|
if [[ -n "${debug}" ]]; then
|
|
echo "Waiting for pihole-FTL to start..."
|
|
pid_file=$(pihole-FTL --config files.pid)
|
|
|
|
# Loop until the pid file is created and non-empty
|
|
while [ ! -f "${pid_file}" ] || [ ! -s "${pid_file}" ]; do
|
|
sleep 0.1
|
|
done
|
|
|
|
# Get the pid from the pid file
|
|
pid=$(cat "${pid_file}")
|
|
|
|
# Attach gdb to the process
|
|
echo "Attaching debugger to pihole-FTL (PID: ${pid})..."
|
|
${SUDO} gdb -p "${pid}"
|
|
fi
|
|
|
|
# If we are asked to tail the log, we do this here
|
|
if [[ -n "${tail}" ]]; then
|
|
|
|
# Check if tmux is installed
|
|
if ! command -v tmux &> /dev/null; then
|
|
echo "Error: tmux is not installed. Please install tmux to use the tail option."
|
|
exit 1
|
|
fi
|
|
|
|
# Get the log file locations
|
|
ftl_log=$(pihole-FTL --config files.log.ftl)
|
|
dnsmasq_log=$(pihole-FTL --config files.log.dnsmasq)
|
|
|
|
# Create tmux sub-session with two panes next to each other each running a tail command
|
|
tmux new-session -d "tail -f ${ftl_log}" \; split-window -h "tail -f ${dnsmasq_log}" \; attach
|
|
fi
|