D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
lib64
/
perl5
/
vendor_perl
/
Net
/
DNS
/
RR
/
Filename :
SOA.pm
back
Copy
package Net::DNS::RR::SOA; # # $Id: SOA.pm 1096 2012-12-28 13:35:15Z willem $ # use vars qw($VERSION); $VERSION = (qw$LastChangedRevision: 1096 $)[1]; # Unchanged since 1037 use base Net::DNS::RR; =head1 NAME Net::DNS::RR::SOA - DNS SOA resource record =cut use strict; use integer; use Net::DNS::DomainName; use Net::DNS::Mailbox; sub decode_rdata { ## decode rdata from wire-format octet string my $self = shift; my ( $data, $offset, @opaque ) = @_; ( $self->{mname}, $offset ) = decode Net::DNS::DomainName1035(@_); ( $self->{rname}, $offset ) = decode Net::DNS::Mailbox1035($data,$offset,@opaque ); @{$self}{qw(serial refresh retry expire minimum)} = unpack "\@$offset N5", $$data; } sub encode_rdata { ## encode rdata as wire-format octet string my $self = shift; my ( $offset, @opaque ) = @_; return '' unless defined $self->{rname}; my $rdata = $self->{mname}->encode(@_); $rdata .= $self->{rname}->encode( $offset + length($rdata), @opaque ); $rdata .= pack "N5", map $self->$_, qw(serial refresh retry expire minimum); } sub format_rdata { ## format rdata portion of RR string. my $self = shift; return '' unless defined $self->{rname}; my $mname = $self->{mname}->string; my $rname = $self->{rname}->string; my @n = map { sprintf "%-10u\t;$_", $self->$_ } qw(serial refresh retry expire); join "\n\t\t\t\t", "$mname $rname (", @n, sprintf "%-6u )\t;minimum", $self->minimum; } sub parse_rdata { ## populate RR from rdata in argument list my $self = shift; my $ttl = $self->{ttl}; $self->$_( @_ ? shift : () ) for qw(mname rname serial); $self->$_( @_ ? $self->ttl(shift) : () ) for qw(refresh retry expire minimum); $self->{ttl} = $ttl; } sub defaults() { ## specify RR attribute default values my $self = shift; $self->parse_rdata( qw(. . 0 1d 1h 1w 3h) ); $self->{serial} = undef; } ######################################## { sub _ordered($$) { ## irreflexive 32-bit partial ordering use integer; my ( $a, $b ) = @_; return defined $b unless defined $a; # ( undef, any ) return 0 unless defined $b; # ( any, undef ) # unwise to assume 32-bit arithmetic, or that integer overflow goes unpunished if ( $a < 0 ) { # translate $a<0 region $a = ( $a ^ 0x80000000 ) & 0xFFFFFFFF; # 0 <= $a < 2**31 $b = ( $b ^ 0x80000000 ) & 0xFFFFFFFF; # -2**31 <= $b < 2**32 } return $a < $b ? ( $a > ( $b - 0x80000000 ) ) : ( $b < ( $a - 0x80000000 ) ); } } ######################################## sub mname { my $self = shift; $self->{mname} = new Net::DNS::DomainName1035(shift) if @_; $self->{mname}->name if defined wantarray; } sub rname { my $self = shift; $self->{rname} = new Net::DNS::Mailbox1035(shift) if @_; $self->{rname}->address if defined wantarray; } sub serial { use integer; my $self = shift; return $self->{serial} || 0 unless @_; # current/default value my $value = shift; # replace if in sequence return $self->{serial} = 0 + $value if _ordered( $self->{serial}, $value ); # unwise to assume 32-bit arithmetic, or that integer overflow goes unpunished my $serial = 0xFFFFFFFF & ( $self->{serial} || 0 ); return $self->{serial} = $serial ^ 0xFFFFFFFF if ( $serial & 0x7FFFFFFF ) == 0x7FFFFFFF; # wrap return $self->{serial} = $serial + 1; # increment } sub refresh { my $self = shift; $self->{refresh} = shift if @_; return 0 + ( $self->{refresh} || 0 ); } sub retry { my $self = shift; $self->{retry} = shift if @_; return 0 + ( $self->{retry} || 0 ); } sub expire { my $self = shift; $self->{expire} = shift if @_; return 0 + ( $self->{expire} || 0 ); } sub minimum { my $self = shift; $self->{minimum} = shift if @_; return 0 + ( $self->{minimum} || 0 ); } 1; __END__ =head1 SYNOPSIS use Net::DNS; $rr = new Net::DNS::RR('name SOA mname rname 0 86400 3600 604800 10800'); =head1 DESCRIPTION Class for DNS Start of Authority (SOA) resource records. =head1 METHODS The available methods are those inherited from the base class augmented by the type-specific methods defined in this package. Use of undocumented package features or direct access to internal data structures is discouraged and could result in program termination or other unpredictable behaviour. =head2 mname $mname = $rr->mname; The domain name of the name server that was the original or primary source of data for this zone. =head2 rname $rname = $rr->rname; The mailbox which identifies the person responsible for maintaining this zone. =head2 serial $serial = $rr->serial; $serial = $rr->serial(value); Unsigned 32 bit version number of the original copy of the zone. Zone transfers preserve this value. RFC1982 defines a strict (irreflexive) partial ordering for zone serial numbers. The serial number will be incremented unless the replacement value argument satisfies the ordering constraint. =head2 refresh $refresh = $rr->refresh; A 32 bit time interval before the zone should be refreshed. =head2 retry $retry = $rr->retry; A 32 bit time interval that should elapse before a failed refresh should be retried. =head2 expire $expire = $rr->expire; A 32 bit time value that specifies the upper limit on the time interval that can elapse before the zone is no longer authoritative. =head2 minimum $minimum = $rr->minimum; The unsigned 32 bit minimum TTL field that should be exported with any RR from this zone. =head1 Zone Serial Number Management The internal logic of the serial() method offers support for several widely used zone serial numbering policies. =head2 Strictly Sequential $successor = $soa->serial( SEQUENTIAL ); The existing serial number is incremented modulo 2**32 because the value returned by the auxiliary SEQUENTIAL() function can never satisfy the serial number ordering constraint. =head2 Date Encoded $successor = $soa->serial( YYYYMMDDxx ); The 32 bit value returned by the auxiliary YYYYMMDDxx() function will be used if it satisfies the ordering constraint, otherwise the serial number will be incremented as above. Serial number increments must be limited to 100 per day for the date information to remain useful. =head2 Time Encoded $successor = $soa->serial( UNIXTIME ); The 32 bit value returned by the auxiliary UNIXTIME() function will used if it satisfies the ordering constraint, otherwise the existing serial number will be incremented as above. =head1 COPYRIGHT Copyright (c)1997-2002 Michael Fuhr. Portions Copyright (c)2002-2004 Chris Reinhardt. Portions Copyright (c)2010,2012 Dick Franks. Package template (c)2009,2012 O.M.Kolkman and R.W.Franks. All rights reserved. This program is free software; you may redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L<perl>, L<Net::DNS>, L<Net::DNS::RR>, RFC1035 Section 3.3.13, RFC1982 =cut