#!/bin/sh

# addvirtual - Ajoute un hte virtuel dans le fichier de configuration d'Apache.

# Vous modifierez les valeurs suivantes pour les faire pointer sur les
# bons rpertoires.

docroot="/etc/httpd/html"
logroot="/var/log/httpd/"
httpconf="/etc/httpd/conf/httpd.conf"

# certains sites utilisent apachectl et non restart_apache:
restart="/usr/local/bin/restart_apache"

showonly=0
tempout="/tmp/addvirtual.$$";  trap "rm -f $tempout $tempout.2" 0

if [ "$1" = "-n" ] ; then
  showonly=1 ; shift
fi

if [ $# -ne 3 ] ; then
  echo "Syntaxe: $(basename $0) [-n] domaine adresse_admin id_propritaire" >&2
  echo "  O -n montre ce qui serait fait, mais ne fait rien" >&2
  exit 1
fi

# Contrle des erreurs communes et probables

if [ $(id -u) != "root" -a $showonly = 0 ] ; then
  echo "Erreur: $(basename $0) ne peut tre excut que sous l'identit de root." >&2
  exit 1
fi
if [ ! -z "$(echo $1 | grep -E '^www\.')" ] ; then
  echo "Veuillez omettre le prfixe www. sur le nom de domaine" >&2 
  exit 0
fi
if [ "$(echo $1 | sed 's/ //g')" != "$1" ] ; then
  echo "Erreur: les noms de domaine ne peuvent pas comporter d'espaces." >&2
  exit 1
fi
if [ -z "$(grep -E "^$3" /etc/passwd)" ] ; then
  echo "Compte $3 introuvable dans le fichier de mots de passe" >&2
  exit 1
fi

# Construit la structure de rpertoires et y dpose quelques fichiers 

if [ $showonly -eq 1 ] ; then
  tempout="/dev/tty"  # pour crire l'hte virtuel sur la sortie standard
  echo "mkdir $docroot/$1 $logroot/$1"
  echo "chown $3 $docroot/$1 $logroot/$1"
else
  if [ ! -d $docroot/$1 ] ; then
    if mkdir $docroot/$1 ; then
      echo "Je n'ai pu crer le rpertoire $docroot/$1: je quitte." >&2 ; exit 1
    fi
  fi
  if [ ! -d $logroot/$1 ] ; then 
    mkdir $logroot/$1
    if [ $? -ne 0 -a $? -ne 17 ] ; then
      # code d'erreur 17 = le rpertoire existe dj
      echo "Je n'ai pu crer le rpertoire $docroot/$1: je quitte." >&2 ; exit 1
    fi
  fi
  chown $3 $docroot/$1 $logroot/$1
fi

# Dposons maintenant les blocs ncessaires dans le fichier httpd.conf

cat << EOF > $tempout

####### Configuration pour l'hte virtuel $1 ###########

<VirtualHost www.$1 $1>
ServerName www.$1
ServerAdmin $2
DocumentRoot $docroot/$1
ErrorLog logs/$1/error_log
TransferLog logs/$1/access_log
</VirtualHost>

<Directory $docroot/$1>
Options Indexes FollowSymLinks Includes
AllowOverride All
order allow,deny
allow from all
</Directory>

EOF

if [ $showonly -eq 1 ]; then
  echo "Astuce: copiez le bloc ci-dessus dans $httpconf et"
  echo "redmarrez le serveur avec $restart; c'est tout."
  exit 0
fi

# Amliorons le fichier httpd.conf

date="$(date +%m%d%H%m)"        # mois jour heure minute 
cp $httpconf $httpconf.$date    # copie de sauvegarde du fichier de configuration

# Cherche la dernire ligne du fichier avec une entre </VirtualHost> 
# Oui, cela signifie que ce script ne fonctionnera pas en l'absence
# d'une premire entre d'hte virtuel dans le fichier de configuration.
# Si tel est votre cas, utilisez l'option -n et copiez  la main dans le
# fichier ce qui apparat...

addafter="$(cat -n $httpconf|grep '</VirtualHost>'|awk 'NR==1 {print $1}')"

if [ -z "$addafter" ]; then
  echo "Erreur: je ne trouve pas de ligne </VirtualHost> dans $httpconf" >&2
  /bin/rm -f $httpconf.$date; exit 1
fi

sed "${addafter}r $tempout" < $httpconf > $tempout.2
mv $tempout.2 $httpconf

if $restart ; then
  mv $httpconf $httpconf.failed.$date
  mv $httpconf.$date $httpconf
  $restart
  echo "La configuration semble avoir chou; serveur redmarr avec" >&2
  echo "  l'ancien fichier de configuration" >&2
  echo "La configuration qui a chou se trouve dans $httpconf.failed.$date" >&2
  exit 1
fi

exit 0
