1#!/usr/bin/perl5 2 3### Subject: Re: Fuller example of Net::NNTP? 4### Date: Tue, 4 Feb 1997 10:37:58 -0800 5### From: "Paul E. Hoffman" <phoffman@imc.org> 6### To: Graham Barr <gbarr@ti.com> 7### 8### Thanks for your reply. After looking at the examples, I realized that 9### you're not doing what I want, which is to store the messages on the local 10### hard disk with the same message number as what was on the remote. So, I 11### rolled my own program, although I haven't finished it yet (I have a hook 12### for expiring, but haven't done it yet). 13### 14### You are welcome to use this in the Net:: distribution if you think it is 15### useful. 16### 17### NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE 18### 19### This script is included as-is, I give no guarantee that it will 20### work on every system 21### 22 23use Net::NNTP; 24 25$BaseDir = '/usr/usenet'; 26chdir($BaseDir) or die "Could not cd to $BaseDir\n"; 27 28# Format of grouplist is: 29# groupname<tab>expirationdays 30# expirationdays is the number of days to leave the articles around; 31# set it to 0 if you want the articles to stay forever 32# If the groupname starts with a #, it is skipped 33open(GROUPLIST, 'grouplist.txt') or die "Could not open grouplist.txt\n"; 34while(<GROUPLIST>) { 35 $Line = $_; chomp($Line); 36 if($Line eq '') { next }; # Skip blank lines 37 if(substr($Line, 0, 1) eq '#') { next }; # Skip comments 38 push(@Groups, $Line) 39} 40 41$NntpPtr = Net::NNTP->new('news.server.com'); 42 43foreach $GroupLine (@Groups) { 44 ($GroupName, $GroupExp) = split(/\s/, $GroupLine, 2); 45 # Process the expiration first (still to be done...) 46 47 # See if this is a new group 48 unless(-e "$BaseDir/$GroupName") { 49 unless(mkdir("$BaseDir/$GroupName", 0755)) 50 { die "Could not make $BaseDir/$GroupName\n" } 51 } 52 chdir("$BaseDir/$GroupName") or die "Couldn't chdir to $GroupName\n"; 53 # Find the last article in the directory 54 @AllInDir = <*>; @RevSortedAllInDir = reverse(sort(@AllInDir)); 55 $LenArr = @RevSortedAllInDir; 56 if($LenArr > 0) { $NumLastInDir = $RevSortedAllInDir[0] } 57 else { $NumLastInDir = 0 } 58 ($NumArt, $NumFirst, $NumLast, $XGroupName) = 59$NntpPtr->group($GroupName); 60 61 if($NumLast == $NumLastInDir) { next } # No new articles 62 if($NumLast < $NumLastInDir) 63 { die "In $GroupName, the last number was $NumLast, but the " . 64 " last number in the directory was $NumLastInDir\n" } 65 # Figure out which article to start from 66 if($NumLastInDir == 0) { $GetArtNum = $NumFirst } 67 else { $GetArtNum = $NumLastInDir + 1 } 68 69 # Now read each of the new articles 70 while(1) { # Loop until "last" is called 71 $ArtRef = $NntpPtr->article($GetArtNum); 72 @ArtArr = @$ArtRef; $ArtArrLen = @ArtArr; 73 if($ArtArrLen > 0 ) { # Skip article numbers that had 0 len 74 open(OUT, ">$GetArtNum") or 75 die "Could not create $GroupName/$GetArtNum\n"; 76 print OUT @$ArtRef; close(OUT); 77 } 78 79 # Check if we're at the end 80 if($GetArtNum == $NumLast) { last } 81 $GetArtNum += 1; # Increment the article number to get 82 } 83} 84 85$NntpPtr->quit; 86exit; 87