[Discussion] Script en chaine et rédaction

Bonjour à tous, un sujet pour apprendre et connaitre vos bonnes pratiques sur des “scripts en chaine”.

Je m’explique lorsque j’installe un nouveau YunoHost ou que je réinstalle mon serveur j’utilise un tableur avec la construction ci-dessous (par exemple).

Colonne A : yunohost domain cert-install
Colonne B : domaine.tld
(Et ceci multiplier par le nombre de domaine et sous domaine. J’ai des fichiers identiques avec l’ajout des domaines, les alias etc).

Et dans ma colonne C j’ai la formule A2&" "&B2 que j’étire sur mon nom de ligne pour obtenir la commande entière pour chacun des domaines dans l’exemple. Et ensuite je colle tout ça dans un txt et je rajoute && entre chaque ligne.

Ma question est donc comment vous procéder dans ces cas là ?


Autres cas ou j’aimerais connaitre vos méthodes sur des scripts localisés par exemple dans /usr/local/bin mais j’imagine que cela peut fonctionner pour toutes les rédactions.

Par exemple mon scripts de sauvegarde de mon Nextcloud est le suivant :

rsync -a --progress --delete /home/yunohost.app/nextcloud/data/lulu/files/ /media/Serenis/03_Nextcloud/Lulu && rsync -a --progress --delete /home/yunohost.app/nextcloud/data/guillermo/files/ /media/Serenis/03_Nextcloud/Guillermo && chown -R nextcloud:nextcloud /media/Serenis && chmod -R g+s /media/Serenis && chown -R nextcloud:nextcloud /media/Limbes && chmod -R g+s /media/Limbes && chown -R nextcloud:nextcloud /media/Sauvegardes && chmod -R g+s /media/Sauvegardes

Mais quand je l’édite avec nano par exemple tout s’affiche sur une ligne ce qu’il fait que c’est peu facilement lisible et j’aurais aimé commenter chaque “morceau” afin de mieux le comprendre si je le rouvre dans 6 mois.
J’avais cru lire que si entre deux instructions, il n’y avait pas && alors les instructions s’enchainait quand même, même si la première échouait.

Voilà merci pour vos retours, conseils et méthodologie sur ce sujet.

Je vous souhaite de bonnes fêtes de fin d’année.
Prenez soin de vous.
Guillermo

PS : je voulais faire un seul sujet pour discuter de tout cela au même endroit mais si c’est peu lisible je peux scinder les deux discussions.

Par rapport à la construction avec && : à mon avis tu peux t’en passer car c’est effectivement pas lisible. Si tu met tout ça dans un script alors le plus simple est d’ajouter au tout début :

set -eu

ce qui active l’option e (= s’arrêter et sortir du script si la moindre commande échoue) et u (faire référence à une variable non défini est considéré comme une erreur - dans ton cas tu n’utilises pas de variable, mais ça mange pas de pain).

Donc faire

set -eu

cmd1
cmd2
cmd3

est relativement équivalent à faire

cmd1 && cmd2 && cmd3

Tu aussi peux procéder d’une autre façon qui consiste à mettre tes instructions sur plusieurs ligne en mettant un \ à la fin pour indiquer à bash que tu n’as pas fini et que ça continue sur la ligne suivante :

cmd1 \
&& cmd2 \
&& cmd3

(faut juste pas oublier de rajouter le \ à la fin, ce qui est vite arrivé …)

Autres remarques :

  • si tu veux aller + loin dans le script bash, tu pourrais probablement faire avec une boucle for ce que tu fais avec ton tableur :
DOMAINS="domaine1.tld domaine2.tld domaine3.tld"
for DOMAIN in $DOMAINS
do
     yunohost domain cert-install $DOMAIN
done
  • Il me semble que donner le nom de domaine à la commande yunohost domain cert-install est optionnel et que si il n’est pas donné, il install un certif sur tous les domaines ? Donc peut-être que ça se résume à yunohost domain cert-install
2 Likes

Salut,

Pour la premiere partie ; Il est possible de n’utiliser que GNU Bash et un fichier pour arriver a tes fins, avec une boucle while:

#!/bin/bash

while read -r domain; do
    yunohost domain cert-install "$domain"
done

Bien rendre le script executable avec: $ chmod +x script

Ensuite tu peux remplir un fichier avec par exemple:

domain1.tld
domain2.tld
domain3.tld

Et executer: $ ./script < fichier
Ou sans fichier: $ echo domain1.tld domain2.tld domain3.tld | ./script

Pour la deuxieme partie ; Je t’invite a lire le manuel de bash: https://www.gnu.org/software/bash/manual/bash.html#The-Set-Builtin

Tu peux ajouter set -eux en haut d’un script GNU Bash pour faire en sorte d’avoir une trace des commandes (x), que le script s’arrête a la premiere commande causant une erreur (e) ou a l’utilisation d’une variable non définie (u), ces trois options sont recommandées en général durant le developpement de scripts GNU Bash mais il est aussi possible de garder ces options durant l’usage normal du script. En particulier l’option e.

Par exemple avec le script précédent ça donne:

#!/bin/bash

set -eux

while read -r domain; do
    yunohost domain cert-install "$domain"
done

Il est aussi utile pour intégrer les bonnes pratiques de vérifier ses scripts avec Shellcheck.

En espérant que ça t’aide,
Léo

3 Likes

@Aleks,

