#!/bin/sh volume_root='/run/angie' tmp_dir="${volume_root}/tmp" merged_root="${volume_root}/merged" target_root="${volume_root}" empty_dir='/var/lib/empty' have_envvar() { [ -n "$1" ] || return 1 grep -Ezq "^$1=" /proc/$$/environ || return } ## unexporting variable in (POSIX) sh is PITA =/ unexport() { local ___k ___v for ___k ; do [ -n "${___k}" ] || continue have_envvar "${___k}" || continue ___v=$(eval printf '%s' "\"\${${___k}}\"") eval "unset ${___k}" eval "${___k}=$(env printf '%s' \"\${___v}\")" done } ## likely the same as in https://pkg.go.dev/strconv#ParseBool gobool_to_int() { ## local value=$1 ## local default=$2 case "${1:-_}" in 1 | [Tt] | [Tt][Rr][Uu][Ee] ) echo 1 ;; 0 | [Ff] | [Ff][Aa][Ll][Ss][Ee] ) echo 0 ;; * ) echo "${2:-error}" ;; esac } [ -n "${__IEP_SRC:-}" ] || __IEP_SRC="$0" log_always() { if [ "${IEP_DEBUG}" = 1 ] ; then echo "# $(date +'%Y-%m-%d %H:%M:%S.%03N %z'): ${__IEP_SRC}${*:+: $*}" else echo "# ${__IEP_SRC}${*:+: $*}" fi >&2 } log() { [ "${IEP_VERBOSE}" = 0 ] || log_always "$@" } ln_s() { if [ "${IEP_VERBOSE}" = 0 ] ; then ln -s "$@" || return else ln -sv "$@" || return fi } cp_a() { if [ "${IEP_VERBOSE}" = 0 ] ; then cp -a "$@" || return else cp -av "$@" || return fi } ln_cp() { if [ -h "$1" ] ; then ln_s "$(readlink -e "$1")" "$2" else cp_a "$1" "$2" fi } have_cmd() { command -v "$1" >/dev/null 2>&1 || return ; } strip_suffix() { printf '%s' "${1%"$2"}" | tr -s '/' ; } install_userdir() { if [ "${IEP_ROOT}" = 1 ] ; then install -d -o "${NGX_USER}" -g "${NGX_GROUP}" "$@" else install -d "$@" fi } expand_file_envsubst() { local __ret __src __dst __ret=0 for __src ; do [ -n "${__src}" ] || continue if ! [ -f "${__src}" ] ; then __ret=1 log_always "file not found: ${__src}" continue fi case "${__src}" in *.in ) ;; * ) __ret=1 log "expand_file_envsubst: file name extension mismatch: ${__src}" continue ;; esac __dst=$(strip_suffix "${__src}" '.in') if [ -e "${__dst}" ] ; then __ret=1 log "expand_file_envsubst: destination file already exists: ${__dst}" continue fi log "Running envsubst: ${__src} -> ${__dst}" envsubst.sh < "${__src}" > "${__dst}" || __ret=1 done return ${__ret} } expand_file_j2cfg() { j2cfg-single "$@" || return $? } expand_dir_envsubst() { local __template_list __have_args __ret __orig_file __template_list=$(mktemp) || return find "$@" -follow -name '*.in' -type f \ | { if [ -n "${NGX_TEMPLATE_EXCLUDE_REGEX:-}" ] ; then grep -Ev -e "${NGX_TEMPLATE_EXCLUDE_REGEX}" elif [ -n "${NGX_TEMPLATE_INCLUDE_REGEX:-}" ] ; then grep -E -e "${NGX_TEMPLATE_INCLUDE_REGEX}" else cat fi } \ | sort -uV > "${__template_list}" __ret=0 if [ -s "${__template_list}" ] ; then __have_args="${ENVSUBST_ARGS:+1}" if [ -z "${__have_args}" ] ; then ## optimize envsubst.sh invocation by caching argument list ## ref: envsubst.sh ENVSUBST_ARGS=$(mktemp) || return envsubst-args.sh > "${ENVSUBST_ARGS}" export ENVSUBST_ARGS fi while read -r __orig_file ; do [ -n "${__orig_file}" ] || continue expand_file_envsubst "${__orig_file}" || __ret=1 done < "${__template_list}" if [ -z "${__have_args}" ] ; then rm -f "${ENVSUBST_ARGS}" ; unset ENVSUBST_ARGS fi unset __have_args fi rm -f "${__template_list}" ; unset __template_list return ${__ret} } expand_dir_j2cfg() { local __template_list __ret __template_list=$(mktemp) || return find "$@" -follow -name '*.j2' -type f -printf '%p\0' \ | { if [ -n "${NGX_TEMPLATE_EXCLUDE_REGEX:-}" ] ; then grep -zEv -e "${NGX_TEMPLATE_EXCLUDE_REGEX}" elif [ -n "${NGX_TEMPLATE_INCLUDE_REGEX:-}" ] ; then grep -zE -e "${NGX_TEMPLATE_INCLUDE_REGEX}" else cat fi } \ | sort -zuV > "${__template_list}" __ret=0 if [ -s "${__template_list}" ] ; then xargs -0r -n 1000 -a "${__template_list}" \ j2cfg-multi < /dev/null || __ret=1 fi rm -f "${__template_list}" ; unset __template_list return ${__ret} } is_builtin_module() { [ -n "${1:-}" ] || return 1 [ -n "${2:-}" ] || return 1 [ -f "/etc/angie/builtin.$1" ] || return 1 [ -s "/etc/angie/builtin.$1" ] || return 1 grep -Fxq -e "$2" "/etc/angie/builtin.$1" || return 1 } append_list() { if [ -n "$2" ] ; then printf '%s' "${1:-}${1:+ }$2" else printf '%s' "$1" fi } prepend_list() { if [ -n "$2" ] ; then printf '%s' "$2${1:+ }${1:-}" else printf '%s' "$1" fi } list_have_item() { [ -n "$1" ] || return 1 [ -n "$2" ] || return 1 case " $1 " in *" $2 "* ) return 0 ;; * ) return 1 ;; esac } normalize_list() { [ -n "$1" ] || return 0 printf '%s' "$1" \ | sed -zE 's/[[:space:]]+/ /g;s/^ //;s/ $//' } sort_dedup_list() { [ -n "$1" ] || return 0 printf '%s' "$1" \ | tr -s '[:space:]' '\n' | sort -uV \ | sed -zE 's/[[:space:]]+/ /g;s/^ //;s/ $//' } float_div() { mawk -v "a=$1" -v "b=$2" 'BEGIN{print a/b;exit;}'