85.1.30. pepsi-stage-block-language

route a message by its detected body language(s)

Handbuchabschnitt:

1

85.1.30.1.1. Name

pepsi-stage-block-language - die Sprachrichtlinien-Stage der Pepsi-Pipeline.

85.1.30.1.2. Übersicht

pepsi-stage-block-language [GLOBAL-OPTIONS] worker

85.1.30.1.3. Beschreibung

Diese Stage hat den Standardwert FUSION = yes: Wenn Stage-Fusion aktiviert ist ([pepsi] ALLOW_FUSION, der Standardwert) und diese Stage in das vereinheitlichte pepsi-Binärprogramm eingefaltet ist, kann ein Vorgänger sie in seinem eigenen Worker-Prozess ausführen, statt sie separat zu dispatchen. Siehe pepsi-dispatch(1) und pepsi.conf(5).

pepsi-stage-block-language ist ein Stage-Programm, das von pepsi-dispatch(1) als persistenter Worker ausgeführt wird, der Nachrichten-IDs von der Standardeingabe liest. Es lädt diesen pepsi.workqueue-Datensatz (und weigert sich zu handeln, sofern sein status nicht running ist), liest seinen [stage-<stage>]-Abschnitt, bewertet die unter state.language festgehaltene(n) menschliche(n) Sprache(n) (von pepsi-stage-detect-language(1)) gegen eine konfigurierte weiße und schwarze Liste und routet die Nachricht entsprechend: oberhalb der Bewertungsschwelle schaltet sie zu NEXT_STAGE weiter, andernfalls wird sie blockiert. Was Blockieren bedeutet, bestimmt die Option ENFORCEMENT — ein Bounce, oder ein Flag auf einer trotzdem zugestellten Nachricht (siehe Durchsetzung unten). Der Rest von state (state.dsn, der Ingress-origin, …) bleibt erhalten, und diese Stage fügt ihm nie etwas hinzu.

85.1.30.1.4. Bewertung

state.language ist eine Zeichenkette im HTTP-Accept-Language-Stil aus code;q=quality-Elementen, wobei jede quality die Erkennungswahrscheinlichkeit dieser Sprache ist. Die Stage wandelt sie in eine einzelne Zahl um:

score = Σ q over languages listed in WHITELIST
      − Σ q over languages listed in BLACKLIST

Sprachen auf keiner der Listen tragen nichts bei. Steht zum Beispiel Englisch auf der weißen und Französisch auf der schwarzen Liste, so bewertet sich eine als en;q=0.7, fr;q=0.3 festgehaltene Nachricht zu 0.7 − 0.3 = 0.4.

Ein Listeneintrag ist ein Sprachbereich, der nach dem einfachen Filtern von RFC 4647 §3.3.1 gegen ein erkanntes Tag abgeglichen wird: Der Bereich passt, wenn er dem Tag gleicht oder einem Präfix davon, auf das - folgt. Ein schlichtes de passt also auf ein erkanntes de-CH, und ein engeres de-CH — das in den Listen ebenfalls zulässig ist — passt nur auf ein erkanntes de-CH, nicht auf ein blankes de.

Wenn keine Sprache erkannt wurde (state.language fehlt), wird die Bewertung gegen die Pseudo-Verteilung none;q=1 berechnet. Der literale Pseudo-Code none kann selbst in WHITELIST oder BLACKLIST erscheinen, sodass ein Operator über das Schicksal nicht erkannter Mail entscheidet: none auf die schwarze Liste zu setzen bewertet sie mit −1, auf die weiße Liste mit +1, und sie nirgends aufzuführen belässt sie bei 0.

Eine Nachricht, die ein explizites state.spam = false-Urteil trägt — von einem vorgelagerten Treffer auf einer weißen Liste (pepsi-stage-check-whitelist(1)) oder von Ingress für Mail gesetzt, die ausschließlich an das reservierte <Postmaster>-Postfach gerichtet ist (RFC 5321 §4.5.1) — umgeht die Sprachrichtlinie vollständig und schaltet unabhängig von ihrer erkannten Sprache zu NEXT_STAGE weiter.

