1
0
angie-conv-image/image-entry.d/00-common.envsh

265 lines
5.2 KiB
Bash

#!/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;}' </dev/null
}
find_fast() {
find "$@" -printf . -quit | grep -Fq .
}
randN() {
od -v -A n -t x1 -N "$1" < /dev/urandom | tr -d '[:space:]'
}
re_ipv4_oct='[0-9]|[1-9][0-9]|[1-9][0-9][0-9]|2[0-4][0-9]|25[0-5]'
re_ipv4_addr="^${re_ipv4_oct}\.${re_ipv4_oct}\.${re_ipv4_oct}\.${re_ipv4_oct}\$"
is_ipv4_address() {
[ -n "$1" ] || return 1
printf '%s' "$1" | grep -zEq "${re_ipv4_addr}" || return 1
}