85.1.18. pepsi-stage-aliases

expand message recipients through an alias mapping file

Section du manuel:

1

85.1.18.1.1. Nom

pepsi-stage-aliases - l’étape d’expansion d’alias / de listes de diffusion du pipeline Pepsi.

85.1.18.1.2. Synopsis

pepsi-stage-aliases [GLOBAL-OPTIONS] worker

85.1.18.1.3. Description

pepsi-stage-aliases est un programme d’étape exécuté par pepsi-dispatch(1). Il charge une ligne pepsi.workqueue (refusant d’agir sauf si son status est running), lit sa section [stage-<stage>] et réécrit les destinataires d’enveloppe du message à travers la table d’alias nommée par ALIASES. Chaque destinataire qui correspond à une entrée de la table est remplacé par les adresses cibles de cette entrée ; les destinataires qui ne correspondent à rien sont laissés inchangés. La liste de destinataires résultante est dédupliquée sans tenir compte de la casse de sorte que chaque adresse ne soit remise qu’au plus une fois, et le message est avancé vers NEXT_STAGE.

L’étape ne charge que l’enveloppe et state — jamais les en-têtes ni le corps. Lorsqu’aucun destinataire ne correspond à la table (et qu’aucun doublon n’est supprimé), le message est avancé inchangé.

85.1.18.1.4. Fichier d’alias

ALIASES nomme un fichier de table lisible par un humain, analysé comme une table Postfix virtual(5). Chaque ligne non vide associe une clé à une ou plusieurs adresses cibles

# comments begin with '#'; blank lines are ignored
postmaster@example.com   alice@example.com
staff@example.com        bob@example.com, carol@partner.example
@example.net             ops@example.com
sales-*@example.org      sales@example.com

La clé (côté gauche) est le premier champ délimité par des espaces : une adresse complète, un attrape-tout @domain, ou un motif joker * (un glob * tel que *@example.org ou sales-*@example.org). Les cibles (côté droit) sont séparées par des virgules et/ou des espaces et sont conservées verbatim — elles peuvent être locales ou distantes, mais ne peuvent pas contenir de joker. Une ligne avec une clé mais sans cibles est ignorée (un destinataire n’est jamais silencieusement supprimé). Si la même clé apparaît deux fois, la dernière ligne l’emporte.

Comme dans virtual(5), une ligne dont le premier caractère est un blanc prolonge la correspondance précédente au lieu d’en commencer une nouvelle, de sorte qu’une longue liste de cibles peut être repliée sur plusieurs lignes ; les lignes vides et les lignes entièrement de commentaire intercalées ne rompent pas une telle continuation. Un # ne commence un commentaire qu’au début d’un champ (au début de la ligne, ou après un blanc), de sorte que bug#42@example.com est une clé ordinaire plutôt qu’une clé tronquée.

Avertissement

Les jokers sont des globs, pas des expressions régulières. * correspond à toute suite de caractères et tout autre caractère — un . compris — est littéral. Pour aliaser un domaine entier, écrivez *@example.net (ou l’attrape-tout @example.net) ; .*@example.net est une expression régulière et, lu comme un glob, exige un point initial : il ne correspond donc à aucune adresse réelle et tout message vers ce domaine passe sans être aliasé. (Les motifs pepsi.whitelist de pepsi-whitelist(1) sont des ERE POSIX ; cette table ne l’est pas.) La vérification de syntaxe de pepsi-setup comme l’analyseur de table de l’étape elle-même rejettent ou signalent une clé qui ressemble à une expression régulière et nomment le glob que vous vouliez probablement.

Le fichier est lu en mémoire et relu seulement lorsque son identité change — heure de modification, taille et inode, de sorte qu’un remplacement préservant la mtime (cp -p, une sauvegarde restaurée) est également remarqué — et un worker occupé ne le ré-analyse donc pas pour chaque message. Un fichier manquant est une table vide (aucun alias configuré). Un fichier qui existe mais ne peut pas être lu (permissions, erreur d’E/S) est une erreur : le message est mis en pause et réessayé à intervalles croissants, comme pour toute autre défaillance de l’hôte, plutôt que remis sans résolution des alias – une entrée postmaster@ ou fourre-tout qui ne s’appliquerait pas en silence le remettrait au mauvais destinataire ou le ferait rebondir. Le fichier illisible n’est pas mis en cache, de sorte que la tentative suivante le relit. pepsi-setup vérifie la syntaxe du fichier ALIASES au moment de l’installation lorsqu’il existe, et écrit un modèle de départ commenté lorsqu’il n’existe pas (voir pepsi-setup(1)) ; une ligne malformée y est signalée comme un avertissement avant le déploiement plutôt que seulement à l’exécution, jamais comme une erreur fatale.

85.1.18.1.5. Correspondance et expansion

