Last active
September 3, 2018 13:17
-
-
Save rseon/733b2097186695f6a856139735ac754d to your computer and use it in GitHub Desktop.
[Bash] Apache hosting creation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# | |
# No english version, sorry ! | |
# | |
# Création automatique de nouveau projet Apache2 / MySQL. | |
# Testé sous Debian Stretch | |
# | |
# Remplacer my-hosting par votre hébergement ainsi que l'adresse IP_HOST de votre serveur. | |
# Attention : vérifiez bien les chemins ! | |
######################################################## | |
# | |
# Configuration | |
# | |
VERSION="1.5" | |
PATH_SCRIPT="/home/my-hosting/create_host" | |
PATH_WEB="/home/web/" | |
PATH_VHOSTS="/etc/apache2/sites-available/" | |
SUFFIX_SD=".my-hosting.com" | |
MAIL_ADMIN="[email protected]" | |
BASE_LOG="/var/log/apache2/com.my-hosting." | |
IP_HOST="XX.XX.XX.XX" | |
TPL_VHOST=$PATH_SCRIPT"/vhost_apache.conf"; | |
TMP_VHOST="/tmp/apache_edited.conf" | |
# Colors | |
# @link https://gist.github.com/elucify/c7ccfee9f13b42f11f81 | |
C_RESTORE=$(echo -en '\033[0m') | |
C_RED=$(echo -en '\033[00;31m') | |
C_GREEN=$(echo -en '\033[00;32m') | |
C_YELLOW=$(echo -en '\033[00;33m') | |
C_BLUE=$(echo -en '\033[00;34m') | |
C_MAGENTA=$(echo -en '\033[00;35m') | |
C_PURPLE=$(echo -en '\033[00;35m') | |
C_CYAN=$(echo -en '\033[00;36m') | |
C_LIGHTGRAY=$(echo -en '\033[1;30m') | |
C_LRED=$(echo -en '\033[01;31m') | |
C_LGREEN=$(echo -en '\033[01;32m') | |
C_LYELLOW=$(echo -en '\033[01;33m') | |
C_LBLUE=$(echo -en '\033[01;34m') | |
C_LMAGENTA=$(echo -en '\033[01;35m') | |
C_LPURPLE=$(echo -en '\033[01;35m') | |
C_LCYAN=$(echo -en '\033[01;36m') | |
C_WHITE=$(echo -en '\033[01;37m') | |
## | |
# | |
# Fonctions | |
# | |
## | |
DRYRUN=0 | |
FORCE_PROJECT=0 | |
FORCE_USE_DB=0 | |
FORCE_RELOAD=0 | |
VALID_AUTO=0 | |
## | |
# Vérifie que le script est lancé en root | |
## | |
testRoot() { | |
if [ "$(whoami)" != "root" ] | |
then | |
echo "Error : only root can add new project." | |
echo "" | |
exit 1; | |
fi | |
} | |
## | |
# Affichage de l'aide | |
## | |
usage() { | |
echo "Usage: $0 [ --dry-run ] [ --project= ] [ --use-db ] [ --reload ] [ --auto ]" | |
echo "" | |
echo "Outil permettant la création d'un hébergement web avec Apache :" | |
echo " - Création du chemin vers le projet (dans /home/web, ou alors défini par l'utilisateur) avec un robots.txt par défaut" | |
echo " - Création du virtualhost" | |
echo " - Création d'une base de donnée au nom du projet dont l'utilisateur est le nom du projet (ou alors défini par l'utilisateur) et le mot de passe est généré automatiquement (ou défini par l'utilisateur)" | |
echo "Le site sera accessible en sous-domaine de rseon.com" | |
echo "" | |
echo " ${C_GREEN}-n | --dry-run${C_RESTORE} Mode test. Permet d'afficher les commandes executées, mais l'hébergement ne sera pas créé" | |
echo -e " ${C_GREEN}-p=\e[4mtest\e[24m | --project=\e[4mtest\e[24m${C_RESTORE} Spécifie le nom et le chemin du projet ainsi que la base de donnée. Valide chaque étape automatiquement (pas de personnalisation possible)" | |
echo " ${C_GREEN}-a | --auto${C_RESTORE} Permet de valider automatiquement chaque étape (pas de personnalisation possible)" | |
echo " ${C_GREEN}-d | --use-db${C_RESTORE} Crée la base de donnée. L'utilisateur sera le nom du projet et le mot de passe sera généré automatiquement" | |
echo " ${C_GREEN}-r | --reload${C_RESTORE} Rechargement automatique de Apache" | |
echo " ${C_GREEN}-v | --version${C_RESTORE} Affichage de la version" | |
echo " ${C_GREEN}-h | --help${C_RESTORE} Affichage de ce message" | |
echo "" | |
} | |
## | |
# Affichage du bandeau d'accueil | |
## | |
printBandeau() { | |
echo "-------------------------------------------"; | |
echo "-------------------------------------------"; | |
echo "-------- ${C_LBLUE} RSeon - Hosting v$VERSION ${C_RESTORE} ---------"; | |
echo "-------------------------------------------"; | |
echo "-------------------------------------------"; | |
echo "${C_LBLUE} Création d'un espace d'hébergement${C_RESTORE}"; | |
echo ""; | |
if [ $DRYRUN = "1" ]; then | |
echo " ${C_RED}[[ MODE TEST ACTIF ]]${C_RESTORE}"; | |
echo ""; | |
fi | |
} | |
######################################################## | |
# | |
# INIT | |
# | |
testRoot; | |
## | |
# Récupération des arguments du script | |
# @link https://stackoverflow.com/a/14203146 ("Bash Equals-Separated (e.g., --option=argument) (without getopt[s])") | |
## | |
for i in "$@" | |
do | |
case $i in | |
-p=* | --project=* ) | |
FORCE_PROJECT="${i#*=}" | |
shift | |
;; | |
-n | --dry-run ) | |
DRYRUN="1" | |
;; | |
-v | --version ) | |
echo "Version ${C_LBLUE}${VERSION}${C_RESTORE}" | |
echo "" | |
exit | |
;; | |
-h | --help ) | |
usage | |
exit | |
;; | |
-a | --auto ) | |
VALID_AUTO=1 | |
;; | |
-d | --use-db ) | |
FORCE_USE_DB=1 | |
;; | |
-r | --reload ) | |
FORCE_RELOAD=1 | |
;; | |
* ) | |
echo "Paramètre inconnu." | |
echo "$1" | |
usage | |
exit 1;; | |
esac | |
done | |
clear | |
printBandeau; | |
######################################################## | |
# | |
# NOM DU PROJET | |
# | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}----------- Nom du projet ----------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo ""; | |
if [ $FORCE_PROJECT = "0" ]; then | |
echo "Entrez le nom du projet :"; | |
echo -e "${C_GREEN}Ce nom sera utilisé pour le nom du dossier, le sous-domaine (\e[4mprojet$SUFFIX_SD\e[24m) ainsi que le nom de la base de donnée ${C_RESTORE}"; | |
while true; do | |
read -p "" project_name | |
case $project_name in | |
* ) | |
echo "Nom du projet choisi : ${C_YELLOW}$project_name ${C_RESTORE}"; | |
if [ $VALID_AUTO = "0" ]; then | |
while true; do | |
read -p "Correct [O/n] ? " check | |
case $check in | |
[Oo]* ) | |
echo "${C_GREEN}Validé ${C_RESTORE}"; | |
break;; | |
[Nn]* ) | |
exit;; | |
* ) | |
echo "La valeur est incorrecte";; | |
esac | |
done | |
fi | |
break;; | |
esac | |
done | |
else | |
project_name=$FORCE_PROJECT; | |
echo "Nom du projet choisi : ${C_YELLOW}$project_name ${C_RESTORE}"; | |
fi | |
PROJECT_URL=$project_name$SUFFIX_SD; | |
PATH_PROJECT=$PATH_WEB$project_name | |
DB_NAME=$(echo $project_name | cut -c1-16) | |
DB_USER=$DB_NAME | |
VHOST=$PATH_VHOSTS$project_name.conf | |
echo "Chemin des fichiers : ${C_YELLOW}$PATH_PROJECT ${C_RESTORE}"; | |
if [ $VALID_AUTO = "0" ] && [ $FORCE_PROJECT = "0" ]; then | |
while true; do | |
read -p "Correct [O/n] ? " check | |
case $check in | |
[Oo]* ) | |
echo "${C_GREEN}Validé ${C_RESTORE}"; break;; | |
[Nn]* ) | |
read -p "Spécifiez le chemin complet : " new_path_project | |
PATH_PROJECT=$new_path_project | |
echo "Chemin des fichiers : ${C_YELLOW}$PATH_PROJECT ${C_RESTORE}"; | |
break;; | |
* ) | |
echo "La valeur est incorrecte";; | |
esac | |
done | |
fi | |
######################################################## | |
# | |
# BASE DE DONNEE | |
# | |
echo ""; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}--- Création de la base de donnée --${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo ""; | |
if [ $FORCE_USE_DB = "0" ] && [ $FORCE_PROJECT = "0" ]; then | |
while true; do | |
if [ $VALID_AUTO = "0" ]; then | |
read -p "Créer un utilisateur et une table [O/n] ? " database | |
else | |
database="O" | |
fi | |
case $database in | |
[Oo]* ) | |
if [ $VALID_AUTO = "0" ]; then | |
read -p "Utilisateur [$project_name] : " new_db_user | |
if [ "$new_db_user" != "" ]; then | |
DB_USER=$new_db_user | |
fi | |
read -p "Mot de passe [généré automatiquement] : " new_db_pass | |
if [ "$new_db_pass" != "" ]; then | |
DB_PASS=$new_db_pass | |
else | |
DB_PASS=$(perl $PATH_SCRIPT/generate_pass.sh); | |
fi | |
else | |
DB_PASS=$(perl $PATH_SCRIPT/generate_pass.sh); | |
fi | |
echo "${C_GREEN}Base de donnée en attente de création${C_RESTORE}"; | |
break;; | |
[Nn]* ) | |
DB_PASS="pasdebase" | |
echo "${C_GREEN}Pas de base de donnée${C_RESTORE}"; | |
break;; | |
* ) | |
echo "La valeur est incorrecte";; | |
esac | |
done | |
else | |
echo "${C_GREEN}Base de donnée en attente de création${C_RESTORE}"; | |
DB_PASS=$(perl $PATH_SCRIPT/generate_pass.sh); | |
fi | |
######################################################## | |
# | |
# CREATION DE L'HEBERGEMENT | |
# | |
echo ""; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}---- Création de l'hébergement ----${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo ""; | |
while true; do | |
if [ $VALID_AUTO = "0" ]; then | |
read -p "Créer l'hébergement [O/n] ? " check | |
else | |
check="O" | |
fi | |
case $check in | |
[Oo]* ) | |
echo "${C_GREEN}Création de l'hébergement en cours${C_RESTORE}"; | |
echo ""; | |
echo "Création du dossier $project_name"; | |
if [ $DRYRUN = "0" ]; then | |
mkdir -p $PATH_PROJECT; | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}mkdir -p $PATH_PROJECT${C_RESTORE}"; | |
fi | |
echo ""; | |
echo "Création du robots.txt"; | |
if [ $DRYRUN = "0" ]; then | |
touch $PATH_PROJECT/robots.txt; | |
echo "User-agent: *" >> $PATH_PROJECT/robots.txt; | |
echo "Disallow: /" >> $PATH_PROJECT/robots.txt; | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}touch $PATH_PROJECT/robots.txt${C_RESTORE}"; | |
echo " ${C_LMAGENTA}echo \"User-agent: *\" >> $PATH_PROJECT/robots.txt${C_RESTORE}"; | |
echo " ${C_LMAGENTA}echo \"Disallow: /\" >> $PATH_PROJECT/robots.txt${C_RESTORE}"; | |
fi | |
echo ""; | |
echo "Droits pour les accès"; | |
if [ $DRYRUN = "0" ]; then | |
chown -R www-data:www-data $PATH_PROJECT/; | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}chown -R www-data:www-data $PATH_PROJECT/${C_RESTORE}"; | |
fi | |
echo ""; | |
echo "Création du fichier de configuration Apache"; | |
current_date_time="`date "+%F %T"`"; | |
if [ $DRYRUN = "0" ]; then | |
cp $TPL_VHOST $VHOST | |
sed -i "s|DATETIME|$current_date_time|g" "$VHOST" | |
sed -i "s|VERSION|$VERSION|g" "$VHOST" | |
sed -i "s|MAIL_ADMIN|$MAIL_ADMIN|g" "$VHOST" | |
sed -i "s|PROJECT_URL|$PROJECT_URL|g" "$VHOST" | |
sed -i "s|PATH_PROJECT|$PATH_PROJECT|g" "$VHOST" | |
sed -i "s|BASE_LOG|$BASE_LOG|g" "$VHOST" | |
sed -i "s|project_name|$project_name|g" "$VHOST" | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}cp $TPL_VHOST $VHOST${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|DATETIME|$current_date_time|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|VERSION|$VERSION|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|MAIL_ADMIN|$MAIL_ADMIN|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|PROJECT_URL|$PROJECT_URL|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|PATH_PROJECT|$PATH_PROJECT|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|BASE_LOG|$BASE_LOG|g\" \"$VHOST\"${C_RESTORE}"; | |
echo " ${C_LMAGENTA}sed -i \"s|project_name|$project_name|g\" \"$VHOST\"${C_RESTORE}"; | |
fi | |
echo ""; | |
echo "Activation du site"; | |
if [ $DRYRUN = "0" ]; then | |
a2ensite $project_name.conf; | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}a2ensite $project_name.conf${C_RESTORE}"; | |
fi | |
if [ $DB_PASS != "pasdebase" ] | |
then | |
echo ""; | |
echo "Création de la base" | |
echo " ${C_LBLUE}Connexion à MySQL...${C_RESTORE}"; | |
if [ $DRYRUN = "0" ]; then | |
mysql -u root -p <<EOFMYSQL | |
CREATE DATABASE \`$project_name\`; | |
GRANT ALL PRIVILEGES ON \`$project_name\`.* TO \`$DB_NAME\`@localhost IDENTIFIED BY '$DB_PASS'; | |
FLUSH PRIVILEGES; | |
EOFMYSQL | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}mysql -u root -p${C_RESTORE}"; | |
echo " ${C_LMAGENTA}mysql> CREATE DATABASE \`$project_name\`${C_RESTORE}"; | |
echo " ${C_LMAGENTA}mysql> GRANT ALL PRIVILEGES ON \`$DB_USER\`.* TO \`$DB_NAME\`@localhost IDENTIFIED BY '$DB_PASS'${C_RESTORE}"; | |
echo " ${C_LMAGENTA}mysql> FLUSH PRIVILEGES;${C_RESTORE}"; | |
fi | |
fi | |
if [ $FORCE_RELOAD = "0" ]; then | |
while true; do | |
echo ""; | |
if [ $VALID_AUTO = "0" ]; then | |
read -p "Recharger Apache [O/n] ? " check | |
else | |
check="O" | |
fi | |
case $check in | |
[Oo]* ) | |
echo "${C_LBLUE}Rechargement de Apache...${C_RESTORE}"; | |
if [ $DRYRUN = "0" ]; then | |
systemctl reload apache2 | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}systemctl reload apache2${C_RESTORE}"; | |
fi | |
break;; | |
[Nn]* ) | |
echo "${C_GREEN}Vous devrez relancer manuellement la commande${C_RESTORE} ${C_LMAGENTA}systemctl reload apache2${C_RESTORE}"; | |
break;; | |
* ) | |
echo "La valeur est incorrecte";; | |
esac | |
done | |
else | |
echo "${C_LBLUE}Rechargement de Apache...${C_RESTORE}"; | |
if [ $DRYRUN = "0" ]; then | |
systemctl reload apache2 | |
echo "${C_GREEN}OK${C_RESTORE}"; | |
else | |
echo "${C_RED}DRY-RUN${C_RESTORE}"; | |
echo " ${C_LMAGENTA}systemctl reload apache2${C_RESTORE}"; | |
fi | |
fi | |
break;; | |
[Nn]* ) | |
exit;; | |
* ) | |
echo "La valeur est incorrecte";; | |
esac | |
done | |
######################################################## | |
# | |
# RECAP | |
# | |
echo ""; | |
echo ""; | |
echo "${C_GREEN}--------------------------------------${C_RESTORE}"; | |
echo "${C_GREEN}--------------------------------------${C_RESTORE}"; | |
echo "${C_GREEN}-- Hébergement créé avec succès ! --${C_RESTORE}"; | |
echo "${C_GREEN}--------------------------------------${C_RESTORE}"; | |
echo "${C_GREEN}--------------------------------------${C_RESTORE}"; | |
echo ""; | |
if [ $DRYRUN = "0" ]; then | |
echo "Si vous souhaitez modifier le virtualhost :"; | |
echo " ${C_LMAGENTA}nano $VHOST${C_RESTORE}"; | |
echo " ${C_LMAGENTA}systemctl reload apache2${C_RESTORE}"; | |
echo ""; | |
echo ""; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}----------- Récapitulatif ----------${C_RESTORE}"; | |
echo "${C_LIGHTGRAY}--------------------------------------${C_RESTORE}"; | |
echo "${C_YELLOW}Veillez à garder précieusement ces informations ! ${C_RESTORE}"; | |
echo ""; | |
echo "Hébergement"; | |
echo " Nom du projet : ${C_LMAGENTA}$project_name${C_RESTORE}"; | |
echo " Chemin des fichiers : ${C_LMAGENTA}$PATH_PROJECT${C_RESTORE}"; | |
echo " URL d'accès au site : ${C_LMAGENTA}http://$PROJECT_URL${C_RESTORE}"; | |
echo " IP du serveur : ${C_LMAGENTA}$IP_HOST${C_RESTORE}"; | |
echo ""; | |
if [ $DB_PASS != "pasdebase" ] | |
then | |
echo "Base de donnée"; | |
echo " Host : ${C_LMAGENTA}localhost${C_RESTORE}"; | |
echo " Base de donnée : ${C_LMAGENTA}$DB_NAME${C_RESTORE}"; | |
echo " Utilisateur : ${C_LMAGENTA}$DB_USER${C_RESTORE}"; | |
echo " Mot de passe : ${C_LMAGENTA}$DB_PASS${C_RESTORE}"; | |
else | |
echo "${C_LMAGENTA}Pas de base de donnée${C_RESTORE}"; | |
fi | |
else | |
echo " ${C_RED}[[ MODE TEST ACTIF ]]${C_RESTORE}"; | |
echo "" | |
echo "Vous avez visualisé les commandes effectuées, l'hébergement n'a pas été créé." | |
echo "Relancez ce script sans le paramètre --dry-run pour créer l'hébergement." | |
fi | |
echo ""; | |
echo ""; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/perl | |
sub randomPassword { | |
my $password; | |
my $_rand; | |
my @chars = split(" ", | |
"a b c d e f g h i j k l m n o | |
p q r s t u v w x y z A B C D | |
E F G H I J K L M N O P Q R S | |
T U V W X Y Z - _ 0 1 2 - _ - | |
3 4 5 6 7 8 9 - _ - _ - _"); | |
srand; | |
$password_length = 20; | |
for (my $i=0; $i <= $password_length ;$i++) { | |
$_rand = int(rand 71); | |
$password .= $chars[$_rand]; | |
} | |
return $password; | |
} | |
print randomPassword(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
## | |
## Auto-generated virtualhost by RSeon's create_host vVERSION | |
## Creation date : DATETIME | |
## | |
<VirtualHost *:80> | |
ServerAdmin MAIL_ADMIN | |
ServerName PROJECT_URL | |
DocumentRoot PATH_PROJECT | |
<Directory PATH_PROJECT> | |
Options FollowSymLinks | |
AllowOverride All | |
Require all granted | |
</Directory> | |
ErrorLog BASE_LOGproject_name-error.log | |
CustomLog BASE_LOGproject_name-access.log combined | |
</Virtualhost> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment