File Coverage

blib/lib/Net/Packet/Env.pm
Criterion Covered Total %
statement 7 9 77.7
branch n/a
condition n/a
subroutine 3 3 100.0
pod n/a
total 10 12 83.3


line stmt bran cond sub pod time code
1             #
2             # $Id: Env.pm,v 1.2.2.8 2006/06/04 13:45:18 gomor Exp $
3             #
4             package Net::Packet::Env;
5 28     28   172 use strict;
  28         63  
  28         721  
6 28     28   139 use warnings;
  28         55  
  28         1732  
7              
8             require Exporter;
9             require Class::Gomor::Array;
10             our @ISA = qw(Exporter Class::Gomor::Array);
11             our @EXPORT_OK = qw($Env);
12              
13 28     28   24792 use Net::Libdnet;
  0            
  0            
14             require Net::IPv6Addr;
15              
16             our @AS = qw(
17             dev
18             ip
19             ip6
20             mac
21             desc
22             dump
23             err
24             errString
25             noFrameAutoDesc
26             noFrameAutoDump
27             noDumpAutoSet
28             noDescAutoSet
29             _dnet
30             );
31             our @AO = qw(
32             debug
33             );
34             __PACKAGE__->cgBuildIndices;
35             __PACKAGE__->cgBuildAccessorsScalar(\@AS);
36              
37             no strict 'vars';
38              
39             our $Env = __PACKAGE__->new;
40              
41             sub new {
42             my $self = shift->SUPER::new(
43             debug => 0,
44             noFrameAutoDesc => 0,
45             noFrameAutoDump => 0,
46             noDumpAutoSet => 0,
47             noDescAutoSet => 0,
48             err => 0,
49             errString => '',
50             @_,
51             );
52              
53             $self->[$__dev]
54             ? do { $self->[$__dev] = $self->getDevInfoFor($self->[$__dev]) }
55             : do { $self->[$__dev] = $self->getDevInfo };
56              
57             $self->[$__mac] = $self->getMac unless $self->[$__mac];
58             $self->[$__ip] = $self->getIp unless $self->[$__ip];
59             $self->[$__ip6] = $self->getIp6 unless $self->[$__ip6];
60              
61             $self;
62             }
63              
64             sub getDevInfo {
65             my $self = shift;
66             # By default, we take outgoing device to Internet
67             $self->[$___dnet] = Net::Libdnet::intf_get_dst(shift() || '1.1.1.1');
68             $self->getDev;
69             }
70              
71             sub getDevInfoFor {
72             my $self = shift;
73             $self->[$___dnet] = Net::Libdnet::intf_get(shift());
74             $self->getDev;
75             }
76              
77             sub updateDevInfo {
78             my $self = shift;
79             $self->getDevInfo(shift());
80             $self->[$__dev] = $self->getDev;
81             $self->[$__ip] = $self->getIp;
82             $self->[$__ip6] = $self->getIp6;
83             $self->[$__mac] = $self->getMac;
84             }
85              
86             sub getDev { shift->[$___dnet]->{name} || (($^O eq 'linux') ? 'lo' : 'lo0') }
87              
88             sub getMac { shift->[$___dnet]->{link_addr} || 'ff:ff:ff:ff:ff:ff' }
89              
90             sub getIp {
91             my $ip = shift->[$___dnet]->{addr} || '127.0.0.1';
92             $ip =~ s/\/\d+$//;
93             $ip;
94             }
95              
96             sub _getIp6 {
97             my $self = shift;
98             my $dev = $self->[$__dev];
99             my $mac = $self->[$__mac];
100             my $buf = `/sbin/ifconfig $dev 2> /dev/null`;
101             $buf =~ s/$dev//;
102             $buf =~ s/$mac//i;
103             my ($ip6) = ($buf =~ /((?:[a-f0-9]{1,4}(?::|%|\/){1,2})+)/i); # XXX: better
104             if ($ip6) {
105             $ip6 =~ s/%|\///g;
106             $ip6 = lc($ip6);
107             }
108             ($ip6 && Net::IPv6Addr::ipv6_chkip($ip6) && $ip6) || '::1';
109             }
110              
111             sub getIp6 {
112             my $self = shift;
113             $self->_getIp6($self->[$__dev]);
114             }
115              
116             sub debug {
117             my $self = shift;
118             @_ ? do { $self->[$__debug] = $Class::Gomor::Debug = shift }
119             : $self->[$__debug];
120             }
121              
122             1;
123              
124             =head1 NAME
125              
126             Net::Packet::Env - environment object used for frame capture/injection
127              
128             =head1 SYNOPSIS
129              
130             use Net::Packet::Env;
131              
132             # Get default values from system
133             my $env = Net::Packet::Env->new;
134              
135             # Get values from a specific device
136             my $env2 = Net::Packet::Env->new(dev => 'vmnet1');
137              
138             print "dev: ", $env->dev, "\n";
139             print "mac: ", $env->mac, "\n";
140             print "ip : ", $env->ip, "\n" if $env->ip;
141             print "ip6: ", $env->ip6, "\n" if $env->ip6;
142             print "promisc: ", $env->promisc, "\n";
143              
144             =head1 DESCRIPTION
145              
146             Basically, this module is used to tell where to inject a frame, and how to capture a frame.
147              
148             =head1 ATTRIBUTES
149              
150             =over 4
151              
152             =item B
153              
154             The device on which frames will be injected/captured.
155              
156             =item B
157              
158             The MAC address used to build injected frames.
159              
160             =item B
161              
162             The IPv4 address used to build injected frames.
163              
164             =item B
165              
166             The IPv6 address used to build injected frames.
167              
168             =item B
169              
170             The link type of the capturing process (see B). It will be set automatically when a capturing device is open. Usually used internally.
171              
172             =item B
173              
174             The B object used to inject frames to network.
175              
176             =item B
177              
178             The B object used to receive frames from network.
179              
180             =item B
181              
182             This one is used to tell the tcpdump-like process (see B) to go into promiscuous mode or not. Note: the device may be already in promiscuous mode, so even when you set it to 0, you may be in the situation to capture in promiscuous mode.
183              
184             =item B
185              
186             When set, the pcap filter that'll be used for packet captures will be this one. It must be manually set if you want this feature. Default is to capture all traffic.
187              
188             =item B
189              
190             The environment debug directive. Set it to a number greater than 0 to increase the level of debug messages. Up to 3, default 0.
191              
192             =back
193              
194             =head1 METHODS
195              
196             =over 4
197              
198             =item B
199              
200             Object constructor. You can pass attributes that will overwrite default ones. Default values:
201              
202             dev: autoDev() - the one tcpdump get without -i parameter.
203              
204             mac: autoMac() - from dev, MAC address the default device has.
205              
206             ip: autoIp() - from dev, IPv4 address the default device has.
207              
208             ip6: autoIp6() - from dev, IPv6 address the default device has.
209              
210             promisc: 0
211              
212             link: undef
213              
214             See B for more about auto* sub routines.
215              
216             =back
217              
218             =head1 AUTHOR
219              
220             Patrice EGomoRE Auffret
221              
222             =head1 COPYRIGHT AND LICENSE
223            
224             Copyright (c) 2004-2006, Patrice EGomoRE Auffret
225            
226             You may distribute this module under the terms of the Artistic license.
227             See LICENSE.Artistic file in the source distribution archive.
228            
229             =head1 RELATED MODULES
230            
231             L, L, L
232            
233             =cut