2 ##########################################################################
3 # onis 0.7.2 2005-01-21 #
4 #---=============--------------------------------------------------------#
6 # Purpose: Generating statistics #
7 # Input: IRC-Logfiles #
8 # Output: One HTML file #
9 # Version: 0.7.2 (unstable) #
11 # Homepage: http://verplant.org/onis/ #
12 # Authors: Florian octo Forster <octo@verplant.org> #
13 # Contributions are listed in THANKS #
14 ##########################################################################
18 if ($0 =~ m#^(.*)[/\\]#) { chdir ($1); }
20 unshift (@INC, 'lib');
22 # 0x0010 Language (make not-translated lines red/yellow)
23 # 0x0020 Parser (dropped lines)
24 # 0x0040 Parser (time information)
25 # 0x0100 Data::Core (host unsharp)
26 # 0x0200 Data::Persistent
27 # 0x0400 Data::Core (dump incoming data to stderr)
28 # 0x0800 Data::Core (initializing)
36 use Onis::Config qw/get_config parse_argv read_config/;
37 use File::Basename qw/dirname/;
40 use vars qw/$VERSION $REVISION/;
43 $REVISION = '$LastChangedRevision$';
48 $VERSION =~ s/^\D*(\d+).*/r$1/;
54 print STDERR $/, __FILE__, ': $Id$' if ($::DEBUG);
57 read_config (get_config ('config') ? get_config ('config') : 'config');
58 read_config (scalar get_config ('theme')) if (get_config ('theme'));
60 my $output = get_config ('output');
63 $output = "reports/onis.html";
66 foreach ('Core', get_config ('plugin'))
68 my $module = ucfirst (lc ($_));
69 require "Onis/Plugins/$module.pm";
72 if (!get_config ('input'))
74 # TODO: Make a complete (!) lsit..
77 Usage: $0 [options] <logfile> [logfile logfile ..]
80 --config Specify alternate config file
81 --output <file> Defines the file to write the HTML to.
82 --overwrite <bool> Overwrites files without prompting.
83 --channel <channel> Defines the channel's name.
84 --logtype <type> Defines the logfile's type.
85 See 'config' for a complete list.
86 --user <name> Define's the generator's name.
88 For a full list of all options please read the ``config'' file.
96 if (get_config ('overwrite'))
98 my $tmp = lc (get_config ('overwrite'));
99 if ($tmp eq 'true' or $tmp eq 'yes' or $tmp eq 'on')
107 print STDERR <<MESSAGE;
109 WARNING: The output file ``$output'' already exists
111 You can set the ``overwrite'' option in the config
112 file to disable this dialog.
115 print STDERR 'Are you sure you want to overwrite it? [Y|n] ';
116 my $answer = <STDIN>;
117 exit (1) if ($answer =~ m/n/i);
121 my $logtype = 'Eggdrop';
122 if (get_config ('logtype'))
124 $logtype = ucfirst (lc (get_config ('logtype')));
127 require "Onis/Parser/$logtype.pm";
128 require Onis::Parser::Persistent;
129 require Onis::Data::Persistent;
130 import Onis::Parser (qw(parse last_date));
131 import Onis::Parser::Persistent (qw(newfile));
132 import Onis::Data::Persistent ();
134 $FileInfo = Onis::Data::Persistent->new ('FileInfo', 'inode', qw(mtime));
136 if (get_config ('purge_logs'))
138 my $temp = lc (get_config ('purge_logs'));
139 if (($temp eq 'truncate') or ($temp eq 'shorten'))
143 elsif (($temp eq 'delete') or ($temp eq 'remove')
150 for (get_config ('input'))
160 ($inode, $size, $mtime) = (stat ($file))[1,7,9];
162 print STDERR $/, $/, __FILE__, " --- New File ``$file'' ---" if ($::DEBUG & 0x200);
164 if (!defined ($mtime))
166 print STDERR $/, __FILE__, ": Unable to stat file ``$file''";
171 my ($old_mtime) = $FileInfo->get ($inode);
173 print STDERR $/, __FILE__, ": ``$file'': " if ($::DEBUG & 0x200);
175 if (defined ($old_mtime))
177 if ($old_mtime == $mtime)
179 print STDERR "File did not change. Skipping." if ($::DEBUG & 0x200);
182 elsif ($old_mtime < $mtime)
184 print STDERR "File changed. Reading it again." if ($::DEBUG & 0x200);
188 print STDERR "File ``$file'' is older than expected. There might be a problem!";
193 print STDERR "File appears to be new. Reading it." if ($::DEBUG & 0x200);
195 $FileInfo->put ($inode, $mtime);
199 if ($PURGE_LOGS == 1)
201 unless (open ($logfile, '+< ' . $file))
203 print STDERR $/, __FILE__, ": Unable to open file ``$file'': $!";
209 unless (open ($logfile, '< ' . $file))
211 print STDERR $/, __FILE__, ": Unable to open file ``$file'': $!";
218 unless (flock ($logfile, LOCK_EX))
220 print STDERR $/, __FILE__, ": Unable to get an exclusive lock for file ``$file'': $!";
227 unless (flock ($logfile, LOCK_SH))
229 print STDERR $/, __FILE__, ": Unable to get a shared lock for file ``$file'': $!";
235 newfile ($FileInfo->{$inode});
239 $status = parse ($_);
243 # 2 == unable to parse
245 # 4 == don't have date
249 print STDERR $/, __FILE__, ": Rewinding file ``$file''" if ($::DEBUG & 0x200);
250 seek ($logfile, 0, 0);
253 elsif (($status == 1) or ($status == 2)
256 $position = tell ($logfile);
264 print STDERR $/, __FILE__, ": Parser returned unknown status code: ``$status''";
268 if ($PURGE_LOGS and (($status == 1)
272 if (($PURGE_LOGS > 1)
273 #and (($position + 1) >= $size)
277 print STDERR $/, __FILE__, ": Deleting empty file ``$file''" if ($::DEBUG & 0x200);
282 unless (unlink ($file))
284 print STDERR $/, __FILE__, ": Unable to delete empty file ``$file'': $!";
286 delete ($FileInfo->{$inode});
290 print STDERR $/, __FILE__, ": Won't delete ``$file''. Set it to writeable first!";
295 seek ($logfile, 0, 0);
296 if (truncate ($logfile, 0))
298 print $logfile &last_date ();
299 print STDERR $/, __FILE__, ": Truncated ``$file''" if ($::DEBUG & 0x200);
303 print STDERR $/, __FILE__, ": Couldn't truncate file ``$file'': $!";
315 require Onis::Data::Core;
317 import Onis::Data::Core qw#print_output#;
318 import Onis::Html qw#open_file close_file#;
320 if (open_file ($output))
327 # Fail and make noise! ;)
328 print STDERR <<MESSAGE;
330 ERROR: Unable to open output file
332 The output file ``$output'' could not be opened. Please make sure to set
333 the permissions right and try again.
343 print $/ if ($::DEBUG);