415 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			415 lines
		
	
	
		
			16 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")/lib/ulib/ulib" || exit 1
 | |
| urequire DEFAULTS template apache.tools
 | |
| apacheconfig_initvars
 | |
| 
 | |
| function display_help() {
 | |
|     uecho "$scriptname: Gérer la configuration d'un serveur web apache
 | |
| 
 | |
| USAGE
 | |
|     $scriptname -c
 | |
|     $scriptname -t -- args...
 | |
| 
 | |
| OPTIONS
 | |
|     -c, --create
 | |
|         Créer un nouveau répertoire de configuration pour un hôte
 | |
|     -d, --destdir DESTDIR[=$TEMPLATECTL_NAME]
 | |
|         Nom du répertoire local de configuration.
 | |
|     -f,--full
 | |
|     --partial
 | |
|         Indiquer respectivement que la configuration est complète ou partielle.
 | |
|         Avec la configuration complète, le serveur peut être complètement
 | |
|         configuré avec tous les fichiers présents. Avec la configuration
 | |
|         partielle, uniquement les informations spécifiques à un service en
 | |
|         particulier sont disponibles.
 | |
|         Cette option est utilisée avec --create. Par défaut, la configuration
 | |
|         est partielle.
 | |
|         Pour le moment, la seule différence est que --full crée un fichier de
 | |
|         configuration nommé .apacheconfig alors que --partial crée un fichier
 | |
|         nommé apacheconfig.conf qui est visible et donc découvrable et éditable
 | |
|         plus facilement
 | |
| 
 | |
|     -t, --template [OPT]
 | |
|         Gérer les fichiers du répertoire local avec templatectl. La valeur de
 | |
|         cette option est utilisée comme argument court pour l'invocation de
 | |
|         templatectl, e.g
 | |
|             $scriptname -tm args
 | |
|         est équivalent à
 | |
|             templatectl -m args
 | |
|         Les arguments qui restent sont passés tels quels à templatectl
 | |
|         Les options courantes de templatectl -l, -v, -m, -L sont disponibles
 | |
|         directement
 | |
|     --help-template
 | |
|         Afficher l'aide concernent la gestion des templates.
 | |
|         Equivalent à -t -- --help
 | |
|     -h, --host HOST
 | |
|         Spécifier l'hôte. Equivalent à -v host=HOST
 | |
|     --sysname SYSNAME
 | |
|     --sysdist SYSDIST
 | |
|     -s, --sysver SYSVER
 | |
|         Spécifier la distribution pour laquelle synchroniser le template. Par
 | |
|         défaut, choisir les valeurs correspondantes au système courant.
 | |
|         Les options -7 et -8 sont des aliases respectivement pour -s wheezy et
 | |
|         -s jessie, parce que les fichiers par défaut ont changé à partir de
 | |
|         debian jessie.
 | |
| 
 | |
|     -u, --update, --deploy
 | |
|         Mettre à jour la configuration système à partir du répertoire local.
 | |
|         Lors du déploiement de la configuration, les valeurs des variables
 | |
|         dynamiques sont remplacées dans les fichiers destination.
 | |
|         Les arguments qui restent sont passés tels quels à apache_autoconf
 | |
|     -p, --pull
 | |
|         Faire 'git pull' avant --update
 | |
|     -F, --fix-ip
 | |
|         Corriger les lignes de la forme '<VirtualHost *:PORT>#*ip:IP' et les
 | |
|         remplacer par '<VirtualHost IP:PORT>'
 | |
|         Cela permet de déployer une version de production des fichiers de
 | |
|         configuration.
 | |
|     -N, --network-config
 | |
|         Mettre aussi à jour la configuration réseau.
 | |
|     --no-post-update
 | |
|         Ne pas lancer le script post-update.sh après le déploiement s'il existe.
 | |
|         Le script est lancé avec les mêmes arguments que apacheconfig_deploy()
 | |
|         la fonction définie dans le module apache.tools
 | |
|     -r, --certsdir CERTSDIR
 | |
|         Spécifier le cas échéant le répertoire contenant les certificats à
 | |
|         déployer. Cet argument est requis si le répertoire certsconf/ existe,
 | |
|         sauf si les certificats sont déjà déployés.
 | |
| 
 | |
|     --localhosts
 | |
|         Créer dans le fichier /etc/hosts tous les noms d'hôte ayant un suffixe
 | |
|         .local mentionnés dans les fichiers de site. Cette option est utile pour
 | |
|         le développement et les tests.
 | |
|     -C, --one-conf CONF
 | |
|         Ne déployer que le fichier de configuration spécifié. Cette option est
 | |
|         utilisée avec --deploy et est utile pour le développement et les tests.
 | |
|     -M, --one-module MODULE
 | |
|         Ne déployer que le fichier de module spécifié. Cette option est utilisée
 | |
|         avec --deploy et est utile pour le développement et les tests.
 | |
|     -S, --one-site SITE
 | |
|         Ne déployer que le fichier de site spécifié. Cette option est utilisée
 | |
|         avec --deploy ou --localhosts et est utile pour le développement et les
 | |
|         tests.
 | |
| 
 | |
|     -k, --new-site HOST.TLD
 | |
|         Créer une définition pour un nouveau site à partir des fichiers du
 | |
|         répertoires templates/
 | |
|     -K, --new-site-templatedir TEMPLATEDIR
 | |
|         Spécifier le répertoire source pour les templates de site utilisés par
 | |
|         l'option --new-site. Par défaut, utiliser le répertoire templates/ situé
 | |
|         dans le répertoire de configuration.
 | |
|         Si TEMPLATEDIR est un nom simple sans séparateur de chemin '/' et qu'un
 | |
|         répertoire templates/TEMPLATEDIR existe, alors prendre ce répertoire-là
 | |
|         comme source.
 | |
|     --new-site-force
 | |
|         Avec --new-site, utiliser le nom d'hôte fourni même s'il n'est pas
 | |
|         pleinement qualifié"
 | |
| }
 | |
