213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
 | |
| source "$(dirname "$0")/../load.sh" || exit 1
 | |
| 
 | |
| function parse_runphp() {
 | |
|     local runphp="$1" preamble="$2" conf="$3" postamble="$4"
 | |
|     local conf0
 | |
|     ac_set_tmpfile conf0
 | |
|     # extraire la configuration depuis le fichier
 | |
|     <"$runphp" awk -v preamble="$preamble" -v conf="$conf0" -v postamble="$postamble" '
 | |
| BEGIN { out = preamble }
 | |
| {
 | |
|   if ($0 ~ /SOF:runphp.userconf:/) {
 | |
|     if (out != "") print >out
 | |
|     out = conf
 | |
|   } else if ($0 ~ /EOF:runphp.userconf:/) {
 | |
|     out = postamble
 | |
|     if (out != "") print >out
 | |
|   } else {
 | |
|     if (out != "") print >out
 | |
|   }
 | |
| }
 | |
| '
 | |
|     # mettre en forme le fichier conf: pas de lignes vides avant et après
 | |
|     <"$conf0" >"$conf" awk '
 | |
| BEGIN { p = 0; have_pending = 0; pending = "" }
 | |
| $0 != "" { p = 1 }
 | |
| p == 1 {
 | |
|   if ($0 != "") {
 | |
|     if (have_pending) print pending
 | |
|     print
 | |
|     have_pending = 0
 | |
|     pending = ""
 | |
|   } else {
 | |
|     if (!have_pending) have_pending = 1
 | |
|     else pending = pending "\n"
 | |
|   }
 | |
| }
 | |
| '
 | |
|     ac_clean "$conf0"
 | |
| }
 | |
| 
 | |
| declare -A PHPWRAPPER_DESTDIRS=(
 | |
|     [_bg_launcher.php]=@@SBIN@@
 | |
|     [.launcher.php]=@@CLI@@
 | |
|     [_wrapper.sh]=@@CLI@@
 | |
| )
 | |
| declare -A PHPWRAPPER_MODES=(
 | |
|     [_bg_launcher.php]=+x
 | |
|     [.launcher.php]=
 | |
|     [_wrapper.sh]=+x
 | |
| )
 | |
| 
 | |
| projdir=
 | |
| install_phpwrappers=1
 | |
| args=(
 | |
|     "Mettre à jour le script runphp"
 | |
|     "[path/to/runphp]"
 | |
|     -d:,--projdir:PROJDIR . "\
 | |
| Copier les fichiers pour un projet de l'université de la Réunion:
 | |
| - BUILDENV0 et BUILDENV sont fixés à ..env.dist et .env
 | |
| - les fichiers ..env.dist et .runphp.conf sont créés le cas échéant
 | |
| - le script build est mis à jour
 | |
| - les wrappers PHP pour la gestion des tâches de fond sont mis à jour le cas
 | |
|   échéant"
 | |
|     --np,--no-phpwrappers-install install_phpwrappers= "ne pas installer les wrappers PHP"
 | |
| )
 | |
| parse_args "$@"; set -- "${args[@]}"
 | |
| 
 | |
| if [ -n "$projdir" ]; then
 | |
|     setx projdir=abspath "$projdir"
 | |
|     set -- "$projdir/sbin/runphp"
 | |
| fi
 | |
| 
 | |
| runphp="${1:-.}"
 | |
| if [ -d "$runphp" ]; then
 | |
|     runphp="$runphp/runphp"
 | |
| elif [ ! -e "$runphp" ]; then
 | |
|     [ "${runphp%/runphp}" != "$runphp" ] || runphp="$runphp/runphp"
 | |
| fi
 | |
| 
 | |
| setx runphp=abspath "$runphp"
 | |
| setx rundir=dirname -- "$runphp"
 | |
| [ "$rundir" == "$MYDIR" ] && exit 0
 | |
| [ -d "$rundir" ] || mkdir -p "$rundir"
 | |
| 
 | |
| # Tout d'abord, isoler chaque partie du fichier local
 | |
| ac_set_tmpfile preamble
 | |
| ac_set_tmpfile conf
 | |
| ac_set_tmpfile postamble
 | |
| parse_runphp "$MYDIR/runphp" "$preamble" "$conf" "$postamble"
 | |
| 
 | |
| # Puis analyser le fichier destination
 | |
| if [ -f "$runphp" ]; then
 | |
|     ac_set_tmpfile userconf
 | |
|     parse_runphp "$runphp" "" "$userconf" ""
 | |
|     initial_config=
 | |
| 
 | |
| elif [ -n "$projdir" ]; then
 | |
|     # forcer BUILDENV0=..env.dist et BUILDENV=.env pour les projets de
 | |
|     # l'université de la Réunion
 | |
|     ac_set_tmpfile userconf
 | |
|     sed <"$conf" >"$userconf" '
 | |
| /^BUILDENV0=/s/=.*/=..env.dist/
 | |
| /^BUILDENV=/s/=.*/=.env/
 | |
| '
 | |
|     initial_config=1
 | |
| 
 | |
| else
 | |
|     userconf="$conf"
 | |
|     initial_config=1
 | |
| fi
 | |
| 
 | |
| # (Re)construire le fichier destination
 | |
