#!/bin/sh # Ce script sert à gérer les abonnements d'une adresse email # # exemple d'utilisation : # - supprimer une adresse de toutes les mailings-list (suppression d'un compte) # - ajouter interactivement une adresse à certaines ML avec un choix par # défaut (salaries, ...) # # note: dans l'autre sens (ie. pour gérer une mailing-list donnée), il vaut # mieux passer par phpldapadmin ou similaire, c'est plus pratique. # # 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="0" AJOUTS="" SUPPRESSIONS="" LOGFILE=$( mktemp ) LISTING_MAILING_LISTS=$( afficher_listing_mailinglists ) # 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 a:r:ihl f; do case $f in 'a') AJOUTS=$( echo $AJOUTS $OPTARG ) ;; 'r') SUPPRESSIONS=$( echo $SUPPRESSIONS $OPTARG ) ;; 'i') MODE_INTERACTIF=1 ;; 'l') MODE_LISTING=1 ;; 'h') usage terminaison 0 ;; \?) usage >&2 terminaison 1 ;; esac done shift $( expr $OPTIND - 1 ) MAIL="$1" # Petite vérif. if [ "$MAIL" = "" ]; then echo "ERREUR: aucune adresse email fournie." >&2 usage terminaison 1 fi # Mode listing if [ "$MODE_LISTING" -gt 0 ]; then afficher_abonnements_en_cours "$MAIL" terminaison 0 fi # Les mailings-lists demandées existent-elles ? TMP=0 for ML in $AJOUTS $SUPPRESSIONS; do if [ $( printf "%s\nALL\n" "$LISTING_MAILING_LISTS" | egrep -c "^$ML$" ) -ne 1 ]; then echo "ERREUR: la mailing-list ne semble pas exister : $ML" >&2 TMP=1 fi done test "$TMP" -eq 0 || terminaison 1 # Construction de la liste finale des abonnements if [ $( echo "$SUPPRESSIONS" | grep -wc "ALL" ) -gt 0 ]; then # Suppression de tous les abonnements (paramètre "-r ALL") SUPPRESSIONS=$( afficher_abonnements_en_cours "$MAIL" ) fi LISTE_FINALE=$( (afficher_abonnements_en_cours "$MAIL" | 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 # Listing des mailing-lists disponibles echo "Listing des mailing-lists : " printf "%s\n" "$LISTING_MAILING_LISTS" | sed 's/^/ /' # Prompt pour la modification du listing LISTE_FINALE=$( echo $LISTE_FINALE ) # ça permet de convertir facilement en une liste mono-ligne :) printf "Indiquer les listes auxquelles l'email %s doit être abonné, ligne vide pour terminer\n(. pour ignorer la proposition et annuler les entrées précédentes)\n[%s]\n" "$MAIL" "$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 ML in $LISTE_USER; do # Si c'est un "." qui a été rentré, on efface la liste finale if [ "$ML" = "." ]; then LISTE_FINALE="" # sinon, on vérifie simplement que la mailing-list existe elif [ $( printf "%s\n" "$LISTING_MAILING_LISTS" | egrep -c "^$ML$" ) -ne 1 ]; then # Si elle n'existe pas: nouveau tour gratuit echo "ERREUR: la mailing-list ne semble pas exister : $ML" >&2 BOUCLE_INTERACTIVE=1 else # On concatène (astuce avec echo pour enlever les espaces inutiles) LISTE_FINALE=$( echo $LISTE_FINALE $ML ) fi done done # - les suppressions for ML in $( afficher_abonnements_en_cours "$MAIL" | grep -wFv "$( echo "$LISTE_FINALE" | sed 's/ \+/\n/g' )" ); do printf "Suppression de %s de la mailing-list %s.\n" "$MAIL" "$ML" supprimer_abonnement "$MAIL" "$ML" >"$LOGFILE" 2>&1 || terminaison 1 done # - les créations d'abonnement for ML in $( echo "$LISTE_FINALE" | sed 's/ \+/\n/g' | grep -wFv "$( afficher_abonnements_en_cours "$MAIL" )" ); do printf "Ajout de %s à la mailing-list %s.\n" "$MAIL" "$ML" creer_abonnement "$MAIL" "$ML" >"$LOGFILE" 2>&1 || terminaison 1 done # Fin du script - nettoyage terminaison 0