#!/usr/bin/perl # # Perl frontend to SquidAnalyzer.pm. # use strict; use SquidAnalyzer; use Getopt::Long; $| = 1; my $DEFAULT_CONFFILE = '/etc/squidanalyzer/squidanalyzer.conf'; my $logfile = ''; my $configfile = ''; my $help = ''; my $rebuild = ''; my $preserve = ''; my $debug = 0; my $version = 0; my $build_date = ''; my $no_year_stat = 0; my $pid_dir = '/tmp'; my $pidfile = 'squid-analyzer.pid'; # get the command line parameters my $result = GetOptions ( "c|configfile=s" => \$configfile, "b|build_date=s" => \$build_date, "d|debug!" => \$debug, "h|help" => \$help, "l|logfile=s" => \$logfile, "r|rebuild!" => \$rebuild, "p|preserve=i" => \$preserve, "P|pid_dir=s" => \$pid_dir, "v|version!" => \$version, "no-year-stat!" => \$no_year_stat, ); # Show version and exit if ($version) { print "SquidAnalyzer version $SquidAnalyzer::VERSION\n"; exit 0; } if ($build_date) { $rebuild = 1; if ( ($build_date !~ /^\d{4}-\d{2}-\d{2}$/) && ($build_date !~ /^\d{4}-\d{2}$/) && ($build_date !~ /^\d{4}$/) ) { die("FATAL: bad syntax for build_date, expecting format: yyyy-mm-dd, yyyy-mm or yyyy\n"); exit 0; } } # Look at configuration file if (!$configfile) { # Backward compatibility with release < 4.0 with configuration # file as single argument. $configfile = $ARGV[0] if (($#ARGV == 0) && $ARGV[0]); # Set default configuration file $configfile ||= $DEFAULT_CONFFILE; } if ($help) { &usage; exit; } # Check if an other process is already running if (-e "$pid_dir/$pidfile") { die "FATAL: pid file ($pid_dir/$pidfile) exists, an other squid-analalyzer process may still running.\n"; } # Write the pid file open(OUT, ">$pid_dir/$pidfile") or die "FATAL: can not write to pid file $pid_dir/$pidfile, $!\n"; print OUT "$$"; close(OUT); # Die cleanly on signal sub terminate { # block signal local $SIG{TERM} = 'IGNORE'; local $SIG{INT} = 'IGNORE'; local $SIG{QUIT} = 'IGNORE'; print("LOG: Received terminating signal.\n"); if (-e "$pid_dir/$pidfile") { unlink("$pid_dir/$pidfile") or print("ERROR: Unable to remove pid file $pid_dir/$pidfile, $!\n"); } exit 0; } # Die on kill -2, -3 or -15 $SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'terminate'; # Instanciate SquidAnalyzer.pm perl module my $sa = new SquidAnalyzer($configfile, $logfile, $debug, $rebuild, "$pid_dir/$pidfile"); $sa->{no_year_stat} = $no_year_stat; # Run parsing only if we have a log file or that we are not in rebuild mode $sa->parseFile() if (!$rebuild || $logfile); # Remove old statistics if ($preserve) { $sa->{preserve} = $preserve; } # In rebuild mode history time is not use and we must store the # specific rebuild date if any is provided at command line. if ($rebuild) { $sa->{history_time} = ''; $sa->{build_date} = $build_date; } # Generate graphics and html $sa->buildHTML(); # Remove PID file unlink("$pid_dir/$pidfile"); exit(0); sub usage { print qq{ Usage: squid-analyzer [ -c squidanalyzer.conf ] [-l logfile] -c | --configfile filename : path to the SquidAnalyzer configuration file. By default: $DEFAULT_CONFFILE -b | --build_date date : set the date to be rebuilt, format: yyyy-mm-dd or yyyy-mm or yyyy. Used with -r or --rebuild. -d | --debug : show debug informations. -h | --help : show this message and exit. -l | --logfile filename : path to the Squid logfile to parse. By default: /var/log/squid/access.log -p | --preserve number : used to set the statistic obsolescence in number of month. Older stats will be removed. -P | --pid_dir directory : set directory where pid file will be stored. Default /tmp/ -r | --rebuild : use this option to rebuild all html and graphs output from all data files. -v | version : show version and exit. --no-year-stat : disable years statistics, reports will start from month level only. }; exit 0; }