#!/usr/bin/perl -Tws # # Convert nntp:ucam.comp-serv.announce # into an Atom document. # # $Cambridge: hermes/src/atom/ucsann.cgi,v 1.4 2005/12/15 10:22:04 fanf2 Exp $ use strict; use Carp; use Net::NNTP; use vars qw( $d $o ); my $HOST = "nntp-serv.cam.ac.uk"; my $GROUP = "ucam.comp-serv.announce"; # in CGI mode? if (defined $ENV{GATEWAY_INTERFACE}) { # output HTTP headers print "Content-type: text/xml\r\n"; print "\r\n"; $o = 1 if defined $ENV{QUERY_STRING} and $ENV{QUERY_STRING} eq "ver=0.3"; } my $nntp = new Net::NNTP ($HOST, Debug => $d) or die "NNTP connect: $@\n"; my @group = $nntp->group($GROUP) or die "NNTP group: ", $nntp->message; # convert nntp timestamp into iso 8601 sub timestamp ($) { my $entry = shift; $entry =~ /^Date: ([0-9]+) ([A-Z][a-z][a-z]) (\d\d\d\d) (\d\d:\d\d:\d\d) (GMT|BST|([-+]\d\d)(\d\d))$/m or confess "bad timestamp (1): $entry"; my ($date,$mon,$year,$time,$z) = ($1,$2,$3,$4,$5); my %zone = ( GMT => "+00:00", BST => "+01:00" ); my %mon = ( Jan => "01", Feb => "02", Mar => "03", Apr => "04", May => "05", Jun => "06", Jul => "07", Aug => "08", Sep => "09", Oct => "10", Nov => "11", Dec => "12" ); exists $mon{$mon} or confess "bad timestamp (2): $entry"; my $zone = $zone{$z} || "$6:$7"; return sprintf "%s-%s-%02dT%s%s", $year, $mon{$mon}, $date, $time, $zone; } # for compatibility with old atom my $indent = " "; sub updated ($) { my $timestamp = shift; my $val; if ($o) { $val = "$indent$timestamp"; $val .= "\n$indent$timestamp" if $indent eq " "; } else { $val = "$indent$timestamp"; } $val .= "\n" if $indent eq " "; $indent = " "; return $val; } my %article; for my $number ($group[1] .. $group[2]) { print ".$number" if $d; my $article = $nntp->article($number); if (defined $article) { $article{$number} = join "", @$article; } elsif ($d) { warn "NNTP article $number: ", $nntp->message; } } print "\n" if $d; $nntp->quit or die "NNTP quit: ", $nntp->message; print "\n"; print $o ? "\n" : "\n"; print <UCS announcements University of Cambridge Computing Service tag:fanf2\@cam.ac.uk,2005:ucsann END print updated timestamp $article{$group[2]}; for my $number (sort { $b <=> $a } keys %article) { my $entry = $article{$number}; my $timestamp = timestamp $entry; my $updated = updated $timestamp; $entry =~ /^Subject: (.*)$/m; my $title = "UCS announcement: $1"; $entry =~ /\n\n+(.*?)\n*$/s; my $content = $1; $content =~ s/&/&/g; $content =~ s//>/g; $content =~ s/Â?£/£/g; print < $title University of Cambridge Computing Service tag:fanf2\@cam.ac.uk,2005:ucsann/$number $updated
$content
END } print "
\n"; exit 0;