Skip to content

Instantly share code, notes, and snippets.

@rseon
Last active September 3, 2018 13:17
Show Gist options
  • Save rseon/733b2097186695f6a856139735ac754d to your computer and use it in GitHub Desktop.
Save rseon/733b2097186695f6a856139735ac754d to your computer and use it in GitHub Desktop.
[Bash] Apache hosting creation
#!/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 "";
#!/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();
##
## 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