Wireshark-dev: Re: [Wireshark-dev] continuous packet capture
From: Brian Daniel <[email protected]>
Date: Tue, 17 Mar 2009 13:19:29 -0400
Is your goal to output directly from wireshark into a MySQL database instead of a .cap file? Then be able to generate .cap files out of the database based on date, time range, and other standard filters. Keep us posted on your progress.
For now, I have to capture 40 .cap files each at 512 Meg and tell it to rotate. When making 041.cap the 001.cap goes away, etc... But the problem is no one has time nor do they want to analyze all that data before it goes away. We want to be able to have a packet capture available if a user says they had a problem at (specified date and time) then I'll make a copy of the files related to that date & time range and analyze them. Yes, I can do this already with the existing wireshark but a database would be nice.
Once the database grows to a specified size, will you be able to automatically drop oldest packets to make room for the new ones. And the big question: while you're deleting oldest mysql records, will "zero" newest capture packets get dropped or not be added to the database?
Good Luck. Cool Project!
On Thu, Mar 5, 2009 at 2:36 PM, Jon Polacheck <[email protected]> wrote:
I am working on a continuous packet capture application (think
Infinistream, Gigastor, NetVCR) written in Perl (only because that's
what I know). Here is what I have so far.

This works (or seems to).  More optimization possible by removing
unnecessary trailing spaces from each packet hexdump.  Hacked
Data::Hexdumper some, more probably doable.

Used mkfifo to create the named pipe.  Perl sees it as a disk file
(that I called qtfifo).  ENQUE.pl dumps packet hexdumps to the fifo.
DEQUE.pl reads lines from the fifo.  /^0000 / acts as the delimiter.
mysql compression worked with the standard OpenSuSE install, no
recompiling or other mucking about necessary.

Lines used for debugging marked as such.


use Net::Pcap;
use Data::Hexdumper qw(hexdump);

$dev = "eth0";

# used a 50 packet cap file to make sure what came out matched what went in
#$dump = "ip.cap";
#$pcap = Net::Pcap::open_offline($dump, \$err) or die "Can't read
'$dump': $err\n";

# live, real-time feed
$pcap = Net::Pcap::open_live($dev, 1514, 1, 0, \$err);

Net::Pcap::loop($pcap, -1, \&process_pkt, ""); # <- subroutine call

sub process_pkt {
   open(QT, "> qtfifo");
# $_[2] is the third element of the default array "@_" which was created
# by the subroutine call "&process_pkt"
   my $pkt=$_[2];
   $results = hexdump( data ="" $pkt
       , number_format => 'C',
   print QT $results;
    $i++; # debug
    &stop_run if $i > 100; #debug

# all debug below
sub stop_run {
 print "stop_run\n";
 open(QT, "> qtfifo");
 print QT "\nx\n";
 print "enque ended\n";


use Time::HiRes ( nanosleep );
use DBI;


$dsn = "DBI:mysql:database=$database;host=$hostname;port=$port";

$dbh = DBI->connect($dsn,
   {'RaiseError' => 1});

# call the Net::Packet collector script
system(q{perl ENQUE.pl&});

open(EQT, " < qtfifo");

$i = 0; # debug
$pc = 0; # debug

while(1) {
   $i++; # debug
   $line = readline(EQT);
   if ($line =~ /^0000 / ) {
       $dbh->do(qq{INSERT INTO cpc VALUES ( compress("$pkt"))});
       $pc++ if defined($pkt); # debug
       print "packet $pc:\n$pkt\n" if defined($pkt); # debug
       $pkt .= $line;
   } else {
       $pkt .= $line;
       &theend if $pkt =~ /x/; # debug
   nanosleep(1); # would not work without this!

# all debug below
sub theend {
   print "$i loops\ndeque ended\n";

This generated a cap file that looks just fine in Wireshark.

mysql -Br -D cpc -e "select uncompress(packet) from cpc;" | text2pcap -

Hope you find this of interest.

Jon Polacheck

Sent via:    Wireshark-dev mailing list <[email protected]>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
            mailto:[email protected]?subject=unsubscribe