| 
 | |
| action=
 | |
| destdir=
 | |
| nohideconfig=auto
 | |
| templateopt=
 | |
| FULLCONF=
 | |
| pull=
 | |
| fixip=
 | |
| netconf=
 | |
| no_post_update=
 | |
| aac_certsdir=
 | |
| bits=
 | |
| oneconf=
 | |
| onemodule=
 | |
| onesite=
 | |
| site_host=
 | |
| site_templdir=
 | |
| site_force=
 | |
| args=(
 | |
|     --help '$exit_with display_help'
 | |
|     -c,--create action=create
 | |
|     -d:,--destdir: destdir=
 | |
|     --no-hideconfig nohideconfig=1
 | |
|     --hideconfig nohideconfig=
 | |
|     -f,--full FULLCONF=1
 | |
|     --partial FULLCONF=
 | |
|     -t::,--template:: '$set@ templateopt; action=template'
 | |
|     --help-template '$templateopt=-help; action=template'
 | |
|     -l,--list '$templateopt=l; action=template'
 | |
|     -v:,--var: TEMPLATECTL_VARS
 | |
|     -m,--merge '$templateopt=m; action=template'
 | |
|     -L,--list-vars '$templateopt=L; action=template'
 | |
|     -h:,--host: '$array_add TEMPLATECTL_VARS host="$value_"'
 | |
|     --sysname: '$array_add TEMPLATECTL_VARS sysname="$value_"'
 | |
|     --sysdist: '$array_add TEMPLATECTL_VARS sysdist="$value_"'
 | |
|     -s:,--sysver: '$array_add TEMPLATECTL_VARS sysver="$value_"'
 | |
|     -6,--squeeze '$array_add TEMPLATECTL_VARS sysver=squeeze'
 | |
|     -7,--wheezy '$array_add TEMPLATECTL_VARS sysver=wheezy'
 | |
|     -8,--jessie '$array_add TEMPLATECTL_VARS sysver=jessie'
 | |
|     --bits: bits=
 | |
|     -u,--update,--deploy action=deploy
 | |
|     -p,--pull pull=1
 | |
|     -F,--fix-ip fixip=1
 | |
|     -N,--network-config netconf=1
 | |
|     --no-post-update no_post_update=1
 | |
|     -r:,--certsdir: aac_certsdir=
 | |
|     --localhosts action=localhosts
 | |
|     -C:,--one-conf: oneconf=
 | |
|     -M:,--one-module: onemodule=
 | |
|     -S:,--one-site: onesite=
 | |
|     -k:,--new-site: '$action=new-site; set@ site_host'
 | |
|     -K:,--new-site-templatedir: site_templdir=
 | |
|     --new-site-force site_force=
 | |
| )
 | |
