File Coverage

blib/lib/Zonemaster/Engine/Packet.pm
Criterion Covered Total %
statement 62 64 96.8
branch 14 16 87.5
condition 1 2 50.0
subroutine 14 14 100.0
pod 8 8 100.0
total 99 104 95.1


line stmt bran cond sub pod time code
1             package Zonemaster::Engine::Packet;
2              
3 26     26   166 use version; our $VERSION = version->declare("v1.0.4");
  26         52  
  26         220  
4              
5 26     26   3205 use 5.014002;
  26         94  
6 26     26   132 use warnings;
  26         48  
  26         775  
7              
8 26     26   125 use Moose;
  26         43  
  26         193  
9 26     26   169426 use Zonemaster::Engine::Util;
  26         81  
  26         14864  
10              
11             has 'packet' => (
12             is => 'ro',
13             isa => 'Zonemaster::LDNS::Packet',
14             required => 1,
15             handles => [
16             qw(
17             data
18             rcode
19             aa
20             question
21             answer
22             authority
23             additional
24             print
25             string
26             answersize
27             unique_push
28             timestamp
29             type
30             edns_size
31             edns_rcode
32             has_edns
33             id
34             querytime
35             do
36             opcode
37             )
38             ]
39             );
40              
41             sub no_such_record {
42 19283     19283 1 58445 my ( $self ) = @_;
43              
44 19283 100       100582 if ( $self->type eq 'nodata' ) {
45 602         15960 my ( $q ) = $self->question;
46 602         12149 Zonemaster::Engine::Util::info( NO_SUCH_RECORD => { name => Zonemaster::Engine::Util::name( $q->name ), type => $q->type } );
47              
48 602         4765 return 1;
49             }
50             else {
51 18681         484864 return;
52             }
53             }
54              
55             sub no_such_name {
56 21669     21669 1 55734 my ( $self ) = @_;
57              
58 21669 100       64567 if ( $self->type eq 'nxdomain' ) {
59 32         505 my ( $q ) = $self->question;
60 32         770 info( NO_SUCH_NAME => { name => name( $q->name ), type => $q->type } );
61              
62 32         289 return 1;
63             }
64             else {
65 21637         376300 return;
66             }
67             }
68              
69             sub is_redirect {
70 13332     13332 1 40995 my ( $self ) = @_;
71              
72 13332 100       46302 if ( $self->type eq 'referral' ) {
73 12922         294232 my ( $q ) = $self->question;
74 12922         253961 my ( $a ) = $self->authority;
75 12922         381232 Zonemaster::Engine::Util::info(
76             IS_REDIRECT => {
77             name => Zonemaster::Engine::Util::name( $q->name ),
78             type => $q->type,
79             to => Zonemaster::Engine::Util::name( $a->name )
80             }
81             );
82              
83 12922         107046 return 1;
84             }
85             else {
86 410         4717 return;
87             }
88             } ## end sub is_redirect
89              
90             sub get_records {
91 65647     65647 1 180088 my ( $self, $type, @section ) = @_;
92 65647         138321 my %sec = map { lc( $_ ) => 1 } @section;
  485         1996  
93 65647         97229 my @raw;
94              
95 65647 100       156210 if ( !@section ) {
96 65162         1751559 @raw = ( $self->packet->answer, $self->packet->authority, $self->packet->additional );
97             }
98              
99 65647 100       189827 if ( $sec{'answer'} ) {
100 461         12022 push @raw, $self->packet->answer;
101             }
102              
103 65647 100       138753 if ( $sec{'authority'} ) {
104 24         620 push @raw, $self->packet->authority;
105             }
106              
107 65647 50       136973 if ( $sec{'additional'} ) {
108 0         0 push @raw, $self->packet->additional;
109             }
110              
111 65647         126051 @raw = grep { $_->type eq uc( $type ) } @raw;
  1116297         3240624  
112              
113 65647         306289 return @raw;
114             } ## end sub get_records
115              
116             sub get_records_for_name {
117 7583     7583 1 20698 my ( $self, $type, $name ) = @_;
118              
119 7583         18346 return grep { name( $_->name ) eq name( $name ) } $self->get_records( $type );
  5947         17919  
120             }
121              
122             sub has_rrs_of_type_for_name {
123 93     93 1 229 my ( $self, $type, $name ) = @_;
124              
125 93         229 return ( grep { name( $_->name ) eq name( $name ) } $self->get_records( $type ) ) > 0;
  80         258  
126             }
127              
128             sub answerfrom {
129 12949     12949 1 45135 my ( $self, @args ) = @_;
130              
131 12949 50       51484 if ( @args ) {
132 0         0 $self->packet->answerfrom( @args );
133             }
134              
135 12949   50     384945 my $from = $self->packet->answerfrom // '<unknown>';
136              
137 12949         65795 return $from;
138             }
139              
140             sub TO_JSON {
141 237     237 1 85890 my ( $self ) = @_;
142              
143 237         6520 return { 'Zonemaster::Engine::Packet' => $self->packet };
144             }
145              
146 26     26   232 no Moose;
  26         60  
  26         207  
