#!/bin/bash if [ ! -x /bin/sh ]; then echo "Executable test for /bin/sh failed. Your Docker version is too old to run Alpine 3.14+ and Pi-hole. You must upgrade Docker."; exit 1; fi if [ "${PH_VERBOSE:-0}" -gt 0 ]; then set -x fi trap stop TERM INT QUIT HUP ERR CAPSH_PID="" TRAP_TRIGGERED=0 start() { # The below functions are all contained in bash_functions.sh # shellcheck source=/dev/null . /usr/bin/bash_functions.sh # If the file /etc/pihole/setupVars.conf exists, but /etc/pihole/pihole.toml does not, then we are migrating v5->v6 # FTL Will handle the migration of the config files if [[ -f /etc/pihole/setupVars.conf && ! -f /etc/pihole/pihole.toml ]]; then echo " [i] v5 files detected that have not yet been migrated to v6" echo "" migrate_v5_configs fi # =========================== # Initial checks # =========================== # If PIHOLE_UID is set, modify the pihole user's id to match set_uid_gid # Configure FTL with any environment variables if needed echo " [i] Starting FTL configuration" ftl_config # Install additional packages inside the container if requested install_additional_packages # Start crond for scheduled scripts (logrotate, pihole flush, gravity update etc) start_cron # Install the logrotate config file install_logrotate #migrate Gravity Database if needed: migrate_gravity echo " [i] pihole-FTL pre-start checks" # Run the post stop script to cleanup any remaining artifacts from a previous run sh /opt/pihole/pihole-FTL-poststop.sh fix_capabilities sh /opt/pihole/pihole-FTL-prestart.sh echo " [i] Starting pihole-FTL ($FTL_CMD) as ${DNSMASQ_USER}" echo "" capsh --user="${DNSMASQ_USER}" --keep=1 -- -c "/usr/bin/pihole-FTL $FTL_CMD >/dev/null" & # Notes on above: # - DNSMASQ_USER default of pihole is in Dockerfile & can be overwritten by runtime container env # - /var/log/pihole/pihole*.log has FTL's output that no-daemon would normally print in FG too # prevent duplicating it in docker logs by sending to dev null # We need the PID of the capsh process so that we can wait for it to finish CAPSH_PID=$! # Wait until the log file exists before continuing while [ ! -f /var/log/pihole/FTL.log ]; do sleep 0.5 done # Wait until the FTL log contains the "FTL started" message before continuing while ! grep -q '########## FTL started' /var/log/pihole/FTL.log; do sleep 0.5 done pihole updatechecker local versionsOutput versionsOutput=$(pihole -v) echo " [i] Version info:" printf "%b" "${versionsOutput}\\n" | sed 's/^/ /' echo "" if [ "${TAIL_FTL_LOG:-1}" -eq 1 ]; then # Start tailing the FTL log from the most recent "FTL Started" message # Get the line number startFrom=$(grep -n '########## FTL started' /var/log/pihole/FTL.log | tail -1 | cut -d: -f1) # Start the tail from the line number and background it tail --follow=name -n +"${startFrom}" /var/log/pihole/FTL.log & else echo " [i] FTL log output is disabled. Remove the Environment variable TAIL_FTL_LOG, or set it to 1 to enable FTL log output." fi # Wait for the capsh process (which spawned FTL) to finish wait $CAPSH_PID FTL_EXIT_CODE=$? # If we are here, then FTL has exited. # If the trap was triggered, then stop will have already been called if [ $TRAP_TRIGGERED -eq 0 ]; then # Pass the exit code through to the stop function stop $FTL_EXIT_CODE fi } stop() { local FTL_EXIT_CODE=$1 # if we have nothing in FTL_EXIT_CODE, then have been called by the trap. Close FTL and wait for the CAPSH_PID to finish if [ -z "${FTL_EXIT_CODE}" ]; then TRAP_TRIGGERED=1 echo "" echo " [i] Container stop requested..." echo " [i] pihole-FTL is running - Attempting to shut it down cleanly" echo "" killall --signal 15 pihole-FTL wait $CAPSH_PID FTL_EXIT_CODE=$? fi # Wait for a few seconds to allow the FTL log tail to catch up before exiting the container sleep 2 # ensure the exit code is an integer, if not set it to 1 if ! [[ "${FTL_EXIT_CODE}" =~ ^[0-9]+$ ]]; then FTL_EXIT_CODE=1 fi sh /opt/pihole/pihole-FTL-poststop.sh echo "" echo " [i] pihole-FTL exited with status $FTL_EXIT_CODE" echo "" echo " [i] Container will now stop or restart depending on your restart policy" echo " https://docs.docker.com/engine/containers/start-containers-automatically/#use-a-restart-policy" echo "" # If we are running pytest, keep the container alive for a little longer # to allow the tests to complete if [[ ${PYTEST} ]]; then sleep 10 fi exit "${FTL_EXIT_CODE}" } start