| parse_args "$@"; set -- "${args[@]}"
 | |
| 
 | |
| if [ "$nohideconfig" == auto ]; then
 | |
|     [ -n "$FULLCONF" ] && nohideconfig= || nohideconfig=1
 | |
| fi
 | |
| 
 | |
| if [ -n "$pull" ]; then
 | |
|     estep "Mise à jour du dépôt"
 | |
|     if [ -n "$destdir" ]; then
 | |
|         [ -d "$destdir" ] || die "$destdir: répertoire introuvable"
 | |
|         (cd "$destdir" && git pull) || die
 | |
|     else
 | |
|         git pull || die
 | |
|     fi
 | |
| fi
 | |
| 
 | |
| apacheconfig_loadconf "$destdir" "$nohideconfig" || die
 | |
| apacheconfig_sysinfos "$sysname" "$sysdist" "$sysver" "$bits"
 | |
| 
 | |
| ################################################################################
 | |
| if [ "$action" == create ]; then
 | |
|     if [ -n "$autocreate" -a ! -d "$destdir" ]; then
 | |
|         estepn "Création automatique de $(ppath "$destdir")"
 | |
|         mkdir -p "$destdir" || die
 | |
|     fi
 | |
|     [ -d "$destdir" ] || die "$destdir: répertoire introuvable"
 | |
| 
 | |
|     [ -n "$host" ] || host="$1"
 | |
|     if [ -n "$host" ]; then
 | |
|         read_value -i "Veuillez entrer le nom d'hôte" host "$host"
 | |
|     else
 | |
|         check_interaction -c && einfo "Vous pouvez entrer un nom d'hôte spécifique pour la nouvelle configuration, ou laisser la valeur par défaut @@dhost@@ pour qu'il soit calculé dynamiquement lors du déploiement"
 | |
|         read_value "Veuillez entrer le nom d'hôte" host @@dhost@@
 | |
|     fi
 | |
|     __template_set_var host "$host"
 | |
| 
 | |
|     if [ -f "$config" ]; then
 | |
|         ask_yesno "Le fichier $(ppath "$config") sera écrasé. Voulez-vous continuer?" O || die
 | |
|         rm -f "$config" || die
 | |
|     fi
 | |
|     templatectl -d "$destdir" --config "$config" ${nohideconfig:+--no-hide-config} --no-load-vars -m --write-vars
 | |
| 
 | |
| ################################################################################
 | |
| elif [ "$action" == template ]; then
 | |
|     __TEMPLATECTL_HELP="USAGE: $scriptname -t -- args...
 | |
| 
 | |
| $__TEMPLATECTL_HELP"
 | |
|     templatectl -d "$destdir" --config "$config" --no-load-vars ${templateopt:+-$templateopt} "$@"
 | |
| 
 | |
| ################################################################################
 | |
| elif [ "$action" == deploy -o "$action" == localhosts ]; then
 | |
|     [ -d "$destdir" ] || die "$destdir: répertoire introuvable"
 | |
| 
 | |
