Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 ! wink

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