Spaces:
Paused
Paused
| # Copyright (C) Dnspython Contributors, see LICENSE for text of ISC license | |
| # Copyright (C) 2001-2017 Nominum, Inc. | |
| # | |
| # Permission to use, copy, modify, and distribute this software and its | |
| # documentation for any purpose with or without fee is hereby granted, | |
| # provided that the above copyright notice and this permission notice | |
| # appear in all copies. | |
| # | |
| # THE SOFTWARE IS PROVIDED "AS IS" AND NOMINUM DISCLAIMS ALL WARRANTIES | |
| # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
| # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL NOMINUM BE LIABLE FOR | |
| # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
| # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
| # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT | |
| # OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
| """DNS Opcodes.""" | |
| import dns.enum | |
| import dns.exception | |
| class Opcode(dns.enum.IntEnum): | |
| #: Query | |
| QUERY = 0 | |
| #: Inverse Query (historical) | |
| IQUERY = 1 | |
| #: Server Status (unspecified and unimplemented anywhere) | |
| STATUS = 2 | |
| #: Notify | |
| NOTIFY = 4 | |
| #: Dynamic Update | |
| UPDATE = 5 | |
| def _maximum(cls): | |
| return 15 | |
| def _unknown_exception_class(cls): | |
| return UnknownOpcode | |
| class UnknownOpcode(dns.exception.DNSException): | |
| """An DNS opcode is unknown.""" | |
| def from_text(text: str) -> Opcode: | |
| """Convert text into an opcode. | |
| *text*, a ``str``, the textual opcode | |
| Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. | |
| Returns an ``int``. | |
| """ | |
| return Opcode.from_text(text) | |
| def from_flags(flags: int) -> Opcode: | |
| """Extract an opcode from DNS message flags. | |
| *flags*, an ``int``, the DNS flags. | |
| Returns an ``int``. | |
| """ | |
| return Opcode((flags & 0x7800) >> 11) | |
| def to_flags(value: Opcode) -> int: | |
| """Convert an opcode to a value suitable for ORing into DNS message | |
| flags. | |
| *value*, an ``int``, the DNS opcode value. | |
| Returns an ``int``. | |
| """ | |
| return (value << 11) & 0x7800 | |
| def to_text(value: Opcode) -> str: | |
| """Convert an opcode to text. | |
| *value*, an ``int`` the opcode value, | |
| Raises ``dns.opcode.UnknownOpcode`` if the opcode is unknown. | |
| Returns a ``str``. | |
| """ | |
| return Opcode.to_text(value) | |
| def is_update(flags: int) -> bool: | |
| """Is the opcode in flags UPDATE? | |
| *flags*, an ``int``, the DNS message flags. | |
| Returns a ``bool``. | |
| """ | |
| return from_flags(flags) == Opcode.UPDATE | |
| ### BEGIN generated Opcode constants | |
| QUERY = Opcode.QUERY | |
| IQUERY = Opcode.IQUERY | |
| STATUS = Opcode.STATUS | |
| NOTIFY = Opcode.NOTIFY | |
| UPDATE = Opcode.UPDATE | |
| ### END generated Opcode constants | |