sh : si erreur…
#1

Bonsoir,

Un tout petit coup de main svp. Je suis entrain de m'écrire un petit script shell, pour le renouvellement de certificats auprès de LestsEncrypt.

Je cherche à écrire que s'il n'y a aucune erreur lors de la génération, alors il peut redémarrer le serveur web.

Voici mon petit bout de code :
Code :
#!/bin/sh

## renew certs LE

error=0
set -A domains "huc.fr.eu.org" "doc.huc.fr.eu.org" "stephane-huc.net"

for domain in "${domains[@]}"; do
     /usr/sbin/acme-client -v "${domain}"
# si erreur, alors erreur=1 ; si erreur=1, break ?!
     sleep 7
done

if [ "${error}" -eq 0 ]; then
    /usr/bin/rcctl reload nginx
else
    mail…
fi

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#2

Tu dois pouvoir utiliser le retour d'acme-client avec $? : si pas égal à 0, alors...
Ou plus simplement :

Code :
/usr/sbin/acme-client -v "${domain}" || break

Et tu reload nginx après normalement, puisqu'en cas d'erreur avant tu ne seras pas arrivé jusque là.

Code :
#!/bin/sh

set -A domains "huc.fr.eu.org" "doc.huc.fr.eu.org" "stephane-huc.net"

for domain in "${domains[@]}"; do
     /usr/sbin/acme-client -v "${domain}" || break
     sleep 7
done
/usr/bin/rcctl reload nginx

    mail…
Sachant que tu peux remplacer l'appel de "break" par une fonction de ton cru qui envoie un mail ou un message d'erreur ou ce que tu veux...
Répondre
#3

ahh, oui, c'est même plus simple :p

merci.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#4

tu peux aussi
Code :
set -e
en dessous de ton shebang.
La première erreur arrêtera le script.
Répondre
#5

@prx: pour en revenir à ce sujet, sachant que j'ai les options '-e', '-x' activées, l'instruction suivante :

Code :
/usr/sbin/acme-client -v "${domain}" || _mail

sort immédiatement, après l'exécution.
Donc, il faut que je voye à capturer correctement le code de sortie d'exécution.

Et, en effet, si je comprend bien le manpage :
Citation :acme-client returns 0 if certificates were changed (revoked or updated),
1 on failure, or 2 if the certificates didn't change (up to date).

Le client acme retourne :
- '2' si le cert est valide (à jour).
- '1' si est en erreur
- '0' s'il a été révoqué ou mise à jour !

Donc, il faut bien que je récupère d'abord le code de sortie et crée une instruction de type si status = 1

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#6

(26-08-2020, 17:27:12)eol a écrit :  tu peux aussi
Code :
set -e
en dessous de ton shebang.
La première erreur arrêtera le script.

Ou carrément mettre comme shebang:
Code :
#!/bin/sh -e

PengouinBSD : En effet.
Dans ce cas, ça peut donner :
Code :
/usr/sbin/acme-client -v "${domain}"
test $? -eq 1 && _mail
Répondre
#7

Problème : avec l'option '-e', le code de sortie 2 est considéré comme une erreur, résultat le script s'arrête après la première exécution de la boucle.

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre
#8

Ah oui, tu dois préciser dans ce cas une porte de sortie :
Code :
/usr/sbin/acme-client -v "${domain}" || (test $? -eq 1 && _mail)

(pas testé, c'est pour illustrer le "||")
Répondre
#9

oui, j'ai fait classiquement :

Code :
        /usr/sbin/acme-client -v "${domain}"
        status="$?"
        
        if [ "${status}" -eq 0 ]; then
            _ocsp
            _restart nginx
            
        elif [ "${status}" -eq 1 ]; then
            _mail
            exit 2
            
        else
            sleep 7
        fi

GPG:Fingerprint ed25519 : 072A 4DA2 8AFD 868D 74CF  9EA2 B85E 9ADA C377 5E8E
GPG:Fingerprint rsa4096 : 4E0D 4AF7 77F5 0FAE A35D  5B62 D0FF 7361 59BF 1733
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)