* Re: [9front] upas: lies about how it works
@ 2020-10-31 23:54 Steve Simon
0 siblings, 0 replies; only message in thread
From: Steve Simon @ 2020-10-31 23:54 UTC (permalink / raw)
To: 9front
having used plan9 as my primary email service for 15 years, there are still subtleties i didn't realise in there.
excellent description ori.
-Steve
> On 25 Oct 2020, at 1:22 am, ori@eigenstate.org wrote:
>
> Finally, I want to have some docs that give someone like
> me an idea of how things are supposed to fit together.
> I found figuring out upas configs unnecessarily painful,
> partly because upas itself has way too many layers of
> wrappers, but partly because we have documentation of
> the parts but not how they're intended to slot together.
>
> I reverse engineered all of this from reading the upas
> example files and code, so it's certain to be full of
> lies -- here's a draft for review:
>
>
> Upas: Theory of Operation
> -------------------------
>
> Upas is the Plan 9 mail system. It's used for
> viewing mail, sending mail, and receiving mail.
> It comes with clients and servers for SMTP,
> IMAP, etc. It also provides a powerful toolkit
> for spam filtering and mail processing.
>
> Upas is configured through a scattering of
> methods. There are a few config files, and
> a number of scripts which users are intended
> to customize.
>
> Here's a list of some important files:
>
> remotemail
> The script that you customize
> for delivering mail to remote
> systems.
>
> qmail
> Enqueues mail for later delivery,
> applying filters along the way.
>
> rewrite
> Rewrites and matches the destination
> of the email, deciding which mail
> box or smtp server to put the message
> into.
>
> smtpd.conf
> Configures the SMTP server
>
> validateaddress:
> Checks if we should deliver to an
> address on this system.
>
> There are a number of additional files not mentioned
> in this summary.
>
>
> Viewing
> -------
>
> Viewing mail with upas involves very few moving
> parts. Upas/fs connects to most mail protocols,
> and provides a consistent file system interface
> for all of them, abstracting the storage system
> away from the mail clients.
>
> Upas/fs knows how to render a file system for
> local mailboxes, maildirs, pop, and imap,
> serving them up in a multi-level heirarchy
> in /mail/fs, with one subdirectory for each
> mailbox mounted:
>
> /mail/fs/$mbox/$mail/$subfiles
>
> For example, to see who sent the first email in
> the default mailbox, you could run:
>
> cat /mail/fs/mbox/1/from
>
> Typically, you'd access mail/fs through a client
> such as nedmail or acme Mail.
>
> Upas/fs only has one config file in /mail/lib,
> for configuring which headers are shown.
>
>
> Sending And Receiving
> ---------------------
>
> Sending and receving email via SMTP in upas is
> a similar operation: A mail is entered into the
> pipeline, is routed, and is delivered to the
> appropriate destination.
>
> Upas/send is the heart of the delivery pipeline.
> Sending invokes upas/marshal to drop an email
> into upas/send, while receiving does this via
> upas/smtpd.
>
> Sending and receiving in upas both roughly follow
> the same path. Both of them take an email, and
> dump it into upas/send, which applies the rewrite
> rules and sends it on to further routing depending
> on the destination of the email.
>
> The major difference between sending and receiving
> is in the starting point: When composing an email
> on plan 9, it gets sent to upas/marshal to drop it
> into the delivery pipeline. When plan 9 is set up
> to recieve mail directly, mail comes in through
> upas/smtpd.
>
> Send accepts a well formed email, and applies
> the rewrite rules in /mail/lib/rewrite. The
> rewrite rules are expected to match an email
> address and take an appropriate action.
>
> With a typical rewrite configuration, if the
> mail matches a local user, then the email will
> get deposited into their mailbox. Otherwise,
> the email is punted to /mail/lib/remotemail.
>
> With the default gateway setup, the pipeline
> looks something like this, where the rewrite
> rules that upas/send uses to interpret email
> enqueues it using qmail:
>
> upas/marshal => upas/send =>
> /mail/lib/qmail => qer =>
> /mail/lib/remotemail => upas/smtp
>
> With the example smtp setup, rewrite also
> handles delivering emails locally.
>
> However, because of the flexibility of the
> rewrite rules, everything after upas/send
> can be swapped out and replaced.
>
> Marshal
> -------
>
> Marshal is the simpler of the two entry
> points into the mail system. All it does
> is take a message that you may type by
> hand, and formats it into an rfc822 envelope,
> and (depending on flags) passes it on to send.
>
> It's also used in the receiving pipeline,
> but only as an address validator, using the
> 'x' flag to examine whether an address is
> deliverable.
>
> Smtpd
> -----
>
> Filtering
> ---------
>
> In addition to the config files in /mail/lib,
> each user can configure mail filtering by
> editing /mail/box/$user/pipeto. This is where.
> for example, spam filtering would be done.
>
> An example of spam filtering is in:
>
> /mail/lib/smtpd.example/pipeto.bayes
>
> There are some more complicated examples in
>
> /sys/src/cmd/upas/filterkit/pipeto.sample
> /sys/src/cmd/upas/filterkit/pipefrom.sample
>
> The scripts are run as user 'none', to protect
> you from any funny business.
>
> Upas ships with a number of programs designed
> to work with the pipefrom or pipeto setup.
>
> These include:
>
> upas/filter
> upas/list
> upas/deliver
> upas/token
> upas/vf
> upas/bayes
>
> There's also a utility library used by rc
> to make pipe scripts easier. It can be loaded
> like this:
>
> . /mail/lib/pipeto.lib $*
>
> The pipeto script is invoked as:
>
> rfc822-email | pipeto destaddr destmbox
>
> and isw expected to eventually invoke
>
> upas/deliver
>
> to deliver their filtered emails.
>
> Storage Formats
> ---------------
>
> If /mail/box/$user/$mbox is a file, then it's assumed
> to be in mbox format. If it's a directory, then it's
> assumed to be in mdir format. If the mailbox does not
> exist, then a new maildir is created.
>
> The Binaries
> ------------
>
> Spam filtering:
> upas/addhash: Merges bayes token hash tables togheter
> upas/bayes: Evaluates bayes tokens
> upas/msgtok: Tokenizes spam for bayesian filter
> upas/isspam: Checks if a message is spam.
> upas/token: Creates a message hash
> upas/spf: Verifies SPF records
> upas/ratfs: Spam blocklist FS
> upas/vf: Virus filtering.
> upas/list: Maintains and checks lists of users
> upas/scanmail: Fixed-pattern spam filtering
>
> Mail filtering
> upas/aliasmail: Manages translating mail aliases
> upas/deliver: Drops a message into a specific mailbox
> upas/filter: Reroutes messages to different mailboxes
>
> Mail serving:
> upas/imap4d: Serves imap
> upas/pop3: Serves pop3
> upas/smtpd: Serves smtp
>
> Sending:
> upas/marshal: Submits a message for delivery
> upas/smtp: Sends a message to another mail server
>
> Mailing lists:
> upas/ml: Receives and bounces mailing list messages.
> upas/mlmgr: Manages mailing lists
> upas/mlowner: Manages mailing list owner/control messages
>
> Internal Plumbing:
> upas/qer: Enqueues commands
> upas/runq: Runs and retries enqueued commands
> upas/mbappend: Appends messages to mbox or mdir mailboxes
> upas/send: Starts the email delivery process
>
> Utilities:
> upas/msgcat: Shows message contents
> upas/testscan: Dry run of scanmail
> upas/spam: Marks an email as spam
> upas/unspam: Reduces spam weight of message tokens
> upas/tfmt: Prevents topposting
> upas/unesc: Interpret =?foo?bar?=char?= escapes
>
> Clients:
> upas/fs: Renders a mailbox as a file system
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2020-10-31 23:54 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-10-31 23:54 [9front] upas: lies about how it works Steve Simon
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).