#!/bin/sh # Ce script sert à créer/supprimer une mailing-list # # exemple d'utilisation : # - créer une mailing-list et lui ajouter des abonnés, # - retirer des abonnés d'une mailing-list, # - supprimer une mailing-list # # note: dans l'autre sens (ie. gérer les abonnements d'une adresse donnée), # il existe le script_ml-gestion-abonne.sh # # Known bug: ne pas utiliser avec les mailings-lists ou adresses emails # dont le nom contient un espace. # Inclusion de la conf. + fonctions de base . ./lib_gestion-mailinglists.sh # Initialisation des variables "globales" MODE_INTERACTIF="0" MODE_LISTING_ABONNES="0" CREATION_SUPPRESSION="0" # 0: neutre, -1: suppression, 1: creation AJOUTS="" SUPPRESSIONS="" LOGFILE=$( mktemp ) # Fonctions # affiche le message d'aide usage() { cat <&2 else rm -f "$LOGFILE" fi RETOUR="$1" fi exit "$RETOUR" } # Début du code # gestion des options de lancement while getopts cda:r:ihlL f; do case $f in 'c') CREATION_SUPPRESSION=1 ;; 'd') CREATION_SUPPRESSION=-1 ;; 'a') AJOUTS=$( echo $AJOUTS $OPTARG ) ;; 'r') SUPPRESSIONS=$( echo $SUPPRESSIONS $OPTARG ) ;; 'i') MODE_INTERACTIF=1 ;; 'l') MODE_LISTING_ABONNES=1 ;; 'L') afficher_listing_mailinglists terminaison 0 ;; 'h') usage terminaison 0 ;; \?) usage >&2 terminaison 1 ;; esac done shift $( expr $OPTIND - 1 ) MAILINGLIST="$1" # Petite vérif. if [ "$MAILINGLIST" = "" ]; then echo "ERREUR: aucune mailing-list n'a été indiquée." >&2 usage terminaison 1 fi # Mode listing des abonnes d'une mailing-linst if [ "$MODE_LISTING_ABONNES" -gt 0 ]; then # On vérifie quand même que la mailing-list existe... if [ $( afficher_listing_mailinglists | grep -wc "^$MAILINGLIST$" ) -ne 1 ]; then echo "ERREUR: mailing-list inexistante." >&2 terminaison 1 fi # Listing des abonnés de la mailing-list afficher_abonnes_mailinglist "$MAILINGLIST" terminaison 0 fi # La mailing-list demandée existe-elle ? if [ $( printf "%s\n" "$( afficher_listing_mailinglists )" | egrep -c "^$MAILINGLIST$" ) -ne 1 ]; then # Si elle n'existe pas, doit-on la créer ? if [ $CREATION_SUPPRESSION -lt 1 ]; then echo "ERREUR: la mailing-list ne semble pas exister : $MAILINGLIST" >&2 terminaison 1 else # On crée la mailing-list printf "Création de la mailing-list..." if creer_mailinglist "$MAILINGLIST" >"$LOGFILE" 2>&1; then printf " [OK]\n" else printf "\nProblèmes à la création de la mailing-list. Cf log.\n" >&2 terminaison 1 fi fi else # Si elle existe, doit-on la supprimer ? if [ "$CREATION_SUPPRESSION" -lt 0 ]; then # On la supprime et on arrête là le script printf "Suppression de la mailing-list..." if supprimer_mailinglist "$MAILINGLIST" >"$LOGFILE" 2>&1; then printf "[OK]\n"; terminaison 0 else printf "\nProblèmes à la suppression de la mailing-list. Cf log.\n" >&2 terminaison 1 fi fi fi # Construction de la liste finale des abonnements if [ $( echo "$SUPPRESSIONS" | grep -wc "ALL" ) -gt 0 ]; then # Suppression de tous les abonnés (paramètre "-r ALL") SUPPRESSIONS=$( afficher_abonnes_mailinglist "$MAILINGLIST" ) fi LISTE_FINALE=$( (afficher_abonnes_mailinglist "$MAILINGLIST" | grep -wFv "$( echo "$SUPPRESSIONS" | sed 's/ \+/\n/g' )" ; echo "$AJOUTS" | sed 's/ \+/\n/g') | grep -v "^$" | sort -u ) # Entrée dans le "mode interactif" BOUCLE_INTERACTIVE=$MODE_INTERACTIF # simple copie cosmétique, histoire de garder le paramètre jusqu'au bout (sait-on jamais :) while [ "$BOUCLE_INTERACTIVE" -eq 1 ]; do # Prompt pour la modification du listing LISTE_FINALE=$( echo $LISTE_FINALE ) # ça permet de convertir facilement en une liste mono-ligne :) printf "Indiquer les emails qui seront abonnés à la liste '%s', ligne vide pour terminer\n(. pour ignorer la proposition et annuler les entrées précédentes)\n[%s]\n" "$MAILINGLIST" "$LISTE_FINALE" LISTE_USER=$( while read LINE; do if [ "$LINE" = "" ]; then exit 0; else echo "$LINE"; fi; done ) # écrasement de LISTE_FINALE si l'utilisateur a entré qqchose if [ "$LISTE_USER" != "" ]; then LISTE_FINALE="" fi # On vérifie chaque entrée (un peu redondant avec la boucle de vérif. précédente) BOUCLE_INTERACTIVE=0 for MAIL in $LISTE_USER; do # Si c'est un "." qui a été rentré, on efface la liste finale if [ "$MAIL" = "." ]; then LISTE_FINALE="" else # sinon, on concatène (astuce avec echo pour enlever les espaces inutiles) LISTE_FINALE=$( echo $LISTE_FINALE $MAIL ) fi done done # - les suppressions for MAIL in $( afficher_abonnes_mailinglist "$MAILINGLIST" | grep -wFv "$( echo "$LISTE_FINALE" | sed 's/ \+/\n/g' )" ); do printf "Suppression de %s de la mailing-list %s.\n" "$MAIL" "$MAILINGLIST" supprimer_abonnement "$MAIL" "$MAILINGLIST" >"$LOGFILE" 2>&1 || terminaison 1 done # - les créations d'abonnement for MAIL in $( echo "$LISTE_FINALE" | sed 's/ \+/\n/g' | grep -wFv "$( afficher_abonnes_mailinglist "$MAILINGLIST" )" ); do printf "Ajout de %s à la mailing-list %s.\n" "$MAIL" "$MAILINGLIST" creer_abonnement "$MAIL" "$MAILINGLIST" >"$LOGFILE" 2>&1 || terminaison 1 done # Fin du script - nettoyage terminaison 0