vipgrab.pl
上传用户:sy_wanhua
上传日期:2013-07-25
资源大小:3048k
文件大小:13k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

C/C++

  1. #!/usr/bin/perl
  2. # ====================================================================
  3. # The Vovida Software License, Version 1.0 
  4. # Copyright (c) 2000 Vovida Networks, Inc.  All rights reserved.
  5. # Redistribution and use in source and binary forms, with or without
  6. # modification, are permitted provided that the following conditions
  7. # are met:
  8. # 1. Redistributions of source code must retain the above copyright
  9. #    notice, this list of conditions and the following disclaimer.
  10. # 2. Redistributions in binary form must reproduce the above copyright
  11. #    notice, this list of conditions and the following disclaimer in
  12. #    the documentation and/or other materials provided with the
  13. #    distribution.
  14. # 3. The names "VOCAL", "Vovida Open Communication Application Library",
  15. #    and "Vovida Open Communication Application Library (VOCAL)" must
  16. #    not be used to endorse or promote products derived from this
  17. #    software without prior written permission. For written
  18. #    permission, please contact vocal@vovida.org.
  19. # 4. Products derived from this software may not be called "VOCAL", nor
  20. #    may "VOCAL" appear in their name, without prior written
  21. #    permission of Vovida Networks, Inc.
  22. # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED
  23. # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  24. # OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND
  25. # NON-INFRINGEMENT ARE DISCLAIMED.  IN NO EVENT SHALL VOVIDA
  26. # NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES
  27. # IN EXCESS OF $1,000, NOR FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
  28. # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  29. # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  30. # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  31. # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  32. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  33. # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  34. # DAMAGE.
  35. # ====================================================================
  36. # This software consists of voluntary contributions made by Vovida
  37. # Networks, Inc. and many individuals on behalf of Vovida Networks,
  38. # Inc.  For more information on Vovida Networks, Inc., please see
  39. # <http://www.vovida.org/>.
  40. # $Id: vipgrab.pl,v 1.9 2000/08/12 01:25:15 bogawa Exp $
  41. # simple wrapper for ipgrab.
  42. # you should be able to use it using the same command line you would
  43. # use for ipgrab, e.g.
  44. #            ipgrab port 5060 udp
  45. # should be the same as
  46. #            ./vipgrab.pl port 5060 udp
  47. # This program requires perl-Tk .
  48. use Tk;
  49. use Tk::Balloon;
  50. use Data::Dumper;
  51. my $pref_file = "$ENV{HOME}/.vipgrabrc";
  52. my $mw = MainWindow->new;
  53. &main;
  54. sub set_relative_position {
  55.     local($old_toplevel, $new_toplevel, $delta_x, $delta_y) = @_;
  56.     my $old_geometry, $new_geometry, $x_pos, $y_pos;
  57.     $old_geometry = $old_toplevel->geometry();
  58.     if($old_geometry =~ /^=?((d+)x(d+))?(([+-]d+)([+-]d+))?$/) {
  59. $x_pos = $5;
  60. $y_pos = $6;
  61. if($x_pos =~ /([+-])(d+)/) {
  62.     $x_sign = $1;
  63.     $real_x_pos = $2;
  64. }
  65. if($y_pos =~ /([+-])(d+)/) {
  66.     $y_sign = $1;
  67.     $real_y_pos = $2;
  68. }
  69. $x_pos = $x_sign . ($delta_x + $real_x_pos);
  70. $y_pos = $y_sign . ($delta_y + $real_y_pos);
  71. $new_toplevel->geometry($x_pos . $y_pos);
  72.     } else {
  73. print $old_geometry, "n";
  74.     }
  75. }
  76. sub preference_dialog {
  77.     if(!Exists($prefs)) {
  78. $prefs = $mw->Toplevel();
  79. &set_relative_position($mw, $prefs, 50, 50);
  80. # using transient means that smart window managers won't bury this
  81. # window under others, which is usually a good thing
  82. $prefs->transient($mw); 
  83. $prefs->title("vipgrab Preferences");
  84. $scrollback_frame = $prefs->Frame()->pack();
  85. $scrollback_frame->Label(-text=>"Number of scrollback lines: ")
  86.   ->pack(side=>'left');
  87. $scrollback_frame->Entry(-textvariable=>$preferences{"scrollback"})
  88.   ->pack(side=>'left');
  89. $log_frame = $prefs->Frame()->pack();
  90. $log_frame->Label(-text=>"Log filename: ")
  91.   ->pack(side=>'left');
  92. $log_frame->Entry(-textvariable=>$preferences{"logfile"})
  93.   ->pack(side=>'left');
  94. $log_frame->Checkbutton(-text=>"Log to File", 
  95. -variable=>$preferences{use_logfile})
  96.   ->pack();
  97. $command_frame = $prefs->Frame()->pack();
  98. $command_frame->Label(-text=>"ipgrab command line: ")
  99.   ->pack(side=>'left');
  100. $command_frame->Entry(-textvariable=>$preferences{"ipgrab_command"})
  101.   ->pack(side=>'left');
  102. $prefs->Checkbutton(-text=>"Move To End", 
  103.     -variable=>$move_to_end)
  104.   ->pack();
  105. $prefs->Checkbutton(-text=>"SIP Tooltips", 
  106.     -variable=>$preferences{use_sip_tooltips},
  107.     -command=>&update_tooltips)
  108.   ->pack();
  109. $prefs->Button(-text=>"Close", 
  110.        -command=> sub { $prefs->withdraw })
  111.   ->pack();
  112.     } else {
  113. $prefs->deiconify();
  114. $prefs->raise();
  115.     }
  116. }
  117. sub update_tooltips {
  118.     if($preferences{use_sip_tooltips}) {
  119. $sipBalloon->attach($listbox, 
  120.     -statusmsg => "Use Button 1 to view the message in the main window, or Button 2 to open a new window",
  121.     -balloonmsg => $list_balloonmsg,
  122.     -balloonposition => 'mouse',
  123.     -postcommand => sub { 
  124. $list_balloonmsg = 
  125.   $summaryList[$listbox->index("@$data")];
  126.     },
  127.     -motioncommand => sub { 
  128. my $x = $listbox->pointerx - $listbox->rootx;
  129. my $y = $listbox->pointery - $listbox->rooty;
  130. $data = "$x,$y";
  131.     }
  132.    );
  133.     } else {
  134. $sipBalloon->detach($listbox);
  135.     }
  136. }
  137. sub quit {
  138.     &write_preferences;
  139.     exit;
  140. }
  141. sub start {
  142.     if(!$ipgrab_running) {
  143. my $ipgrab = $preferences{"ipgrab_command"};
  144. foreach(@ARGV) {
  145.     $ipgrab .= " ". $_;
  146. }
  147. open(IPGRAB, "$ipgrab |") || die "can't run $ipgrab!n";
  148. open(LOGFILE, ">>$preferences{logfile}") || die "can't open logfile $preferences{logfile}n";
  149. $mw->fileevent(IPGRAB, 'readable', [&insert_text]);
  150. $b->attach($start_button, 
  151.    -balloonmsg => "Start ipgrab", 
  152.    -statusmsg => "Start ipgrab (currently running)");
  153. $ipgrab_running = 1;
  154.     }
  155. }
  156. sub stop {
  157.     if($ipgrab_running) {
  158. close(IPGRAB);
  159. close(LOGFILE);
  160. $b->attach($start_button, 
  161.    -balloonmsg => "Start ipgrab", 
  162.    -statusmsg => "Start ipgrab (currently NOT running)");
  163. $ipgrab_running = 0;
  164.     }
  165. }
  166. sub update_if_diff {
  167.     if($old_packet ne $packet) {
  168. &update_messages(0);
  169. $old_packet = $packet;
  170.     }
  171. }
  172. sub update_messages {
  173.     local($finished) = @_;
  174.     if($source) {
  175. $seq = sprintf("%5.5d", $sequence_number);
  176. $x = "$seq: $source:$source_port -> $dest:$dest_port";
  177. $packetList[$seq - $first_number] = $x . "n" . $packet;
  178. $summaryList[$seq - $first_number] = $summary;
  179. if($have_inserted) {
  180.     $listbox->delete('end');
  181. }
  182. $listbox->insert('end', $x);
  183. $have_inserted = 1;
  184. if($move_to_end) {
  185.     $listbox->yview('moveto', $listbox->index('end'));
  186. }
  187.     }
  188.     if($finished) {
  189. $have_inserted = 0;
  190. $packet = "";
  191. $summary = "";
  192. undef(%parseState);
  193. $sequence_number++;
  194. while(($sequence_number - $first_number) 
  195.       > $preferences{"scrollback"}) {
  196.     shift(@packetList);
  197.     shift(@summaryList);
  198.     $first_number++;
  199.     $listbox->delete(0);
  200. }
  201.     }
  202. }
  203. sub insert_text {
  204.     if($_ = <IPGRAB>) {
  205. # start parsing
  206. if($preferences{use_logfile}) {
  207.     print LOGFILE $_;
  208. }
  209. $packet .= $_;
  210. chomp;
  211. if(/^=================================================================$/) {
  212.     # start of a packet
  213.     &update_messages(1) if ($seq);
  214.     $state = $StartOfPacket;
  215. } elsif(/^-----/) {
  216.     # this is buggy, but I'm not entirely sure why.
  217.     # move forward to next state
  218.     if($state == $StartOfPacket) {
  219. # print "sop->soenn";
  220. $state = $StartOfEnet;
  221.     } elsif($state == $StartOfEnet) {
  222. # print "soen->eoenn";
  223. $state = $EndOfEnet;
  224.     } elsif($state == $EndOfEnet) {
  225. # print "eoen->soipn";
  226. $state = $StartOfIp;
  227.     } elsif($state == $StartOfIp) {
  228. # print "soip->eoipn";
  229. $state = $EndOfIp;
  230.     } elsif($state == $EndOfIp) {
  231. # print "eoip->soun";
  232. $state = $StartOfUdp;
  233.     }
  234. } else {
  235. # because the above stuff seems buggy, skip it.  it works fine without
  236. # it anyway.
  237. # elsif($state == $StartOfIp) {
  238. # print "xxxn";
  239.     if(/Source address/) {
  240. s/Source addresss+//;
  241. $source = $_;
  242.     } elsif(/Destination address/) {
  243. s/Destination addresss+//;
  244. $dest = $_;
  245.     }
  246.     if(/SIP Headers/) {
  247. $parseState{sip_header} = 1;
  248.     }
  249.     if($parseState{sip_header}) {
  250. $a = $_;
  251. if($a =~ s/^Header:s+//) {
  252.     $b = sprintf("%-80.80sn", $a);
  253.     $summary .= $b;
  254. }
  255.     }
  256. # } elsif($state == $StartOfUdp) {
  257. #     print "aaan";
  258.     if(/Source port:/) {
  259. # print "sp: $_n";
  260. s/Source port:s+//;
  261. /^([0-9]+)/;
  262. $source_port = $_;
  263. # $source_port = $1;
  264.     } elsif(/Destination port/) {
  265. # print "dp: $_n";
  266. s/Destination port:s+//;
  267. /^([0-9]+)/;
  268. $dest_port = $_;
  269. # $dest_port = $1;
  270.     }
  271. }
  272.     } else {
  273. $mw->fileevent(IPGRAB, 'readable', "");
  274.     }
  275. }
  276. sub open_new_message {
  277.     my $message = $_[0];
  278.     $message =~ /^(d+)/;
  279.     my $msgNumber = $1;
  280.     my $new_message = $mw->Toplevel();
  281.     $new_message->title("Message #$msgNumber");
  282.     $temp_text = $new_message->Scrolled("Text", 
  283. -width => 80, 
  284. -height =>25)
  285.       ->pack(-expand => 1);
  286.     $new_message->Button(-text=> "Close", 
  287.  -command => [ sub { $_[0]->destroy;}, $new_message ])
  288.       ->pack();
  289.     $temp_text->insert('1.0', $message);
  290. }
  291. sub write_preferences { 
  292.     open(PREFS, ">$pref_file")
  293.       or die "can't write preferences file $pref_file";
  294.     print PREFS Data::Dumper->Dump([%preferences], [qw(*preferences)]);
  295.     close(PREFS);
  296. }
  297. # read the preferences, or if there are none, create a default
  298. # preferences file in $ENV{HOME}/.vipgrabrc
  299. sub read_preferences { 
  300.     my $pref_data;
  301.     my $prefs_ok;
  302.     if(-f $pref_file) {
  303. open(PREFS, $pref_file) 
  304.   or die "can't read preferences file $pref_file";
  305. while(<PREFS>) {
  306.     $pref_data .= $_;
  307. }
  308. close(PREFS);
  309. $prefs_ok = eval $pref_data;
  310.     } 
  311.     if(!defined($prefs_ok)) {
  312. $initial_status = "unable to read $pref_file, using default values";
  313. # use default values
  314. $preferences{"ipgrab_command"} = "sudo /sbin/ipgrab";
  315. $preferences{"logfile"} = "vipgrab.log";
  316. $preferences{"scrollback"} = 100; # no more than 100 items in queue
  317. $preferences{use_logfile} = 1;
  318. $preferences{use_sip_tooltips} = 1;
  319.     }
  320. }
  321. sub main {
  322.     $StartOfPacket = 1;
  323.     $StartOfEnet = 2;
  324.     $EndOfEnet = 3;
  325.     $StartOfIp = 4;
  326.     $EndOfIp = 5;
  327.     $StartOfUdp = 6;
  328.     &read_preferences();
  329.     
  330.     
  331.     if(($< != 0) && ($> != 0)) {
  332. # need root password to run
  333. print STDERR "warning: you are not root!n";
  334. #    exit;
  335.     }
  336.     
  337.     $first_number = 0;
  338.     
  339.     
  340.     print $ipgrab, "n";
  341.     
  342.     $mw->title( "vipgrab");
  343.     
  344.     $menu_frame = $mw->Frame(-relief=>'raised', 
  345.      -borderwidth=>2)
  346.       ->pack(-expand=> 1, -fill => x);
  347.     $menu_frame->Menubutton(-text => "File", 
  348.     -menuitems=> [ [ "command" => "Quit", 
  349.      -command => &quit ]]
  350.    )
  351.       ->pack(-side=> 'left');
  352.     $speedbar_frame = $mw->Frame()
  353.       ->pack(-expand=> 1, -fill=>'x');
  354.     $quit_button = $speedbar_frame->Button(-text=>"Quit", 
  355.    -command=>&quit)
  356.       ->pack(side=>'left');
  357.     $start_button = $speedbar_frame->Button(-text=>"Start", 
  358.     -command=>&start)
  359.       ->pack(side=>'left');
  360.     $stop_button = $speedbar_frame->Button(-text=>"Stop", 
  361.    -command=>&stop)
  362.       ->pack(side=>'left');
  363.     $prefs_button = $speedbar_frame->Button(-text=>"Prefs", 
  364.     -command=>&preference_dialog)
  365.       ->pack(side=>'left');
  366.     
  367.     $listbox = $mw->Scrolled("Listbox", 
  368.      -scrollbars=>"e", 
  369.      -width=>60, 
  370.      -selectmode=>"single")->pack();
  371.     
  372.     $text = $mw->Scrolled("Text", 
  373.   -width => 80, 
  374.   -height =>25)
  375.       ->pack(-expand => 1);
  376.     $status_font = $mw->fontCreate(-size=>8);
  377.     $status_bar_widget = $mw->Label(-anchor=>'w', 
  378.     -width=>90, 
  379.     -font=>"helvetica 10 normal",
  380.     -justify=>"left", 
  381.     -relief=>"sunken", 
  382.     -text => $initial_status)
  383.       ->pack(-expand=>1, -anchor=>'w');
  384.     
  385.     # balloon fun!
  386.     $b = $mw->Balloon(-statusbar => $status_bar_widget, 
  387.       -background=>"#ffff80");
  388.     
  389.     $sipBalloon = $mw->Balloon(-font=>'courier',  
  390.        -statusbar => $status_bar_widget, 
  391.        -background=>"#e0e0ff");
  392.     
  393.     $b->attach($quit_button, 
  394.        -balloonmsg => "Quit program", 
  395.        -statusmsg => "Quit the program");
  396.     $b->attach($stop_button, 
  397.        -msg => "Stop ipgrab");
  398.     $b->attach($prefs_button, 
  399.        -msg => "Change preferences for vipgrab.pl");
  400.     
  401. #     $b->attach($listbox, 
  402. #         -balloonposition => 'mouse',
  403. #         -msg => "Use Button 1 to view the message in the main window, or Button 2 to open a new window",
  404. #        );
  405.     
  406.     $listbox->bind('<Button-1>', 
  407.    sub {
  408.        $text->delete("1.0", 'end');
  409.        $text->insert('1.0', 
  410.      $packetList[$listbox->curselection()]);
  411.    }
  412.   );
  413.     $listbox->bind('<Button-2>', 
  414.    [ sub {
  415.        $data = "$_[1],$_[2]";
  416.        print $data, "n";
  417.        $myIndex = $listbox->index("@$data");
  418.        if($myIndex >=0 ) {
  419.    &open_new_message($packetList[$myIndex]);
  420.        }
  421.    }, Ev('x'), Ev('y') ]
  422.   );
  423.     &start();
  424.     $mw->repeat(100, &update_if_diff);
  425.     &update_tooltips;
  426.     MainLoop;
  427. }
  428. __END__