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

4 years ago
4 years ago
  1. #!/bin/bash
  2. #------------------------------------------------------------------------------------------------------------------
  3. # Script : sys_create_vhost.sh
  4. # Auteur : Doug Le Tough
  5. # Date : 22-07-2017
  6. # Version : 1.0.0
  7. # Objet : Création d'un VHOST sur le rproxy et sur l'hôte du backend. le rproxy comme le backend
  8. # sont considérés être des serveurs Apache. Ce script ajoute également le domaine passé
  9. # en argument de la liste des domaines gérés par Dehydrated.
  10. #
  11. #------------------------------------------------------------------------------------------------------------------
  12. # Mise a jour :
  13. #
  14. # 1.0.0 22/07/2017 - Doug Le Tough - Cre : Mise en production
  15. # 1.1.0 26/07/2017 - Doug Le Tough - Evo : Ajout vérification de la configuration
  16. # Ajout création du répertoire du backend
  17. #
  18. #------------------------------------------------------------------------------------------------------------------
  19. # Dependances : Aucune
  20. #
  21. #
  22. #------------------------------------------------------------------------------------------------------------------
  23. # Liste des options et arguments:
  24. #
  25. # @OPT: o:domain:domain:1/1::::
  26. # @OPT: o:backend_host:backend_host:1/1::::
  27. # @OPT: o:backend_port:backend_port:1/1::::
  28. #
  29. #------------------------------------------------------------------------------------------------------------------
  30. # Liste des erreurs:
  31. #
  32. # 2 | erreur | stop | ${ERROR}
  33. #
  34. #------------------------------------------------------------------------------------------------------------------
  35. # Liste des paramètres de configuration définis dans le fichier de configuration du script:
  36. #
  37. # RPROXY_VHOST_TEMPLATE=rproxy_template.conf
  38. # REMOTE_VHOST_TEMPLATE=backend_template.conf
  39. # DEHYDRATED_DOMAIN_LIST=/etc/dehydrated/domains.txt
  40. # HTTPD_PATH=/etc/httpd/sites-available
  41. # WWW_ROOT_DIR=/var/www
  42. #
  43. #------------------------------------------------------------------------------------------------------------------
  44. ##
  45. ## Syntaxe :
  46. ## --------
  47. ##
  48. ## prompt> sys_create_vhost.sh -domain <DOMAIN.TLD> [-backend_host <BACKEND_HOST>] -backend_port <BACKEND_PORT>
  49. ##
  50. ## ex: sys_create_vhost.sh -domain pad.tetalab.org -backend_host jimmy.local.tetalab.org -backend_port 9001
  51. ##
  52. ## Prérequis:
  53. ## ----------
  54. ## - Le script doit être executé par l'utilisateur asr sur le rproxy (sousetsuken)
  55. ##
  56. ## Fonctionnement:
  57. ## ---------------
  58. ## Crée le fichier de configuration sur le rproxy à partir du fichiers modèle local_site_template.conf
  59. ## ainsi que le fichier de configuration sur l'hôte du backend à partir du fichier modèle remote_site_template.conf.
  60. ##
  61. ## Les deux fichiers modèles sont situés dans le répertoire NC_EXPL_MOD.
  62. ##
  63. ## Remarque importante: Ce script n'active *PAS* le virtualhost et ne redémarre *PAS* les serveurs Apache.
  64. ##
  65. #------------------------------------------------------------------------------------------------------------------
  66. # Initialisation de l'environement
  67. #------------------------------------------------------------------------------------------------------------------
  68. if [ "${USER}" != "asr" ]; then
  69. ERROR="Seul l'utilisateur asr peut utiliser ce script"
  70. echo -e "\033[91m${ERROR}\033[0m"
  71. exit 1
  72. fi
  73. source /etc/profile.d/tetalab.sh
  74. if [ ! -f ${NC_EXPL_CFG}/init.conf ]; then
  75. echo "Le fichier d'initialisation du socle \${NC_EXPL_CFG}/init.conf n'éxiste pas !"
  76. echo "Arrêt du script par sécurité"
  77. exit 250
  78. fi
  79. source ${NC_EXPL_CFG}/init.conf
  80. IP_ADDR=$(host ${backend_host} | rev | cut -d' ' -f1 | rev)
  81. IS_PRESENT=$(grep -E ^${domain}$ ${DEHYDRATED_DOMAIN_LIST} | wc -l)
  82. REMOTE_HTTP_PATH=${backend_host}:${HTTPD_PATH}
  83. REPLACE_DOMAIN="s/SITE_NAME/${domain}/g"
  84. REPLACE_HOST="s/SITE_HOST/${backend_host}/g"
  85. REPLACE_IP_ADDR="s/SITE_IP/${IP_ADDR}/g"
  86. REPLACE_SITE_PORT="s/SITE_PORT/${backend_port}/"
  87. #------------------------------------------------------------------------------------------------------------------
  88. # Fonctions
  89. #------------------------------------------------------------------------------------------------------------------
  90. function check_config
  91. {
  92. fct_message "Vérification de la configuration:" -color jaune
  93. if [ ! -r ${SH_FICCFG} ]; then
  94. ERROR="Fichier de configuration ${SH_FICCFG} absent ou illisible"
  95. fct_erreur 2
  96. fi
  97. if [ ${#RPROXY_VHOST_TEMPLATE} -eq 0 ]; then
  98. ERROR="Paramètre manquant ou vide dans le fichier de configuration: RPROXY_VHOST_TEMPLATE"
  99. fct_erreur 2
  100. fi
  101. if [ ${#REMOTE_VHOST_TEMPLATE} -eq 0 ]; then
  102. ERROR="Paramètre manquant ou vide dans le fichier de configuration: REMOTE_VHOST_TEMPLATE"
  103. fct_erreur 2
  104. fi
  105. if [ ${#DEHYDRATED_DOMAIN_LIST} -eq 0 ]; then
  106. ERROR="Paramètre manquant ou vide dans le fichier de configuration: DEHYDRATED_DOMAIN_LIST"
  107. fct_erreur 2
  108. fi
  109. if [ ${#HTTPD_PATH} -eq 0 ]; then
  110. ERROR="Paramètre manquant ou vide dans le fichier de configuration: HTTPD_PATH"
  111. fct_erreur 2
  112. fi
  113. if [ ${#WWW_ROOT_DIR} -eq 0 ]; then
  114. ERROR="Paramètre manquant ou vide dans le fichier de configuration: WWW_ROOT_DIR"
  115. fct_erreur 2
  116. fi
  117. fct_message " * RPROXY_VHOST_TEMPLATE: ${RPROXY_VHOST_TEMPLATE}"
  118. fct_message " * REMOTE_VHOST_TEMPLATE: ${REMOTE_VHOST_TEMPLATE}"
  119. fct_message " * DEHYDRATED_DOMAIN_LIST: ${DEHYDRATED_DOMAIN_LIST}"
  120. fct_message " * HTTPD_PATH: ${HTTPD_PATH}"
  121. fct_message " * WWW_ROOT_DIR: ${WWW_ROOT_DIR}"
  122. fct_message " * Domain: ${domain}"
  123. fct_message " * Backend host: ${backend_host}"
  124. fct_message " * Backend port: ${backend_port}"
  125. }
  126. function check_port
  127. {
  128. if [ ! ${backend_port} -gt 0 ] 2>/dev/null || [ ! ${backend_port} -lt 65535 ] 2>/dev/null; then
  129. ERROR="Le numéro de port doit être compris entre 0 et 65535"
  130. fct_erreur 2
  131. fi
  132. }
  133. function check_templates
  134. {
  135. fct_message "Vérification de la présence du fichier modèle ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE}" -color jaune
  136. if [ ! -r ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} ]; then
  137. ERROR="${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible"
  138. fct_erreur 2
  139. fi
  140. fct_message "Vérification de la présence du fichier modèle ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE}" -color jaune
  141. if [ ! -r ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} ]; then
  142. ERROR="${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} n'existe pas ou n'est pas lisible"
  143. fct_erreur 2
  144. fi
  145. }
  146. function create_rproxy_conf
  147. {
  148. fct_message "Création de la configuration du rproxy:" -color jaune
  149. fct_message " * Domaine: ${domain}"
  150. fct_message " * Hôte : ${backend_host}"
  151. fct_message " * Port: ${backend_port}"
  152. sed -s ${REPLACE_DOMAIN} ${NC_EXPL_MOD}/${RPROXY_VHOST_TEMPLATE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  153. RET_VAL=$?
  154. if [ ! ${RET_VAL} -eq 0 ]; then
  155. ERROR="Erreur lors de la création de la configuration du rproxy (1)"
  156. fct_erreur 2
  157. fi
  158. sed -i ${REPLACE_HOST} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  159. RET_VAL=$?
  160. if [ ! ${RET_VAL} -eq 0 ]; then
  161. ERROR="Erreur lors de la création de la configuration du rproxy (2)"
  162. fct_erreur 2
  163. fi
  164. sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  165. RET_VAL=$?
  166. if [ ! ${RET_VAL} -eq 0 ]; then
  167. ERROR="Erreur lors de la création de la configuration du rproxy (3)"
  168. fct_erreur 2
  169. fi
  170. fct_message "Installation de la configuration du rproxy vers ${HTTPD_PATH}/${domain}.conf" -color jaune
  171. sudo cp ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${HTTPD_PATH}/${domain}.conf
  172. RET_VAL=$?
  173. if [ ! ${RET_VAL} -eq 0 ]; then
  174. ERROR="Erreur lors de l'installation de la configuration du rproxy"
  175. fct_erreur 2
  176. fi
  177. fct_message "Application des droits sur ${HTTPD_PATH}/${domain}.conf" -color jaune
  178. sudo chown root: ${HTTPD_PATH}/${domain}.conf
  179. RET_VAL=$?
  180. if [ ! ${RET_VAL} -eq 0 ]; then
  181. ERROR="Erreur lors de l'application des droits."
  182. fct_erreur 2
  183. fi
  184. fct_message "Application des permissions sur ${HTTPD_PATH}/${domain}.conf" -color jaune
  185. sudo chmod 644 ${HTTPD_PATH}/${domain}.conf
  186. RET_VAL=$?
  187. if [ ! ${RET_VAL} -eq 0 ]; then
  188. ERROR="Erreur lors de l'application des permissions"
  189. fct_erreur 2
  190. fi
  191. }
  192. function create_backend_conf
  193. {
  194. fct_message "Création de la configuration du backend:" -color jaune
  195. fct_message " * Domaine: ${domain}"
  196. fct_message " * Addresse IP du backend: ${IP_ADDR}"
  197. fct_message " * Port: ${backend_port}"
  198. sed -s ${REPLACE_DOMAIN} ${NC_EXPL_MOD}/${REMOTE_VHOST_TEMPLATE} > ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  199. RET_VAL=$?
  200. if [ ! ${RET_VAL} -eq 0 ]; then
  201. ERROR="Erreur lors de la création de la configuration du backend (1)"
  202. fct_erreur 2
  203. fi
  204. sed -i ${REPLACE_IP_ADDR} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  205. RET_VAL=$?
  206. if [ ! ${RET_VAL} -eq 0 ]; then
  207. ERROR="Erreur lors de la création de la configuration du backend (2)"
  208. fct_erreur 2
  209. fi
  210. sed -i ${REPLACE_SITE_PORT} ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp
  211. RET_VAL=$?
  212. if [ ! ${RET_VAL} -eq 0 ]; then
  213. ERROR="Erreur lors de la création de la configuration du backend (3)"
  214. fct_erreur 2
  215. fi
  216. fct_message "Installation de la configuration du backend sur ${backend_host}" -color jaune
  217. scp -q ${NC_EXPL_TMP}/${domain}.conf_${SH_SESSION_ID}.tmp ${backend_host}:/tmp/${domain}.conf
  218. RET_VAL=$?
  219. if [ ! ${RET_VAL} -eq 0 ]; then
  220. ERROR="Erreur lors de l'installation de la configuration du backend (1)"
  221. fct_erreur 2
  222. fi
  223. ssh ${backend_host} "sudo mv /tmp/${domain}.conf ${HTTPD_PATH}/${domain}.conf"
  224. RET_VAL=$?
  225. if [ ! ${RET_VAL} -eq 0 ]; then
  226. ERROR="Erreur lors de l'installation de la configuration du backend (2)"
  227. fct_erreur 2
  228. fi
  229. fct_message "Application des droits sur le fichier de configuration du backend"
  230. ssh ${backend_host} "sudo chown root: ${HTTPD_PATH}/${domain}.conf"
  231. RET_VAL=$?
  232. if [ ! ${RET_VAL} -eq 0 ]; then
  233. ERROR="Erreur lors de l'application des droits sur la configuration du backend"
  234. fct_erreur 2
  235. fi
  236. fct_message "Application des permissions sur le fichier de configuration du backend"
  237. ssh ${backend_host} "sudo chmod 644 ${HTTPD_PATH}/${domain}.conf"
  238. RET_VAL=$?
  239. if [ ! ${RET_VAL} -eq 0 ]; then
  240. ERROR="Erreur lors de l'application des permissions sur la configuration du backend"
  241. fct_erreur 2
  242. fi
  243. }
  244. function create_backend_document_root
  245. {
  246. fct_message "Création du répertoire d'accueil du backend sur ${backend_host}" -color jaune
  247. ssh ${backend_host} "sudo mkdir -p ${WWW_ROOT_DIR}/${domain}"
  248. RET_VAL=$?
  249. if [ ! ${RET_VAL} -eq 0 ]; then
  250. ERROR="Erreur lors de la création du répertoire d'accueil du backend"
  251. fct_erreur 2
  252. fi
  253. fct_message "Application des droits sur le répertoire d'accueil du backend" -color jaune
  254. ssh ${backend_host} "sudo chown -R apache:apache ${WWW_ROOT_DIR}/${domain}"
  255. if [ ! ${RET_VAL} -eq 0 ]; then
  256. ERROR="Erreur lors de de l'application des droits sur le répertoire d'accueil du backend"
  257. fct_erreur 2
  258. fi
  259. fct_message "Application des permissions sur le répertoire d'accueil du backend" -color jaune
  260. ssh ${backend_host} "sudo chmod -R 775 ${WWW_ROOT_DIR}/${domain}"
  261. if [ ! ${RET_VAL} -eq 0 ]; then
  262. ERROR="Erreur lors de de l'application des droits sur le répertoire d'accueil du backend"
  263. fct_erreur 2
  264. fi
  265. }
  266. function add_domain
  267. {
  268. if [ ${IS_PRESENT} -eq 0 ]; then
  269. fct_message "Ajout du domaine ${domain} aux domaines dont les certificats sont gérés par dehydrated" -color jaune
  270. sudo echo ${domain} >> ${DEHYDRATED_DOMAIN_LIST}
  271. RET_VAL=$?
  272. if [ ! ${RET_VAL} -eq 0 ]; then
  273. ERROR="Erreur lors de l'ajout du domaine dans ${DEHYDRATED_DOMAIN_LIST}"
  274. fct_erreur 2
  275. fi
  276. else
  277. fct_message "${domain} fait déjà partie de la liste des domaines gérés par dehydrated" -color jaune
  278. fi
  279. }
  280. #------------------------------------------------------------------------------------------------------------------
  281. # Traitement
  282. #------------------------------------------------------------------------------------------------------------------
  283. check_config
  284. check_port
  285. check_templates
  286. create_rproxy_conf
  287. if [ "${#backend_host}" -gt 0 ]; then
  288. create_backend_conf
  289. fi
  290. create_backend_document_root
  291. add_domain
  292. fct_erreur 0