#!/bin/sh set -ef [ $# -gt 0 ] || exit 1 if [ -z "${NGX_DEBUG:-}" ] ; then cat >&2 <<-EOF $0: NGX_DEBUG is not set - defaulting to NGX_DEBUG=0 EOF NGX_DEBUG=0 fi set -a ANGIE_MODULES_DIR="${ANGIE_MODULES_DIR:-/usr/lib/angie/modules}" set +a ## produce package list pkgs= for i ; do [ -n "$i" ] || continue i="angie-module-$i" printf '%s' "$i" | grep -zEq '^[a-z0-9.+-]+$' || { env printf 'package name %q is not legal, quitting!\n' "$i" >&2 exit 1 } pkgs="${pkgs}${pkgs:+ }$i" done [ -n "${pkgs}" ] || exit 0 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/ $//' } pkgs=$(sort_dedup_list "${pkgs}") dirs='cache lib log' for n in ${dirs} ; do d="/run/angie/$n" [ -d "$d" ] || install -d "$d" done apt-install.sh ${pkgs} ANGIE_MODCONF_DIR=/etc/angie/mod.dist [ -d "${ANGIE_MODCONF_DIR}" ] || install -d "${ANGIE_MODCONF_DIR}" list_ngx_modules() { set +e dpkg-query -L "$1" \ | grep -F -e "${ANGIE_MODULES_DIR}/" \ | grep -E -e '/[^/]+_module(-debug)?\.so$' \ | sed -E '\,^(.+)-debug\.so$,{p;s//\1.so/;p;d}' \ | sort -uV \ | xargs -r ls -U1d 2>/dev/null set -e } is_same_file() { find -L "$1" -samefile "$2" -printf . -quit 2>/dev/null | grep -Fq . || return 1 } gen_mod_config() { if [ -s "$2" ] ; then printf '%s: configuration already exists: %s\n' "$1" "$2" >&2 return fi [ -n "$3" ] || return local __m for __m in $3 ; do echo "load_module ${__m};" done > "$2" } for p in ${pkgs} ; do [ -n "$p" ] || continue i="${p#angie-module-}" ## adjust modules: ## - remove debug module if not in debug image ## - move debug module to usual location otherwise while read -r fmod_debug ; do # [ -n "${fmod_debug}" ] || continue case "${fmod_debug}" in *-debug.so ) ;; * ) continue ;; esac fmod="${fmod_debug%-debug.so}.so" fmod_tmp=$(mktemp -u "${fmod}.XXXXXXXXXX") if [ "${NGX_DEBUG}" = 0 ] ; then if [ -f "${fmod}" ] ; then fmod_real=$(readlink -f "${fmod}") else env printf 'missing (non-debug) file: %q\n' "${fmod}" >&2 env printf 'falling back to (debug) file: %q\n' "${fmod_debug}" >&2 fmod_real=$(readlink -f "${fmod_debug}") fi else fmod_real=$(readlink -f "${fmod_debug}") fi [ -n "${fmod_real}" ] || exit 1 ln -v "${fmod_real}" "${fmod_tmp}" rm -fv "${fmod}" "${fmod_debug}" mv -fv "${fmod_tmp}" "${fmod}" done <<-EOF $(list_ngx_modules "$p") EOF if [ -e "${ANGIE_MODCONF_DIR}/.$i.preseed" ] ; then printf '%s: skipping generation of module load config (preseed is in effect)\n' "$p" >&2 continue fi ## produce attachable module configs http_modules= mail_modules= stream_modules= while read -r fmod ; do [ -n "${fmod}" ] || continue fmod_short="modules.d/${fmod#"${ANGIE_MODULES_DIR}/"}" fname=${fmod##*/} case "${fname}" in ngx_http_* ) http_modules="${http_modules}${http_modules:+ }${fmod_short}" ;; ngx_mail_* ) mail_modules="${mail_modules}${mail_modules:+ }${fmod_short}" ;; ngx_stream_* ) stream_modules="${stream_modules}${stream_modules:+ }${fmod_short}" ;; ## damn NDK ndk_http_* ) http_modules="${http_modules}${http_modules:+ }${fmod_short}" ;; * ) env printf '%s: unable to determine module type for file (skipping): %q\n' "$p" "${fmod}" >&2 continue ;; esac done <<-EOF $(list_ngx_modules "$p") EOF [ -z "${http_modules}" ] || gen_mod_config "$p" "${ANGIE_MODCONF_DIR}/http-$i.conf" "${http_modules}" [ -z "${mail_modules}" ] || gen_mod_config "$p" "${ANGIE_MODCONF_DIR}/mail-$i.conf" "${mail_modules}" [ -z "${stream_modules}" ] || gen_mod_config "$p" "${ANGIE_MODCONF_DIR}/stream-$i.conf" "${stream_modules}" done