You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Abd El-Hameed Mohammed <ha...@use-trade.com> on 2003/10/03 02:23:23 UTC

Apache bandwidth calculating

Hi all
    Do any one know where i can find the source of mod_bwlimited
or any recources for modules like it.

Thank you

Re: Apache bandwidth calculating

Posted by Abd El-Hameed Mohammed <ha...@use-trade.com>.
Thank you very much.
I 'll do my best to help you improve this module.

Thank you.

----- Original Message ----- 
From: "Skylos the Doggie" <sk...@doglover.com>
To: "Abd El-Hameed Mohammed" <ha...@use-trade.com>
Cc: "Ged Haywood" <ge...@www2.jubileegroup.co.uk>; <mo...@perl.apache.org>
Sent: Tuesday, October 07, 2003 5:39 PM
Subject: Re: Apache bandwidth calculating


> In Tue, 7 Oct 2003, Abd El-Hameed Mohammed wrote:
>
> > Thank you all.
> > OK
> > Let me ask again, are there any way to store a web site bandwidth
statistics
> > in a file or a database
>
> Yes.
>
> I adapted some of the Apache::AuthDBI module into a logging hook that
> interfaces to a database via dbi via custom query(ies).  You can use
> tokens I've defined to insert just about any of the available retrievable
> information from the objects available to a module into the custom
> queries.  You can use this to execute any custom query on a database with
> time and bandwidth used, for instance thus allowing you to generate the
> most detailed bandwidth statistics you could ever want, or as general as
> you like.  Group it how you please.
>
> This is not a fully tested module.  Use at your own risk.  Help me make
> it better.
>
> Perldoc should work on it to help you figure out how to use the tokens.
>
> Ask if you hvae any questions, and please let me know of any suggestions
> for improvements!
>
> With intrepidation, here is the code.
>
> Skylos
>
> ---
>
> package Apache::ActivityLogDBI;
>
> use Apache ();
> use Apache::Constants qw( OK SERVER_ERROR );
> use DBI ();
> use strict;
>
> # $Id: ActivityLogDBI.pm,v 0.01 2003/10/07 08:36:38 ask Exp $
>
> require_version DBI 1.00;
>
> $ActivityLogDBI::VERSION = '0.01';
>
> # 1: report about cache miss
> # 2: full debug output
> $ActivityLogDBI::DEBUG = 0;
>
> # configuration attributes, defaults will be overwritten with values from
.htaccess.
>
> my %Config = (
>     'Activity_Log_DBI_data_source'      => '',
>     'Activity_Log_DBI_username'         => '',
>     'Activity_Log_DBI_password'         => '',
> );
>
> # stores the configuration of current URL.
> # initialized  during authentication, eventually re-used for
authorization.
> my $Attr = { };
>
> # rectify queries with the appropriate information
> sub subvars {
>   my $r = shift;
>   my $query = shift;
>   my $dbh = shift;
>
>   my $s = $r->server;
>   my $c = $r->connection;
>
>   my $vals = {
>     CONNECTION_REMOTEHOST => sub { $c->remote_host(); },
>     CONNECTION_REMOTEIP => sub { $c->remote_ip(); },
>     CONNECTION_REMOTELOGNAME => sub { $c->remote_logname(); },
>     CONNECTION_USER => sub {  $c->user(); },
>     CONNECTION_AUTHTYPE => sub { $c->auth_type(); },
>     CONNECTION_ABORTED => sub { $c->aborted(); },
>
>     REQUEST_METHOD => sub { $r->method(); },
>     REQUEST_BYTES => sub { $r->bytes_sent(); },
>     REQUEST_HEADER => sub { $r->header_only(); },
>     REQUEST_PROTOCOL => sub { $r->protocol(); },
>     REQUEST_HOSTNAME => sub { $r->hostname(); },
>     REQUEST_TIME => sub { my @d = localtime($r->time()); sprintf
'%04d-%02d-%02d %02d:%02d:%02d', 1900+$d[5], 1+$d[4], $d[3], $d[2], $d[1],
$d[0]; },
>     REQUEST_URI => sub { $r->uri(); },
>     REQUEST_FILENAME => sub { $r->filename(); },
>     REQUEST_LOCATION => sub { $r->location(); },
>     REQUEST_PATH_INFO => sub { $r->path_info(); },
>     REQUEST_ARGS => sub { $r->args(); },
>
>     SERVER_DOCUMENTROOT => sub { $s->document_root(); },
>     SERVER_SERVERROOT => sub { $s->server_root_relative(); },
>     SERVER_SERVERPORT => sub { $s->get_server_port(); },
>     SERVER_ADMIN => sub { $s->server_admin(); },
>     SERVER_HOSTNAME => sub { $s->server_hostname(); },
>     SERVER_ISVIRTUAL => sub { $s->server_is_virtual(); },
>     SERVER_UID => sub { $s->uid(); },
>     SERVER_GID => sub { $s->gid(); },
>     SERVER_LOGLEVEL => sub { $s->loglevel(); },
>
>   };
>   foreach (keys %{$vals}) {
>     if ($query =~ /$_/) {
>       my $value = $dbh->quote($vals->{$_}->());
>       $query =~ s/$_/$value/g;
>     }
>   }
>   return $query;
> }
>
> # log handler
> sub log {
>     my ($r) = @_;
>     my ($key, $val, $dbh);
>
>     my $prefix = "$$ ActivityLogDBI::log";
>
>     if ($ActivityLogDBI::DEBUG > 1) {
>         my ($type) = '';
>         $type .= 'initial ' if $r->is_initial_req;
>         $type .= 'main'     if $r->is_main;
>         print STDERR "==========\n$prefix request type = >$type< \n";
>     }
>
>     return OK unless $r->is_initial_req; # only the first internal request
>
>     print STDERR "REQUEST:\n", $r->as_string if $ActivityLogDBI::DEBUG >
2;
>
>     # get username
>     my ($user_sent) = $r->connection->user;
>     print STDERR "$prefix user sent = >$user_sent<\n" if
$ActivityLogDBI::DEBUG > 1;
>
>     # get configuration
>     while(($key, $val) = each %Config) {
>         $val = $r->dir_config($key) || $val;
>         $key =~ s/^Activity_Log_DBI_//;
>         $Attr->{$key} = $val;
>         printf STDERR "$prefix Config{ %-16s } = %s\n", $key, $val if
$ActivityLogDBI::DEBUG > 1;
>     }
>
>     my @queries;
>     my $temp = $r->dir_config();
>     while(($key, $val) = each %{$temp}) {
>         next unless ($key =~ /^Activity_Log_DBI_Query/);
>         push @queries, $val;
>         printf STDERR "$prefix Config{ %-16s } = %s\n", $key, $val if
$ActivityLogDBI::DEBUG > 1;
>     }
>     undef $temp;
>
>     unless (scalar @queries) {
>         printf STDERR "$prefix No queries - return OK\n" if
$ActivityLogDBI::DEBUG > 1;
>         return OK;
>     }
>
>     # parse connect attributes, which may be tilde separated lists
>     my @data_sources = split(/~/, $Attr->{data_source});
>     my @usernames    = split(/~/, $Attr->{username});
>     my @passwords    = split(/~/, $Attr->{password});
>     $data_sources[0] = '' unless $data_sources[0]; # use ENV{DBI_DSN} if
not defined
>
>     # connect to database, use all data_sources until the connect succeeds
>     my $j;
>     for ($j = 0; $j <= $#data_sources; $j++) {
>         last if ($dbh = DBI->connect($data_sources[$j], $usernames[$j],
$passwords[$j]));
>     }
>     unless ($dbh) {
>         $r->log_reason("$prefix db connect error with data_source
>$Attr->{data_source}<", $r->uri);
>         return SERVER_ERROR;
>     }
>
>     foreach (@queries) {
>         # generate statement
>         my $statement = subvars $r, $_, $dbh;
>         print STDERR "$prefix statement: $statement\n" if
$ActivityLogDBI::DEBUG > 1;
>
>         # run statement
>         my $rows;
>         unless ($rows = $dbh->do($statement)) {
>             $r->log_reason("$prefix can not do statement: $DBI::errstr
$DBI::lasth->{Statement}", $r->uri);
>             $dbh->disconnect;
>             return SERVER_ERROR;
>         }
>
>         print STDERR "$prefix rows affected: $rows\n" if
$ActivityLogDBI::DEBUG > 0;
>
>         if ($dbh->err) {
>             $dbh->disconnect;
>             return SERVER_ERROR;
>         }
>
>     }
>     $dbh->disconnect;
>
>     printf STDERR "$prefix return OK\n" if $ActivityLogDBI::DEBUG > 1;
>     return OK;
> }
>
> 1;
>
> __END__
>
>
> =head1 NAME
>
> ActivityLogDBI - Activity Logging via Perl's DBI
>
>
> =head1 SYNOPSIS
>
>  # Configuration in httpd.conf or startup.pl:
>
>  PerlModule Apache::ActivityLogDBI
>
>  PerlLogHandler ActivityLogDBI::log
>
>  PerlSetVar Activity_Log_DBI_data_source   dbi:driver:dsn
>  PerlSetVar Activity_Log_DBI_username      db_username
>  PerlSetVar Activity_Log_DBI_password      db_password
>  #DBI->connect($data_source, $username, $password)
>
>  PerlSetVar Activity_Log_DBI_Query[...]    custom queries
>
> Any active variables that start with Activity_Log_DBI_Query is executed
> upon the triggering of the logging hook.  Use the variable scoping for
> sites and directories to overwrite lower level queries as necessary.
>
> =head1 DESCRIPTION
>
> This module allows custom logging against a database using Perl's DBI. For
> supported DBI drivers see:
>
>  http://dbi.perl.org/
>
> =head1 LIST OF TOKENS
>
> =item *
> Activity_Log_DBI_data_source (Database Authentication)
>
> The data_source value has the syntax 'dbi:driver:dsn'. This parameter is
> passed to the database driver for processing during connect. The
data_source
> parameter (as well as the username and the password parameters) may be a
> tilde ('~') separated list of several data_sources. All of these triples
will
> be used until a successful connect is made. This way several
backup-servers can
> be configured. if you want to use the environment variable DBI_DSN instead
of
> a data_source, do not specify this parameter at all.
>
> =item *
> Activity_Log_DBI_username (Database Authentication)
>
> The username argument is passed to the database driver for processing
during
> connect. This parameter may be a tilde ('~') separated list. See the
data_source
> parameter above for the usage of a list.
>
> =item *
> Activity_Log_DBI_password (Database Authentication)
>
> The password argument is passed to the database driver for processing
during
> connect. This parameter may be a tilde ('~')  separated list. See the
data_source
> parameter above for the usage of a list.
>
> =item *
> Activity_Log_DBI_Query[...]
>
> Any token beginning with 'Activity_Log_DBI_Query' will be added to a list
of
> queries that are executed on the DBI connection when the activity hook is
> implimented.  See MACROS below for macros that will automatically be
substituted
> in for values from the module environment.
>
> =head1 CONFIGURATION
>
> The module should be loaded upon startup of the Apache daemon.
> Add the following line to your httpd.conf:
>
>  PerlModule Apache::ActivityLogDBI
>
> A common usage is to load the module in a startup file via the PerlRequire
> directive. See eg/startup.pl for an example.
>
> To enable debugging the variable $ActivityLogDBI::DEBUG must be set. This
> can either be done in startup.pl or in the user script. Setting the
variable
> to 1, just reports about a cache miss. Setting the variable to 2 enables
full
> debug output.
>
>
> =head1 PREREQUISITES
>
> Note that this module needs mod_perl-1.08 or higher, apache_1.3.0 or
higher
> and that mod_perl needs to be configured with the appropriate call-back
hooks:
>
>   PERL_LOG=1 PERL_STACKED_HANDLERS=1
>
>
> =head1 SECURITY
>
> In some cases it is more secure not to put the username and the password
in
> the .htaccess file. The following example shows a solution to this
problem:
>
> httpd.conf:
>
>  <Perl>
>  my($uid,$pwd) = My::dbi_pwd_fetch();
>  $Location{'/foo/bar'}->{PerlSetVar} = [
>      [ Activity_Log_DBI_username  => $uid ],
>      [ Activity_Log_DBI_password  => $pwd ],
>  ];
>  </Perl>
>
>
> =head1 MACROS
>
> =item *
> CONNECTION_REMOTEHOST
>
> Output of the remote_host() method of the Connection object.
>
> =item *
> CONNECTION_REMOTEIP
>
> Output of the remote_ip() method of the Connection object.
>
> =item *
> CONNECTION_REMOTELOGNAME
>
> Output of the remote_logname() method of the Connection object.
>
> =item *
> CONNECTION_USER
>
> Output of the user() method of the Connection object.
>
> =item *
> CONNECTION_AUTHTYPE
>
> Output of the auth_type() method of the Connection object.
>
> =item *
> CONNECTION_ABORTED
>
> Output of the aborted() method of the Connection object.
>
> =item *
> REQUEST_METHOD
>
> Output of the method() method of the Request object.
>
> =item *
> REQUEST_BYTES
>
> Output of the bytes_sent() method of the Request object.
>
> =item *
> REQUEST_HEADER
>
> Output of the header_only() method of the Request object.
>
> =item *
> REQUEST_PROTOCOL
>
> Output of the protocol() method of the Request object.
>
> =item *
> REQUEST_HOSTNAME
>
> Output of the hostname() method of the Request object.
>
> =item *
> REQUEST_TIME
>
> ISO formatted output of the time() method of the Request object.
>
> =item *
> REQUEST_URI
>
> Output of the uri() method of the Request object.
>
> =item *
> REQUEST_FILENAME
>
> Output of the filename() method of the Request object.
>
> =item *
> REQUEST_LOCATION
>
> Output of the location() method of the Request object.
>
> =item *
> REQUEST_PATH_INFO
>
> Output of the path_info() method of the Request object.
>
> =item *
> REQUEST_ARGS
>
> Output of the args() method of the Request object.
>
> =item *
> SERVER_DOCUMENTROOT
>
> Output of the document_root() method of the Request object.
>
> =item *
> SERVER_SERVERROOT
>
> Output of the server_root_realative() method of the Request object.
>
> =item *
> SERVER_SERVERPORT
>
> Output of the get_server_port() method of the Request object.
>
> =item *
> SERVER_ADMIN
>
> Output of the server_admin() method of the Request object.
>
> =item *
> SERVER_HOSTNAME
>
> Output of the server_hostname() method of the Server object.
>
> =item *
> SERVER_ISVIRTUAL
>
> Output of the server_is_virtual() method of the Server object.
>
> =item *
> SERVER_UID
>
> Output of the uid() method of the Server object.
>
> =item *
> SERVER_GID
>
> Output of the gid() method of the Server object.
>
> =item *
> SERVER_LOGLEVEL
>
> Output of the loglevel() method of the Server object.
>
>
> =head1 SEE ALSO
>
> L<Apache>, L<mod_perl>, L<DBI>
>
>
> =head1 AUTHORS
>
> =item *
> Apache::ActivityLogDBI by David Ihnen <sk...@dogpawz.com>
>
> =item *
> Code structure derived from Apache::AuthDBI by Edmund Mergl; now
maintained and
> supported by the modperl mailinglist.
>
> =item *
> mod_perl by Doug MacEachern <mo...@apache.org>
>
> =item *
> DBI by Tim Bunce <db...@perl.org>
>
>
>
> =head1 COPYRIGHT
>
> The ActivityLogDBI module is free software; you can redistribute it and/or
> modify it under the same terms as Perl itself.
>
> =cut
> ---
>
> > ----- Original Message -----
> > From: "Ged Haywood" <ge...@www2.jubileegroup.co.uk>
> > To: "Abd El-Hameed Mohammed" <ha...@use-trade.com>
> > Cc: <mo...@perl.apache.org>
> > Sent: Sunday, October 05, 2003 12:45 PM
> > Subject: Re: Apache bandwidth calculating
> >
> >
> > > Hi there,
> > >
> > > On Fri, 3 Oct 2003, Abd El-Hameed Mohammed wrote:
> > >
> > > > Do any one know where i can find the source of mod_bwlimited
> > > > or any recources for modules like it.
> > >
> > > http://modules.apache.org/search
> > >
> > > Type the word "bandwidth" into the box.
> > >
> > > Try CPAN too, and you might want to look at
> > >
> > > http://www.modperlcookbook.org/chapters/ch13.pdf
> > >
> > > in which Geoff which mentions mod_throttle_access
> > > (and brings us more-or-less back on-topic:).
> > >
> > > 73,
> > > Ged.
> > >
> > > [This E-mail scanned for viruses using McAfee.]
> > >
> > >
> > >
> >
> >
>
> - skylos@doglover.com
> - The best part about the internet is nobody knows you're a dog.
>   (Peter Stiener, The New Yorker, July 5, 1993)
> - Dogs like... TRUCKS!  (Nissan commercial, 1996)
> - PGP key: http://dogpawz.com/skylos/mykey.asc
>
>


Re: Apache bandwidth calculating

Posted by Skylos the Doggie <sk...@doglover.com>.
In Tue, 7 Oct 2003, Abd El-Hameed Mohammed wrote:

> Thank you all.
> OK
> Let me ask again, are there any way to store a web site bandwidth statistics
> in a file or a database

Yes.

I adapted some of the Apache::AuthDBI module into a logging hook that
interfaces to a database via dbi via custom query(ies).  You can use
tokens I've defined to insert just about any of the available retrievable
information from the objects available to a module into the custom
queries.  You can use this to execute any custom query on a database with
time and bandwidth used, for instance thus allowing you to generate the
most detailed bandwidth statistics you could ever want, or as general as
you like.  Group it how you please.

This is not a fully tested module.  Use at your own risk.  Help me make
it better.

Perldoc should work on it to help you figure out how to use the tokens.

Ask if you hvae any questions, and please let me know of any suggestions
for improvements!

With intrepidation, here is the code.

Skylos

---

package Apache::ActivityLogDBI;

use Apache ();
use Apache::Constants qw( OK SERVER_ERROR );
use DBI ();
use strict;

# $Id: ActivityLogDBI.pm,v 0.01 2003/10/07 08:36:38 ask Exp $

require_version DBI 1.00;

$ActivityLogDBI::VERSION = '0.01';

# 1: report about cache miss
# 2: full debug output
$ActivityLogDBI::DEBUG = 0;

# configuration attributes, defaults will be overwritten with values from .htaccess.

my %Config = (
    'Activity_Log_DBI_data_source'      => '',
    'Activity_Log_DBI_username'         => '',
    'Activity_Log_DBI_password'         => '',
);

# stores the configuration of current URL.
# initialized  during authentication, eventually re-used for authorization.
my $Attr = { };

# rectify queries with the appropriate information
sub subvars {
  my $r = shift;
  my $query = shift;
  my $dbh = shift;

  my $s = $r->server;
  my $c = $r->connection;

  my $vals = {
    CONNECTION_REMOTEHOST => sub { $c->remote_host(); },
    CONNECTION_REMOTEIP => sub { $c->remote_ip(); },
    CONNECTION_REMOTELOGNAME => sub { $c->remote_logname(); },
    CONNECTION_USER => sub {  $c->user(); },
    CONNECTION_AUTHTYPE => sub { $c->auth_type(); },
    CONNECTION_ABORTED => sub { $c->aborted(); },

    REQUEST_METHOD => sub { $r->method(); },
    REQUEST_BYTES => sub { $r->bytes_sent(); },
    REQUEST_HEADER => sub { $r->header_only(); },
    REQUEST_PROTOCOL => sub { $r->protocol(); },
    REQUEST_HOSTNAME => sub { $r->hostname(); },
    REQUEST_TIME => sub { my @d = localtime($r->time()); sprintf '%04d-%02d-%02d %02d:%02d:%02d', 1900+$d[5], 1+$d[4], $d[3], $d[2], $d[1], $d[0]; },
    REQUEST_URI => sub { $r->uri(); },
    REQUEST_FILENAME => sub { $r->filename(); },
    REQUEST_LOCATION => sub { $r->location(); },
    REQUEST_PATH_INFO => sub { $r->path_info(); },
    REQUEST_ARGS => sub { $r->args(); },

    SERVER_DOCUMENTROOT => sub { $s->document_root(); },
    SERVER_SERVERROOT => sub { $s->server_root_relative(); },
    SERVER_SERVERPORT => sub { $s->get_server_port(); },
    SERVER_ADMIN => sub { $s->server_admin(); },
    SERVER_HOSTNAME => sub { $s->server_hostname(); },
    SERVER_ISVIRTUAL => sub { $s->server_is_virtual(); },
    SERVER_UID => sub { $s->uid(); },
    SERVER_GID => sub { $s->gid(); },
    SERVER_LOGLEVEL => sub { $s->loglevel(); },

  };
  foreach (keys %{$vals}) {
    if ($query =~ /$_/) {
      my $value = $dbh->quote($vals->{$_}->());
      $query =~ s/$_/$value/g;
    }
  }
  return $query;
}

# log handler
sub log {
    my ($r) = @_;
    my ($key, $val, $dbh);

    my $prefix = "$$ ActivityLogDBI::log";

    if ($ActivityLogDBI::DEBUG > 1) {
        my ($type) = '';
        $type .= 'initial ' if $r->is_initial_req;
        $type .= 'main'     if $r->is_main;
        print STDERR "==========\n$prefix request type = >$type< \n";
    }

    return OK unless $r->is_initial_req; # only the first internal request

    print STDERR "REQUEST:\n", $r->as_string if $ActivityLogDBI::DEBUG > 2;

    # get username
    my ($user_sent) = $r->connection->user;
    print STDERR "$prefix user sent = >$user_sent<\n" if $ActivityLogDBI::DEBUG > 1;

    # get configuration
    while(($key, $val) = each %Config) {
        $val = $r->dir_config($key) || $val;
        $key =~ s/^Activity_Log_DBI_//;
        $Attr->{$key} = $val;
        printf STDERR "$prefix Config{ %-16s } = %s\n", $key, $val if $ActivityLogDBI::DEBUG > 1;
    }

    my @queries;
    my $temp = $r->dir_config();
    while(($key, $val) = each %{$temp}) {
        next unless ($key =~ /^Activity_Log_DBI_Query/);
        push @queries, $val;
        printf STDERR "$prefix Config{ %-16s } = %s\n", $key, $val if $ActivityLogDBI::DEBUG > 1;
    }
    undef $temp;

    unless (scalar @queries) {
        printf STDERR "$prefix No queries - return OK\n" if $ActivityLogDBI::DEBUG > 1;
        return OK;
    }

    # parse connect attributes, which may be tilde separated lists
    my @data_sources = split(/~/, $Attr->{data_source});
    my @usernames    = split(/~/, $Attr->{username});
    my @passwords    = split(/~/, $Attr->{password});
    $data_sources[0] = '' unless $data_sources[0]; # use ENV{DBI_DSN} if not defined

    # connect to database, use all data_sources until the connect succeeds
    my $j;
    for ($j = 0; $j <= $#data_sources; $j++) {
        last if ($dbh = DBI->connect($data_sources[$j], $usernames[$j], $passwords[$j]));
    }
    unless ($dbh) {
        $r->log_reason("$prefix db connect error with data_source >$Attr->{data_source}<", $r->uri);
        return SERVER_ERROR;
    }

    foreach (@queries) {
        # generate statement
        my $statement = subvars $r, $_, $dbh;
        print STDERR "$prefix statement: $statement\n" if $ActivityLogDBI::DEBUG > 1;

        # run statement
        my $rows;
        unless ($rows = $dbh->do($statement)) {
            $r->log_reason("$prefix can not do statement: $DBI::errstr $DBI::lasth->{Statement}", $r->uri);
            $dbh->disconnect;
            return SERVER_ERROR;
        }

        print STDERR "$prefix rows affected: $rows\n" if $ActivityLogDBI::DEBUG > 0;

        if ($dbh->err) {
            $dbh->disconnect;
            return SERVER_ERROR;
        }

    }
    $dbh->disconnect;

    printf STDERR "$prefix return OK\n" if $ActivityLogDBI::DEBUG > 1;
    return OK;
}

1;

__END__


=head1 NAME

ActivityLogDBI - Activity Logging via Perl's DBI


=head1 SYNOPSIS

 # Configuration in httpd.conf or startup.pl:

 PerlModule Apache::ActivityLogDBI

 PerlLogHandler ActivityLogDBI::log

 PerlSetVar Activity_Log_DBI_data_source   dbi:driver:dsn
 PerlSetVar Activity_Log_DBI_username      db_username
 PerlSetVar Activity_Log_DBI_password      db_password
 #DBI->connect($data_source, $username, $password)

 PerlSetVar Activity_Log_DBI_Query[...]    custom queries

Any active variables that start with Activity_Log_DBI_Query is executed
upon the triggering of the logging hook.  Use the variable scoping for
sites and directories to overwrite lower level queries as necessary.

=head1 DESCRIPTION

This module allows custom logging against a database using Perl's DBI. For
supported DBI drivers see:

 http://dbi.perl.org/

=head1 LIST OF TOKENS

=item *
Activity_Log_DBI_data_source (Database Authentication)

The data_source value has the syntax 'dbi:driver:dsn'. This parameter is
passed to the database driver for processing during connect. The data_source
parameter (as well as the username and the password parameters) may be a
tilde ('~') separated list of several data_sources. All of these triples will
be used until a successful connect is made. This way several backup-servers can
be configured. if you want to use the environment variable DBI_DSN instead of
a data_source, do not specify this parameter at all.

=item *
Activity_Log_DBI_username (Database Authentication)

The username argument is passed to the database driver for processing during
connect. This parameter may be a tilde ('~') separated list. See the data_source
parameter above for the usage of a list.

=item *
Activity_Log_DBI_password (Database Authentication)

The password argument is passed to the database driver for processing during
connect. This parameter may be a tilde ('~')  separated list. See the data_source
parameter above for the usage of a list.

=item *
Activity_Log_DBI_Query[...]

Any token beginning with 'Activity_Log_DBI_Query' will be added to a list of
queries that are executed on the DBI connection when the activity hook is
implimented.  See MACROS below for macros that will automatically be substituted
in for values from the module environment.

=head1 CONFIGURATION

The module should be loaded upon startup of the Apache daemon.
Add the following line to your httpd.conf:

 PerlModule Apache::ActivityLogDBI

A common usage is to load the module in a startup file via the PerlRequire
directive. See eg/startup.pl for an example.

To enable debugging the variable $ActivityLogDBI::DEBUG must be set. This
can either be done in startup.pl or in the user script. Setting the variable
to 1, just reports about a cache miss. Setting the variable to 2 enables full
debug output.


=head1 PREREQUISITES

Note that this module needs mod_perl-1.08 or higher, apache_1.3.0 or higher
and that mod_perl needs to be configured with the appropriate call-back hooks:

  PERL_LOG=1 PERL_STACKED_HANDLERS=1


=head1 SECURITY

In some cases it is more secure not to put the username and the password in
the .htaccess file. The following example shows a solution to this problem:

httpd.conf:

 <Perl>
 my($uid,$pwd) = My::dbi_pwd_fetch();
 $Location{'/foo/bar'}->{PerlSetVar} = [
     [ Activity_Log_DBI_username  => $uid ],
     [ Activity_Log_DBI_password  => $pwd ],
 ];
 </Perl>


=head1 MACROS

=item *
CONNECTION_REMOTEHOST

Output of the remote_host() method of the Connection object.

=item *
CONNECTION_REMOTEIP

Output of the remote_ip() method of the Connection object.

=item *
CONNECTION_REMOTELOGNAME

Output of the remote_logname() method of the Connection object.

=item *
CONNECTION_USER

Output of the user() method of the Connection object.

=item *
CONNECTION_AUTHTYPE

Output of the auth_type() method of the Connection object.

=item *
CONNECTION_ABORTED

Output of the aborted() method of the Connection object.

=item *
REQUEST_METHOD

Output of the method() method of the Request object.

=item *
REQUEST_BYTES

Output of the bytes_sent() method of the Request object.

=item *
REQUEST_HEADER

Output of the header_only() method of the Request object.

=item *
REQUEST_PROTOCOL

Output of the protocol() method of the Request object.

=item *
REQUEST_HOSTNAME

Output of the hostname() method of the Request object.

=item *
REQUEST_TIME

ISO formatted output of the time() method of the Request object.

=item *
REQUEST_URI

Output of the uri() method of the Request object.

=item *
REQUEST_FILENAME

Output of the filename() method of the Request object.

=item *
REQUEST_LOCATION

Output of the location() method of the Request object.

=item *
REQUEST_PATH_INFO

Output of the path_info() method of the Request object.

=item *
REQUEST_ARGS

Output of the args() method of the Request object.

=item *
SERVER_DOCUMENTROOT

Output of the document_root() method of the Request object.

=item *
SERVER_SERVERROOT

Output of the server_root_realative() method of the Request object.

=item *
SERVER_SERVERPORT

Output of the get_server_port() method of the Request object.

=item *
SERVER_ADMIN

Output of the server_admin() method of the Request object.

=item *
SERVER_HOSTNAME

Output of the server_hostname() method of the Server object.

=item *
SERVER_ISVIRTUAL

Output of the server_is_virtual() method of the Server object.

=item *
SERVER_UID

Output of the uid() method of the Server object.

=item *
SERVER_GID

Output of the gid() method of the Server object.

=item *
SERVER_LOGLEVEL

Output of the loglevel() method of the Server object.


=head1 SEE ALSO

L<Apache>, L<mod_perl>, L<DBI>


=head1 AUTHORS

=item *
Apache::ActivityLogDBI by David Ihnen <sk...@dogpawz.com>

=item *
Code structure derived from Apache::AuthDBI by Edmund Mergl; now maintained and
supported by the modperl mailinglist.

=item *
mod_perl by Doug MacEachern <mo...@apache.org>

=item *
DBI by Tim Bunce <db...@perl.org>



=head1 COPYRIGHT

The ActivityLogDBI module is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

=cut
---

> ----- Original Message -----
> From: "Ged Haywood" <ge...@www2.jubileegroup.co.uk>
> To: "Abd El-Hameed Mohammed" <ha...@use-trade.com>
> Cc: <mo...@perl.apache.org>
> Sent: Sunday, October 05, 2003 12:45 PM
> Subject: Re: Apache bandwidth calculating
>
>
> > Hi there,
> >
> > On Fri, 3 Oct 2003, Abd El-Hameed Mohammed wrote:
> >
> > > Do any one know where i can find the source of mod_bwlimited
> > > or any recources for modules like it.
> >
> > http://modules.apache.org/search
> >
> > Type the word "bandwidth" into the box.
> >
> > Try CPAN too, and you might want to look at
> >
> > http://www.modperlcookbook.org/chapters/ch13.pdf
> >
> > in which Geoff which mentions mod_throttle_access
> > (and brings us more-or-less back on-topic:).
> >
> > 73,
> > Ged.
> >
> > [This E-mail scanned for viruses using McAfee.]
> >
> >
> >
>
>

- skylos@doglover.com
- The best part about the internet is nobody knows you're a dog.
  (Peter Stiener, The New Yorker, July 5, 1993)
- Dogs like... TRUCKS!  (Nissan commercial, 1996)
- PGP key: http://dogpawz.com/skylos/mykey.asc

Re: Apache bandwidth calculating

Posted by Ged Haywood <ge...@www2.jubileegroup.co.uk>.
Hi there,

On Tue, 7 Oct 2003, Abd El-Hameed Mohammed wrote:

> Let me ask again, are there any way to store a web site bandwidth statistics
> in a file or a database

Well a gentle reminder didn't work.

This is the mod_perl Mailing List, and your question is not
appropriate here.

73,
Ged.


Re: Apache bandwidth calculating

Posted by Abd El-Hameed Mohammed <ha...@use-trade.com>.
Thank you all.
OK
Let me ask again, are there any way to store a web site bandwidth statistics
in a file or a database


----- Original Message ----- 
From: "Ged Haywood" <ge...@www2.jubileegroup.co.uk>
To: "Abd El-Hameed Mohammed" <ha...@use-trade.com>
Cc: <mo...@perl.apache.org>
Sent: Sunday, October 05, 2003 12:45 PM
Subject: Re: Apache bandwidth calculating


> Hi there,
>
> On Fri, 3 Oct 2003, Abd El-Hameed Mohammed wrote:
>
> > Do any one know where i can find the source of mod_bwlimited
> > or any recources for modules like it.
>
> http://modules.apache.org/search
>
> Type the word "bandwidth" into the box.
>
> Try CPAN too, and you might want to look at
>
> http://www.modperlcookbook.org/chapters/ch13.pdf
>
> in which Geoff which mentions mod_throttle_access
> (and brings us more-or-less back on-topic:).
>
> 73,
> Ged.
>
> [This E-mail scanned for viruses using McAfee.]
>
>
>


Re: Apache bandwidth calculating

Posted by Ged Haywood <ge...@www2.jubileegroup.co.uk>.
Hi there,

On Fri, 3 Oct 2003, Abd El-Hameed Mohammed wrote:

> Do any one know where i can find the source of mod_bwlimited
> or any recources for modules like it.

http://modules.apache.org/search

Type the word "bandwidth" into the box.

Try CPAN too, and you might want to look at

http://www.modperlcookbook.org/chapters/ch13.pdf

in which Geoff which mentions mod_throttle_access
(and brings us more-or-less back on-topic:).

73,
Ged.