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 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 ? wink

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.

Hors 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.

Hors 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

Watael a écrit :

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 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

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

dwam #4 a écrit :

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

Hizoka #11 a écrit :

@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.

Hors 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.

Hors 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... wink

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.

Hors 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