Commit | Line | Data |
---|---|---|
86530b38 AT |
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; |