177 lines
5 KiB
Bash
Executable file
177 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
|
|
|