#!/bin/bash

# script en langage shell (bash) automatisant une installation et configuration d'un serveur BIND
# dans la situation particulière du local 30 à l'epfc WSP
# (c'est à dire existance d'un serveur http à l'adresse 192.168.30.130
#  qui fournit un certain nombre de fichiers)
# l'essentiel du travail est fait par le script perl 'h2n' disponible sur internet
# ce script-ci l'adapte aux dernières versions de BIND, qui s'exécutent en 'chroot'
# et automatise les installations

# si le script est exécuté sans arguments, il installe une configuration par 
# défaut qui correspondent à l'exemple des notes de cours (Mise en oeuvre de BIND)

# si l'on fournit 2 fichiers de configuration, et qu'on les donne en paramètres au script
# il installera le configuration correspondante

id=`whoami`

if [[ $id != "root" ]]; then
	echo il faut être root pour exécuter ce script
	exit
fi

# attribution des paramètres optionnels

domainhosts=$1
# fichier contenant les noms du domaine à publier, dans le format de /etc/hosts, 
# qui sera ajouté à la fin de /etc/hosts (s'il n'y est pas déjà)
h2nargsfile=$2
# fichier contenant les argument à donner au script h2n pour qu'il produise les fichiers de configuration
# de BIND pour que celui-ci publie noms qui figurent dans $domainhosts
localfilesdirectory=$3
# l'existance d'un troisième argument indique que les fichiers de configuration sont locaux
# (au lieu d'être sur le serveur http à l'adresse 192.168.30.130)
# sa valeur doit être le répertoire où ils se trouvent ( '.' pour le répertoire courant )

# vérification des paramètres

# valeurs par défaut pour ces deux paramètres, qui correspondent à l'exemple des notes de cours
if [[ $domainhosts == "" ]]; then
	domainhosts="dom.hosts"
fi

if [[ $h2nargsfile == "" ]]; then
	h2nargsfile="h2n.args"
fi

if [[ $localfilesdirectory != "" ]]; then
# s'il y a un troisième argument
	if [[ ! -d "$localfilesdirectory" ]]; then
	# vérifier qu'il correspond à un répertoire existant
		echo $localfilesdirectory n''est pas un répertoire existant
		echo script non exécuté !
		echo 
		exit
	fi
	if [[ ! -f "$localfilesdirectory/$domainhosts" ]]; then
	# vérifier que le fichier $domainhosts existe
		echo le fichier $localfilesdirectory/$domainhosts n''existe pas
		echo script non exécuté !
		echo 
		exit
	fi
	if [[ ! -f "$localfilesdirectory/$h2nargsfile" ]]; then
	# vérifier que le fichier $domainhosts existe
		echo le fichier $localfilesdirectory/$h2nargsfile n''existe pas
		echo script non exécuté !
		echo 
		exit
	fi
fi


wnamed=`which named 2>/dev/null`
# le script 'sortie_erreur3' (disponible sur la page SYSX serveur local 192.168.30.130)
# explique et illustre cette syntaxe par des exemples
if [[ $wnamed == "" ]]; then
# si named n'est pas encore installé
# 	/usr/bin/wget --directory-prefix=/usr/local/bin http://192.168.30.130/bind-9.4.1-7mdv2008.0.i586.rpm
	/usr/bin/wget --directory-prefix=/usr/local/bin http://192.168.30.130/libpq8.3_5-8.3.4-6mdv2009.0.i586.rpm
	/usr/bin/wget --directory-prefix=/usr/local/bin http://192.168.30.130/bind-9.5.0-6mdv2009.0.i586.rpm
	# télécharger le rpm de bind (à partir du serveur local 192.168.30.130)
# 	/usr/sbin/urpmi --force /usr/local/bin/bind-9.4.1-7mdv2008.0.i586.rpm
	/usr/sbin/urpmi --force /usr/local/bin/libpq8.3_5-8.3.4-6mdv2009.0.i586.rpm
	/usr/sbin/urpmi --force /usr/local/bin/bind-9.5.0-6mdv2009.0.i586.rpm
	# et l'installer par la commande urpmi
fi

wh2n=`which h2n 2>/dev/null`
if [[ $h2n == "" ]]; then
# si h2n n'est pas encore installé
	if [[ ! -f "/usr/local/bin/h2n.tar.gz" ]]; then
	# s'il n'est pas encore installé
		/usr/bin/wget --directory-prefix=/usr/local/bin http://192.168.30.130/h2n.tar.gz
		# télécharger le tgz de h2n (à partir du serveur local 192.168.30.130)
	fi
	if [[ ! -f "/usr/local/bin/h2n-2.56/h2n" ]]; then
		cd /usr/local/bin
		/bin/tar xzf /usr/local/bin/h2n.tar.gz
		# décompresserer le tgz de h2n dans /usr/local/bin
	fi
	/bin/cp -f /usr/local/bin/h2n-2.56/h2n /usr/local/bin/
	# copier l'exécutable dans /usr/local/bin/ , pour qu'il soit dans le path
	/bin/cp -f /usr/local/bin/h2n-2.56/h2n.html /usr/local/etc/
	# copier le fichier expliquant la configuration dans /usr/local/etc/ , 
	# pour qu'il soit visible facilement
