Blame demos/nntp.mirror

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;