#1 Le 04/12/2012, à 18:50
- lanzrg
[bash] Créer une fonction pour initialiser un site !
Bonjour, bonsoir,
J'aimerais qu'une âme charitable me termine ce début de fonction bash.
Voici ce quelle devra faire.
- Récupérer dans une variable ($1) le nom de l'application web
- Créer depuis ce nom le dossier de l'application web
- Créer depuis ce nom le fichier de conf dans "sites-available"
- Ajouter une chaîne multiligne dans le fichier de conf
- Ajouter depuis ce nom une ligne dans le fichier hosts
- Activer le site (a2ensite)
- Et enfin rebooter apache
# $1 = premier paramètre, nom de l'application
function site() {
# Dossier de l'application
dir='/home/lan/Sites/'
# Créer le dossier $dir s'il n'existe pas
cd $dir
mkdir $1
dir='/home/lan/Sites/'$1
# Dossier des vhosts
vhost='/etc/apache2/sites-available'
# Créer le fichier de conf dans $vhost avec comme nom $name
cd $vhosts
touch $1
# Ajouter ceci à la fin du fichier créer précédement
<VirtualHost *:80>
DocumentRoot $dir/public
ServerName $name
</VirtualHost>
# Fichier hosts
host='/etc/hosts'
# Ajouter ceci au fichier $host
127.0.0.1 $1
# Activer le site
sudo a2ensite $1
# Redémarrer apache2
/etc/init.d/apache2 restart
}
Merci d'avance !
Hors ligne
#2 Le 04/12/2012, à 19:15
- pingouinux
Re : [bash] Créer une fonction pour initialiser un site !
Bonjour,
Ceci devrait convenir, à vérifier. J'ai remplacé $1 par "$1".
Attention : La variable name n'est pas définie.
# $1 = premier paramètre, nom de l'application
function site() {
# Dossier de l'application
dir='/home/lan/Sites/'
# Créer le dossier $dir s'il n'existe pas
cd $dir
mkdir "$1"
dir='/home/lan/Sites/'"$1"
# Dossier des vhosts
vhost='/etc/apache2/sites-available'
# Créer le fichier de conf dans $vhost avec comme nom $name
# cd $vhosts
cd $vhost
# touch "$1"
# Ajouter ceci à la fin du fichier créer précédement
echo "<VirtualHost *:80>
DocumentRoot $dir/public
ServerName $name
</VirtualHost>" >>$vhost/"$1"
# Fichier hosts
host='/etc/hosts'
# Ajouter ceci au fichier $host
echo "127.0.0.1 $1" >>$host
# Activer le site
sudo a2ensite "$1"
# Redémarrer apache2
/etc/init.d/apache2 restart
}
Correction
Dernière modification par pingouinux (Le 04/12/2012, à 20:32)
Hors ligne
#3 Le 04/12/2012, à 19:43
- lanzrg
Re : [bash] Créer une fonction pour initialiser un site !
Merci beaucoup, sympa les >> pour écrire dans un fichier !
Le $name est un oubli de ma part c'est $1 enfait.
Ca fonctionne si je suis en root, mais alors il est impossible d'écrire dans mon dossier /Sites/quelquechose/.
Il y aurait moyen de corriger cela ? En exécutant les instructions en root (sudo) qui le nécessite.
Hors ligne
#4 Le 04/12/2012, à 19:46
- pingouinux
Re : [bash] Créer une fonction pour initialiser un site !
Il suffit que tu mettes sudo devant les commandes en question (comme tu as fait pour a2ensite).
Hors ligne
#5 Le 04/12/2012, à 19:55
- lanzrg
Re : [bash] Créer une fonction pour initialiser un site !
Il me crée bien le dossier dans Sites mais pour le reste ça foire.
/etc/apache2/sites-available/quelquechose: Permission denied
/etc/hosts: Permission denied
J'ai l'impression que quelque chose cloche ici :
sudo echo "<VirtualHost \*:80>
DocumentRoot $dir/public
ServerName $name
</VirtualHost>" >>$vhost/"$1"
Le sudo echo n'a pas l'air de marcher !
Dernière modification par lanzrg (Le 04/12/2012, à 20:01)
Hors ligne
#6 Le 04/12/2012, à 20:46
- pingouinux
Re : [bash] Créer une fonction pour initialiser un site !
Ça n'a rien à voir, mais j'ai déjà corrigé une erreur dans le script en #2 (il y avait un "\" en trop devant "*:80").
Tu peux éventuellement ajouter cette ligne au début de la fonction ( après la ligne function site() { ), pour voir les commandes exécutées :
set -x
Que donnent cette commande ?
ls -l /etc/apache2/sites-available/quelquechose /etc/hosts
Hors ligne
#7 Le 05/12/2012, à 00:31
- lanzrg
Re : [bash] Créer une fonction pour initialiser un site !
La fonction avec set -x :
site quelquechose
+ site quelquechose
+ set -x
+ dir=/home/lan/Sites/
+ cd /home/lan/Sites/
+ mkdir quelquechose
+ dir=/home/lan/Sites/quelquechose
+ vhost=/etc/apache2/sites-available
+ cd /etc/apache2/sites-available
+ sudo echo '<VirtualHost *:80>
DocumentRoot /home/lan/Sites/quelquechose/public
ServerName
</VirtualHost>'
bash: /etc/apache2/sites-available/quelquechose: Permission denied
+ host=/etc/hosts
+ sudo echo '127.0.0.1 quelquechose'
bash: /etc/hosts: Permission denied
+ sudo a2ensite quelquechose
ERROR: Site quelquechose does not exist!
+ /etc/init.d/apache2 restart
* Restarting web server apache2
et le ls -l :
ls -l /etc/apache2/sites-available/quelquechose /etc/hosts
+ ls --color=auto -l /etc/apache2/sites-available/quelquechose /etc/hosts
ls: cannot access /etc/apache2/sites-available/quelquechose: No such file or directory
-rw-r--r-- 1 root root 262 Dec 4 19:30 /etc/hosts
Quelque chose ne marche pas avec les echo(s), mais quoi et pourquoi ?
Hors ligne
#8 Le 05/12/2012, à 07:00
- pingouinux
Re : [bash] Créer une fonction pour initialiser un site !
Je crois avoir compris. Quand on écrit
sudo echo "texte" >fichier
la redirection s'applique à sudo et non à echo.
Ceci devrait être bon (il y a peut-être plus simple) :
sudo bash -c "echo \"texte\" >fichier"
Ce qui donne dans ton cas :
texte=" <VirtualHost *:80>
DocumentRoot $dir/public
ServerName $name
</VirtualHost>"
sudo bash -c "echo \"$texte\" >>$vhost/$1"
sudo bash -c "echo \"127.0.0.1 $1\" >>$host"
Hors ligne
#9 Le 05/12/2012, à 14:49
- lanzrg
Re : [bash] Créer une fonction pour initialiser un site !
Voici ma première fonction bash complète, j'ai un peu réaménager le code pour plus de clarté.
Cette fonction va beaucoup me servir durant ma formation PHP.
Je trouve bash un peu austère et je pense sincèrement étudier de plus près python pour ce genre de script.
Encore un grand merci à pingouinux !
function site() {
# Debugging
# set -x
# Variables
home='/home/lan/Sites/'
app='/home/lan/Sites/'"$1"
vdir='/etc/apache2/sites-available'
hfile='/etc/hosts'
vconf="<VirtualHost *:80>
DocumentRoot $app/public
ServerName $1
</VirtualHost>"
# Create application directory
cd $home
mkdir "$1"
# Create vhost and enable site
sudo bash -c "echo \"$vconf\" >>$vdir/$1"
sudo a2ensite "$1"
# Add entry to hosts file
sudo bash -c "echo \"127.0.0.1 $1\" >>$hfile"
# Restart apache2
/etc/init.d/apache2 restart
}
Hors ligne
#10 Le 05/12/2012, à 15:00
- pingouinux
Re : [bash] Créer une fonction pour initialiser un site !
Tu peux encore gagner deux lignes :
home='/home/lan/Sites/'
app='/home/lan/Sites/'"$1"
.....................................
cd $home
mkdir "$1"
peut se simplifier en :
app="/home/lan/Sites/$1"
.....................................
mkdir "$app"
Et je ne peux que t'encourager pour python.
Dernière modification par pingouinux (Le 05/12/2012, à 15:00)
Hors ligne