]> Sergey Matveev's repositories - public-inbox.git/commitdiff
import ssoma-replay example script I've been using
authorEric Wong <e@80x24.org>
Sat, 14 May 2016 02:17:47 +0000 (02:17 +0000)
committerEric Wong <e@80x24.org>
Sat, 14 May 2016 02:24:46 +0000 (02:24 +0000)
Unfortunately, most users still prefer their mail delivered
over SMTP; so we'll at least document mlmmj integration for now
until we can popularize pull-based reading over POP3/NNTP/ssoma.

Makefile.PL
TODO
scripts/ssoma-replay [new file with mode: 0755]

index 448c79c36b37b6f2d6abd86d4b20b202d98e8c9f..9e0c6e8fb5d53d31f8785283dfcc7e73fc50bc59 100644 (file)
@@ -41,7 +41,8 @@ sub MY::postamble {
 EATMYDATA =
 -include config.mak
 -include Documentation/include.mk
-my_syntax := \$(addsuffix .syntax, $PM_FILES \$(EXE_FILES))
+SCRIPTS := scripts/ssoma-replay
+my_syntax := \$(addsuffix .syntax, $PM_FILES \$(EXE_FILES) \$(SCRIPTS))
 
 N := \$(shell echo \$\$(( \$\$(nproc 2>/dev/null || echo 2) + 1)))
 
diff --git a/TODO b/TODO
index b6a3af3fde7835efa090a5e4fa2f9cb68d0ea0bb..1a403118411b27e980b74ef9c03a3d6b9c1d212f 100644 (file)
--- a/TODO
+++ b/TODO
@@ -44,6 +44,3 @@ TODO items for public-inbox
 * more test cases (use git fast-import to speed up creation)
 
 * large mbox/Maildir/MH/NNTP spool import (use git fast-import)
-
-* improve + document mlmmj integration, currently only at:
-  http://bogomips.org/unicorn-public/20140508084301.GA2033%40dcvr.yhbt.net/
diff --git a/scripts/ssoma-replay b/scripts/ssoma-replay
new file mode 100755 (executable)
index 0000000..bfcea0a
--- /dev/null
@@ -0,0 +1,95 @@
+#!/usr/bin/perl -w
+# Copyright (C) 2015-2016 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+#
+# A work-in-progress, but one day I hope this script is no longer
+# necessary and users will all pull from public-inboxes instead
+# of having mail pushed to them via mlmmj.
+#
+# This is for use with ssoma, using "command:" delivery mechanism
+# (as opposed to normal Maildir or mbox).
+# It assumes mlmmj-process is in /usr/bin (mlmmj requires absolute paths)
+# and assumes FOO@domain.example.com has web archives available at:
+# https://domain.example.com/FOO/
+#
+# The goal here is _anybody_ can setup a mirror of any public-inbox
+# repository and run their own mlmmj instance to replay traffic.
+=begin usage with ssoma:
+
+NAME=meta
+URL=https://public-inbox.org/meta/
+ssoma add $NAME $URL "command:/path/to/ssoma-replay -L /path/to/spool/$NAME"
+
+; $GIT_DIR/ssoma.state should have something like the following target:
+; (where GIT_DIR is ~/.ssoma/meta.git/ in the above example)
+[target "local"]
+       command = /path/to/ssoma-replay -L /path/to/spool/meta
+=cut
+use strict;
+use Email::Simple;
+use URI::Escape qw/uri_escape_utf8/;
+use File::Temp qw/tempfile/;
+my ($fh, $filename) = tempfile('pi-replay-XXXXXXXX');
+my $msg = eval {
+       local $/;
+       Email::Simple->new(<STDIN>);
+};
+select $fh;
+
+# Note: the archive URL makes assumptions about where the
+# archive is hosted.  It is currently true of all the domains
+# hosted by me.
+
+my $header_obj = $msg->header_obj;
+my $body = $msg->body;
+my $list_id = $header_obj->header('List-Id');
+my ($archive_url, $user, $domain);
+if (defined $list_id) {
+       ($user, $domain) = ($list_id =~ /<(.+)\@(.+)>/g);
+
+       if (defined $domain) {
+               $archive_url = "https://$domain/$user/";
+               my $mid = $header_obj->header('Message-Id');
+               if ($mid =~ /\A<(.+)>\z/) {
+                       $mid = $1;
+               }
+               $mid = uri_escape_utf8($mid);
+               $header_obj->header_set('List-Archive', "<$archive_url>");
+
+               foreach my $h (qw(Help Unsubscribe Subscribe Owner)) {
+                       my $lch = lc $h;
+                       my $v = "<mailto:$user+$lch\@$domain>";
+                       $header_obj->header_set("List-$h", $v);
+               }
+               $header_obj->header_set('List-Post', "<mailto:$user\@$domain>");
+
+               # RFC 5064
+               $header_obj->header_set('Archived-At', "<$archive_url$mid/>");
+               $header_obj->header_set('X-Archived-At');
+       }
+}
+
+print $header_obj->as_string, $msg->crlf, $body;
+
+# don't break inline signatures
+goto out if ($body =~ /^-----BEGIN PGP SIG.+-----/sm);
+
+# try not to break dkim/dmarc/spf crap, either
+foreach (qw(domainkey-signature dkim-signature authentication-results)) {
+       goto out if defined $header_obj->header($_);
+}
+
+my $ct = $header_obj->header('Content-Type');
+
+if (!defined($ct) || $ct =~ m{\A\s*text/plain\b}i) {
+       print "\n" unless $body =~ /\n\z/s;
+       defined $archive_url or goto out;
+       # Do not add a space after '--' as is standard for user-generated
+       # signatures, we want to preserve the "-- \n" in original user sigs
+       # for mail software which splits on that.
+       print "--\n", "unsubscribe: $user+unsubscribe\@$domain\n",
+                "archive: $archive_url\n";
+}
+out:
+$| = 1;
+exec '/usr/bin/mlmmj-process', @ARGV, '-m', $filename;