5 # This script will gather statistical information from a database
6 # containing headers and other information from a INN feed.
8 # It is part of the NewsStats package.
10 # Copyright (c) 2010 Thomas Hochstein <thh@inter.net>
12 # It can be redistributed and/or modified under the same terms under
13 # which Perl itself is published.
16 our $VERSION = "0.01";
18 push(@INC, dirname($0));
22 use NewsStats qw(:DEFAULT :TimePeriods ListNewsgroups ReadGroupList);
26 ################################# Definitions ##################################
28 # define types of information that can be gathered
29 # all / groups (/ clients / hosts)
31 @LegalTypes{('all','groups')} = ();
33 ################################# Main program #################################
35 ### read commandline options
36 my %Options = &ReadOptions('dom:p:t:l:n:r:g:c:s:');
38 ### read configuration
39 my %Conf = %{ReadConfig('newsstats.conf')};
41 ### override configuration via commandline options
43 $ConfOverride{'DBTableRaw'} = $Options{'r'} if $Options{'r'};
44 $ConfOverride{'DBTableGrps'} = $Options{'g'} if $Options{'g'};
45 $ConfOverride{'DBTableClnts'} = $Options{'c'} if $Options{'c'};
46 $ConfOverride{'DBTableHosts'} = $Options{'s'} if $Options{'s'};
47 $ConfOverride{'TLH'} = $Options{'n'} if $Options{'n'};
48 &OverrideConfig(\%Conf,\%ConfOverride);
50 ### get type of information to gather, defaulting to 'all'
51 $Options{'t'} = 'all' if !$Options{'t'};
52 die "$MySelf: E: Unknown type '-t $Options{'t'}'!\n" if !exists($LegalTypes{$Options{'t'}});
54 ### get time period (-m or -p)
55 my ($StartMonth,$EndMonth) = &GetTimePeriod($Options{'m'},$Options{'p'});
57 ### read newsgroups list from -l
58 my %ValidGroups = %{&ReadGroupList($Options{'l'})} if $Options{'l'};
61 my $DBHandle = InitDB(\%Conf,1);
63 ### get data for each month
64 warn "$MySelf: W: Output only mode. Database is not updated.\n" if $Options{'o'};
65 foreach my $Month (&ListMonth($StartMonth,$EndMonth)) {
67 print "---------- $Month ----------\n" if $Options{'d'};
69 if ($Options{'t'} eq 'all' or $Options{'t'} eq 'groups') {
70 ### ----------------------------------------------
71 ### get groups data (number of postings per group)
72 # get groups data from raw table for given month
73 my $DBQuery = $DBHandle->prepare(sprintf("SELECT newsgroups FROM %s.%s WHERE day LIKE ? AND NOT disregard",$Conf{'DBDatabase'},$Conf{'DBTableRaw'}));
74 $DBQuery->execute($Month.'-%') or die sprintf("$MySelf: E: Can't get groups data for %s from %s.%s: $DBI::errstr\n",$Month,$Conf{'DBDatabase'},$Conf{'DBTableRaw'});
76 # count postings per group
78 while (($_) = $DBQuery->fetchrow_array) {
79 # get list oft newsgroups and hierarchies from Newsgroups:
80 my %Newsgroups = ListNewsgroups($_,$Options{'l'} ? \%ValidGroups : '');
81 # count each newsgroup and hierarchy once
82 foreach (sort keys %Newsgroups) {
87 # add valid but empty groups if -l is set
89 foreach (sort keys %ValidGroups) {
90 if (!defined($Postings{$_})) {
92 warn (sprintf("ADDED: %s as empty group\n",$_));
97 print "----- GroupStats -----\n" if $Options{'d'};
98 foreach my $Newsgroup (sort keys %Postings) {
99 print "$Newsgroup => $Postings{$Newsgroup}\n" if $Options{'d'};
100 if (!$Options{'o'}) {
102 $DBQuery = $DBHandle->prepare(sprintf("REPLACE INTO %s.%s (month,newsgroup,postings) VALUES (?, ?, ?)",$Conf{'DBDatabase'},$Conf{'DBTableGrps'}));
103 $DBQuery->execute($Month, $Newsgroup, $Postings{$Newsgroup}) or die sprintf("$MySelf: E: Can't write groups data for %s/%s to %s.%s: $DBI::errstr\n",$Month,$Newsgroup,$Conf{'DBDatabase'},$Conf{'DBTableGrps'});
108 # other types of information go here - later on
113 $DBHandle->disconnect;
117 ################################ Documentation #################################
121 gatherstats - process statistical data from a raw source
125 B<gatherstats> [B<-Vhdo>] [B<-m> I<YYYY-MM>] [B<-p> I<YYYY-MM:YYYY-MM>] [B<-t> I<type>] [B<-l> I<filename>] [B<-n> I<TLH>] [B<-r> I<database table>] [B<-g> I<database table>] [B<-c> I<database table>] [B<-s> I<database table>]
129 See doc/README: Perl 5.8.x itself and the following modules from CPAN:
145 This script will extract and process statistical information from a
146 database table which is fed from F<feedlog.pl> for a given time period
147 and write its results to (an)other database table(s). Entries marked
148 with I<'disregard'> in the database will be ignored; currently, you have
149 to set this flag yourself, using your database management tools. You
150 can exclude erroneous entries that way (e.g. automatic reposts (think
151 of cancels flood and resurrectors); spam; ...).
153 The time period to act on defaults to last month; you can assign
154 another month via the B<-m> switch or a time period via the B<-p>
155 switch; the latter takes preference.
157 By default B<gatherstats> will process all types of information; you
158 can change that using the B<-t> switch and assigning the type of
159 information to process. Currently only processing of the number of
160 postings per group per month is implemented anyway, so that doesn't
163 Possible information types include:
167 =item B<groups> (postings per group per month)
169 B<gatherstats> will examine Newsgroups: headers. Crosspostings will be
170 counted for each single group they appear in. Groups not in I<TLH>
173 B<gatherstats> will also add up the number of postings for each
174 hierarchy level, but only count each posting once. A posting to
175 de.alt.test will be counted for de.alt.test, de.alt.ALL and de.ALL,
176 respectively. A crossposting to de.alt.test and de.alt.admin, on the
177 other hand, will be counted for de.alt.test and de.alt.admin each, but
178 only once for de.alt.ALL and de.ALL.
180 Data is written to I<DBTableGrps> (see doc/INSTALL).
186 F<gatherstats.pl> will read its configuration from F<newsstats.conf>
187 which should be present in the same directory via Config::Auto.
189 See doc/INSTALL for an overview of possible configuration options.
191 You can override configuration options via the B<-n>, B<-r>, B<-g>,
192 B<-c> and B<-s> switches, respectively.
198 =item B<-V> (version)
200 Print out version and copyright information on B<yapfaq> and exit.
204 Print this man page and exit.
208 Output debugging information to STDOUT while processing (number of
211 =item B<-o> (output only)
213 Do not write results to database. You should use B<-d> in conjunction
214 with B<-o> ... everything else seems a bit pointless.
216 =item B<-m> I<YYYY-MM> (month)
218 Set processing period to a month in YYYY-MM format. Ignored if B<-p>
221 =item B<-p> I<YYYY-MM:YYYY-MM> (period)
223 Set processing period to a time period between two month, each in
224 YYYY-MM format, separated by a colon. Overrides B<-m>.
226 =item B<-t> I<type> (type)
228 Set processing type to one of I<all> and I<groups>. Defaults to all
229 (and is currently rather pointless as only I<groups> has been
232 =item B<-l> I<filename> (check against list)
234 Check each group against a list of valid newsgroups read from
235 I<filename>, one group on each line and ignoring everything after the
236 first whitespace (so you can use a file in checkgroups format or (part
237 of) your INN active file).
239 Newsgroups not found in I<filename> will be dropped (and logged to
240 STDERR), and newsgroups found in I<filename> but having no postings
241 will be added with a count of 0 (and logged to STDERR).
243 =item B<-n> I<TLH> (newsgroup hierarchy)
245 Override I<TLH> from F<newsstats.conf>.
247 =item B<-r> I<table> (raw data table)
249 Override I<DBTableRaw> from F<newsstats.conf>.
251 =item B<-g> I<table> (postings per group table)
253 Override I<DBTableGrps> from F<newsstats.conf>.
255 =item B<-c> I<table> (client data table)
257 Override I<DBTableClnts> from F<newsstats.conf>.
259 =item B<-s> I<table> (server/host data table)
261 Override I<DBTableHosts> from F<newsstats.conf>.
271 Process all types of information for lasth month:
275 Do a dry run, showing results of processing:
279 Process all types of information for January of 2010:
281 gatherstats -m 2010-01
283 Process only number of postings for the year of 2010,
284 checking against checkgroups-2010.txt:
286 gatherstats -p 2010-01:2010-12 -t groups -l checkgroups-2010.txt
292 =item F<gatherstats.pl>
296 =item F<NewsStats.pm>
298 Library functions for the NewsStats package.
300 =item F<newsstats.conf>
302 Runtime configuration file for B<yapfaq>.
308 Please report any bugs or feature requests to the author or use the
309 bug tracker at L<http://bugs.th-h.de/>!
325 This script is part of the B<NewsStats> package.
329 Thomas Hochstein <thh@inter.net>
331 =head1 COPYRIGHT AND LICENSE
333 Copyright (c) 2010 Thomas Hochstein <thh@inter.net>
335 This program is free software; you may redistribute it and/or modify it
336 under the same terms as Perl itself.