L'ensemble des scripts et bibliothèques bash utilisés pour maintenir l'infrastructure du Tetalab. Ce socle Bash est une version légère et adaptée du socle Bash essentiellement développé par Emmanuel Confrère, éminent DBA Calédonien.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

309 lines
12 KiB

#!/bin/bash
#------------------------------------------------------------------------------------------------------------------
# Script : sys_create_vhost.sh
# Auteur : Doug Le Tough
# Date : 22-07-2017
# Version : 1.0.0
# Objet : Création d'un VHOST sur le rproxy et sur l'hôte du backend. le rproxy comme le backend
# sont considérés être des serveurs Apache. Ce script ajoute également le domaine passé
# en argument de la liste des domaines gérés par Dehydrated.
#
#------------------------------------------------------------------------------------------------------------------
# Mise a jour :
#
# 1.0.0 22/07/2017 - Doug Le Tough - Cre : Mise en production
# 1.1.0 26/07/2017 - Doug Le Tough - Evo : Ajout vérification de la configuration
# Ajout création du répertoire du backend
#
#------------------------------------------------------------------------------------------------------------------
# Dependances : Aucune
#
#
#------------------------------------------------------------------------------------------------------------------
# Liste des options et arguments:
#
# @OPT: o:domain:domain:1/1::::
# @OPT: o:backend_host:backend_host:1/1::::
# @OPT: o:backend_port:backend_port:1/1::::
#
#------------------------------------------------------------------------------------------------------------------
# Liste des erreurs:
#
# 2 | erreur | stop | ${ERROR}
#
#------------------------------------------------------------------------------------------------------------------
# Liste des paramètres de configuration définis dans le fichier de configuration du script:
#
# RPROXY_VHOST_TEMPLATE=rproxy_template.conf
# REMOTE_VHOST_TEMPLATE=backend_template.conf
# DEHYDRATED_DOMAIN_LIST=/etc/dehydrated/domains.txt
# HTTPD_PATH=/etc/httpd/sites-available
# WWW_ROOT_DIR=/var/www
#
#------------------------------------------------------------------------------------------------------------------
##
## Syntaxe :
## --------
##
## prompt> sys_create_vhost.sh -domain <DOMAIN.TLD> [-backend_host <BACKEND_HOST>] -backend_port <BACKEND_PORT>
##
## ex: sys_create_vhost.sh -domain pad.tetalab.org -backend_host jimmy.local.tetalab.org -backend_port 9001
##
## Prérequis:
## ----------
## - Le script doit être executé par l'utilisateur asr sur le rproxy (sousetsuken)
##
## Fonctionnement:
## ---------------
## Crée le fichier de configuration sur le rproxy à partir du fichiers modèle local_site_template.conf
## ainsi que le fichier de configuration sur l'hôte du backend à partir du fichier modèle remote_site_template.conf.
##
## Les deux fichiers modèles sont situés dans le répertoire NC_EXPL_MOD.
##
## Remarque importante: Ce script n'active *PAS* le virtualhost et ne redémarre *PAS* les serveurs Apache.
##
#------------------------------------------------------------------------------------------------------------------
# Initialisation de l'environement
#------------------------------------------------------------------------------------------------------------------
if [ "${USER}" != "asr" ]; then
ERROR="Seul l'utilisateur asr peut utiliser ce script"
echo -e "\033[91m${ERROR}\033[0m"
exit 1
fi
source /etc/profile.d/tetalab.sh
if [ ! -f ${NC_EXPL_CFG}/init.conf ]; then
echo "Le fichier d'initialisation du socle \${NC_EXPL_CFG}/init.conf n'éxiste pas !"
echo "Arrêt du script par sécurité"
exit 250
fi
source ${NC_EXPL_CFG}/init.conf
IP_ADDR=$(host ${backend_host} | rev | cut -d' ' -f1 | rev)
IS_PRESENT=$(grep -E ^${domain}$ ${DEHYDRATED_DOMAIN_LIST} | wc -l)
REMOTE_HTTP_PATH=${backend_host}:${HTTPD_PATH}
REPLACE_DOMAIN="s/SITE_NAME/${domain}/g"
REPLACE_HOST="s/SITE_HOST/${backend_host}/g"
REPLACE_IP_ADDR="s/SITE_IP/${IP_ADDR}/g"
REPLACE_SITE_PORT="s/SITE_PORT/${backend_port}/"
#------------------------------------------------------------------------------------------------------------------
# Fonctions
#------------------------------------------------------------------------------------------------------------------
function check_config
{
fct_message "Vérification de la configuration:" -color jaune
if [ ! -r ${SH_FICCFG} ]; then
ERROR="Fichier de configuration ${SH_FICCFG} absent ou illisible"
fct_erreur 2
fi
if [ ${#RPROXY_VHOST_TEMPLATE} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: RPROXY_VHOST_TEMPLATE"
fct_erreur 2
fi
if [ ${#REMOTE_VHOST_TEMPLATE} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: REMOTE_VHOST_TEMPLATE"
fct_erreur 2
fi
if [ ${#DEHYDRATED_DOMAIN_LIST} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: DEHYDRATED_DOMAIN_LIST"
fct_erreur 2
fi
if [ ${#HTTPD_PATH} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: HTTPD_PATH"
fct_erreur 2
fi
if [ ${#WWW_ROOT_DIR} -eq 0 ]; then
ERROR="Paramètre manquant ou vide dans le fichier de configuration: WWW_ROOT_DIR"
fct_erreur 2
fi
fct_message " * RPROXY_VHOST_TEMPLATE: ${RPROXY_VHOST_TEMPLATE}"
fct_message " * REMOTE_VHOST_TEMPLATE: ${REMOTE_VHOST_TEMPLATE}"
fct_message " * DEHYDRATED_DOMAIN_LIST: ${DEHYDRATED_DOMAIN_LIST}"
fct_message " * HTTPD_PATH: ${HTTPD_PATH}"
fct_message " * WWW_ROOT_DIR: ${WWW_ROOT_DIR}"
fct_message " * Domain: ${domain}"
fct_message " * Backend host: ${backend_host}"
fct_message " * Backend port: ${backend_port}"
}
function check_port
{
if [ ! ${backend_port} -gt 0 ] 2>/dev/null || [ ! ${backend_port} -lt 65535 ] 2>/dev/null; then
ERROR="Le numéro de port doit être compris entre 0 et 65535"
fct_erreur 2
fi
}
function check_templates
{
fct_message "Vérification de la présence du fichier modèle ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE}" -color jaune
if [ ! -r ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} ]; then
ERROR="${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible"
fct_erreur 2
fi
fct_message "Vérification de la présence du fichier modèle ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE}" -color jaune
if [ ! -r ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} ]; then
ERROR="${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible"
fct_erreur 2
fi
}
function create_rproxy_conf
{
fct_message "Création de la configuration du rproxy:" -color jaune
fct_message " * Domaine: ${domain}"
fct_message " * Hôte : ${backend_host}"
fct_message " * Port: ${backend_port}"
sed -s ${REPLACE_DOMAIN} ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du rproxy (1)"
fct_erreur 2
fi
sed -i ${REPLACE_HOST} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du rproxy (2)"
fct_erreur 2
fi
sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du rproxy (3)"
fct_erreur 2
fi
fct_message "Installation de la configuration du rproxy vers ${HTTPD_PATH}/${domain}.conf" -color jaune
sudo cp ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${HTTPD_PATH}/${domain}.conf
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'installation de la configuration du rproxy"
fct_erreur 2
fi
fct_message "Application des droits sur ${HTTPD_PATH}/${domain}.conf" -color jaune
sudo chown root: ${HTTPD_PATH}/${domain}.conf
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des droits."
fct_erreur 2
fi
fct_message "Application des permissions sur ${HTTPD_PATH}/${domain}.conf" -color jaune
sudo chmod 644 ${HTTPD_PATH}/${domain}.conf
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des permissions"
fct_erreur 2
fi
}
function create_backend_conf
{
fct_message "Création de la configuration du backend:" -color jaune
fct_message " * Domaine: ${domain}"
fct_message " * Addresse IP du backend: ${IP_ADDR}"
fct_message " * Port: ${backend_port}"
sed -s ${REPLACE_DOMAIN} ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du backend (1)"
fct_erreur 2
fi
sed -i ${REPLACE_IP_ADDR} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du backend (2)"
fct_erreur 2
fi
sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création de la configuration du backend (3)"
fct_erreur 2
fi
fct_message "Installation de la configuration du backend sur ${backend_host}" -color jaune
scp -q ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${backend_host}:/tmp/${domain}.conf
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'installation de la configuration du backend (1)"
fct_erreur 2
fi
ssh ${backend_host} "sudo mv /tmp/${domain}.conf ${HTTPD_PATH}/${domain}.conf"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'installation de la configuration du backend (2)"
fct_erreur 2
fi
fct_message "Application des droits sur le fichier de configuration du backend"
ssh ${backend_host} "sudo chown root: ${HTTPD_PATH}/${domain}.conf"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des droits sur la configuration du backend"
fct_erreur 2
fi
fct_message "Application des permissions sur le fichier de configuration du backend"
ssh ${backend_host} "sudo chmod 644 ${HTTPD_PATH}/${domain}.conf"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'application des permissions sur la configuration du backend"
fct_erreur 2
fi
}
function create_backend_document_root
{
fct_message "Création du répertoire d'accueil du backend sur ${backend_host}" -color jaune
ssh ${backend_host} "sudo mkdir -p ${WWW_ROOT_DIR}/${domain}"
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de la création du répertoire d'accueil du backend"
fct_erreur 2
fi
fct_message "Application des droits sur le répertoire d'accueil du backend" -color jaune
ssh ${backend_host} "sudo chown -R apache:apache ${WWW_ROOT_DIR}/${domain}"
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de de l'application des droits sur le répertoire d'accueil du backend"
fct_erreur 2
fi
fct_message "Application des permissions sur le répertoire d'accueil du backend" -color jaune
ssh ${backend_host} "sudo chmod -R 775 ${WWW_ROOT_DIR}/${domain}"
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de de l'application des droits sur le répertoire d'accueil du backend"
fct_erreur 2
fi
}
function add_domain
{
if [ ${IS_PRESENT} -eq 0 ]; then
fct_message "Ajout du domaine ${domain} aux domaines dont les certificats sont gérés par dehydrated" -color jaune
sudo echo ${domain} >> ${DEHYDRATED_DOMAIN_LIST}
RET_VAL=$?
if [ ! ${RET_VAL} -eq 0 ]; then
ERROR="Erreur lors de l'ajout du domaine dans ${DEHYDRATED_DOMAIN_LIST}"
fct_erreur 2
fi
else
fct_message "${domain} fait déjà partie de la liste des domaines gérés par dehydrated" -color jaune
fi
}
#------------------------------------------------------------------------------------------------------------------
# Traitement
#------------------------------------------------------------------------------------------------------------------
check_config
check_port
check_templates
create_rproxy_conf
if [ "${#backend_host}" -gt 0 ]; then
create_backend_conf
fi
create_backend_document_root
add_domain
fct_erreur 0