chiark / gitweb /
Merge branch 'master' of /u/webstump/live/
[modbot-ulm.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 use POSIX;
14
15 our $abbrev;
16 our $duplicate;
17 our $xmodid;
18 our $force;
19
20 if (!@ARGV) {
21     $force = 0;
22 } elsif (@ARGV==1 && $ARGV[0] eq '-f') {
23     shift @ARGV;
24     $force = 1;
25 }
26
27 my $sig = $ENV{'HOME'};
28 defined $sig or die;
29 $sig .= '/.signature';
30 die $sig if stat $sig;
31 die unless $!==ENOENT;
32
33 for (;;) {
34     $_ = <>;
35     die unless defined;
36     last if m/^$/;
37     if (m/^Subject: lost moderated newsgroup submission (\S+)/) {
38         $abbrev = $1;
39     }
40 }
41
42 for (;;) {
43     $_ = <>;
44     die unless defined;
45     last if m/^======================$/;
46     if (m/^Errors: inews: .*: 441 POST failed - .*: 441 435 Duplicate$/) {
47         $duplicate = 1;
48     }
49 }
50
51 my $art = IO::File::new_tmpfile;
52 defined $art or die $!;
53
54 for (;;) {
55     $_ = <>;
56     die unless defined;
57     print $art $_ or die $!;
58     last if m/^$/;
59     if (m/^X-Moderation: \[([^][]+)\]/) {
60         $xmodid = $1;
61     }
62 }
63
64 for (;;) {
65     $_ = <>;
66     last unless defined;
67     print $art $_ or die $!;
68 }
69
70 STDIN->error and die $!;
71 $art->flush() or die $!;
72 seek $art,0,0 or die $!;
73
74 die unless $xmodid;
75
76 if ($duplicate) {
77     print "$xmodid - duplicate\n";
78     exit 0;
79 }
80
81 our $injector;
82
83 sub stat_ino ($) {
84     my ($obj) = @_;
85     stat $obj or die "$obj $!";
86     my @s = stat _;
87     $#s = 2;
88     return "@s";
89 }
90
91 if ($force) {
92     $injector = './inews';
93 } elsif (!defined $abbrev) {
94     die "abbrev not found in outer Subject";
95 } else {
96     my $dir = $ENV{'PWD'};
97     defined $dir or die;
98     my $env_stat = stat_ino $dir;
99     my $cwd_stat = stat_ino '.';
100     die "$env_stat != $cwd_stat" unless $env_stat eq $cwd_stat;
101     $dir =~ s#/live-\w[^/]*$#/live-$abbrev# or die "unexpected cwd $dir";
102     $injector = "$dir/inews";
103 }
104
105 print "$xmodid - $injector\n";
106
107 open STDIN, "<&", $art or die $!;
108 exec $injector;
109 die "$injector $!";