| 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 | |
| 23 | use Net::NNTP; |
| 24 | |
| 25 | $BaseDir = '/usr/usenet'; |
| 26 | chdir($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 |
| 33 | open(GROUPLIST, 'grouplist.txt') or die "Could not open grouplist.txt\n"; |
| 34 | while(<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 | |
| 43 | foreach $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; |
| 86 | exit; |