Andernfalls schaltet eine Nachricht, deren Bewertung strikt größer als THRESHOLD ist, zu NEXT_STAGE weiter; eine auf oder unter diesem Wert wird blockiert. Eine Nachricht, die bereits ein Bounce ist (der leere Umschlagabsender), ist in beiden Durchsetzungsmodi ausgenommen — sie schaltet unabhängig von ihrer Bewertung zu NEXT_STAGE weiter, denn ein Bounce darf nie gebounct werden, und ein Flag würde dann einen Bounce behaupten, der ohnehin nie stattgefunden hätte.

Bemerkung

Da der Vergleich strikt ist und nicht gelistete Sprachen 0 beitragen, benötigt eine Richtlinie nach dem Muster „alle erlauben außer einer schwarzen Liste“ einen negativen THRESHOLD. Mit dem Standardwert THRESHOLD = 0.0 und nur gesetzter BLACKLIST erhält jede Nachricht in neutraler Sprache den Wert 0 — der nicht größer als 0 ist — und wird blockiert. pepsi-setup(1) warnt vor genau dieser Fehlkonfiguration (eine BLACKLIST mit leerer WHITELIST und einem nicht-negativen THRESHOLD).

Diese Stage pausiert eine Nachricht nie, und der Nachrichtentext wird nie geladen.

85.1.30.1.5. Durchsetzung

ENFORCEMENT entscheidet, was mit einer blockierten Nachricht geschieht. Beide Modi wirken auf genau dieselbe Menge von Nachrichten: Für alles, wofür hard einen Bounce erzeugt, setzt soft ein Flag.

hard (der Standardwert)

Die Nachricht wird mit einem permanenten Failure-DSN-state zu BOUNCE_STAGE geroutet, sodass pepsi-stage-bounce(1) nur dann einen Bounce ausgibt, wenn das NOTIFY des Absenders FAILURE anfordert (der Standardwert bei Abwesenheit). So oder so wird die Nachricht nicht zugestellt. An der Nachricht selbst wird nichts umgeschrieben. pepsi-setup(1) weist eine hard-Stage ohne BOUNCE_STAGE zurück, und ihr Worker verweigert bei einem solchen Abschnitt den Start, da er sonst jede von der Richtlinie abgewiesene Nachricht fehlschlagen ließe.

Eine Nachricht mit mehreren Umschlagempfängern wird zuerst aufgeteilt, sodass jeder Empfänger auf seinem eigenen Datensatz blockiert wird und daher seine eigene empfängerbezogene Gruppe in der DSN erhält (RFC 3464 §2.3.1) und nach seinem eigenen NOTIFY beurteilt wird. Ohne die Aufteilung würde der Bericht eine Adresse nennen und den Absender im Glauben lassen, die übrigen seien zugestellt worden.

soft

Die Nachricht wird trotzdem zugestellt, markiert, und schaltet zu NEXT_STAGE weiter:

  • SUBJECT_FLAG_LABEL (Standardwert [!LANG]) wird an sein Subject: angehängt, im Header-Block und in der subject-Spalte des Datensatzes, sodass die Markierung sowohl für den Empfänger als auch für pepsi-queue(1) sichtbar ist. Sie wird nur angehängt, wenn der Betreff sie nicht bereits enthält, unabhängig von der Groß-/Kleinschreibung, sodass eine Antwort, die sie durch diese Stage zurückzitiert, keine zweite ansammelt. Eine Nachricht, die ohne Subject:-Feld ankam, bekommt keines — die Stage erfindet keinen Header —, aber ihre Spalte wird dennoch markiert.

  • Ein X-Pepsi-Detected-Languages-Header wird hinzugefügt, der die Erkennung in derselben code;q=value-Form trägt wie ein HTTP-Accept-Language-Header. Er wird aus der tatsächlich bewerteten Verteilung neu gerendert — sodass das Feld und die Entscheidung nicht auseinandergehen können, wobei jede Qualität auf zwei Nachkommastellen gerundet wird — und bei nicht erkannter Mail trägt er die bewertete Pseudo-Verteilung none;q=1. Jede bereits an der Nachricht vorhandene Kopie dieses Feldes wird zuvor entfernt: Es liegt nicht im X-Pepsi-*-Namensraum, den pepsi-stage-decrypt(1) pauschal abstreift, sodass eine eingehende Nachricht ein gefälschtes tragen kann, und das Feld, mit dem eine zugestellte Nachricht endet, muss die Antwort dieses Servers sein und nicht die des Absenders.

  • BOUNCE_STAGE wird nicht herangezogen, und es wird keine DSN erzeugt.

