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

215 lines
5.9 KiB
Bash
Executable file

#!/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 <<EOF
$0 [-i] [ -c | -d ] [-r email] [-r ALL] [-a email] [-a ...] mail
$0 -L
$0 -h
-i : mode interactif.
-c : crée la mailing-list.
-d : supprime la mailing-list.
-a mail : ajoute le mail à la liste. En mode interactif, propose par défaut cet
email au prompt.
-r mail : supprime le mail de la liste. ALL = suppression de tous les abonnés.
En mode interactif, supprime les listes de la proposition.
-l : liste les abonnés de la mailing-list.
-L : liste les mailing-list
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 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