fi

if [[ ! -d /var/named ]]; then
# si le répertoire /var/named n'existe pas
	mkdir /var/named/
	# le créer
fi


if [[ $localfilesdirectory == "" ]]; then
# si les fichiers de configuration sont sur le serveur 192.168.30.130)
	if [[ -f /usr/local/etc/$domainhosts ]]; then
	# si $domainhosts exite déjà
		/bin/rm -f  /usr/local/etc/$domainhosts
		# le supprimer
	fi
	/usr/bin/wget --directory-prefix=/usr/local/etc http://192.168.30.130/$domainhosts
	# télécharger $domainhosts 
	if [[ -f /var/named/$h2nargsfile ]]; then
	# si $h2nargsfile exite déjà
		/bin/rm -f  /var/named/$h2nargsfile
		# le supprimer
	fi
	/usr/bin/wget --directory-prefix=/var/named http://192.168.30.130/$h2nargsfile
	# télécharger $h2nargsfile 
else
# si les fichiers de configuration sont locaux (sur le PC où le script est exécuté)
	/bin/cp -f $localfilesdirectory/$domainhosts /usr/local/etc/
	/bin/cp -f $localfilesdirectory/$h2nargsfile /var/named
	# les copier à l'endroit voulu
fi


if [[ ! -f /etc/hosts.orig  ]]; then
# si le fichier de sauvegarde de /etc/hosts dans /etc/hosts.orig n'existe pas encore
  cp /etc/hosts /etc/hosts.orig
  # sauvegarder l'état actuel de /etc/hosts dans /etc/hosts.orig
fi


# concaténer le fichier $domainhosts au fichier /etc/hosts 
cat /usr/local/etc/$domainhosts >> /etc/hosts 

pwd=`pwd`
# garder en mémoire le répertoire actif actuel

cd /var/named
# se mettre dans /var/named

# il faut se mettre dans /var/named car h2n met les fichiers de configuration qu'il produit
# dans le répertoire dans lequel il est exécuté
/usr/local/bin/h2n -f $h2nargsfile
# exécuter h2n avec les paramètres contenus dans le fichier $h2nargsfile


# s'ils n'existent pas, 
# créer des répertoires nécessaires pour pouvoir faire les copies qui suivent
if [[ ! -d /var/lib/named/run ]]; then
	mkdir /var/lib/named/run
fi

if [[ ! -d /var/lib/named/run/named ]]; then
	mkdir /var/lib/named/run/named
fi

if [[ ! -d /var/lib/named/var/run/named ]]; then
	mkdir /var/lib/named/var/run/named
fi

if [[ ! -d /var/lib/named/etc ]]; then
	mkdir /var/lib/named/etc
fi


cp -f /var/named/* /var/lib/named/var/named
# copier les fichiers de configuration DNS produits par h2n (dans /var/named) 
# dans /var/lib/named/var/named
# pour tenir compte du fait que named est exécuté en 'chroot /var/lib/named'

cp -f /var/named/named.conf /var/lib/named/etc/named.conf
# copier le fichier de configuration de BIND produit par h2n (dans /var/named) 
# dans /var/lib/named/etc
# pour tenir compte du fait que named est exécuté en 'chroot /var/lib/named'

cd /var/lib/named/var/named
# se mettre dans /var/lib/named/var/named
# pour pouvoir créer plus facilement le lien symbolique suivant :

ln -sf named.ca db.cache
# créer un lien symbolique entre le fichier des 'root-servers' fourni par BIND (named.ca)
# et le nom par lequel h2n veut y accéder (db.cache)

chown -R named /var/lib/named/
# donner la propriété de tout le contenu de /var/lib/named/ à l'utilisateur 'named'

/usr/bin/killall named
# terminer l'exécution de tous les processus de nom 'named'

/usr/sbin/named -u named -t /var/lib/named
# lancer named, en 'chroot /var/lib/named'

cp -f /etc/hosts /etc/bico.hosts
# sauvegarder l'état actuel de /etc/hosts dans /etc/bico.hosts


# restaurer les conditions initiales :

mv -f /etc/hosts.orig /etc/hosts
# écraser le fichier etc/hosts par son état originel /etc/hosts.orig

cd $pwd
# se remettre dans le répertoire initial
