diff --git a/.templates/00-global_var.sh b/.templates/00-global_var.sh index 93577b629..62b1c869f 100644 --- a/.templates/00-global_var.sh +++ b/.templates/00-global_var.sh @@ -27,91 +27,76 @@ 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 option is an array, skipping" - else - # Sanitize variable - VALUE=$(sanitize_variable "$VALUE") - # Continue for single values - line="${KEYS}=${VALUE}" - # 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 key + VALUE=$(jq -r --raw-output ".\"$KEYS\"" "$JSONSOURCE") - ###################################### - # Export the variable to run scripts # - ###################################### - # shellcheck disable=SC2163 - export "$line" - # export to python - if command -v "python3" &>/dev/null; then - [ ! -f /env.py ] && echo "import os" >/env.py - # Escape \ - VALUEPY="${VALUE//\\/\\\\}" - # Avoid " and ' - VALUEPY="${VALUEPY//[\"\']/}" - echo "os.environ['${KEYS}'] = '$VALUEPY'" >>/env.py - python3 /env.py - fi - # set .env - echo "$line" >>/.env || true - # 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 - fi + # 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 + line="${KEYS}=${VALUE}" + # Show in log + 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 "$line" + + # 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 + python3 /env.py + fi + + # Set .env + echo "$line" >>/.env || true + + # 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 ################