Well here is what I have so far to get the previous day, the current day,
next day, and this works fine but could return 25 results, I am not even
sure how to go about getting only the one that the offense falls within.
The database entries have a date/time that the user stopped having that
IP. The start time is gotten by subtracting the session_time (amount of
time online in seconds), and other information relative to the radius
logs.
The scenario is : we get complaint that joespammer is spamming, from ip
111.222.333.444 on mar 3 2005 at 15:01:05. We run this script to find out
what users had that IP on Mar 3 and the previous, and next day, then find
specific user by human eye that had that ip during the specified time.
I want to script the finding who had the ip based on start and stop time
and the time of spam.
Thank you very much for you help,
#!/usr/bin/perl
use DBI;
use Date::Manip;
# Get parameters from the user.
print "Please enter the date of the offense (ex: yyyy-mm-dd):\n";
our $offdate = <STDIN>;
chop $offdate;
our @dayformat = "%Y-%m-%d";
our $prevday = DateCalc("$offdate","- 1 day",\$err);
$prevday = UnixDate($prevday, @dayformat);
our $nextday = DateCalc("$offdate","+ 1 day",\$err);
$nextday = UnixDate($nextday, @dayformat);
print "Please enter the IP address of the offender (ex:
111.111.111.111)\n";
our $ip = <STDIN>;
chop $ip;
print "Please enter the affiliate code (ex: VZD / PRTC )\n";
our $customer = <STDIN>;
chop $customer;
# Get matching information from the database.
if ( ($customer eq "PRTC") || ($customer eq "prtc") ) {
&PrintPRTCTable;
} elsif ( ($customer eq "VZD") || ($customer eq "vzd") ) {
&PrintVZDTable;
} else {
print "Something went horribly wrong!!";
}
### Sub to print PRTC Table ###
sub PrintPRTCTable {
my @row;
my $rsltid;
my $rsltdate;
my $rslttime;
my $rsltrecord_type;
my $rsltfullname;
my $rsltframed_ip_address;
my $tableline;
my $rsltuser_name;
my $rsltrecord_time;
my $rsltevent_timestamp;
my $sth;
my $start_time;
my $stop_time;
my $start_time_secs;
my $session_time;
my $dbh = DBI->connect('DBI:mysql:database_name','user','password') or
die("Cannot Connect: $DBI::errstr");
### Start 6 way union ###
my $sql = qq(
(
Select ALL PRTC_DIALUP.Id, PRTC_DIALUP.Date, PRTC_DIALUP.Time,
PRTC_DIALUP.Record_Type, PRTC_DIALUP.Full_Name,
PRTC_DIALUP.Framed_IP_Address, PRTC_DIALUP.Acct_Session_Time
from PRTC_DIALUP
Where PRTC_DIALUP.Framed_IP_Address = '$ip'
AND PRTC_DIALUP.Date = '$offdate'
)
UNION
(
Select ALL PRTC_DIALUP.Id, PRTC_DIALUP.Date, PRTC_DIALUP.Time,
PRTC_DIALUP.Record_Type, PRTC_DIALUP.Full_Name,
PRTC_DIALUP.Framed_IP_Address, PRTC_DIALUP.Acct_Session_Time
from PRTC_DIALUP
Where PRTC_DIALUP.Framed_IP_Address = '$ip'
AND PRTC_DIALUP.Date = '$prevday'
)
UNION
(
Select ALL PRTC_DIALUP.Id, PRTC_DIALUP.Date, PRTC_DIALUP.Time,
PRTC_DIALUP.Record_Type, PRTC_DIALUP.Full_Name,
PRTC_DIALUP.Framed_IP_Address, PRTC_DIALUP.Acct_Session_Time
from PRTC_DIALUP
Where PRTC_DIALUP.Framed_IP_Address = '$ip'
AND PRTC_DIALUP.Date = '$nextday'
)
UNION
(
Select ALL PRTC_DSL.Id, PRTC_DSL.Date, PRTC_DSL.Time,
PRTC_DSL.Record_Type, PRTC_DSL.Full_Name, PRTC_DSL.Framed_IP_Address,
PRTC_DSL.Acct_Session_Time
from PRTC_DSL
Where PRTC_DSL.Framed_IP_Address = '$ip'
and PRTC_DSL.Date = '$offdate'
)
UNION
(
Select ALL PRTC_DSL.Id, PRTC_DSL.Date, PRTC_DSL.Time,
PRTC_DSL.Record_Type, PRTC_DSL.Full_Name, PRTC_DSL.Framed_IP_Address,
PRTC_DSL.Acct_Session_Time
from PRTC_DSL
Where PRTC_DSL.Framed_IP_Address = '$ip'
and PRTC_DSL.Date = '$prevday'
)
UNION
(
Select ALL PRTC_DSL.Id, PRTC_DSL.Date, PRTC_DSL.Time,
PRTC_DSL.Record_Type, PRTC_DSL.Full_Name, PRTC_DSL.Framed_IP_Address,
PRTC_DSL.Acct_Session_Time
from PRTC_DSL
Where PRTC_DSL.Framed_IP_Address = '$ip'
and PRTC_DSL.Date = '$nextday'
)
ORDER BY Full_Name, Time;
);
### End 6 way union ###
#pass sql query to database handle...
$sth = $dbh->prepare($sql);
#execute the query...
$sth->execute();
format PRTC_TOP =
Id | Start Time | Stop Time | Full Name
| IP address
.
while(@row = $sth->fetchrow_array) {
$rsltid = $row[0];
$rsltdate = $row[1];
$stop_time = $row[2];
$rsltrecord_type = $row[3];
$rsltfullname = $row[4];
s/^\s+//, s/\s+$// for $rsltfullname;
$rsltframed_ip_address = $row[5];
$session_time = $row[6];
$start_time = DateCalc("$rsltdate $stop_time","- $session_time
seconds",\$err);
my @format = "%Y-%m-%d %H:%M:%S";
$start_time = UnixDate($start_time, @format);
format PRTCOUT =
@<<<<<<<<< @<<<<<<<<<<<<<<<<<<< @<<<<<<<<< @<<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<
$rsltid, $start_time, $rsltdate $stop_time, $rsltfullname,
$rsltframed_ip_address
.
$^ = "PRTC_TOP";
$~ = "PRTCOUT";
write;
}
}
### Sub to Print VZD Table ###
sub PrintVZDTable {
my @row;
my $rsltid;
my $rsltdate;
my $rslttime;
my $rsltrecord_type;
my $rsltfullname;
my $rsltframed_ip_address;
my $tableline;
my $rsltuser_name;
my $rsltrecord_time;
my $rsltevent_timestamp;
my $sth;
my $start_time;
my $stop_time;
my $start_time_secs;
my $session_time;
my $rsltdslam;
my $rsltport;
my @rsltDSLinfo;
my $dbh = DBI->connect('dbi:mysql:database_name','user','password') or
die("Cannot Connect: $DBI::errstr");
### Start 6 way union ###
my $sql = qq(
(
Select ALL VZD_DIALUP.Id, VZD_DIALUP.Date, VZD_DIALUP.Record_Time,
VZD_DIALUP.User_Name, VZD_DIALUP.Framed_IP_Address,
VZD_DIALUP.Acct_Session_Time, VZD_DIALUP.Acct_Session_Id
from VZD_DIALUP
Where VZD_DIALUP.Framed_IP_Address = '$ip'
AND VZD_DIALUP.Date = '$offdate'
)
UNION
(
Select ALL VZD_DIALUP.Id, VZD_DIALUP.Date, VZD_DIALUP.Record_Time,
VZD_DIALUP.User_Name, VZD_DIALUP.Framed_IP_Address,
VZD_DIALUP.Acct_Session_Time, VZD_DIALUP.Acct_Session_Id
from VZD_DIALUP
Where VZD_DIALUP.Framed_IP_Address = '$ip'
AND VZD_DIALUP.Date = '$prevday'
)
UNION
(
Select ALL VZD_DIALUP.Id, VZD_DIALUP.Date, VZD_DIALUP.Record_Time,
VZD_DIALUP.User_Name, VZD_DIALUP.Framed_IP_Address,
VZD_DIALUP.Acct_Session_Time, VZD_DIALUP.Acct_Session_Id
from VZD_DIALUP
Where VZD_DIALUP.Framed_IP_Address = '$ip'
AND VZD_DIALUP.Date = '$nextday'
)
UNION
(
Select ALL VZD_DSL.Id, VZD_DSL.Date, VZD_DSL.Record_Time,
VZD_DSL.User_Name, VZD_DSL.Framed_IP_Address, VZD_DSL.Acct_Session_Time,
VZD_DSL.Acct_Session_Id
from VZD_DSL
Where VZD_DSL.Framed_IP_Address = '$ip'
and VZD_DSL.Date = '$offdate'
)
UNION
(
Select ALL VZD_DSL.Id, VZD_DSL.Date, VZD_DSL.Record_Time,
VZD_DSL.User_Name, VZD_DSL.Framed_IP_Address, VZD_DSL.Acct_Session_Time,
VZD_DSL.Acct_Session_Id
from VZD_DSL
Where VZD_DSL.Framed_IP_Address = '$ip'
and VZD_DSL.Date = '$prevday'
)
UNION
(
Select ALL VZD_DSL.Id, VZD_DSL.Date, VZD_DSL.Record_Time,
VZD_DSL.User_Name, VZD_DSL.Framed_IP_Address, VZD_DSL.Acct_Session_Time,
VZD_DSL.Acct_Session_Id
from VZD_DSL
Where VZD_DSL.Framed_IP_Address = '$ip'
and VZD_DSL.Date = '$nextday'
)
ORDER BY User_Name, Record_Time;
);
### End 6 way union ###
#pass sql query to database handle...
$sth = $dbh->prepare($sql);
#execute the query...
$sth->execute();
format VZD_TOP =
Id | Start Time | Stop Time | Full Name
| IP address | DSLAM | PORT
.
while(@row = $sth->fetchrow_array) {
$rsltid = $row[0];
$rsltdate = $row[1];
$rsltrecord_time = $row[2];
$rsltuser_name = $row[3];
s/^\s+//, s/\s+$// for $rsltuser_name;
$rsltframed_ip_address = $row[4];
$session_time = $row[5];
if($row[6] =~ /\//){
@rsltDSLinfo = split(/\//, $row[6]);
$rsltdslam = $rsltDSLinfo[0];
$rsltport = $rsltDSLinfo[2];
}else{
$rsltdslam = "";
$rsltport = "";
}
$start_time = DateCalc("$rsltdate $rsltrecord_time","-
$session_time seconds",\$err);
my @format = "%Y-%m-%d %H:%M:%S";
$start_time = UnixDate($start_time, @format);
format VZDOUT =
@<<<<<<<<< @<<<<<<<<<<<<<<<<<<< @<<<<<<<<< @<<<<<<<<<<
@<<<<<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<< @<<<<<<<< @<<<<<
$rsltid, $start_time, $rsltdate $rsltrecord_time, $rsltuser_name,
$rsltframed_ip_address, $rsltdslam, $rsltport
.
$^ = "VZD_TOP";
$~ = "VZDOUT";
write;
}
}
Chris Hood�
-----Original Message-----
From: Jay Savage [mailto:[EMAIL PROTECTED]
Sent: Tuesday, April 19, 2005 10:57 AM
To: Christopher L. Hood; beginners perl
Subject: Re: Find a specific record based on time
On 4/19/05, [EMAIL PROTECTED]
<[EMAIL PROTECTED]> wrote:
> Ok, basically I have a list of start times, stop times, usernames, and
> ip's in a database, I currently have code in place that will take in a
> date and ip address and return a list of people that had that IP
address,
> with the time that they acquired the ip and the time that they released
> the ip.
>
> What I need to do is input a date & time and find out the exact user
that
> had the ip address at that time.
>
> So I have tried Date::Manip and it does most of the work for me for my
> other calculations but it doesn't seem to give me a way to find out
what
> I need.
>
> Any ideas, or point to a better module to use would be great.
>
> Chris Hood
>
Well, what does your current code to do this look like, and where is
it going wrong for you?
--jay
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>