#1 Le 07/10/2021, à 11:49
- dwam
2 petits soucis dans mon premier script
Bonjour
je viens de terminer mon premier script bash qui me permet d'automatiser la création d'un virtualhost Apache... Ca marche super mais il me reste 2 petits soucis :
***** Premier souci **************
j'ai besoin d'écrire un fichier conf qui contient ceci
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
je fais donc, ligne par ligne
echo "la ligne à ajouter" >> fichier.conf
Mais je bloque sur les 2 lignes de logs qui contiennent la variable d'environnement apache "${APACHE_LOG_DIR}"...
J'ai essayé plusieurs variations avec des ' des " et doubles ', mais non... mon script cherche à interpréter au lieu de juste recopier... Au final les valeurs sont vides et ça foire...
Une idée ?
***** Second souci **************
A un moment j'utilise la commande
apache2ctl configtest
qui, si tout va bien, me retourne
Syntax OK
Comment faire pour conditionner la poursuite de l'éxécution de mon script à cette réponse ? J'imagine que c'est faisable... stdin ???
En gros j'aimerais que :
- si la réponse est OK, alors je reload apache pour terminer la procédure.
- mais si la réponse est différente, mon script m'affiche la réponse et le script se termine de manière auto ou manuelle sans reloader apache.
Pour le moment j'ai mis un
echo; read -rsn1 -p "Press any key to continue . . ."; echo
mais on doit pouvoir faire mieux non ?
J'espère que c'est assez clair... Merci d'avance et bien à vous
Guillaume
Hors ligne
#2 Le 07/10/2021, à 12:19
- Watael
Re : 2 petits soucis dans mon premier script
salut,
1- pour empêcher le développement de la variable, il faut soit protéger le signe dollar avec un contre-barre oblique, soit en mettre le nom de la variable entre apostrophes
2- les commandes retourne un code lors de leur exécution :
= 0 -> réussite
> 0 -> échec
il n'est pas indispensable d'utiliser ce code : la commande if est faite pour ça. cf. help if
Dernière modification par Watael (Le 07/10/2021, à 12:44)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#3 Le 07/10/2021, à 12:21
- pingouinux
Re : 2 petits soucis dans mon premier script
Bonjour,
1)
echo ' ErrorLog ${APACHE_LOG_DIR}/error.log' >> fichier.conf
2)
Si c'est un script bash, en sortir avec
exit 0 si c'est bon
exit 1 en cas d'erreur (toute valeur différente de 0 convient
./appel_du_script && echo "C'est bon" || echo "Erreur"
Hors ligne
#4 Le 07/10/2021, à 13:23
- dwam
Re : 2 petits soucis dans mon premier script
Bonjour et merci à vous deux
@Watael
1 . la solution avec les apostrophes ne fonctionne pas (ou je n'ai pas réussi à bien l'utiliser). Par contre, celle avec l'anti slash est parfaite. Génial !
Ca donne :
echo " ErrorLog \${APACHE_LOG_DIR}/error.log" >> $conf
echo " CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined" >> $conf
@pingouinux
1 . Mettre des ' à la place des " fonctionne ici
echo ' ErrorLog \${APACHE_LOG_DIR}/error.log' >> $conf
Par contre, avec cette ligne elle ne fonctionne pas car elle me fait perdre ma propre variable $vhost
echo ' CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined' >> $conf
J'ai donc utilisé la soluce de l'antislash... cf plus haut
@Watael et @pingouinux
Pour le 2ème souci je pense qu'on ne s'est pas bien compris.
Je ne cherche pas à connaître le code retourné par la commande MAIS au contraire la valeur retournée par la commande.
Cette commande elle s'exécute toujours... mais sa réponse peut être différente...
Ex :
root@web1:~# apache2ctl configtest
Syntax OK
Bon mon bricolage fonctionne mais c'est pas très propre.
Encore merci, j'ai avancé, c'est cool
Hors ligne
#5 Le 07/10/2021, à 13:29
- Hizoka
Re : 2 petits soucis dans mon premier script
Salut,
cat << EOF > $conf
<VirtualHost *:80>
ServerName your_domain
ServerAlias www.your_domain
DocumentRoot /var/www/your_domain
ErrorLog \${APACHE_LOG_DIR}/error.log
CustomLog \${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
EOF
Retour=$(apache2ctl configtest)
echo "La commande précédente a renvoyé le code $? et le texte $Retour"
Si le texte est vide, tu peux essayer :
Retour=$(apache2ctl configtest 2>&1)
echo "La commande précédente a renvoyé le code $? et le texte $Retour"
Dernière modification par Hizoka (Le 07/10/2021, à 13:30)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 07/10/2021, à 13:45
- Watael
Re : 2 petits soucis dans mon premier script
quand j'introduis une erreur dans le fichier de conf d'apache2, la commande apache2ctl configtest émet bien un code d'erreur (1).
on peut donc faire
if apache2ctl configtest &>/tmp/apache2ctl.configtest
then
echo "exécution commandes en cas succès..."
else
cat /tmp/apache2ctl.configtest >&2
echo "exécution commandes en cas d'échec..." >&2
fi
Dernière modification par Watael (Le 07/10/2021, à 13:50)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#7 Le 07/10/2021, à 13:48
- dwam
Re : 2 petits soucis dans mon premier script
@Hizoka
Wow la solution avec cat c'est bô et 1000 fois plus pratique... Merci...
Pour le reste, pas encore essayé mais je pense avoir compris le principe... Si j'ai bon, je n'aurais plus qu'un petit IF à faire pour conditionner le reste du script à cette réponse.
Encore merci et belle journée
Guillaume
Hors ligne
#8 Le 07/10/2021, à 13:50
- dwam
Re : 2 petits soucis dans mon premier script
quand j'introduit une erreur dans le fichier de conf d'apache2, la commande apache2ctl configtest émet bien un code d'erreur (1).
on peut donc faireif apache2ctl configtest &>/tmp/apache2ctl.configtest then echo "exécution commandes en cas succès..." else cat /tmp/apache2ctl.configtest >&2 echo "exécution commandes en cas d'échec..." >&2 fi
Ok alors, je vais tester cela... Merci bcp !!!
Hors ligne
#9 Le 07/10/2021, à 14:38
- dwam
Re : 2 petits soucis dans mon premier script
J'ai testé vos solutions. Merci encore !
En me basant sur celle-ci
Retour=$(apache2ctl configtest 2>&1)
echo "La commande précédente a renvoyé le code $? et le texte $Retour"
j'ai pu comprendre qu'en fonction du problème potentiel dans la config, je dois de toutes façons interrompre l'exécution du script pour décider quoi faire...
Par exemple, "apache2ctl configtest" me retourne un Syntax OK et un code 0 même si le path vers le DocumentRoot est mauvais...
root@web1:~# bash test
La commande précédente a renvoyé le code 0 et le texte AH00112: Warning: DocumentRoot [/srv/web/domain.com/ww] does not exist
Syntax OK
Par contre, s'il y a un problème de syntaxe là ça fonctionne bien...
Je pense donc simplifier et au contraire puisque je scripte, considérer qu'il n'y aura pas d'erreur et donc reloader ma config Apache sans même tester...
Hors ligne
#10 Le 07/10/2021, à 14:54
- pingouinux
Re : 2 petits soucis dans mon premier script
Par contre, avec cette ligne elle ne fonctionne pas car elle me fait perdre ma propre variable $vhost
echo ' CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined' >> $conf
Je suis surpris…
$ echo ' CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined' >fichier
$ cat fichier
CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined
Hors ligne
#11 Le 07/10/2021, à 14:56
- Hizoka
Re : 2 petits soucis dans mon premier script
Tu peux toujours essayé de vérifier que le texte retourné vaut "Syntax OK" même lorsque la commande renvoie 0.
@pingouinux
Je pense qu'il ne voulait pas protéger $vhost
Il veut sûrement :
CustomLog ${APACHE_LOG_DIR}/access-BLABLA.log combined
Dernière modification par Hizoka (Le 07/10/2021, à 14:58)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#12 Le 07/10/2021, à 15:30
- dwam
Re : 2 petits soucis dans mon premier script
Tu peux toujours essayé de vérifier que le texte retourné vaut "Syntax OK" même lorsque la commande renvoie 0.
Finalement ce n'est pas vraiment la peine puisque si la syntaxe est bonne lors des tests du script, elle ne va pas changer toute seule après coup...
Je vais simplement faire une pause dans l'exec et afficher la réponse, histoire de voir si qqchose ne va pas... C'est un script que je lance moi dans la console, ce ne pas un script qui tourne en tâche de fond... donc je peux tjs intervenir...
@pingouinux
Je pense qu'il ne voulait pas protéger $vhost
Il veut sûrement :
CustomLog ${APACHE_LOG_DIR}/access-BLABLA.log combined
oui exactement.
Merci à tous en tout cas...
Pour un tout premier script je suis assez content... J'ai surement réinventé le fil à couper le beurre 1000 fois moins bien que les autres mais ça fonctionne...
Je peaufine un peu et je collerai tout le script ici.
Hors ligne
#13 Le 07/10/2021, à 15:47
- pingouinux
Re : 2 petits soucis dans mon premier script
@pingouinux
Je pense qu'il ne voulait pas protéger $vhost
Il veut sûrement :
CustomLog ${APACHE_LOG_DIR}/access-BLABLA.log combined
Dans ce cas, c'est :
echo ' CustomLog ${APACHE_LOG_DIR}/access-'"$vhost"'.log combined' >> fichier.conf
Hors ligne
#14 Le 07/10/2021, à 15:55
- dwam
Re : 2 petits soucis dans mon premier script
Merci pour la précision @pingouinux
Hors ligne
#15 Le 07/10/2021, à 16:04
- dwam
Re : 2 petits soucis dans mon premier script
Voici le script dans sa globalité qui me permet de gagner du temps et de bien systématiser la procédure de création de virtualhost sous Apache.
Pour info :
- les sites sont sous /srv/web/domain/hostname
- les sites sont tjs sous la forme http://host.domain.tld... le domain.tld vient en alias du www en général.
- il reste un bug très léger dans le cas où on n'indique pas de "hostname" et pas d'"alias" > le domain.tld se retrouve indiqué deux fois en tant qu'alias... Pas grave...
- je n'explique pas la notion de VM et de page index.php adaptée...
- ce script doit être exécuté en mode root (sudo -i)
Pour les invites :
1 . entrez le domain.tld
2 . entrez le hostname (www ou ftp, etc...) - Optionnel mais si vide, alors le www sera créé et le DocumentRoot sera /srv/web/domain.tld/www. Sinon le DocumentRoot sera /srv/web/domain.tld/hostname.
3 . entrez les aliases (webmail ftp mon-site etc...) - Optionnel
Et c'est tout !
Si vous voyez des bêtises, n'hésitez pas...
#!/bin/bash
baseroot=/srv/web
user=www-data
thisvm=vm1
read -p "Enter the domain name:" domain
read -p "Enter the host name:" host
read -p "Enter the optional aliases:" alias
# On gère la liste des alias
for i in $alias
do
aliases+="$i.$domain "
done
# On gère le cas du hostname (si vide > www)
# et on ajoute le domain.tld dans la liste des aliases si host=www
[ "${host:-www}" = "www" ] && aliases="$domain $aliases"
# On créé le répertoire pour le domaine
if [ ! -d "$baseroot/$domain" ];then
mkdir $baseroot/$domain
fi
# On créé le sous-répertoire de base pour le site web
if [ -z "$host" ]; then
# "host is blank. Creating default www";
host=www
fi
sitedir=$baseroot/$domain/$host
mkdir $sitedir
# On copie la page d'index en fonction de la VM
cp $thisvm-index.php $sitedir/index.php
# On modifie owner et droits
chown -R $user:$user $sitedir
chmod -R 755 $sitedir
chmod 640 $sitedir/index.php
# On checke les permissions du fichier
# ls -l $sitedir
# On créé le fichier de conf pour le virtualhost Apache
vhost=$host.$domain
conf=/etc/apache2/sites-available/$vhost.conf
cat << EOF > $conf
<VirtualHost *:80>
ServerAdmin webmaster@$domain
ServerName $vhost
ServerAlias $aliases
<Directory "$sitedir">
Allow from all
Options None
AllowOverride None
Require all granted
</Directory>
DocumentRoot $sitedir
ErrorLog \${APACHE_LOG_DIR}/error.log
CustomLog \${APACHE_LOG_DIR}/access-$vhost.log combined
</VirtualHost>
EOF
# On active le site
a2ensite $vhost.conf
# On checke
apache2ctl configtest
# On reload Apache
systemctl restart apache2
echo Le site $vhost est activé.
echo Tapez http://$vhost/ dans votre navigateur.
Encore un grand merci à tous ceux qui m'ont répondu et appris des trucs... La route est longue ! J'ai mis plus de temps à écrire ce premier script sous Linux qu'il ne m'en fera gagner mais bon faut bien commencer.
Dernière modification par dwam (Le 07/10/2021, à 19:10)
Hors ligne
#16 Le 07/10/2021, à 16:47
- pingouinux
Re : 2 petits soucis dans mon premier script
Si tu veux forcer le script à s'exécuter en mode administrateur, tu peux mettre en tête :
[ $(whoami) = root ] || { echo "Lancer $0 en root"; exit 1; }
Le cas échéant, tu as un message et le script s'arrête avec un code d'erreur.
Hors ligne
#17 Le 07/10/2021, à 17:09
- Watael
Re : 2 petits soucis dans mon premier script
en bash :
(($UID)) && { echo "ERR: must be root" >&2; exit 1; }
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#18 Le 07/10/2021, à 17:29
- Hizoka
Re : 2 petits soucis dans mon premier script
en bash :
if [ -z "$host" ]; then aliases="$domain $aliases"; fi
if [ "$host"="www" ]; then aliases="$domain $aliases"; fi
=>
[ "${host:-www}" = "www" ] && aliases="$domain $aliases"
Si host est vide, on utilise www.
Dernière modification par Hizoka (Le 07/10/2021, à 17:30)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#19 Le 07/10/2021, à 18:17
- Watael
Re : 2 petits soucis dans mon premier script
quand j'ai des saisies dont je veux être sûr qu'elles seront remplies et dans le format que je veux, je fais une boucle while ou until conditionnée aux obligations nécessaires; pareil quand j'ai une liste à établir, la condition de sortie, là, étant la validation ou non du recommencement.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#20 Le 07/10/2021, à 18:19
- dwam
Re : 2 petits soucis dans mon premier script
@Watael & @pingouinux
Merci pour la suggestion et les exemples... Je vais tester et sans doute ajouter, même si le premier truc que je fais quand je ssh mes serveurs, c'est un sudo -i pour basculer en root... Ce sont des serveurs Ubuntu là et je n'y fais que des choses où il faut être root.
@Hizoka
Ouh la ! Pas sûr de comprendre, je vais donc essayer... bêtement... et voir ce que ça donne...
Par contre je rebondis sur un détail... Vous indiquez "en bash"... Je comprends qu'une partie de mon code n'est pas du bash... C'est bien ça ?
Hors ligne
#21 Le 07/10/2021, à 18:57
- dwam
Re : 2 petits soucis dans mon premier script
@Hizoka
Bon effectivement je ne comprends pas du tout la magie cette ligne de code mais je vais essayer de chercher...
[ "${host:-www}" = "www" ] && aliases="$domain $aliases"
En attendant j'ai modifié cette gestion du hostname et des aliases et c'est 100% opérationnel et propre...
Tout cela m'a permis de voir que je ne voulais pas forcément que "domain.tld" soit un alias quand un hostname autre que "www" avait été saisi... Génial !
Merci !!!!!!!!!!
PS : j'ai mis à jour le script plus haut avec les améliorations
Dernière modification par dwam (Le 07/10/2021, à 19:12)
Hors ligne
#22 Le 07/10/2021, à 19:27
- Watael
Re : 2 petits soucis dans mon premier script
tu devrais lire ceci pour nommer correctement tes variables.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#23 Le 07/10/2021, à 19:44
- Hizoka
Re : 2 petits soucis dans mon premier script
[ "${host:-www}" = "www" ] && aliases="$domain $aliases"
=
if [ "${host:-www}" = "www" ]
then
aliases="$domain $aliases"
fi
${host:-www} veut simplement dire : utilise la valeur d ela variable host et si celle-ci est nulle, utilise le texte www.
echo "${var:-bonjour}" # Affiche bonjour car la variable var n'existe pas
var="au revoir"
echo "${var:-bonjour}" # Affiche au revoir car la variable var existe
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne