Implement dynamic shebang detection and permission handling

Added logic to determine and set the appropriate shebang for scripts based on available interpreters. Enhanced permission handling for scripts based on user privileges.
This commit is contained in:
Alexandre
2025-12-08 18:53:45 +01:00
committed by GitHub
parent 79f0d71d30
commit 61972255ee

View File

@@ -10,16 +10,67 @@ touch /started
# Starting scripts # # Starting scripts #
#################### ####################
candidate_shebangs+=(
"/usr/bin/env bashio"
"/usr/bin/bashio"
"/usr/bin/bash"
"/usr/bin/sh"
"/bin/bash"
"/bin/sh"
)
# Find the first valid shebang interpreter in candidate list
shebang=""
for candidate in "${candidate_shebangs[@]}"; do
command_path="${candidate%% *}"
# Test if command exists and can actually execute a shell command (for shells)
if [ -x "$command_path" ]; then
# Try as both 'sh -c' and 'bashio echo' style
if "$command_path" -c 'echo yes' > /dev/null 2>&1 || "$command_path" echo "yes" > /dev/null 2>&1; then
shebang="$candidate"
break
fi
fi
done
if [ -z "$shebang" ]; then
echo "ERROR: No valid shebang found!"
exit 1
fi
for SCRIPTS in /etc/cont-init.d/*; do for SCRIPTS in /etc/cont-init.d/*; do
[ -e "$SCRIPTS" ] || continue [ -e "$SCRIPTS" ] || continue
echo "$SCRIPTS: executing" echo "$SCRIPTS: executing"
# Check if run as root (UID 0)
if [ "$(id -u)" -eq 0 ]; then
# Fix permissions for root user
chown "$(id -u)":"$(id -g)" "$SCRIPTS" chown "$(id -u)":"$(id -g)" "$SCRIPTS"
chmod a+x "$SCRIPTS" chmod a+x "$SCRIPTS"
# Change shebang if no s6 supervision else
sed -i 's|/usr/bin/with-contenv bashio|/usr/bin/env bashio|g' "$SCRIPTS" echo -e "\e[38;5;214m$(date) WARNING: Script executed with user $(id -u):$(id -g), things can break and chown won't work\e[0m"
sed -i "/exit 0/d" "$SCRIPTS" # Disable chown and chmod commands inside the script for non-root users
. "$SCRIPTS" || echo -e "\033[0;31mError\033[0m : $SCRIPTS exiting $?" sed -i "s/^\s*chown /true # chown /g" "$SCRIPTS"
rm "$SCRIPTS" sed -i "s/^\s*chmod /true # chmod /g" "$SCRIPTS"
fi
# Prepare to run
sed -i "1s|^.*|#!$shebang|" "$SCRIPTS"
chmod +x "$SCRIPTS"
# Optionally use 'source' to share env variables, when requested
if [ "${ha_entry_source:-null}" = true ]; then
# Replace exit with return, so sourced scripts can return errors
sed -i -E 's/^\s*exit ([0-9]+)/return \1 \|\| exit \1/g' "$SCRIPTS"
sed -i 's/bashio::exit\.nok/return 1/g' "$SCRIPTS"
sed -i 's/bashio::exit\.ok/return 0/g' "$SCRIPTS"
# shellcheck disable=SC1090
source "$SCRIPTS" || echo -e "\033[0;31mError\033[0m : $SCRIPTS exiting $?"
else
"$SCRIPTS" || echo -e "\033[0;31mError\033[0m : $SCRIPTS exiting $?"
fi
# Cleanup after execution
sed -i '1a exit 0' "$SCRIPTS"
done done
rm /.env || true rm /.env || true