Dies ist der Modus, mit dem man zuerst laufen sollte. Die sich in echten Postfächern ansammelnden Flags sind eine getreue Vorschau darauf, was die Durchsetzung ablehnen würde, sodass WHITELIST, BLACKLIST und THRESHOLD an echtem Verkehr abgestimmt werden können, bevor die Mail eines Korrespondenten weggeworfen wird. Da es sich um eine gewöhnliche Stage-Option handelt, ist ENFORCEMENT je Adresse überschreibbar (pepsi-settings(1)) — ein Konto kann im Training bleiben, während der Rest der Installation durchsetzt.

Warnung

Das Subject: umzuschreiben bricht die DKIM-Signatur des Absenders und das eigene ARC-AMS dieses Servers: Beide übersignieren Subject. Das ist derselbe Kompromiss, den pepsi-stage-vacation(1) für sein VACATION_TAG eingeht, und er ist auf einem Zweig, der in lokaler Zustellung endet, kostenlos und auf einem, der die Nachricht weiterleitet, nicht. Setzen Sie ENFORCEMENT = soft auf ersteren. hard schreibt überhaupt keinen Header um.

85.1.30.1.6. Konfiguration

Die Optionen liegen im eigenen [stage-<name>]-Abschnitt der Stage (PROGRAM = pepsi-stage-block-language): NEXT_STAGE, BOUNCE_STAGE, die Sprachlisten WHITELIST/BLACKLIST, der THRESHOLD und das obige Paar ENFORCEMENT/SUBJECT_FLAG_LABEL. Sie sind in pepsi.conf(5) dokumentiert.

85.1.30.1.7. State

Eingaben: state.language (die Accept-Language-artige Zeichenkette, die von pepsi-stage-detect-language(1) geschrieben wird; bei Abwesenheit als none;q=1 behandelt) und, für eine gebouncte Nachricht, state.dsn und der Umschlagempfänger.

Ausgaben: Auf dem Durchlasspfad schaltet die Stage weiter und lässt state unberührt. Unter ENFORCEMENT = hard leitet eine blockierte Nachricht zu BOUNCE_STAGE um und führt die Failure-DSN-Schlüssel zusammen, die pepsi-stage-bounce(1) verbraucht (state.bounce). Unter soft schreibt die Stage überhaupt kein state: Die Markierung steckt in der Nachricht, nicht in den Metadaten des Datensatzes. Das State-Layout wird in pepsi.state(7) beschrieben.

Übergänge (die Bewertung wird aus WHITELIST/BLACKLIST berechnet, wobei die Pseudo-Sprache none nicht erkannte Mail bewertet):

  • state.spam = false → weiterschalten zu NEXT_STAGE, ohne Bewertung;

  • Bewertung über THRESHOLD → weiterschalten zu NEXT_STAGE;

  • Bewertung auf oder unter THRESHOLD, Nachricht ist ein Bounce (Null-Absender) → weiterschalten zu NEXT_STAGE, unmarkiert, in beiden Modi;

  • Bewertung auf oder unter THRESHOLD, ENFORCEMENT = hard, mehr als ein Umschlagempfänger → der Datensatz wird in einen Datensatz je Empfänger aufgeteilt, jeder bei ebendieser Stage pending belassen und jeder im eigenen nächsten Durchgang erneut beurteilt;

  • Bewertung auf oder unter THRESHOLD, ENFORCEMENT = hard → umleiten zu BOUNCE_STAGE mit state.bounce (einer Failure-DSN);

  • Bewertung auf oder unter THRESHOLD, ENFORCEMENT = soft → die Header Subject:/X-Pepsi-Detected-Languages umschreiben und zu NEXT_STAGE weiterschalten.

