1
0
Fork 0
scripts-admin-quickndirty-p.../oldies/script_ml-gestion-abonne.sh

178 lines
5 KiB
Bash
Executable file

#!/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 <<EOF
$0 [-i] [-r liste] [-r ALL] [-a liste] [-a ...] mail
$0 -h
-i : mode interactif.
-a liste : ajoute le mail à la liste. En mode interactif, propose par défaut cette liste au prompt.
-r liste : supprime le mail de la liste. ALL = suppression de toutes les listes. En mode interactif, supprime les listes de la proposition.
-l : liste les mailings-lists dans lesquelles le mail apparaît.
Note: les ajouts prennent le pas sur les suppressions.
EOF
}
terminaison() {
if [ "$1" = "" ] || [ "$1" -eq 0 ]; then
rm -f "$LOGFILE"
RETOUR=0
else
if [ -s "$LOGFILE" ]; then
printf "NOTICE: log dispo : %s\n" "$LOGFILE" >&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