chiark / gitweb /
Old version
authorJonathan Amery <jdamery+zgit@ysolde.ucam.org>
Thu, 14 Jul 2016 15:03:28 +0000 (16:03 +0100)
committerJonathan Amery <jdamery+zgit@ysolde.ucam.org>
Thu, 14 Jul 2016 15:03:28 +0000 (16:03 +0100)
autorep.pl [new file with mode: 0755]

diff --git a/autorep.pl b/autorep.pl
new file mode 100755 (executable)
index 0000000..3c2e373
--- /dev/null
@@ -0,0 +1,123 @@
+#!/usr/bin/perl
+
+my $rcsid='$Id: testrep.channel,v 1.2 2000/08/22 23:52:51 sec Exp sec $';
+my $len=5; # Max Size in KB of included article.
+
+use Date::Manip;
+use strict;
+
+$|=1;
+while(<>){
+       chomp;
+       if(!open(ARTICLE,"/usr/lib/news/bin/sm '$_'|")){
+               print "$0 failed to get article $_\n";
+       };
+       print "$_\n";
+       &reply();
+       close(ARTICLE);
+};
+print "$0 Exiting on eof.\n";
+sleep(10);
+exit(0);
+
+sub reply(){
+my @hdrs;
+my ($nor,$date,$from,$reply,$mid,$path,$subject,$ng);
+my ($pathe);
+my ($nodes,@paths,$paths,$s);
+
+while (<ARTICLE>){
+       push @hdrs,$_;
+       chomp;
+       last if /^$/;
+       $nor=1 if (/(ignore|no\s?reply)/i);
+       $date=$_ if (s/^date:\s+//i);
+       $from=$_ if (s/^from:\s+//i);
+       $reply=$_ if (s/^reply-to:\s+//i);
+       $mid=$_ if (s/^message-id:\s+//i);
+       $path=$_ if (s/^path:\s+//i);
+       $subject=$_ if (s/^subject:\s+//i);
+       $ng=$_ if (s/^newsgroups:\s+//i);
+}
+
+for my $k (1..10){
+       $_ = scalar <ARTICLE>;
+       push @hdrs,$_;
+       $nor=1 if (/(ignore|no\s?reply)/i);
+}
+
+return if ($ng =~ /,/); # Ignore cross-postings.
+return if ($nor);       # User wanted us to ignore it.
+return if ($from =~ /NNTP-Monitor\@hero\.vmc\.private\.ntl\.com/) ;
+                        # spammy and unmailable
+
+my $diff=&timediff(time-
+UnixDate(ParseDate($date),"%s")
+),"\n";
+
+sub timediff(){
+       my @n=qw(second minute hour day);
+       my @t=(60,60,24,99999);
+       my $r=shift;
+       my $f=1;
+       my $p=0;
+       my $s="";
+       for my $i (0..$#t){
+               $p=$r%$t[$i];$r=int($r/$t[$i]);
+               #print "p: $p, r: $r\n";
+               if($p){$s=(($f-->0 && $r>0)?"and ":"").$p." ".$n[$i].($p>1?"s":"").($f<-1?",":"").($s?" ".$s:"")}
+       }
+       return $s;
+}
+
+$from=$reply if ($reply);
+
+$path =~ /([^!]*)!/; $pathe=$1;
+$nodes = (($paths = $path)=~ s/!/ /g);
+$s=$nodes>1?"s":"";
+
+@paths=split(/!/,$path);
+pop(@paths);
+$paths=join(" ->_",reverse @paths).". ";
+$paths=~s/([^\n]{40,75})[ \n]/$1\n/g;
+$paths=~s/_/ /g;
+
+my $rdate=localtime;
+
+open(FOO,"|/usr/sbin/sendmail -t -f usenet-autoresponder\@ysolde.ucam.org");
+print FOO <<EOF;
+Subject: Response to a test message. (was: $subject)
+From: $ng autoresponder <usenet\@ysolde.ucam.org>
+To: $from
+X-Rcs-Id: $rcsid
+X-Local-Version: 0.1.0
+Precedence: junk
+
+This message has been generated automatically in order to help you track
+the circulation in the $ng newsgroup. If you do not wish any reply
+from this program, just include the words "ignore" or "no reply" in the
+header or in the 10 first lines of the body of your message.
+
+Your Message $mid was received by $pathe
+at $rdate.
+
+Assuming your clock was set correctly, this means that your article
+travelled the network for $diff
+before arriving here.
+
+It had to pass through the following $nodes Usenet node$s starting with
+your system:
+$paths
+
+Full headers plus the first 10 lines of your original message were:
+
+EOF
+
+my $str=join ("",@hdrs);
+print FOO substr($str,0,$len*1024);
+if (substr($str,$len*1024,1)){
+       print "\n- The above message has been trunctated, because it is longer than  $len KB.\n";
+}
+close(FOO);
+
+};