nur-sery/support/template-_wrapper.sh

133 lines
3.7 KiB
Bash

# TODO Faire une copie de ce script dans un répertoire de l'application web
# (dans le répertoire _cli/ par défaut) et modifier les paramétres si nécessaire
#-------------------------------------------------------------------------------
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# S'assurer que le script PHP est lancé avec l'utilisateur www-data
# Tous les chemins suivants sont relatifs au répertoire qui contient ce script
# Chemin relatif de la racine du projet
PROJPATH=..
# Chemin relatif vers le lanceur PHP
LAUNCHERPATH=.launcher.php
# Chemin relatif des scripts PHP wrappés
WRAPPEDPATH=
# Nom du service dans docker-compose.yml utilisé pour lancer les commandes
COMPOSE_SERVICE=web
###############################################################################
case "${RUNPHP_MODE:-auto}" in
auto)
RUNPHP_MODE=
[ -f /.dockerenv ] && RUNPHP_MODE=docker
[ -z "$RUNPHP_MODE" ] &&
[ -f /proc/self/mountinfo ] &&
grep -q ' /docker/' /proc/self/mountinfo &&
RUNPHP_MODE=docker
[ -z "$RUNPHP_MODE" ] &&
[ -f /proc/1/cgroup ] &&
grep -q ':/docker/' /proc/1/cgroup &&
RUNPHP_MODE=docker
[ -n "$RUNPHP_MODE" ] || RUNPHP_MODE=host
;;
docker) RUNPHP_MODE=docker;;
host) RUNPHP_MODE=host;;
direct) RUNPHP_MODE=direct;;
*) RUNPHP_MODE=host;;
esac
MYDIR="$(dirname -- "$0")"
MYNAME="$(basename -- "$0")"
if [ ! -L "$0" ]; then
echo "\
$0
Ce script doit être lancé en tant que lien symbolique avec un nom de la forme
'monscript.php' et lance le script PHP du même nom situé dans le même répertoire
avec l'utilisateur www-data"
if [ "$RUNPHP_MODE" == host -o "$RUNPHP_MODE" == direct ]; then
echo "\
----------------------------------------
Vérification des liens..."
cd "$MYDIR"
for i in *.php*; do
[ -f "$i" ] || continue
name="bin/${i%.*}.php"
dest="../_cli/_wrapper.sh"
link="../bin/${i%.*}.php"
if [ -L "$link" ]; then
echo "* $name OK"
elif [ -e "$link" ]; then
echo "* $name KO (not a link)"
else
echo "* $name NEW"
ln -s "$dest" "$link" || exit 1
fi
done
fi
exit 0
fi
MYTRUESELF="$(readlink -f "$0")"
MYTRUEDIR="$(dirname -- "$MYTRUESELF")"
PROJDIR="$(cd "$MYTRUEDIR${PROJPATH:+/$PROJPATH}"; pwd)"
if [ "$RUNPHP_MODE" == host ]; then
args=(
docker compose run
${RUNPHP_BUILD:+--build}
--rm
)
cwd="$(pwd)"
mounted=
if [ "$PROJDIR" == "$HOME" -o "${PROJDIR#$HOME/}" != "$PROJDIR" ]; then
# monter HOME
args+=(-v "$HOME:$HOME")
[ "${cwd#$HOME/}" != "$cwd" ] && mounted=1
else
# monter uniquement le répertoire du projet
args+=(-v "$PROJDIR:$PROJDIR")
[ "${cwd#$PROJDIR/}" != "$cwd" ] && mounted=1
fi
if [ -z "$mounted" ]; then
echo "Impossible de mapper le répertoire courant avec les montages du container"
exit 1
fi
args+=(
--workdir "$cwd"
"$COMPOSE_SERVICE"
exec "$MYNAME"
"$@"
)
cd "$PROJDIR"
exec "${args[@]}"
fi
launcher="$MYTRUEDIR/$LAUNCHERPATH"
class="$MYTRUEDIR${WRAPPEDPATH:+/$WRAPPEDPATH}/${MYNAME%.php}.phpc"
script="$MYTRUEDIR${WRAPPEDPATH:+/$WRAPPEDPATH}/${MYNAME%.php}.php"
[ -f /g/init.env ] && source /g/init.env
www_data="${DEVUSER_USERENT%%:*}"
[ -n "$www_data" ] || www_data=www-data
cmd=(php "$launcher")
[ -n "$MEMPROF_PROFILE" ] && cmd+=(-dextension=memprof.so)
if [ -f "$class" ]; then
cmd+=("$(<"$class")")
else
cmd+=("$script")
fi
cmd+=("$@")
if [ "$(id -u)" -eq 0 ]; then
su-exec "$www_data" "${cmd[@]}"
else
exec "${cmd[@]}"
fi