|     args=(
 | |
|         -d "$destdir" --$action
 | |
|         ${fixip:+--fix-ip}
 | |
|         ${netconf:+--network-config}
 | |
|         ${no_post_update:+--no-post-update}
 | |
|         ${aac_certsdir:+-r "$aac_certsdir"}
 | |
|         ${oneconf:+--one-conf "$oneconf"}
 | |
|         ${onemodule:+--one-module "$onemodule"}
 | |
|         ${onesite:+--one-site "$onesite"}
 | |
|     )
 | |
|     # sur une ligne séparée parce que $bits peut être vide
 | |
|     [ -n "$custom_sysinfos" ] && array_add args --sysname "$sysname" --sysdist "$sysdist" --sysver "$sysver" --bits "$bits"
 | |
|     for __name in "${TEMPLATE_DYNAMIC_VARS[@]}"; do
 | |
|         array_add args -v "$__name=${!__name}"
 | |
|     done
 | |
|     array_add args -- "$@"
 | |
|     run_as_root "${args[@]}"
 | |
| 
 | |
|     if [ "$action" == deploy ]; then
 | |
|         etitle "Mise à jour du système"
 | |
|         apacheconfig_deploy \
 | |
|             "$destdir" "$aac_certsdir" \
 | |
|             "$config" "$oneconf" "$onemodule" "$onesite" \
 | |
|             "$custom_sysinfos" "$sysname" "$sysdist" "$sysver" "$bits" \
 | |
|             "$netconf" "$fixip" "$no_post_update" || die
 | |
|         eend
 | |
|     elif [ "$action" == localhosts ]; then
 | |
|         etitle "Mise à jour de /etc/hosts"
 | |
|         apacheconfig_localhosts "$destdir" "$aac_certsdir" "$onesite" || die
 | |
|         eend
 | |
|     fi
 | |
| 
 | |
| ################################################################################
 | |
| elif [ "$action" == new-site ]; then
 | |
|     host="$site_host"
 | |
|     templdir="$site_templdir"
 | |
| 
 | |
|     if [ -z "$templdir" -a -d "$destdir/templates" ]; then
 | |
|         # si on ne précise pas le template à utiliser, alors afficher
 | |
|         # éventuellement un menu si plusieurs templates sont disponibles
 | |
|         templdirs=()
 | |
|         if [ -n "$(list_all "$destdir/templates" "*SITE*")" ]; then
 | |
|             array_add templdirs templates
 | |
|             templdir=templates
 | |
|         fi
 | |
|         array_from_lines stempldirs "$(list_dirs "$destdir/templates" | grep -v SITE)"
 | |
|         for stempldir in "${stempldirs[@]}"; do
 | |
|             if [ -n "$(list_all "$destdir/templates/$stempldir" "*SITE*")" ]; then
 | |
|                 array_add templdirs "templates/$stempldir"
 | |
|                 [ -n "$templdir" ] || templdir="templates/$stempldir"
 | |
|             fi
 | |
|         done
 | |