147             __PACKAGE__->meta->make_immutable;
148              
149             1;
150              
151             =head1 NAME
152              
153             Zonemaster::Engine::Packet - wrapping object for L<Zonemaster::LDNS::Packet> objects
154              
155             =head1 SYNOPSIS
156              
157             my $packet = $ns->query('iis.se', 'NS');
158             my @rrs = $packet->get_records('ns');
159              
160             =head1 ATTRIBUTES
161              
162             =over
163              
164             =item packet
165              
166             Holds the L<Zonemaster::LDNS::Packet> the object is wrapping.
167              
168             =back
169              
170             =head1 METHODS
171              
172             =over
173              
174             =item no_such_record
175              
176             Returns true if the packet represents an existing DNS node lacking any records of the requested type.
177              
178             =item no_such_name
179              
180             Returns true if the packet represents a non-existent DNS node.
181              
182             =item is_redirect
183              
184             Returns true if the packet is a redirect to another set of nameservers.
185              
186             =item get_records($type[, $section])
187              
188             Returns the L<Zonemaster::LDNS::RR> objects of the requested type in the packet. If the optional C<$section> argument is given, and is one of C<answer>,
189             C<authority> and C<additional>, only RRs from that section are returned.
190              
191             =item get_records_for_name($type, $name)
192              
193             Returns all L<Zonemaster::LDNS::RR> objects for the given name in the packet.
194              
195             =item has_rrs_of_type_for_name($type, $name)
196              
197             Returns true if the packet holds any RRs of the specified type for the given name.
198              
199             =item answerfrom
200              
201             Wrapper for the underlying packet method, that replaces udnefined values with the string C<E<lt>unknownE<gt>>.
202              
203             =item TO_JSON
204              
205             Support method for L<JSON> to be able to serialize these objects.
206              
207             =back
208              
209             =head1 METHODS PASSED THROUGH
210              
211             These methods are passed through transparently to the underlying L<Zonemaster::LDNS::Packet> object.
212              
213             =over
214              
215             =item *
216              
217             data
218              
219             =item *
220              
221             rcode
222              
223             =item *
224              
225             aa
226              
227             =item *
228              
229             question
230              
231             =item *
232              
233             answer
234              
235             =item *
236              
237             authority
238              
239             =item *
240              
241             additional
242              
243             =item *
244              
245             print
246              
247             =item *
248              
249             string
250              
251             =item *
252              
253             answersize
254              
255             =item *
256              
257             unique_push
258              
259             =item *
260              
261             timestamp
262              
263             =item *
264              
265             type
266              
267             =item *
268              
269             edns_size
270              
271             =item *
272              
273             edns_rcode
274              
275             =item *
276              
277             has_edns
278              
279             =item *
280              
281             id
282              
283             =item *
284              
285             querytime
286              
287             =item *
288              
289             do
290              
291             =item *
292              
293             opcode
294              
295             =back