Package dns :: Package rdtypes :: Package ANY :: Module SOA
[hide private]
[frames] | no frames]

Source Code for Module dns.rdtypes.ANY.SOA

  1  # Copyright (C) 2003-2007, 2009-2011 Nominum, Inc. 
  2  # 
  3  # Permission to use, copy, modify, and distribute this software and its 
  4  # documentation for any purpose with or without fee is hereby granted, 
  5  # provided that the above copyright notice and this permission notice 
  6  # appear in all copies. 
  7  # 
  8  # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES 
  9  # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 
 10  # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR 
 11  # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 
 12  # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 
 13  # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 
 14  # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 
 15   
 16  import struct 
 17   
 18  import dns.exception 
 19  import dns.rdata 
 20  import dns.name 
 21  import dns.util 
 22   
23 -class SOA(dns.rdata.Rdata):
24 """SOA record 25 26 @ivar mname: the SOA MNAME (master name) field 27 @type mname: dns.name.Name object 28 @ivar rname: the SOA RNAME (responsible name) field 29 @type rname: dns.name.Name object 30 @ivar serial: The zone's serial number 31 @type serial: int 32 @ivar refresh: The zone's refresh value (in seconds) 33 @type refresh: int 34 @ivar retry: The zone's retry value (in seconds) 35 @type retry: int 36 @ivar expire: The zone's expiration value (in seconds) 37 @type expire: int 38 @ivar minimum: The zone's negative caching time (in seconds, called 39 "minimum" for historical reasons) 40 @type minimum: int 41 @see: RFC 1035""" 42 43 __slots__ = ['mname', 'rname', 'serial', 'refresh', 'retry', 'expire', 44 'minimum'] 45
46 - def __init__(self, rdclass, rdtype, mname, rname, serial, refresh, retry, 47 expire, minimum):
48 super(SOA, self).__init__(rdclass, rdtype) 49 self.mname = mname 50 self.rname = rname 51 self.serial = serial 52 self.refresh = refresh 53 self.retry = retry 54 self.expire = expire 55 self.minimum = minimum
56
57 - def to_text(self, origin=None, relativize=True, **kw):
58 mname = self.mname.choose_relativity(origin, relativize) 59 rname = self.rname.choose_relativity(origin, relativize) 60 return '%s %s %d %d %d %d %d' % ( 61 mname, rname, self.serial, self.refresh, self.retry, 62 self.expire, self.minimum )
63
64 - def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
65 mname = tok.get_name() 66 rname = tok.get_name() 67 mname = mname.choose_relativity(origin, relativize) 68 rname = rname.choose_relativity(origin, relativize) 69 serial = tok.get_uint32() 70 refresh = tok.get_ttl() 71 retry = tok.get_ttl() 72 expire = tok.get_ttl() 73 minimum = tok.get_ttl() 74 tok.get_eol() 75 return cls(rdclass, rdtype, mname, rname, serial, refresh, retry, 76 expire, minimum )
77 78 from_text = classmethod(from_text) 79
80 - def to_wire(self, file, compress = None, origin = None):
81 self.mname.to_wire(file, compress, origin) 82 self.rname.to_wire(file, compress, origin) 83 five_ints = struct.pack('!IIIII', self.serial, self.refresh, 84 self.retry, self.expire, self.minimum) 85 file.write(five_ints)
86
87 - def to_digestable(self, origin = None):
88 return self.mname.to_digestable(origin) + \ 89 self.rname.to_digestable(origin) + \ 90 struct.pack('!IIIII', self.serial, self.refresh, 91 self.retry, self.expire, self.minimum)
92
93 - def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
94 (mname, cused) = dns.name.from_wire(wire[: current + rdlen], current) 95 current += cused 96 rdlen -= cused 97 (rname, cused) = dns.name.from_wire(wire[: current + rdlen], current) 98 current += cused 99 rdlen -= cused 100 if rdlen != 20: 101 raise dns.exception.FormError 102 five_ints = struct.unpack('!IIIII', 103 wire[current : current + rdlen]) 104 if not origin is None: 105 mname = mname.relativize(origin) 106 rname = rname.relativize(origin) 107 return cls(rdclass, rdtype, mname, rname, 108 five_ints[0], five_ints[1], five_ints[2], five_ints[3], 109 five_ints[4])
110 111 from_wire = classmethod(from_wire) 112
113 - def choose_relativity(self, origin = None, relativize = True):
114 self.mname = self.mname.choose_relativity(origin, relativize) 115 self.rname = self.rname.choose_relativity(origin, relativize)
116
117 - def _cmp(self, other):
118 v = dns.util.cmp(self.mname, other.mname) 119 if v == 0: 120 v = dns.util.cmp(self.rname, other.rname) 121 if v == 0: 122 self_ints = struct.pack('!IIIII', self.serial, self.refresh, 123 self.retry, self.expire, self.minimum) 124 other_ints = struct.pack('!IIIII', other.serial, other.refresh, 125 other.retry, other.expire, 126 other.minimum) 127 v = dns.util.cmp(self_ints, other_ints) 128 return v
129