|
Packit |
bd23c0 |
#!perl
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
### Subject: Re: Fuller example of Net::NNTP?
|
|
Packit |
bd23c0 |
### Date: Tue, 4 Feb 1997 10:37:58 -0800
|
|
Packit |
bd23c0 |
### From: "Paul E. Hoffman" <phoffman@imc.org>
|
|
Packit |
bd23c0 |
### To: Graham Barr <gbarr@ti.com>
|
|
Packit |
bd23c0 |
###
|
|
Packit |
bd23c0 |
### Thanks for your reply. After looking at the examples, I realized that
|
|
Packit |
bd23c0 |
### you're not doing what I want, which is to store the messages on the local
|
|
Packit |
bd23c0 |
### hard disk with the same message number as what was on the remote. So, I
|
|
Packit |
bd23c0 |
### rolled my own program, although I haven't finished it yet (I have a hook
|
|
Packit |
bd23c0 |
### for expiring, but haven't done it yet).
|
|
Packit |
bd23c0 |
###
|
|
Packit |
bd23c0 |
### You are welcome to use this in the Net:: distribution if you think it is
|
|
Packit |
bd23c0 |
### useful.
|
|
Packit |
bd23c0 |
###
|
|
Packit |
bd23c0 |
### NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE
|
|
Packit |
bd23c0 |
###
|
|
Packit |
bd23c0 |
### This script is included as-is, I give no guarantee that it will
|
|
Packit |
bd23c0 |
### work on every system
|
|
Packit |
bd23c0 |
###
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use 5.008001;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use strict;
|
|
Packit |
bd23c0 |
use warnings;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
use Net::NNTP;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my $BaseDir = '/usr/usenet';
|
|
Packit |
bd23c0 |
chdir($BaseDir) or die "Could not cd to $BaseDir\n";
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# Format of grouplist is:
|
|
Packit |
bd23c0 |
# groupname<tab>expirationdays
|
|
Packit |
bd23c0 |
# expirationdays is the number of days to leave the articles around;
|
|
Packit |
bd23c0 |
# set it to 0 if you want the articles to stay forever
|
|
Packit |
bd23c0 |
# If the groupname starts with a #, it is skipped
|
|
Packit |
bd23c0 |
my $GroupList;
|
|
Packit |
bd23c0 |
open($GroupList, '<', 'grouplist.txt') or die "Could not open grouplist.txt\n";
|
|
Packit |
bd23c0 |
my @Groups;
|
|
Packit |
bd23c0 |
while(<$GroupList>) {
|
|
Packit |
bd23c0 |
my $Line = $_; chomp($Line);
|
|
Packit |
bd23c0 |
if($Line eq '') { next }; # Skip blank lines
|
|
Packit |
bd23c0 |
if(substr($Line, 0, 1) eq '#') { next }; # Skip comments
|
|
Packit |
bd23c0 |
push(@Groups, $Line)
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
close $GroupList;
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
my $NntpPtr = Net::NNTP->new('news.server.com');
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
foreach my $GroupLine (@Groups) {
|
|
Packit |
bd23c0 |
my($GroupName, $GroupExp) = split(/\s/, $GroupLine, 2);
|
|
Packit |
bd23c0 |
# Process the expiration first (still to be done...)
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# See if this is a new group
|
|
Packit |
bd23c0 |
unless(-e "$BaseDir/$GroupName") {
|
|
Packit |
bd23c0 |
unless(mkdir("$BaseDir/$GroupName", 0755))
|
|
Packit |
bd23c0 |
{ die "Could not make $BaseDir/$GroupName\n" }
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
chdir("$BaseDir/$GroupName") or die "Couldn't chdir to $GroupName\n";
|
|
Packit |
bd23c0 |
# Find the last article in the directory
|
|
Packit |
bd23c0 |
my @AllInDir = glob('*'); my @RevSortedAllInDir = reverse(sort(@AllInDir));
|
|
Packit |
bd23c0 |
my $LenArr = @RevSortedAllInDir;
|
|
Packit |
bd23c0 |
my $NumLastInDir;
|
|
Packit |
bd23c0 |
if($LenArr > 0) { $NumLastInDir = $RevSortedAllInDir[0] }
|
|
Packit |
bd23c0 |
else { $NumLastInDir = 0 }
|
|
Packit |
bd23c0 |
my($NumArt, $NumFirst, $NumLast, $XGroupName) =
|
|
Packit |
bd23c0 |
$NntpPtr->group($GroupName);
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
if($NumLast == $NumLastInDir) { next } # No new articles
|
|
Packit |
bd23c0 |
if($NumLast < $NumLastInDir)
|
|
Packit |
bd23c0 |
{ die "In $GroupName, the last number was $NumLast, but the " .
|
|
Packit |
bd23c0 |
" last number in the directory was $NumLastInDir\n" }
|
|
Packit |
bd23c0 |
# Figure out which article to start from
|
|
Packit |
bd23c0 |
my $GetArtNum;
|
|
Packit |
bd23c0 |
if($NumLastInDir == 0) { $GetArtNum = $NumFirst }
|
|
Packit |
bd23c0 |
else { $GetArtNum = $NumLastInDir + 1 }
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# Now read each of the new articles
|
|
Packit |
bd23c0 |
while(1) { # Loop until "last" is called
|
|
Packit |
bd23c0 |
my $ArtRef = $NntpPtr->article($GetArtNum);
|
|
Packit |
bd23c0 |
my @ArtArr = @$ArtRef; my $ArtArrLen = @ArtArr;
|
|
Packit |
bd23c0 |
if($ArtArrLen > 0 ) { # Skip article numbers that had 0 len
|
|
Packit |
bd23c0 |
my $Out;
|
|
Packit |
bd23c0 |
open($Out, '>', $GetArtNum) or
|
|
Packit |
bd23c0 |
die "Could not create $GroupName/$GetArtNum\n";
|
|
Packit |
bd23c0 |
print $Out @$ArtRef; close($Out);
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
# Check if we're at the end
|
|
Packit |
bd23c0 |
if($GetArtNum == $NumLast) { last }
|
|
Packit |
bd23c0 |
$GetArtNum += 1; # Increment the article number to get
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
}
|
|
Packit |
bd23c0 |
|
|
Packit |
bd23c0 |
$NntpPtr->quit;
|
|
Packit |
bd23c0 |
exit;
|