I'm trying to figure out the best way to share objects. I've got a etst
program that has 2 threads.
Thread 1:
Look for SYN packets and create a Packet object
Add that object to a list.
Thread 2:
Look through list looking for any Packet objects
Display to stdout the packet.
I am not getting the sharing part done write. In order to share Packet
do I have to create the constructor like I did? What is the best
practice for what I'm trying to do?
--- [ Cut Here ] ---------------------------------
use Net::PcapUtils;
use NetPacket::Ethernet;
use NetPacket::IP;
use NetPacket::TCP;
use threads;
use threads::shared;
use Data::Dumper;
use strict;
{
package Packet;
sub new {
shift;
my ($v1, $v2 ) = @_;
my $pkt;
threads::shared::share($pkt);
$pkt = &threads::shared::share({});
bless $pkt, 'Packet'; # Tag object with pkg name
$pkt->{'packet'} = $v1;
$pkt->{'timestamp'} = $v2;
return $pkt; # Return object
}
sub get_timestamp {
my $self=shift;
return $self->{'timestamp'};
}
sub get_packet {
my $self= shift;
return $self->{'packet'};
}
}
$| = 1;
my @objs : shared = ();
my $prog = "tcp[13] = 2 and src net not 192.168.2";
sub get_timestamp {
my $ti = shift;
$ti = time() unless $ti;
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
localtime($ti);
my $text = sprintf("%02d-%02d %02d:%02d:%02d",
($mon+1), $mday, $hour, $min, $sec);
return $text;
}
sub usleep {
my $time = shift;
$time = $time * 0.000001;
select(undef, undef, undef, $time);
return;
}
sub now {
return time();
}
sub redir {
my $file = shift;
return unless $file;
open STDOUT, ">> $file" or return;
open STDERR, ">&STDOUT";
open STDIN, "</dev/null";
return;
}
sub resolv {
my $addr = shift;
my $host = `host $addr`;
chomp $host;
return $addr if $host =~ m/not found/;
return $addr unless $host =~ m/pointer\s(.+?)\.$/;
$addr = $1;
return $addr;
}
sub process_thread {
while(1) {
# We do not want to consume much CPU and
# we do not want to sleep too long. Just
# sleep a bit then test again.
while($#objs == -1 ) { usleep(250000); }
# Get the packet off the list and unpack the time
my %p = shift @objs;
my $pkt = $p->get_packet();
my $ti = $p->get_timestamp();
#my ($ti, $pkt) = unpack "Ia*", $pkt;
# get the source IP adrress
my $src_ip = NetPacket::IP->decode(
NetPacket::Ethernet::strip($pkt))->{src_ip};
# I want incoming
next if $src_ip =~ m/209\.168\.246\.233/;
my $pt = NetPacket::TCP->decode(
NetPacket::IP::strip(
NetPacket::Ethernet::strip($pkt)));
print get_timestamp($ti)." SYN ".resolv($src_ip)."($src_ip) ->
$pt->{'dest_port'}\n";
}
}
sub catch {
my ($arg,$hdr,$pkt) = @_ ;
#my $data = pack "Ia*", now(), $pkt;
push @objs, Packet->new($pkt, now());
}
sub main {
#my $pid = fork();
#return 0 if $pid;
# in Child
#redir "/opt/SAM/logs/syn.log";
my $pthr = threads->new(\&process_thread);
Net::PcapUtils::loop(\&catch, FILTER=> $prog);
return 0;
}
exit main;