#!/usr/local/bin/perl -w # mvs-log-db.pl use DBI; use strict; use vars qw(%ENV @ARGV $VERSION); $VERSION = "0.06"; my $DEBUG = 0; # global variables my $mvs_dir = "$ENV{HOME}/mvs_reports"; my $db_dir = "${mvs_dir}/mvs_db"; my $table = "mvslog"; my $db_file = "${db_dir}/${table}.dbf"; # data point fields XBase stores in caps my @dpfields = qw( LOGDATE HOST IP NUMBER TYPE ); # the current working data point # contains keys: LOGDATE, HOST, IP, NUMBER, TYPE #my $dpoint = {}; # array of data points from the database my $dbdata = []; if ($#ARGV < 0) { die "\nUsage: $0 [ ... ]\n\n"; } if (not -d $mvs_dir) { dprint("created mvs_dir", $mvs_dir); mkdir $mvs_dir; } if (not -d $db_dir) { dprint("created db_dir", $db_dir); mkdir $db_dir; } my $dbh = DBI->connect("dbi:XBase:${db_dir}"); my ($sth, $sql, $rv); if (not -f $db_file) { create_table($dbh, $table); } $rv = load_dbdata($dbh, $table, $dbdata); dprint("rv=", $rv); my $line; while ($line = <>) { my $dpoint = {}; chomp $line; my @data = split /\s+/, $line; $dpoint->{LOGDATE} = join " ", @data[0..4]; $dpoint->{HOST} = transform_host($data[13]); $dpoint->{IP} = $data[6]; $dpoint->{FILE} = $data[8]; ($dpoint->{NUMBER}, $dpoint->{TYPE}) = get_file_info($dpoint->{FILE}); if ( (isa_number($dpoint->{NUMBER})) and (not isa_duplicate($dpoint, $dbdata)) ) { insert_dpoint($dbh, $table, $dpoint); push @{$dbdata}, $dpoint; } } #print "$0 done.\n"; # insert data point into the database sub insert_dpoint { my $dbh = shift; my $table = shift; my $dpoint = shift; my $sql = "insert into ${table}\n(" . join(', ', @dpfields) . ")\nvalues\n(" . join(', ', map { $dbh->quote($dpoint->{$_}) } @dpfields) . ")"; dprint("insert_dpoint sql=", $sql); my $sth = $dbh->prepare($sql); my $rv = $sth->execute; dprint("insert_dpoint rv=", $rv); return ($rv); } # get definition number and type if available sub get_file_info { my $file = shift; my $number = undef; my $type = undef; # strip path to file $file =~ s#^.+/([^/]+)$#$1#e; # check for each type if ($file =~ m/^\d{4}(\d{4})[.]upd$/i) { $number = $1; $type = "upd"; } elsif ($file =~ m/^sdat(\d{4})[.]exe$/i) { $number = $1; $type = "sdat"; } elsif ($file =~ m/^dat-(\d{4})[.]zip$/i) { $number = $1; $type = "dat"; } dprint("file=", $file, "number=", $number, "type=", $type); return ($number, $type); } sub load_dbdata { my $dbh = shift; my $table = shift; my $dbdata = shift; my $sql = "select LOGDATE, HOST, IP, NUMBER, TYPE " . "from ${table}"; dprint("load_dbdata sql=", $sql); my $sth = $dbh->prepare($sql); my $rv = $sth->execute; dprint("load_dbdata rv=", $rv); my $row_ref; while ($row_ref = $sth->fetchrow_hashref) { push @{$dbdata}, $row_ref; } return scalar @{$dbdata}; } # check for a mvs number sub isa_number { my $number = shift; if ($number =~ m/^\d{4}$/) { return 1; } return 0; } # check for duplicates sub isa_duplicate { my $dpoint = shift; my $dbdata = shift; my ($tempdp, $dpf); my $duplicate = 0; for $tempdp (@{$dbdata}) { my $different = 0; for $dpf (@dpfields) { if ($dpoint->{$dpf} ne $tempdp->{$dpf}) { $different = 1; } } if (not $different) { $duplicate = 1; last; } } return $duplicate; } sub transform_host { my $host = shift; $host =~ s/^Administrator\@//; $host =~ s/^SYSTEM\@//; $host =~ s/\@example\.com$//; $host =~ s/\@mcafeeb2b\.com$//; return $host; } # create table from db handle and table name sub create_table { my $dbh = shift; my $table = shift; my $sql = "create table ${table} (\n" . " LOGDATE varchar(25),\n" . " HOST varchar(50),\n" . " IP varchar(50),\n" . " NUMBER int,\n" . " TYPE varchar(5)\n" . ")"; dprint("create_table sql=", $sql); my $sth = $dbh->prepare($sql); my $rv = $sth->execute; dprint("create_table rv=", $rv); return $rv; } #sub date_to_unixtime {} # print debug info if $DEBUG is on sub dprint { if (not $DEBUG) { return; } my ($pkg, $file, $line, $sub, @others) = caller(1); print "${sub} ${line} : "; print join(' ', map { $_ || 'undef' } @_), "\n"; }