214 lines
5.9 KiB
Bash
Executable file
214 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
|
|
|