File Coverage

blib/lib/Net/DNS/Update.pm
Criterion Covered Total %
statement 39 39 100.0
branch 6 6 100.0
condition n/a
subroutine 9 9 100.0
pod 3 3 100.0
total 57 57 100.0


line stmt bran cond sub pod time code
1             package Net::DNS::Update;
2              
3 86     86   669 use strict;
  86         448  
  86         4033  
4 86     86   508 use warnings;
  86         183  
  86         9027  
5              
6             our $VERSION = (qw$Id: Update.pm 2017 2025-06-27 13:48:03Z willem $)[2];
7              
8              
9             =head1 NAME
10              
11             Net::DNS::Update - DNS dynamic update packet
12              
13             =head1 SYNOPSIS
14              
15             use Net::DNS;
16              
17             $update = Net::DNS::Update->new( 'example.com', 'IN' );
18              
19             $update->push( prereq => nxrrset('host.example.com. AAAA') );
20             $update->push( update => rr_add('host.example.com. 86400 AAAA 2001::DB8::F00') );
21              
22             =head1 DESCRIPTION
23              
24             Net::DNS::Update is a subclass of Net::DNS::Packet, to be used for
25             making DNS dynamic updates.
26              
27             Programmers should refer to RFC2136 for dynamic update semantics.
28              
29             =cut
30              
31              
32 86     86   549 use integer;
  86         176  
  86         549  
33 86     86   2203 use Carp;
  86         168  
  86         7351  
34              
35 86     86   552 use base qw(Net::DNS::Packet);
  86         199  
  86         15404  
36              
37 86     86   639 use Net::DNS::Resolver;
  86         215  
  86         46154  
38              
39              
40             =head1 METHODS
41              
42             =head2 new
43              
44             $update = Net::DNS::Update->new;
45             $update = Net::DNS::Update->new( 'example.com' );
46             $update = Net::DNS::Update->new( 'example.com', 'IN' );
47              
48             Returns a Net::DNS::Update object suitable for performing a DNS
49             dynamic update. Specifically, it creates a packet with the header
50             opcode set to UPDATE and the zone record type to SOA (per RFC 2136,
51             Section 2.3).
52              
53             Programs must use the push() method to add RRs to the prerequisite
54             and update sections before performing the update.
55              
56             Arguments are the zone name and the class. The zone and class may
57             be undefined or omitted and default to the default domain from the
58             resolver configuration and IN respectively.
59              
60             =cut
61              
62             sub new {
63 47     47 1 45440 my ( $class, $zone, @rrclass ) = @_;
64              
65 47 100       295 my ($domain) = grep { defined && length } ( $zone, Net::DNS::Resolver->searchlist );
  51         277  
66              
67 47         244 my $self = __PACKAGE__->SUPER::new( $domain, 'SOA', @rrclass );
68              
69 47         162 my $header = $self->header;
70 47         220 $header->opcode('UPDATE');
71 47         156 $header->qr(0);
72 47         154 $header->rd(0);
73              
74 47         184 return $self;
75             }
76              
77              
78             =head2 push
79              
80             $ancount = $update->push( prereq => $rr );
81             $nscount = $update->push( update => $rr );
82             $arcount = $update->push( additional => $rr );
83              
84             $nscount = $update->push( update => $rr1, $rr2, $rr3 );
85             $nscount = $update->push( update => @rr );
86              
87             Adds RRs to the specified section of the update packet.
88              
89             Returns the number of resource records in the specified section.
90              
91             Section names may be abbreviated to the first three characters.
92              
93             =cut
94              
95             sub push {
96 4     4 1 11 my ( $self, $section, @rr ) = @_;
97 4         16 my ($zone) = $self->zone;
98 4         18 my $zclass = $zone->zclass;
99 4 100       10 for (@rr) { $_->class( $_->class =~ /ANY|NONE/ ? () : $zclass ) }
  4         14  
100 4         26 return $self->SUPER::push( $section, @rr );
101             }
102              
103              
104             =head2 unique_push
105              
106             $ancount = $update->unique_push( prereq => $rr );
107             $nscount = $update->unique_push( update => $rr );
108             $arcount = $update->unique_push( additional => $rr );
109              
110             $nscount = $update->unique_push( update => $rr1, $rr2, $rr3 );
111             $nscount = $update->unique_push( update => @rr );
112              
113             Adds RRs to the specified section of the update packet provided
114             that the RRs are not already present in the same section.
115              
116             Returns the number of resource records in the specified section.
117              
118             Section names may be abbreviated to the first three characters.
119              
120             =cut
121              
122             sub unique_push {
123 91     91 1 725 my ( $self, $section, @rr ) = @_;
124 91         301 my ($zone) = $self->zone;
125 91         285 my $zclass = $zone->zclass;
126 91 100       336 for (@rr) { $_->class( $_->class =~ /ANY|NONE/ ? () : $zclass ) }
  136         424  
127 91         311 return $self->SUPER::unique_push( $section, @rr );
128             }
129              
130              
131             1;
132              
133             __END__