From 9b1fa5b634488636976210aef1d94148822cf42e Mon Sep 17 00:00:00 2001 From: Alexandre <44178713+alexbelgium@users.noreply.github.com> Date: Wed, 9 Jul 2025 09:43:10 +0200 Subject: [PATCH] Revert --- .templates/00-global_var.sh | 101 +++++++++++++++++++++--------------- 1 file changed, 58 insertions(+), 43 deletions(-) diff --git a/.templates/00-global_var.sh b/.templates/00-global_var.sh index 9bb01cd90..93577b629 100644 --- a/.templates/00-global_var.sh +++ b/.templates/00-global_var.sh @@ -27,75 +27,90 @@ fi # echo "All addon options were exported as variables" mapfile -t arr < <(jq -r 'keys[]' "${JSONSOURCE}") +# Escape special characters using printf and enclose in double quotes +sanitize_variable() { + local raw="$1" # original value + local escaped # value after printf %q + # Check if the value is an array + if [[ "$raw" == \[* ]]; then + echo "One of your options is an array, skipping" + return + fi + printf -v escaped '%q' "$raw" + # If nothing changed, return the original. + if [[ "$raw" == "$escaped" ]]; then + printf '%s' "$raw" + return + fi + # Otherwise protect the escaped string with double quotes. + printf '"%s"' "$escaped" +} + for KEYS in "${arr[@]}"; do # export key VALUE=$(jq -r --raw-output ".\"$KEYS\"" "$JSONSOURCE") - # Check if the value is an array if [[ "$VALUE" == \[* ]]; then - bashio::log.warning "One of your options is an array, skipping" - continue - fi - - # Check if secret - if [[ "$VALUE" == *"!secret "* ]]; then - echo "secret detected" - # Get argument - secret=${VALUE#*secret } - # Remove trailing ' or " - secret="${secret%[\"\']}" - # Stop if secret file not mounted - if [[ "$SECRETSOURCE" == "false" ]]; then - bashio::log.warning "Homeassistant config not mounted, secrets are not supported" - continue - fi - # Check if single match - secretnum=$(sed -n "/$secret:/=" "$SECRETSOURCE") - [[ "$secretnum" == *' '* ]] && bashio::exit.nok "There are multiple matches for your password name. Please check your secrets.yaml file" - # Get text - secret=$(sed -n "/$secret:/p" "$SECRETSOURCE") - secret=${secret#*: } - VALUE="$secret" - fi - - # Data validation and export - if [[ "$KEYS" =~ ^[^[:space:]]+$ ]]; then + bashio::log.warning "One of your option is an array, skipping" + else + # Sanitize variable + VALUE=$(sanitize_variable "$VALUE") + # Continue for single values line="${KEYS}=${VALUE}" - # Show in log + # Check if secret + if [[ "${line}" == *"!secret "* ]]; then + echo "secret detected" + # Get argument + secret=${line#*secret } + # Remove trailing ' or " + secret="${secret%[\"\']}" + # Stop if secret file not mounted + if [[ "$SECRETSOURCE" == "false" ]]; then + bashio::log.warning "Homeassistant config not mounted, secrets are not supported" + continue + fi + # Check if single match + secretnum=$(sed -n "/$secret:/=" "$SECRETSOURCE") + [[ "$secretnum" == *' '* ]] && bashio::exit.nok "There are multiple matches for your password name. Please check your secrets.yaml file" + # Get text + secret=$(sed -n "/$secret:/p" "$SECRETSOURCE") + secret=${secret#*: } + line="${line%%=*}='$secret'" + VALUE="$secret" + fi + # text if bashio::config.false "verbose" || [[ "${KEYS,,}" == *"pass"* ]]; then bashio::log.blue "${KEYS}=******" else bashio::log.blue "$line" fi - # Export the variable to run scripts + ###################################### + # Export the variable to run scripts # + ###################################### + # shellcheck disable=SC2163 export "$line" - - # Export to python + # export to python if command -v "python3" &>/dev/null; then [ ! -f /env.py ] && echo "import os" >/env.py - # Escape single quotes in VALUE - VALUE_ESCAPED="${VALUE//\'/\'\"\'\"\'}" - echo "os.environ['${KEYS}'] = '${VALUE_ESCAPED}'" >>/env.py + # Escape \ + VALUEPY="${VALUE//\\/\\\\}" + # Avoid " and ' + VALUEPY="${VALUEPY//[\"\']/}" + echo "os.environ['${KEYS}'] = '$VALUEPY'" >>/env.py python3 /env.py fi - - # Set .env + # set .env echo "$line" >>/.env || true - - # Set /etc/environment + # set /etc/environment mkdir -p /etc echo "$line" >>/etc/environment - # For non s6 if cat /etc/services.d/*/*run* &>/dev/null; then sed -i "1a export $line" /etc/services.d/*/*run* 2>/dev/null; fi if cat /etc/cont-init.d/*run* &>/dev/null; then sed -i "1a export $line" /etc/cont-init.d/*run* 2>/dev/null; fi - # For s6 if [ -d /var/run/s6/container_environment ]; then printf "%s" "${VALUE}" >/var/run/s6/container_environment/"${KEYS}"; fi echo "export ${KEYS}='${VALUE}'" >>~/.bashrc - else - bashio::log.red "Skipping line that does not follow the correct structure: $line" fi done