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 84     84   1255 use strict;
  84         726  
  84         5770  
4 84     84   959 use warnings;
  84         426  
  84         10120  
5              
6             our $VERSION = (qw$Id: Update.pm 1895 2023-01-16 13:38:08Z 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 84     84   958 use integer;
  84         496  
  84         1522  
33 84     84   3707 use Carp;
  84         419  
  84         14185  
34              
35 84     84   882 use base qw(Net::DNS::Packet);
  84         368  
  84         24015  
36              
37 84     84   869 use Net::DNS::Resolver;
  84         344  
  84         48576  
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 26055 my ( $class, $zone, @rrclass ) = @_;
64              
65 47 100       188 my ($domain) = grep { defined && length } ( $zone, Net::DNS::Resolver->searchlist );
  52         279  
66              
67 47         194 my $self = __PACKAGE__->SUPER::new( $domain, 'SOA', @rrclass );
68              
69 47         141 my $header = $self->header;
70 47         187 $header->opcode('UPDATE');
71 47         129 $header->qr(0);
72 47         135 $header->rd(0);
73              
74 47         149 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 10 my ( $self, $section, @rr ) = @_;
97 4         13 my ($zone) = $self->zone;
98 4         10 my $zclass = $zone->zclass;
99 4 100       10 for (@rr) { $_->class( $_->class =~ /ANY|NONE/ ? () : $zclass ) }
  4         15  
100 4         23 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 439 my ( $self, $section, @rr ) = @_;
124 91         220 my ($zone) = $self->zone;
125 91         195 my $zclass = $zone->zclass;
126 91 100       169 for (@rr) { $_->class( $_->class =~ /ANY|NONE/ ? () : $zclass ) }
  136         350  
127 91         251 return $self->SUPER::unique_push( $section, @rr );
128             }
129              
130              
131             1;
132              
133             __END__