133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck# Copyright (C) 2006, 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 Reck
1833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reckclass DHCID(dns.rdata.Rdata):
1933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    """DHCID record
2033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @ivar data: the data (the content of the RR is opaque as far as the
2233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    DNS is concerned)
2333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @type data: string
2433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    @see: RFC 4701"""
2533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    __slots__ = ['data']
2733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
2833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def __init__(self, rdclass, rdtype, data):
2933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        super(DHCID, self).__init__(rdclass, rdtype)
3033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        self.data = data
3133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def to_text(self, origin=None, relativize=True, **kw):
3333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return dns.rdata._base64ify(self.data)
3433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
3533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def from_text(cls, rdclass, rdtype, tok, origin = None, relativize = True):
3633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        chunks = []
3733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        while 1:
3833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            t = tok.get().unescape()
3933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if t.is_eol_or_eof():
4033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                break
4133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            if not t.is_identifier():
4233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck                raise dns.exception.SyntaxError
4333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck            chunks.append(t.value)
4433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        b64 = ''.join(chunks)
4533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        data = b64.decode('base64_codec')
4633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return cls(rdclass, rdtype, data)
4733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
4833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    from_text = classmethod(from_text)
4933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def to_wire(self, file, compress = None, origin = None):
5133259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        file.write(self.data)
5233259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5333259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def from_wire(cls, rdclass, rdtype, wire, current, rdlen, origin = None):
5433259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        data = wire[current : current + rdlen]
5533259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return cls(rdclass, rdtype, data)
5633259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5733259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    from_wire = classmethod(from_wire)
5833259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck
5933259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck    def _cmp(self, other):
6033259e44c8229f70ffe0cf3bb5ca9375c4feb2f9John Reck        return cmp(self.data, other.data)
61