Disons que c’était la seule chose que je maitrisais jusqu’à maintenant. Mais ce matin j’ai du faire jouer 15 commandes pour 39 utilisateurs différents donc je me retrouve avec un tableau de 585 lignes ce qui fait beaucoup ^^ donc autant apprendre un peu plus et monter en compétence.

Merci je vais tester la commande set -eu sur mes prochains gros trucs. Et ce qu’on peux imaginer que cela s’écrire aussi comme cela.

set -eu
#Commande 1 pour faire celui.
cmd1
#Commande 2 pour faire ceci.
cmd2
#Commande 3 pour faire autre chose.
cmd3

Mais du coup la deuxième commande fait intervenir aussi le && ? Après mes lignes de ce matin je les ai collé dans Putty pour jouer les commandes. Je ne les inscrits pas forcément dans un fichier.

Oui j’ai pus m’en rendre compte souvent sur mon tableur d’avoir oublier un slash ou un espace quelque part et après sur le bloc note bonjour l’angoisse pour retrouver ce qu’il manque.
Autres remarques :

  • si tu veux aller + loin dans le script bash, tu pourrais probablement faire avec une boucle for ce que tu fais avec ton tableur :
DOMAINS="domaine1.tld domaine2.tld domaine3.tld"
for DOMAIN in $DOMAINS
do
     yunohost domain cert-install $DOMAIN
done
  • Il me semble que donner le nom de domaine à la commande yunohost domain cert-install est optionnel et que si il n’est pas donné, il install un certif sur tous les domaines ? Donc peut-être que ça se résume à yunohost domain cert-install

Merci beaucoup je vais essayer d’approfondir sur ce terrains là aussi pour les prochaines. J’essayerais la prochaine fois que j’aurais l’occasion pour les certificats.

Pour le fichier DOMAINS=domaine1.tld etc on peux imagine de mettre *.domaine.tld pour qu’il cherche lui même tout les sous domaine possible ?

En tout cas merci beaucoup d’avoir pris le temps de me donner toutes ces informations.

@Ile-bout

Merci beaucoup Léo pour ces ressources, je ne connaissais pas non plus shellcheck, je vais le mettre en favoris pour une utilisation prochaine.
Voilà de quoi m’occuper quelques temps avec ce manuel ^^

Je vais essayer aussi ces deux méthodes avec l’histoire de fichier, mais je pense que ce sera quand j’aurais pris un peu plus d’aise avec bash

Merci beaucoup :slight_smile:

@Guillermo

Pour le fichier DOMAINS=domaine1.tld etc on peux imagine de mettre *.domaine.tld pour qu’il cherche lui même tout les sous domaine possible ?

Il faut lui instruire comment chercher tous les sous-domaines, utiliser l’étoile seulement ne suffit pas.

Premierement il n’y a aucun moyen d’énumérer tous les sous-domaines d’un domaine car la liste n’est disponible que dans la configuration DNS et n’est pas accessible publiquement. Il est seulement possible de vérifier si un certain sous-domaine existe mais pas de lister.

Par contre il est possible de demander a Yunohost de lister tous les domaines (et sous-domaines) enregistrés et ensuite de filtrer la sortie pour obtenir l’information recherchée, par exemple pour lister tous les sous-domaines de ynh.fr enregistrés dans Yunohost:

yunohost domain list | grep -Po "(?<= )\w{1}.+(ynh\.fr)$"

En combinant avec notre script de tout a l’heure:

yunohost domain list | grep -Po "(?<= )\w{1}.+(ynh\.fr)$" | ./script

Léo

1 Like

Merci pour l’information alors honnêtement la partie en rouge sa ma perdu mais je garde sa sous le coude pour plus tard :slightly_smiling_face:
mais sur le principe je comprends la restriction
Merci.

Une question annexe : vous gérer votre base de connaissance avec quoi comme logiciel ? Un wiki ?
Pour le moment je mets des choses sous Joplin et Notes de Nextcloud mais je pense que cela atteint ses limites. J’ai vu certaines personnes utiliser des Git aussi
Guillermo

@Guillermo

Désolé, je voulais inclure une explication la dessus mais j’ai oublié. La partie en rouge est une expression régulière (regular expression, or regexp).

Il existe un site pour composer des expressions régulières intéractivement assez facilement: https://regex101.com/

Il est aussi possible de documenter des expressions régulières existantes via ce site, par exemple pour l’expression régulière de mon précédent message tu peux voir en haut a gauche ici: https://regex101.com/r/aCtk5P/1

En esperant que ça t’aide a comprendre,
Léo

1 Like

Une question annexe : vous gérer votre base de connaissance avec quoi comme logiciel ? Un wiki ?
Pour le moment je mets des choses sous Joplin et Notes de Nextcloud mais je pense que cela atteint ses limites. J’ai vu certaines personnes utiliser des Git aussi

Un wiki c’est bien et simple a utiliser je pense, personnellement je ne maintiens pas de notes.

Merci beaucoup @lle-bout pour le détail des explications :slight_smile: sa à l’air pratique si l’on maitrise le truc je vais tester tout cela.

Je pensais aussi au wiki, mais faut que j’arrive à trouver un format qui me convienne. Et si je note pas tout ce que les cerveaux d’ici me donnent comme informations, je risque d’oublier et de ne pas retrouver toute la leçon quand j’en aurais besoin donc je note :slight_smile:

Milles merci encore