summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/docs/8-miles-high.rst74
-rw-r--r--src/mailman/docs/conf.py3
-rw-r--r--src/mailman/docs/contents.rst4
3 files changed, 78 insertions, 3 deletions
diff --git a/src/mailman/docs/8-miles-high.rst b/src/mailman/docs/8-miles-high.rst
index 1d8d2645c..320a76dfc 100644
--- a/src/mailman/docs/8-miles-high.rst
+++ b/src/mailman/docs/8-miles-high.rst
@@ -29,8 +29,20 @@ due to lack of Message-Id as strongly recommended by RFC 2822 and RFC
and the resulting *message pickle* added to one of the IN, COMMAND, or
BOUNCE processing queues.
-.. image:: msg-flow.png
- :scale: 75
+.. graphviz::
+
+ digraph msgflow {
+ rankdir = LR;
+ node [shape=box, color=lightblue, style=filled];
+ msg [shape=ellipse, color=black, fillcolor=white];
+ lmtpd [label="LMTP\nSERVER"];
+ msg -> MTA [label="SMTP"];
+ MTA -> lmtpd [label="LMTP"];
+ lmtpd -> MTA [label="reject"];
+ lmtpd -> IN -> POSTING [label=".pck"];
+ lmtpd -> BOUNCES [label=".pck"];
+ lmtpd -> COMMAND [label=".pck"];
+ }
The IN queue is processed by *filter chains* (explained below) to
determine whether the post (or administrative request) will be
@@ -52,6 +64,11 @@ The VIRGIN queue is a special queue for messages created by Mailman.
.. image:: pipeline.png
:scale: 67
+.. graphviz::
+
+ digraph pipeline {
+ }
+
Message Filtering
-----------------
@@ -67,6 +84,57 @@ next rule in the filter chain.
.. image:: chains.png
:scale: 67
+.. builtin chain [shape=none]
+ accept chain [shape=none]
+ hold chain [shape=none]
+ discard chain [shape=none]
+ moderation chain [shape=none]
+
+.. graphviz::
+
+ digraph chains {
+ rankdir=TB;
+ approved [shape=record, label="<f0> approved | {<f1> | <f2>}"];
+ emergency [shape=record, label="<f0> emergency | {<f1> | <f2>}"];
+ loop [shape=record, label="<f0> loop | {<f1> | <f2>}"];
+ modmember [shape=record, label="<f0> moderate\nmember | {<f1> | <f2>}"];
+ administrivia [shape=record, label="<f0> administrivia | <f1>"];
+ maxsize [shape=record, label="<f0> max\ size | {<f1> | <f2>}"];
+ any [shape=record, label="<f0> any | {<f1> | <f2>}"];
+ truth [shape=record, label="<f0> truth | <f1>"];
+ IN [shape=box, color=lightblue, style=filled];
+ IN -> approved;
+ subgraph clusterbar {
+ rank=same;
+ subgraph clusterfubar {
+ rank=same;
+ approved:f2 -> emergency;
+ emergency:f2 -> loop;
+ loop:f2 -> modmember;
+ modmember:f2 -> administrivia;
+ administrivia:f2 -> maxsize;
+ maxsize:f2 -> any;
+ any:f2 -> truth;
+ };
+ clusterfoo [shape=none];
+ subgraph clusterfoo {
+ rankdir=LR;
+ rank=same;
+ APPROVED [shape=box, color=lightblue, style=filled];
+ POSTING [shape=box, color=lightblue, style=filled];
+ MODERATION [shape=box, color=lightblue, style=filled];
+ DISCARD [shape=trapezoidium, color=lightblue, style=filled];
+ };
+ };
+ approved:f1 -> POSTING;
+ emergency:f1 -> MODERATION;
+ loop:f1 -> DISCARD;
+ modmember:f1 -> MODERATION;
+ maxsize:f1 -> MODERATION;
+ any:f1 -> MODERATION;
+ truth -> POSTING;
+ }
+
Configuration
-------------
@@ -107,7 +175,7 @@ of preferences, and a *role* such as "owner" or "moderator". Roles
are used to determine what kinds of mail the user receives via that
membership. *Owners* will receive mail to *list*-owner, but not posts
and moderation traffic, for example. A user with multiple roles on a
-single list will therefore have multiple memberships in that list, one
+single list will theref1re have multiple memberships in that list, one
for each role.
Roles are implemented by "magical, invisible" *rosters*.
diff --git a/src/mailman/docs/conf.py b/src/mailman/docs/conf.py
new file mode 100644
index 000000000..56ecec975
--- /dev/null
+++ b/src/mailman/docs/conf.py
@@ -0,0 +1,3 @@
+project = "Workflow Overview"
+
+extensions = ["sphinx.ext.graphviz"]
diff --git a/src/mailman/docs/contents.rst b/src/mailman/docs/contents.rst
new file mode 100644
index 000000000..458ed26ad
--- /dev/null
+++ b/src/mailman/docs/contents.rst
@@ -0,0 +1,4 @@
+.. toctree::
+ :maxdepth: 2
+
+ 8-miles-high