|         if [ ${#templdirs[*]} -gt 1 ]; then
 | |
|             simple_menu templdir templdirs -t "Choix du répertoire des modèles" -m "Veuillez choisir le modèle à utiliser"
 | |
|         fi
 | |
|         templdir="$destdir/$templdir"
 | |
|     fi
 | |
| 
 | |
|     if [[ "$templdir" != */* ]] && [ -d "$destdir/templates/$templdir" ]; then
 | |
|         templdir="$destdir/templates/$templdir"
 | |
|     elif [ -z "$templdir" ]; then
 | |
|         templdir="$destdir/templates"
 | |
|     fi
 | |
|     [ -d "$templdir" ] || die "$templdir: répertoire introuvable"
 | |
|     force="$site_force"
 | |
| 
 | |
|     clrtempl=
 | |
|     ssltempl=
 | |
|     certstempl=
 | |
|     wwwtempl=
 | |
|     array_from_lines clrtempls "$(list_files "$templdir" "*SITE*.conf")"
 | |
|     array_from_lines ssltempls "$(list_files "$templdir" "*SITE*.ssl.conf")"
 | |
|     array_from_lines certstempls "$(list_files "$templdir" "*SITE*-certs.conf")"
 | |
|     for xtempl in "${ssltempls[@]}" "${certstempls[@]}"; do
 | |
|         array_del clrtempls "$xtempl"
 | |
|     done
 | |
|     [ ${#clrtempls[*]} -gt 0 ] && clrtempl="${clrtempls[0]}"
 | |
|     [ ${#ssltempls[*]} -gt 0 ] && ssltempl="${ssltempls[0]}"
 | |
|     [ ${#certstempls[*]} -gt 0 ] && certstempl="${certstempls[0]}"
 | |
|     array_from_lines wwwtempls "$(list_dirs "$templdir" "*SITE*")"
 | |
|     [ ${#wwwtempls[*]} -gt 0 ] && wwwtempl="${wwwtempls[0]}"
 | |
| 
 | |
|     found=
 | |
|     for i in "$clrtempl" "$ssltempl" "$certstempl" "$wwwtempl"; do
 | |
|         [ -n "$i" ] && { found=1; break; }
 | |
|     done
 | |
|     [ -n "$found" ] || die "Aucun template disponible"
 | |
| 
 | |
|     if [ -z "$force" ] && [[ "$host" != *.* ]]; then
 | |
|         die "$host n'est pas un nom d'hôte pleinement qualifié"
 | |
|     fi
 | |
| 
 | |
|     hostip=
 | |
|     for i in "$clrtempl" "$ssltempl"; do
 | |
|         [ -n "$i" -a -f "$templdir/$i" ] || continue
 | |
|         quietgrep SITE_IP "$templdir/$i" && { hostip=1; break; }
 | |
|     done
 | |
|     if [ -n "$hostip" ]; then
 | |
|         # Il y a un champ SITE_IP, il faut demander à l'utilisateur l'adresse ip
 | |
|         # correspondante
 | |
|         [[ "$host" == *.* ]] && hostdomain="${host#*.}" || hostdomain=
 | |
|         pri=
 | |
|         hostip=
 | |
|         i=0
 | |
|         while [ $i -lt ${#PUBDOMAINS[*]} ]; do
 | |
|             if [ "${PUBDOMAINS[$i]}" == "$hostdomain" ]; then
 | |
|                 pri="$VSPREFIX${host%$hostdomain}${PRIDOMAINS[$i]}"
 | |
|                 resolv_ips ips "$pri"
 | |
|                 if [ -n "$ips" ]; then
 | |
|                     hostip="${ips[0]}"
 | |
|                     break
 | |
|                 fi
 | |
|             fi
 | |
|             i=$(($i + 1))
 | |
|         done
 | |
|         if [ -z "$hostip" ]; then
 | |
|             pri="$VSPREFIX$host"
 | |
|             resolv_ips ips "$pri"
 | |
|             [ -n "$ips" ] && hostip="${ips[0]}"
 | |
|         fi
 | |
|         if [ -n "$pri" -a -n "$hostip" ]; then
 | |
|             enote "Correspondance automatique $host --> $pri"
 | |
|             read_value "Veuillez confirmer l'adresse IP d'écoute" hostip "$hostip" N
 | |
|         else
 | |
|             enote "Vous devez saisir l'adresse IP privée correspondant à $host"
 | |
|             read_value "Veuillez entrer l'adresse IP *privée* d'écoute" hostip "" N
 | |
|         fi
 | |
|         [ -n "$hostip" ] || ewarn "Vous avez choisi de ne pas spécifier d'adresse IP d'écoute. Il faudra corriger manuellement les fichiers générés"
 | |
|     fi
 | |
| 
 | |
|     etitle "$host"
 | |
|     hostname="${host%%.*}"
 | |
|     clrconf="${clrtempl/SITE/$hostname}"
 | |
|     sslconf="${ssltempl/SITE/$hostname}"
 | |
|     certsconf="${certstempl/SITE/$hostname}"
 | |
|     wwwdir="${wwwtempl/SITE/$hostname}"
 | |
| 
 | |
|     mkdir -p "$destdir/certsconf"
 | |
|     mkdir -p "$destdir/sites"
 | |
| 
 | |
|     sedscript=
 | |
|     [ -n "$hostip" ] && sedscript="$sedscript
 | |
| s/SITE_IP/$hostip/g"
 | |
|     sedscript="$sedscript
 | |
| s/SITE.TLD/$host/g
 | |
| s/SITE/$hostname/g"
 | |
| 
 | |
|     if [ -z "$clrtempl" ]; then
 | |
|         :
 | |
|     elif [ ! -f "$templdir/$clrtempl" ]; then
 | |
|         ewarn "Le fichier $(ppath "$templdir/$clrtempl") n'existe pas. La copie ne sera pas complète"
 | |
|     elif [ -f "$destdir/sites/$clrconf" ]; then
 | |
|         ewarn "Le fichier sites/$clrconf existe déjà. Il ne sera pas écrasé."
 | |
|     else
 | |
|         estep "sites/$clrconf"
 | |
|         sed "$sedscript" "$templdir/$clrtempl" >"$destdir/sites/$clrconf" || die
 | |
|     fi
 | |
| 
 | |
|     if [ -z "$ssltempl" ]; then
 | |
|         :
 | |
|     elif [ ! -f "$templdir/$ssltempl" ]; then
 | |
|         ewarn "Le fichier $(ppath "$templdir/$ssltempl") n'existe pas. La copie ne sera pas complète"
 | |
|     elif [ -f "$destdir/sites/$sslconf" ]; then
 | |
|         ewarn "Le fichier sites/$sslconf existe déjà. Il ne sera pas écrasé."
 | |
|     else
 | |
|         estep "sites/$sslconf"
 | |
|         sed "$sedscript" "$templdir/$ssltempl" >"$destdir/sites/$sslconf" || die
 | |
|     fi
 | |
| 
 | |
|     if [ -z "$certstempl" ]; then
 | |
|         :
 | |
|     elif [ ! -f "$templdir/$certstempl" ]; then
 | |
|         ewarn "Le fichier $(ppath "$templdir/$certstempl") n'existe pas. La copie ne sera pas complète"
 | |
|     elif [ -f "$destdir/certsconf/$certsconf" ]; then
 | |
|         ewarn "Le fichier certsconf/$certsconf exite déjà. Il ne sera pas écrasé."
 | |
|     else
 | |
|         estep "certsconf/$certsconf"
 | |
|         sed "$sedscript" "$templdir/$certstempl" >"$destdir/certsconf/$certsconf" || die
 | |
|     fi
 | |
| 
 | |
|     if [ -z "$wwwtempl" ]; then
 | |
|         :
 | |
|     elif [ ! -d "$templdir/$wwwtempl" ]; then
 | |
|         ewarn "Le répertoire $(ppath "$templdir/$wwwtempl") n'existe pas. La copie ne sera pas complète"
 | |
|     elif [ -d "$destdir/$wwwdir" ]; then
 | |
|         ewarn "Le répertoire $wwwdir existe déjà. Il ne sera pas écrasé."
 | |
|     else
 | |
|         estep "$wwwdir"
 | |
|         cpdirnovcs "$templdir/$wwwtempl" "$destdir/$wwwdir" || die
 | |
|         sed -i "$sedscript" "$destdir/$wwwdir/.udir" || die
 | |
|     fi
 | |
| 
 | |
|     eend
 | |
| 
 | |
|     if [ -n "$wwwtempl" ]; then
 | |
|         eimportant "Ne pas oublier le cas échéant de mettre à jour HTDMAPPINGS dans $(ppath "$config") e.g.
 | |
|     HTDMAPPINGS=($wwwdir)"
 | |
|     fi
 | |
| fi
 |