commit - 16a10af07204a2e0d1d7d55a71ef811947791581
commit + 7deb630f2352fb316c67d518f8d2795b059e92b9
blob - fb2feef5677e06e63d91096b431d2aa986a7249f
blob + 874bf924486cf2feebdfc2daa6a31bd0acbaba23
--- lib/IRCNOW/Database.pm
+++ lib/IRCNOW/Database.pm
sub new {
my ($class, @arguments) = @_;
my $self = { @arguments };
-
- die "You must specify a database file" unless defined $self->{database};
+ my $defaults = {
+ PrintError => 1,
+ RaiseError => 1,
+ AutoCommit => 1,
+ FetchHashKeyName => 'NAME_lc',
+ user => "",
+ password => "",
+ };
+ # dsn assumed to be sqlite if dbpath is provideded without a dsn value
+ if (not defined $self->{dsn}) {
+ if (defined $self->{dbpath}) {
+ # make sure file exists and isn't empty.
+ die "Can't locate " .$self->{dbpath} unless (-s $self->{dbpath});
+ $self->{dsn}="dbi:SQLite:dbname=" . $self->{dbpath};
+ } else {
+ die "No dsn string specified";
+ }
+ }
+ # Fill defaults values or die.
+ for my $field (qw{user password}) {
+ $self->{$field} = $defaults->{$field} unless defined $self->{$field};
+ }
+ # Create $self->{dbi} if it doesn't exist.
+ $self->{dbi}={} unless exists $self->{dbi};
+ # set dbi options with defaults
+ for my $field (qw{PrintError RaiseError AutoCommit FetchHashKeyName}) {
+ $self->{dbi}->{$field} = $self->{dbi}->{$field} || $defaults->{$field}
+ || die "Required paramater missing: {dbi}->{$field}";
+ }
bless $self, $class;
return $self;
}
sub connectDB {
my $self=shift;
- my $dbpath=$self->{database};
- my $dsn = "dbi:SQLite:dbname=$dbpath";
- my $user = "";
- my $password = "";
- my $dbh = DBI->connect($dsn, $user, $password, {
- PrintError => 1,
- RaiseError => 1,
- AutoCommit => 1,
- FetchHashKeyName => 'NAME_lc',
- }) or die "Couldn't connect to database: " . $DBI::errstr;
- if (!(-s "$dbpath")) {
- warn "Cant locate $dbpath";
- exit 1;
- }
- warn "connected to $dbpath";
- return $dbh;
+ $self->{dbh} = DBI->connect($self->{dsn}, $self->{user}, $self->{password}, $self->{dbi})
+ or die "Couldn't connect to database: " . $DBI::errstr;
+ warn "connected to " . $self->{dsn};
+ return $self->{dbh};
}
sub disconnectDB {
my $self=shift;
- my $dbh = shift;
+ my $dbh = $self->{dbh};
$dbh->disconnect();
+ delete $self->{dbh};
}
+sub createTable {
+ my $self=shift;
+ my $table=shift;
+ my $dbh=$self->dbh();
+ return $dbh->do($self->{TABLES}->{$table}->{dbCreate});
+}
+sub dbh {
+ my $self=shift;
+ my $dbh=$self->{dbh} || $self->connectDB();
+ return $dbh;
+}
-sub createTable {
+sub fieldListStrs {
my $self=shift;
- my $create_stmt=shift;
+ my $fields=shift;
+ my $fieldListStr=join(",", @$fields);
+ my $valuesListStr = "";
+ for (@$fields) {
+ $valuesListStr .= "?,";
+ }
+ chop ($valuesListStr);
+ return $fieldListStr,$valuesListStr;
}
+sub dbInsertRecord {
+ my $self = shift;
+ my $table = shift;
+ my $data = shift;
+ my $fields = shift || $self->{TABLES}->{$table}->{reqFields};
+ my ($fieldStr,$valStr) = $self->fieldListStrs($fields);
+ my @row = \@_;
+ my $dbh = $self->dbh();
+ my $stmt = qq{
+ INSERT INTO $table ($fieldStr) VALUES ($valStr)
+ };
+ if (ref $data->[0] eq "ARRAY") {
+ # We have multiple records to insert
+ my $sth = $dbh->prepare($stmt);
+ for (@$data) {
+ $sth->execute(@$_) or die $dbh->errstr;
+ }
+ } else {
+ $dbh->do($stmt, undef, $data);
+ }
+}
+
+sub dbLastRecord {
+ my $self = shift;
+ my $table = shift;
+ my $dbh = $self->dbh();
+ my $row = $dbh->selectrow_arrayref(qq{
+ SELECT * FROM $table ORDER BY id DESC LIMIT 1
+ });
+ return $row;
+}
+
1;
blob - 03f7e2317608d3e7621e8fcd0e1f89d0e4a7b1e5
blob + cb7c009d69ff505170d81ccb6a9cbeb1f46ef62f
--- lib/IRCNOW/ParseLog/Znc.pm
+++ lib/IRCNOW/ParseLog/Znc.pm
use lib qw(./lib);
use IRCNOW::Database;
+use base qq{IRCNOW::ParseLog};
# Date string to epock used in init_ip_xref
use Date::Parse;
sub new {
my $class = shift;
- my $self = { @_ };
-
- die "Must specify the database to load" unless defined $self->{database};
- die "Must specify the log file to load" unless defined $self->{zncLog};
-
- $self->{table} = 'zncLog';
- $self->{dbCreate} = qq{
+ # Let base class setup and bless our object
+ my $self = $class->SUPER::new( 'zncLog', @_ );
+ $self->set_dbCreate(qq{
CREATE TABLE $self->{table} (
id INTEGER PRIMARY KEY,
epoch integer,
address VARCHAR(50),
type VARCHAR(30)
);
- };
- $self->{fields} = [qw{id epoch timestring user address type}];
- if (not defined $self->{$self->{database}}) {
- $self->{$self->{database}} = IRCNOW::Database->new(database=>$self->{database});
- }
-
- bless $self, $class;
+ });
+ $self->set_fields(qw{id epoch timestring user address type});
+ $self->set_reqFields(qw{ epoch timestring user address type});
return $self;
}
-sub dbh {
- my $self=shift;
- my $dbh=$self->{dbh} || $self->{$self->{database}}->connectDB();
- if (not defined($dbh)) {
- die "failed to connect to $self->{database}";
- }
- $self->{dbh} = $dbh;
- return $dbh;
-}
-
-sub createTable {
- my $self=shift;
- my $dbh=$self->dbh();
- return $dbh->do($self->{dbCreate});
-}
-
-
-sub dbLastRecord {
- my $self = shift;
- my $dbh = $self->dbh();
- my $row = $dbh->selectrow_arrayref(qq{
- SELECT * FROM $self->{table} ORDER BY ID DESC LIMIT 1
- });
- return $row;
-}
-
sub parseLog {
my $self = shift;
my $lastEpoch = shift;
my $lastName = shift;
my $lastIP = shift;
+
+ # Last record defined so assume skipping
+ my $skip = defined $lastEpoch ? 1 : 0;
my @data;
+
open my $log, "<".$self->{zncLog} or die "Can't open " . $self->{zncLog};
while (my $line = <$log>) {
if( $line =~/\[(.*)\].*\[(.*)\] connected to ZNC from (.*)/) {
my $ip = $3;
my $type = 'Connected';
my $epoch = str2time($timeString);
- next if ((defined $lastEpoch and $epoch < $lastEpoch)
+ #Skip anything older then lastepoch
+ print "$skip, $epoch, $name, $ip\n";
+ if ( ($skip and $epoch == $lastEpoch)
and ($name eq $lastName)
- and ($ip eq $lastIP)
- );
+ and ($ip eq $lastIP) ) {
+ $skip = 0; # Found the last record, turn skipping off
+ next;
+ }
+ next if ($skip);
# Add this line to the data
push @data,[$epoch,$timeString,$name,$ip,$type];
}
}
- return @data;
+ return \@data;
}
blob - /dev/null
blob + 85105274f5dc46aa55c53a8c487327412d52b718 (mode 644)
--- /dev/null
+++ lib/IRCNOW/ParseLog.pm
+package IRCNOW::ParseLog;
+
+use strict;
+use warnings;
+
+sub new {
+ my $class = shift;
+ my $table = shift;
+ my @arguments = @_;
+ my $self = { @arguments };
+ $self->{TABLE} = $table;
+ die "Must specify the database to load" unless defined $self->{database};
+ die "Must specify the log file to load" unless defined $self->{zncLog};
+
+
+ bless $self, $class;
+ return $self;
+}
+
+sub set_dbCreate {
+ my $self=shift;
+ my $create=shift;
+ my $table=$self->{TABLE};
+ $self->{database}->{TABLES}->{$self->{TABLE}}->{dbCreate}=$create;
+}
+
+sub set_fields {
+ my $self=shift;
+ $self->{database}->{TABLES}->{$self->{TABLE}}->{fields}=[@_];
+}
+
+sub set_reqFields {
+ my $self=shift;
+ $self->{database}->{TABLES}->{$self->{TABLE}}->{reqFields}=[@_];
+}
+
+sub dbLastRecord {
+ my $self=shift;
+ return $self->{database}->dbLastRecord($self->{TABLE});
+}
+
+sub dbInsertRecord {
+ my $self=shift;
+ my $data=shift;
+ return $self->{database}->dbInsertRecord($self->{TABLE}, $data);
+}
+
+
+1;
blob - d874b9f33f431939b19e6a97d65a49aed30b890a
blob + c67b474a69aed2c49bb101bb3d1e67162277e74d
--- parseznc.pl
+++ parseznc.pl
use warnings;
use lib qw(./lib);
+use IRCNOW::Database;
use IRCNOW::ParseLog::Znc;
+my $botnowDB = IRCNOW::Database->new(dbpath=>'/var/www/botnow/botnow.db');
+
my $znclog = IRCNOW::ParseLog::Znc->new(
- database=>'/var/www/botnow/botnow.db',
+ database=>$botnowDB,
zncLog=>'/home/znc/home/znc/.znc/moddata/adminlog/znc.log',
);
use Data::Dumper;
my $lastRecord=$znclog->dbLastRecord() || [];
+my $data = $znclog->parseLog($lastRecord->[1],$lastRecord->[3],$lastRecord->[4]);
+print Dumper($data);
-print Dumper($znclog->parseLog($lastRecord->[1],$lastRecord->[3],$lastRecord->[4]));
+$znclog->dbInsertRecord($data);
+#print Dumper($znclog->parseLog($lastRecord->[1],$lastRecord->[3],$lastRecord->[4]));
#$znclog->createTable();