Die Stage pausiert nie. Sie lässt eine Nachricht nur fehlschlagen, wenn eine adressbezogene Einstellung ENFORCEMENT = hard für eine Stage ohne BOUNCE_STAGE einschaltet und die Richtlinie die Nachricht blockiert.

85.1.30.1.8. Befehle

worker

Läuft als persistenter pepsi-dispatch(1)-Worker, der Nachrichten-IDs von der Standardeingabe liest.

85.1.30.1.9. Globale Optionen

-c FILE, –config FILE

Liest die Konfiguration aus FILE, statt die Standardorte zu durchsuchen.

-L LOGLEVEL, –log LOGLEVEL

Setzt die Log-Ausführlichkeit (Standardwert info).

-v, –verbose

Zeigt Log-Meldungen aus allen Quellen.

-h, –help; -V, –version

Gibt eine Verwendungsübersicht / die Version aus und beendet sich.

85.1.30.1.10. Exit-Status

0

Die Nachricht wurde verarbeitet (weitergeschaltet oder zur Bounce-Stage geroutet).

1

Ein Fehler ist aufgetreten (Nachricht nicht gefunden oder nicht running, oder eine adressbezogene Einstellung, die den Abschnitt der Stage kaputt macht — ein ungültiger Sprachcode, WHITELIST und BLACKLIST beide leer, eine Überlappung zwischen ihnen oder eine Blockierung ohne BOUNCE_STAGE). Der Grund wird in das Log geschrieben.

Ein Fehler des Hosts (die Datenbank, eine Vorlage oder ein Helfer, die sich nicht verwenden lassen) wird nicht als Fehlschlag gemeldet: Die Nachricht wird pausiert und erneut versucht, wie unter Stage-Fehler in pepsi-dispatch(1) beschrieben. Ein Abschnitt, der sich nicht parsen lässt, lässt den Worker den Start verweigern (Status 78), statt eine Nachricht nach der anderen fehlschlagen zu lassen.

85.1.30.1.11. Beispiele

Nachricht 42 bewerten und routen (sie muss running sein):

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

Ein Pipeline-Abschnitt, der englische Mail annimmt, französisch wirkende Mail ablehnt und nicht erkannte Mail durchlässt (0 überschreitet die -0.1-Schwelle):

[stage-block-language]
PROGRAM = pepsi-stage-block-language
NEXT_STAGE = srs
BOUNCE_STAGE = bounce
WHITELIST = en
BLACKLIST = fr
THRESHOLD = -0.1

Dieselbe Richtlinie im Trainingsmodus: Nichts wird abgelehnt, und die Mail, die abgelehnt worden wäre, kommt mit markiertem Betreff und einem Header an, der sagt warum:

[stage-block-language]
PROGRAM = pepsi-stage-block-language
NEXT_STAGE = local
BOUNCE_STAGE = bounce
WHITELIST = en
BLACKLIST = fr
THRESHOLD = -0.1
ENFORCEMENT = soft

Eine französisch aussehende Nachricht erreicht den Empfänger dann als:

X-Pepsi-Detected-Languages: fr;q=0.87, en;q=0.09
Subject: Bonjour [!LANG]

Einen Benutzer im Training halten, während für alle anderen durchgesetzt wird (pepsi-settings(1)):

pepsi-settings set alice@example.org block-language ENFORCEMENT soft

85.1.30.1.12. Siehe auch

pepsi-config(1), pepsi-stage-detect-language(1), pepsi-stage-bounce(1), pepsi-dispatch(1), pepsi-settings(1), pepsi.conf(5), pepsi.state(7), pepsi-setup(1)

85.1.30.1.13. Fehler

Melden Sie Fehler an den Pepsi-Issue-Tracker.