Category:
Author/Contact Info Val Polyakov vpolyakov@katrillion.com
Description: This is a reporting tool. It reports stuff. :) If you will like this, I'll post Report.pm as well.
#!/usr/bin/perl -w

use Spreadsheet::WriteExcel;

sub commanum {
    my $i;
    my $tmp_len;
    my $final_num = "";
    my $remaining;
    
    $tmp_len = length($_[0]);
    
    if ($tmp_len <= 3) { return $_[0]; }
    
    $i = 3;
    while ($i < $tmp_len)
    {
        $final_num = "," . substr($_[0], -$i, 3) . $final_num ;
        $remaining = substr($_[0], 0, $tmp_len - $i);
        $i += 3;
    }
    
    return $remaining . $final_num;
}

sub setflag ($)
{
    $flags{$_[0]} = 1;
}

sub clearflag ($)
{
    delete $flags{$_[0]};
}

$rpt_dir = "rpt";
$flt_dir = "flt";

$totalhits = 0;
$totalpages = 0;
$totalurls = 0;
keys %pageviews = 1000;
keys %params = 10;
keys %flags = 10;

my $filter_file = "standard";
my @filter;

foreach (@ARGV)
{
    if (/^--\w+=.*/)
    {
        ($pname, $pval) = /--(\w+)=(.*)/;
        $params{$pname} = $pval;
    } elsif (/^-\+\w+=.*/) {
        ($pname, $filename) = /-\+(\w+)=(.*)/;
        open (INFILE, "<$filename")
            or die "Couldn't open file: $filename\n";
        $tmp = $/;
        $/ = '\n\n';
        ($pval) = <INFILE>;
        $/ = $tmp;
        close (INFILE);
        $params{$pname} = $pval;
    } elsif (/^--\w+/) {
        ($pname) = /--(\w+)/;
        $params{$pname} = 1;
    } else {
        eval('require("$rpt_dir/$_")')
            or die "Error in report module $rpt_dir/$_ : $@\n";
        push @reports, ("&" . $_);
    }
}

die "No report specified\n" if ($#reports < 0);

if (exists($params{"filter"})) { $filter_file = $params{"filter"} };

open(FILTER, "<$flt_dir/$filter_file");
while(<FILTER>)
{
    if (!/^#/)
    {
        my ($action, $flag, $pattern) = /(accept|reject)\s(=|!)\s(.*)/
+;
        if (defined($action) && defined($flag) &&defined($pattern)) { 
+push @filter, [ qr/$pattern/, $flag, $action ] }
    }
}
close(FILTER);

# for (my $i = 0; $i <= $#filter; $i++) { print "$filter[$i][1]\t$filt
+er[$i][0]\n" }

if (exists($params{"daily"}))
{
    if (defined($date_stamp = <STDIN>))
    {
        chomp $date_stamp;
        if (exists($params{"inline"}))
        {
            print "$date_stamp\t";
        } else {
            print "\n$date_stamp\n\n";
        }
    }
    while (<STDIN>)
    {
        if ($_ eq "\n")
        {
            foreach $rpt (@reports)
            {
                eval($rpt);
            }
    
            undef %pageviews;
            $totalpages = 0;
            
            $date_stamp = <STDIN>;
            if (defined($date_stamp))
            {
                chomp $date_stamp;
                if (exists($params{"inline"}))
                {
                    print "$date_stamp\t";
                } else {
                    print "\n$date_stamp\n\n";
                }
            }

            $_ = <STDIN>;
        }
        if (defined($_))
        {
            my $i = 0 ;
            my $match = 0;
        
            my ($views, $uri) = /^([0-9]+)\t(\S+)/;
            while ($i <= $#filter && !$match)
            {
                if (($filter[$i][1] eq '=' && $uri =~ /$filter[$i][0]/
+) || ($filter[$i][1] eq '!' && $uri !~ /$filter[$i][0]/))
                {
                    if ($filter[$i][2] eq 'accept')
                    {
                        $pageviews{$uri} += $views;
                        $totalpages += $views;
                    } else {
                        # print "rejecting $uri\n";
                    }
                    $match = 1;
                }
                $i++;
            }
            $totalhits += $views;
            $totalurls++;
        }
    }
} else {
    while (<STDIN>)
    {
        my $i = 0 ;
        my $match = 0;
        
        ($views, $uri) = /^([0-9]+)\t(\S+)/o;
        while ($i <= $#filter && !$match)
        {
            if (($filter[$i][1] eq '=' && $uri =~ /$filter[$i][0]/) ||
+ ($filter[$i][1] eq '!' && $uri !~ /$filter[$i][0]/))
            {
                if ($filter[$i][2] eq 'accept')
                {
                    $pageviews{$uri} += $views;
                    $totalpages += $views;
                } else {
                    # print "rejecting $views\t$uri\n";
                }
                $match = 1;
            }
            $i++;
        }
        $totalhits += $views;
        $totalurls++;
    }

    foreach $rpt (@reports)
    {
        eval($rpt);
    }
}

</readmore>