chiark / gitweb /
c0c2878c877dcef19f46ae6a1d083820fa528c2b
[modbot-mtm.git] / manual-reinject
1 #!/usr/bin/perl -w
2
3 # usage:
4 #  cd ~webstump/live-SOMETHING
5 #  formail < /path/to/mbox -s ./manual-reinject -f
6 # (mbox can sensibly be a folder in ~/mail)
7 #
8 # without -f means get the instance abbrev out of the Subject line
9 # -f means use this instance
10
11 use strict;
12 use IO::File;
13
14 our $abbrev;
15 our $duplicate;
16 our $xmodid;
17 our $force;
18
19 if (!@ARGV) {
20     $force = 0;
21 } elsif (@ARGV==1 && $ARGV[0] eq '-f') {
22     shift @ARGV;
23     $force = 1;
24 }
25
26 for (;;) {
27     $_ = <>;
28     die unless defined;
29     last if m/^$/;
30     if (m/^Subject: lost moderated newsgroup submission (\S+)/) {
31         $abbrev = $1;
32     }
33 }
34
35 for (;;) {
36     $_ = <>;
37     die unless defined;
38     last if m/^======================$/;
39     if (m/^Errors: inews: .*: 441 POST failed - .*: 441 435 Duplicate$/) {
40         $duplicate = 1;
41     }
42 }
43
44 my $art = IO::File::new_tmpfile;
45 defined $art or die $!;
46
47 for (;;) {
48     $_ = <>;
49     die unless defined;
50     print $art $_ or die $!;
51     last if m/^$/;
52     if (m/^X-Moderation: \[([^][]+)\]/) {
53         $xmodid = $1;
54     }
55 }
56
57 for (;;) {
58     $_ = <>;
59     last unless defined;
60     print $art $_ or die $!;
61 }
62
63 STDIN->error and die $!;
64 $art->flush() or die $!;
65 seek $art,0,0 or die $!;
66
67 die unless $xmodid;
68
69 if ($duplicate) {
70     print "$xmodid - duplicate\n";
71     exit 0;
72 }
73
74 our $injector;
75
76 sub stat_ino ($) {
77     my ($obj) = @_;
78     stat $obj or die "$obj $!";
79     my @s = stat _;
80     $#s = 2;
81     return "@s";
82 }
83
84 if ($force) {
85     $injector = './inews';
86 } elsif (!defined $abbrev) {
87     die "abbrev not found in outer Subject";
88 } else {
89     my $dir = $ENV{'PWD'};
90     defined $dir or die;
91     my $env_stat = stat_ino $dir;
92     my $cwd_stat = stat_ino '.';
93     die "$env_stat != $cwd_stat" unless $env_stat eq $cwd_stat;
94     $dir =~ s#/live-\w[^/]*$#/live-$abbrev# or die "unexpected cwd $dir";
95     $injector = "$dir/inews";
96 }
97
98 print "$xmodid - $injector\n";
99
100 open STDIN, "<&", $art or die $!;
101 exec $injector;
102 die "$injector $!";