Un destinataire est mis en minuscules et recherché verbatim ; en cas d’absence, la clé attrape-tout @domain de son domaine est essayée, et enfin toute clé joker * — le joker correspondant le plus spécifique l’emporte (un sales-*@example.org étroit bat un *@example.org large, qui bat un * nu ; les égalités sont départagées de façon déterministe). Le détail de sous-adresse (+tag) n’est pas retiré, de sorte qu’une adresse de liste spécifique telle que list+announce@example.com peut être aliasée à elle seule.

L’expansion est transitive : lorsqu’une cible d’alias est elle-même une clé, elle est développée à son tour, de sorte que les listes de distribution imbriquées se résolvent en leurs adresses feuilles. Une boucle — un alias qui se réfère à lui-même directement ou via une chaîne — est rompue en résolvant la clé répétée en son adresse littérale plutôt qu’en récursant à l’infini. Une chaîne de plus de 32 sauts est arrêtée de la même manière (l’adresse est remise littéralement, avec un avertissement), de sorte qu’une table générée ne peut pas déborder la pile du worker.

85.1.18.1.6. Notifications d’état de remise

state.dsn.rcpt est parallèle à la liste des destinataires ; il est donc reconstruit au même pas que les destinataires réécrits. Une cible développée hérite du NOTIFY du destinataire d’origine dont elle provient, tout mot-clé SUCCESS retiré (RFC 3461 §5.2.7.3(c) : sinon une seule soumission à un alias de cinq membres susciterait cinq DSN positifs pour un seul destinataire et divulguerait la composition de l’alias ; un NOTIFY qui n’était que SUCCESS devient NEVER) et, suivant la même section, porte un ORCPT pointant vers le destinataire d’origine (son ORCPT existant s’il en avait un, sinon rfc822;<original-recipient>). Un destinataire qui n’a pas été développé conserve son entrée DSN inchangée. Les RET/ENVID au niveau du message et toutes les autres clés de state sont préservés.

85.1.18.1.7. Configuration

Les options résident dans la propre section [stage-<name>] de l’étape (PROGRAM = pepsi-stage-aliases) : le chemin du fichier de table ALIASES et le NEXT_STAGE vers lequel le message développé avance. Les deux sont obligatoires — l’étape fait avancer chaque message qu’elle voit, de sorte que pepsi-setup rejette une section à laquelle l’un ou l’autre manque. Elles sont documentées dans pepsi.conf(5).

85.1.18.1.8. État

Entrées : le rcpt_to d’enveloppe et le state.dsn.rcpt par destinataire.

Sorties : un rcpt_to réécrit et un state.dsn.rcpt correspondant, écrits uniquement lorsque la liste de destinataires a réellement changé (un alias s’est appliqué, ou un doublon a été retiré) ; aucun autre state n’est touché. La disposition de l’état est décrite dans pepsi.state(7).

Transitions : avance vers NEXT_STAGE (la seule transition) ; l’étape ne met jamais en pause, n’échoue, ne réachemine ni ne termine.

85.1.18.1.9. Commandes

worker

Exécuté comme un worker persistant de pepsi-dispatch(1), lisant les identifiants de message sur l’entrée standard. C’est ainsi que le dispatcher exécute l’étape en production.

85.1.18.1.10. Options globales

-c FILE, –config FILE

Lit la configuration depuis FILE au lieu de parcourir les emplacements par défaut.

-L LOGLEVEL, –log LOGLEVEL

Règle la verbosité de journalisation (par défaut info).

-v, –verbose

Affiche les messages de journal de toutes les sources.

-h, –help ; -V, –version

Affiche un résumé d’utilisation / la version et quitte.

85.1.18.1.11. Code de sortie

0

Le message a été traité (avancé vers NEXT_STAGE).

1

Une erreur s’est produite (message introuvable ou non running, une étape mal configurée — par exemple un ALIASES ou un NEXT_STAGE manquant — ou une erreur de base de données). La raison est écrite dans le journal. Un fichier d’alias manquant n’est pas une erreur : il est traité comme une table vide.

85.1.18.1.12. Exemples

Retraiter le message 42 avec un worker ponctuel (il doit être running)

echo 42 | pepsi-stage-aliases -c /etc/pepsi/pepsi.conf worker

Une section de pipeline placée juste avant la remise locale, développant les destinataires et transférant vers l’étape de remise locale

[stage-aliases]
PROGRAM = pepsi-stage-aliases
NEXT_STAGE = local
ALIASES = /etc/pepsi/aliases

85.1.18.1.13. Voir aussi

pepsi-config(1), pepsi-stage-relay-to-maildir(1), pepsi-stage-if(1), pepsi-dispatch(1), pepsi.conf(5), pepsi.state(7), pepsi-setup(1)

85.1.18.1.14. Bogues

Signalez les bogues au gestionnaire de tickets de Pepsi.