| estep "$(relpath "$runphp")"
 | |
| (
 | |
|     cat "$preamble"
 | |
|     echo
 | |
|     cat "$userconf"
 | |
|     echo
 | |
|     cat "$postamble"
 | |
| ) >"$runphp"
 | |
| [ -x "$runphp" ] || chmod +x "$runphp"
 | |
| 
 | |
| eval "$(
 | |
| vars=(PROJDIR COMPOSERDIR COMPOSERPHAR VENDORDIR BUILDENV0 BUILDENV BUILD_FLAVOUR DIST IMAGENAME)
 | |
| arrays=(BUILD_IMAGES DISTFILES TEMPLATEFILES VARFILES)
 | |
| for var in "${vars[@]}"; do eval "$var="; done
 | |
| for array in "${arrays[@]}"; do eval "$array=()"; done
 | |
| source "$runphp"
 | |
| for var in "${vars[@]}"; do echo_setv2 "$var"; done
 | |
| for array in "${arrays[@]}"; do echo_seta2 "$array"; done
 | |
| )"
 | |
| 
 | |
| estep "$(relpath "$rundir/Dockerfile.runphp")"
 | |
| rsync -lpt "$MYDIR/Dockerfile.runphp" "$rundir/"
 | |
| 
 | |
| if [ -n "$projdir" ]; then
 | |
|     if testdiff "$rundir/build" "$MYDIR/build"; then
 | |
|         estep "$(relpath "$rundir/build")"
 | |
|         cp "$MYDIR/build" "$rundir/build"
 | |
|         chmod +x "$rundir/build"
 | |
|     fi
 | |
|     if [ ! -f "$projdir/..env.dist" ]; then
 | |
|         estep "$(relpath "$projdir/..env.dist")"
 | |
|         sed <"$MYDIR/dot-build.env.dist" >"$projdir/..env.dist" '
 | |
| /^IMAGENAME=/s/=.*\//='"$(basename -- "$projdir")"'\//
 | |
| '
 | |
|         initial_config=1
 | |
|     fi
 | |
|     if [ ! -f "$projdir/.runphp.conf" ]; then
 | |
|         estep "$(relpath "$projdir/.runphp.conf")"
 | |
|         sed <"$MYDIR/dot-runphp.conf" >"$projdir/.runphp.conf" '
 | |
| /^RUNPHP=/s/=.*/=sbin\/runphp/
 | |
| '
 | |
|     fi
 | |
| 
 | |
|     if [ -z "$install_phpwrappers" ]; then
 | |
|         install_phpwrappers=
 | |
|     elif [ ! -f "$PROJDIR/$COMPOSERDIR/composer.json" ]; then
 | |
|         # ce doit être un projet PHP
 | |
|         install_phpwrappers=
 | |
|     elif [ -d "$projdir/cli/config" ]; then
 | |
|         install_phpwrappers=1
 | |
|         sbin_path=sbin
 | |
|         sbin2proj=..
 | |
|         cli_path=cli/config
 | |
|         cli2proj=../..
 | |
|     elif [ -d "$projdir/cli_config" ]; then
 | |
|         install_phpwrappers=1
 | |
|         sbin_path=sbin
 | |
|         sbin2proj=..
 | |
|         cli_path=cli_config
 | |
|         cli2proj=..
 | |
|     elif [ -d "$projdir/_cli" ]; then
 | |
|         install_phpwrappers=1
 | |
|         sbin_path=sbin
 | |
|         sbin2proj=..
 | |
|         cli_path=_cli
 | |
|         cli2proj=..
 | |
|     else
 | |
|         install_phpwrappers=
 | |
|     fi
 | |
| 
 | |
|     if [ -n "$install_phpwrappers" ]; then
 | |
|         setx -a phpwrappers=ls_files "$MYDIR" "phpwrapper-*"
 | |
|         for phpwrapper in "${phpwrappers[@]}"; do
 | |
|             destname="${phpwrapper#phpwrapper-}"
 | |
|             destdir="${PHPWRAPPER_DESTDIRS[$destname]}"
 | |
|             [ -n "$destdir" ] || die "$phpwrapper: la destination n'est pas configurée"
 | |
|             mode="${PHPWRAPPER_MODES[$destname]}"
 | |
| 
 | |
|             case "$destdir" in
 | |
|             @@SBIN@@) destdir="$PROJDIR/$sbin_path";;
 | |
|             @@CLI@@) destdir="$PROJDIR/$cli_path";;
 | |
|             *) destdir="$PROJDIR/$destdir";;
 | |
|             esac
 | |
| 
 | |
|             estep "$(relpath "$destdir/$destname")"
 | |
|             mkdir -p "$destdir"
 | |
|             tail -n+4 "$MYDIR/$phpwrapper" | sed "
 | |
| s|/@@SBIN@@/|/$sbin_path/|
 | |
| s|@@SBIN2PROJ@@|$sbin2proj|
 | |
| s|/@@CLI@@/|/$cli_path/|
 | |
| s|@@CLI2PROJ@@|$cli2proj|
 | |
| " >"$destdir/$destname"
 | |
|             [ -n "$mode" ] && chmod "$mode" "$destdir/$destname"
 | |
|         done
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| [ -n "$initial_config" ]
 |