File Coverage

blib/lib/Data/Checker/IP.pm
Criterion Covered Total %
statement 68 68 100.0
branch 40 40 100.0
condition 15 24 62.5
subroutine 5 5 100.0
pod 1 1 100.0
total 129 138 93.4


line stmt bran cond sub pod time code
1             package Data::Checker::IP;
2             # Copyright (c) 2014-2014 Sullivan Beck. All rights reserved.
3             # This program is free software; you can redistribute it and/or modify it
4             # under the same terms as Perl itself.
5              
6             ###############################################################################
7              
8             require 5.008;
9 1     1   6 use warnings 'all';
  1         1  
  1         52  
10 1     1   4 use strict;
  1         2  
  1         36  
11 1     1   765 use NetAddr::IP::Lite qw(:nofqdn);
  1         23864  
  1         5  
12 1     1   813 use NetAddr::IP 4.073;
  1         2433  
  1         6  
13              
14             our($VERSION);
15             $VERSION='1.05';
16              
17             ###############################################################################
18             ###############################################################################
19              
20             sub check {
21 25     25 1 27 my($obj,$element,$desc,$check_opts) = @_;
22 25         29 my $err = [];
23 25         25 my $warn = [];
24 25         22 my $info = [];
25              
26             #
27             # Must be a valid IP,
28             #
29             # Must be any of the forms supported by NetAddr::IP.
30             #
31              
32 25         74 my $ip_obj = new NetAddr::IP $element;
33 25 100       2640 my $valid = ($ip_obj ? 1 : 0);
34 25         4735 $obj->check_value($check_opts,undef,$element,$valid,
35             "Not a valid IP",undef,
36             $err,$warn,$info);
37 25 100       48 return ($element,$err,$warn,$info) if (@$err);
38              
39             #
40             # Check IP version.
41             #
42              
43 22         48 my $vers = $ip_obj->version();
44 22 100       103 if ($obj->check_performed($check_opts,'ipv4')) {
45 4         3 my $is4 = ($vers == 4);
46 4         8 $obj->check_value($check_opts,'ipv4',$element,$is4,
47             "IPv4 IP required",
48             "Non-IPv4 IP required",
49             $err,$warn,$info);
50 4 100       16 return ($element,$err,$warn,$info) if (@$err);
51             }
52              
53 20 100       35 if ($obj->check_performed($check_opts,'ipv6')) {
54 4         7 my $is6 = ($vers == 6);
55 4         11 $obj->check_value($check_opts,'ipv6',$element,$is6,
56             "IPv6 IP required",
57             "Non-IPv6 IP required",
58             $err,$warn,$info);
59 4 100       15 return ($element,$err,$warn,$info) if (@$err);
60             }
61              
62             #
63             # in_network
64             #
65              
66 18         18 my $net_obj;
67 18 100       31 if ($obj->check_performed($check_opts,'in_network')) {
68 7         15 my $val = $obj->check_option($check_opts,'network',undef,'in_network');
69 7         22 $net_obj = new NetAddr::IP $val;
70              
71             # Must be a valid IP
72 7 100       608 my $valid = ($net_obj ? 1 : 0);
73 7         1151 $obj->check_value($check_opts,undef,$element,$valid,
74             "in_network must be a valid IP",undef,
75             $err,$warn,$info);
76 7 100       17 return ($element,$err,$warn,$info) if (@$err);
77              
78             # Must be the same version
79 6         10 my $v = $net_obj->version();
80 6 100       31 if ($v != $vers) {
81 1         5 $obj->check_value($check_opts,undef,$element,0,
82             "in_network and IP must both be IPv4 or IPv6",undef,
83             $err,$warn,$info);
84 1         5 return ($element,$err,$warn,$info);
85             }
86              
87             # Must contain network info
88 5         12 my $mask = $net_obj->masklen();
89 5 100 66     72 if ( ($vers == 4 && $mask == 32) ||
      33        
      66        
90             ($vers == 6 && $mask == 128) ) {
91 1         4 $obj->check_value($check_opts,undef,$element,0,
92             "in_network must be a valid network IP",undef,
93             $err,$warn,$info);
94 1         5 return ($element,$err,$warn,$info);
95             }
96              
97 4         21 my $flag = $net_obj->contains($ip_obj);
98 4         67 $obj->check_value($check_opts,'in_network',$element,$flag,
99             "IP not in network",
100             "IP contained in network",
101             $err,$warn,$info);
102              
103 4 100       16 return ($element,$err,$warn,$info) if (@$err);
104             }
105              
106             #
107             # network_ip, broadcast_ip
108             #
109              
110 13 100       25 my $chk_net_ip = ($obj->check_performed($check_opts,'network_ip') ? 1 : 0);
111 13 100       27 my $chk_broad_ip = ($obj->check_performed($check_opts,'broadcast_ip') ? 1 : 0);
112 13 100 100     62 if ( ($chk_net_ip || $chk_broad_ip) && ! $net_obj) {
      66        
113 7         17 my $mask = $ip_obj->masklen();
114              
115 7 100 66     102 if ( ($vers == 4 && $mask == 32) ||
      33        
      66        
116             ($vers == 6 && $mask == 128) ) {
117 1         5 $obj->check_value($check_opts,undef,$element,0,
118             "IP must include network information for " .
119             "network/broadcast check",undef,
120             $err,$warn,$info);
121 1         7 return ($element,$err,$warn,$info);
122             }
123              
124 6         7 $net_obj = $ip_obj;
125             }
126              
127 12 100       17 if ($chk_net_ip) {
128 3         14 my $net_ip = $net_obj->network->addr();
129 3         367 my $ip = $ip_obj->addr();
130 3         283 $valid = ($ip eq $net_ip);
131 3         11 $obj->check_value($check_opts,'network_ip',$element,$valid,
132             "Network IP required",
133             "Non-network IP required",
134             $err,$warn,$info);
135 3 100       15 return ($element,$err,$warn,$info) if (@$err);
136             }
137              
138 10 100       18 if ($chk_broad_ip) {
139 3         14 my $broad_ip = $net_obj->broadcast->addr();
140 3         321 my $ip = $ip_obj->addr();
141 3         245 $valid = ($ip eq $broad_ip);
142 3         8 $obj->check_value($check_opts,'broadcast_ip',$element,$valid,
143             "Broadcast IP required",
144             "Non-broadcast IP required",
145             $err,$warn,$info);
146 3 100       13 return ($element,$err,$warn,$info) if (@$err);
147             }
148              
149 8         30 return ($element,$err,$warn,$info);
150             }
151              
152             1;
153             # Local Variables:
154             # mode: cperl
155             # indent-tabs-mode: nil
156             # cperl-indent-level: 3
157             # cperl-continued-statement-offset: 2
158             # cperl-continued-brace-offset: 0
159             # cperl-brace-offset: 0
160             # cperl-brace-imaginary-offset: 0
161             # cperl-label-offset: 0
162             # End: