133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright (C) 2003-2007, 2009, 2010 Nominum, Inc. 233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# 333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Permission to use, copy, modify, and distribute this software and its 433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# documentation for any purpose with or without fee is hereby granted, 533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# provided that the above copyright notice and this permission notice 633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# appear in all copies. 733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# 833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES 933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR 1133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 1433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 1633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport dns.exception 1733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport dns.rdata 1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckimport dns.tokenizer 1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass HINFO(dns.rdata.Rdata): 2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck """HINFO record 2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @ivar cpu: the CPU type 2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @type cpu: string 2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @ivar os: the OS type 2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @type os: string 2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck @see: RFC 1035""" 2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck __slots__ = ['cpu', 'os'] 3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def __init__(self, rdclass, rdtype, cpu, os): 3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck super(HINFO, self).__init__(rdclass, rdtype) 3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.cpu = cpu 3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck self.os = os 3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def to_text(self, origin=None, relativize=True, **kw): 3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return '"%s" "%s"' % (dns.rdata._escapify(self.cpu), 3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck dns.rdata._escapify(self.os)) 3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True): 4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cpu = tok.get_string() 4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck os = tok.get_string() 4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck tok.get_eol() 4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return cls(rdclass, rdtype, cpu, os) 4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck from_text = classmethod(from_text) 4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def to_wire(self, file, compress = None, origin = None): 4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck l = len(self.cpu) 5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck assert l < 256 5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck byte = chr(l) 5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck file.write(byte) 5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck file.write(self.cpu) 5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck l = len(self.os) 5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck assert l < 256 5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck byte = chr(l) 5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck file.write(byte) 5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck file.write(self.os) 5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None): 6133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck l = ord(wire[current]) 6233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck current += 1 6333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck rdlen -= 1 6433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if l > rdlen: 6533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck raise dns.exception.FormError 6633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck cpu = wire[current : current + l] 6733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck current += l 6833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck rdlen -= l 6933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck l = ord(wire[current]) 7033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck current += 1 7133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck rdlen -= 1 7233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if l != rdlen: 7333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck raise dns.exception.FormError 7433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck os = wire[current : current + l] 7533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return cls(rdclass, rdtype, cpu, os) 7633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 7733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck from_wire = classmethod(from_wire) 7833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck 7933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck def _cmp(self, other): 8033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck v = cmp(self.cpu, other.cpu) 8133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck if v == 0: 8233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck v = cmp(self.os, other.os) 8333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck return v 84