2024-09-17 14:11:00 +03:00
|
|
|
#!/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
|
2024-09-30 20:45:03 +03:00
|
|
|
grep -Ezq "^$1=" /proc/$$/environ || return
|
2024-09-17 14:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
## 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 -type f -name '*.in' \
|
|
|
|
| sort -uV > "${__template_list}"
|
|
|
|
|
|
|
|
__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
|
|
|
|
|
|
|
|
__ret=0
|
|
|
|
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
|
|
|
|
|
|
|
|
rm -f "${__template_list}" ; unset __template_list
|
|
|
|
|
|
|
|
return ${__ret}
|
|
|
|
}
|
|
|
|
|
|
|
|
expand_dir_j2cfg() {
|
|
|
|
local __template_list __ret
|
|
|
|
|
|
|
|
__template_list=$(mktemp) || return
|
|
|
|
|
|
|
|
find "$@" -follow -type f -name '*.j2' -printf '%p\0' \
|
|
|
|
| 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() {
|
2024-09-30 20:45:03 +03:00
|
|
|
[ -n "$1" ] || return 1
|
2024-09-17 14:11:00 +03:00
|
|
|
[ -n "$2" ] || return 1
|
|
|
|
case " $1 " in
|
|
|
|
*" $2 "* ) return 0 ;;
|
|
|
|
* ) return 1 ;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
normalize_list() {
|
|
|
|
[ -n "$1" ] || return 0
|
|
|
|
|
|
|
|
printf '%s' "$1" \
|
2024-09-30 20:45:03 +03:00
|
|
|
| sed -zE 's/[[:space:]]+/ /g;s/^ //;s/ $//'
|
2024-09-17 14:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
sort_dedup_list() {
|
|
|
|
[ -n "$1" ] || return 0
|
|
|
|
|
|
|
|
printf '%s' "$1" \
|
2024-09-30 20:45:03 +03:00
|
|
|
| tr -s '[:space:]' '\n' | sort -uV \
|
|
|
|
| sed -zE 's/[[:space:]]+/ /g;s/^ //;s/ $//'
|
2024-09-17 14:11:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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:]'
|
2024-09-30 20:45:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2024-09-17 14:11:00 +03:00
|
|
|
}
|