util/Zeroconf.py
author Andrey Skvortsov <andrej.skvortzov@gmail.com>
Fri, 15 Sep 2017 19:01:31 +0300
changeset 1807 5562f34f2fc2
parent 1783 3311eea28d56
child 1826 91796f408540
permissions -rw-r--r--
lazy initialization of highlight pens and brushes for DebugVariableViewer

Constructors wx.Pen() and wx.Brush() require wx.App to exist already.
That causes crash during import of the control,
because import is done before calling main application code.
1783
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     1
#  Multicast DNS Service Discovery for Python, v0.12
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     2
#     Copyright (C) 2003, Paul Scott-Murphy
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     3
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     4
#     This module provides a framework for the use of DNS Service Discovery
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     5
#     using IP multicast.  It has been tested against the JRendezvous
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     6
#     implementation from <a href="http://strangeberry.com">StrangeBerry</a>,
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     7
#     and against the mDNSResponder from Mac OS X 10.3.8.
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     8
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
     9
#     This library is free software; you can redistribute it and/or
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    10
#     modify it under the terms of the GNU Lesser General Public
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    11
#     License as published by the Free Software Foundation; either
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    12
#     version 2.1 of the License, or (at your option) any later version.
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    13
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    14
#     This library is distributed in the hope that it will be useful,
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    15
#     but WITHOUT ANY WARRANTY; without even the implied warranty of
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    16
#     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    17
#     Lesser General Public License for more details.
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    18
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    19
#     You should have received a copy of the GNU Lesser General Public
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    20
#     License along with this library; if not, write to the Free Software
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    21
#     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    22
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    23
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    24
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    25
# 0.12 update - allow selection of binding interface
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    26
#          typo fix - Thanks A. M. Kuchlingi
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    27
#          removed all use of word 'Rendezvous' - this is an API change
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    28
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    29
# 0.11 update - correction to comments for addListener method
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    30
#                  support for new record types seen from OS X
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    31
#                   - IPv6 address
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    32
#                   - hostinfo
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    33
#                  ignore unknown DNS record types
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    34
#                  fixes to name decoding
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    35
#                  works alongside other processes using port 5353 (e.g. on Mac OS X)
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    36
#                  tested against Mac OS X 10.3.2's mDNSResponder
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    37
#                  corrections to removal of list entries for service browser
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    38
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    39
# 0.10 update - Jonathon Paisley contributed these corrections:
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    40
#                  always multicast replies, even when query is unicast
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    41
#                  correct a pointer encoding problem
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    42
#                  can now write records in any order
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    43
#                  traceback shown on failure
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    44
#                  better TXT record parsing
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    45
#                  server is now separate from name
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    46
#                  can cancel a service browser
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    47
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    48
#                  modified some unit tests to accommodate these changes
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    49
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    50
# 0.09 update - remove all records on service unregistration
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    51
#                  fix DOS security problem with readName
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    52
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    53
# 0.08 update - changed licensing to LGPL
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    54
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    55
# 0.07 update - faster shutdown on engine
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    56
#                  pointer encoding of outgoing names
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    57
#                  ServiceBrowser now works
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    58
#                  new unit tests
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    59
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    60
# 0.06 update - small improvements with unit tests
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    61
#                  added defined exception types
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    62
#                  new style objects
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    63
#                  fixed hostname/interface problem
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    64
#                  fixed socket timeout problem
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    65
#                  fixed addServiceListener() typo bug
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    66
#                  using select() for socket reads
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    67
#                  tested on Debian unstable with Python 2.2.2
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    68
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    69
# 0.05 update - ensure case insensitivty on domain names
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    70
#                  support for unicast DNS queries
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    71
#
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    72
# 0.04 update - added some unit tests
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    73
#                  added __ne__ adjuncts where required
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    74
#                  ensure names end in '.local.'
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    75
#                  timeout on receiving socket for clean shutdown
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    76
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    77
import string
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    78
import time
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    79
import struct
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    80
import socket
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    81
import threading
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    82
import select
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    83
import traceback
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    84
1783
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    85
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    86
__author__ = "Paul Scott-Murphy"
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    87
__email__ = "paul at scott dash murphy dot com"
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    88
__version__ = "0.12"
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    89
3311eea28d56 clean-up: fix PEP8 E402 module level import not at top of file
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1782
diff changeset
    90
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    91
__all__ = ["Zeroconf", "ServiceInfo", "ServiceBrowser"]
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    92
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    93
# hook for threads
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    94
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    95
globals()['_GLOBAL_DONE'] = 0
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    96
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    97
# Some timing constants
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    98
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
    99
_UNREGISTER_TIME = 125
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   100
_CHECK_TIME = 175
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   101
_REGISTER_TIME = 225
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   102
_LISTENER_TIME = 200
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   103
_BROWSER_TIME = 500
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   104
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   105
# Some DNS constants
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   106
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   107
_MDNS_ADDR = '224.0.0.251'
1752
d14ff9d7eb76 clean-up: fix PEP8 E703 statement ends with a semicolon
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1749
diff changeset
   108
_MDNS_PORT = 5353
d14ff9d7eb76 clean-up: fix PEP8 E703 statement ends with a semicolon
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1749
diff changeset
   109
_DNS_PORT = 53
d14ff9d7eb76 clean-up: fix PEP8 E703 statement ends with a semicolon
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1749
diff changeset
   110
_DNS_TTL = 60 * 60  # one hour default TTL
1737
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   111
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   112
_MAX_MSG_TYPICAL = 1460  # unused
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   113
_MAX_MSG_ABSOLUTE = 8972
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   114
1737
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   115
_FLAGS_QR_MASK = 0x8000  # query response mask
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   116
_FLAGS_QR_QUERY = 0x0000  # query
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   117
_FLAGS_QR_RESPONSE = 0x8000  # response
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   118
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   119
_FLAGS_AA = 0x0400  # Authorative answer
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   120
_FLAGS_TC = 0x0200  # Truncated
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   121
_FLAGS_RD = 0x0100  # Recursion desired
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   122
_FLAGS_RA = 0x8000  # Recursion available
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   123
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   124
_FLAGS_Z = 0x0040   # Zero
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   125
_FLAGS_AD = 0x0020  # Authentic data
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   126
_FLAGS_CD = 0x0010  # Checking disabled
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   127
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   128
_CLASS_IN = 1
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   129
_CLASS_CS = 2
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   130
_CLASS_CH = 3
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   131
_CLASS_HS = 4
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   132
_CLASS_NONE = 254
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   133
_CLASS_ANY = 255
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   134
_CLASS_MASK = 0x7FFF
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   135
_CLASS_UNIQUE = 0x8000
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   136
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   137
_TYPE_A = 1
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   138
_TYPE_NS = 2
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   139
_TYPE_MD = 3
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   140
_TYPE_MF = 4
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   141
_TYPE_CNAME = 5
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   142
_TYPE_SOA = 6
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   143
_TYPE_MB = 7
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   144
_TYPE_MG = 8
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   145
_TYPE_MR = 9
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   146
_TYPE_NULL = 10
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   147
_TYPE_WKS = 11
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   148
_TYPE_PTR = 12
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   149
_TYPE_HINFO = 13
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   150
_TYPE_MINFO = 14
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   151
_TYPE_MX = 15
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   152
_TYPE_TXT = 16
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   153
_TYPE_AAAA = 28
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   154
_TYPE_SRV = 33
1758
845ca626db09 clean-up: fix PEP8 E222 multiple spaces after operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   155
_TYPE_ANY = 255
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   156
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   157
# Mapping constants to names
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   158
1747
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   159
_CLASSES = {
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   160
    _CLASS_IN:   "in",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   161
    _CLASS_CS:   "cs",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   162
    _CLASS_CH:   "ch",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   163
    _CLASS_HS:   "hs",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   164
    _CLASS_NONE: "none",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   165
    _CLASS_ANY:  "any"
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   166
}
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   167
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   168
_TYPES = {
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   169
    _TYPE_A:     "a",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   170
    _TYPE_NS:    "ns",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   171
    _TYPE_MD:    "md",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   172
    _TYPE_MF:    "mf",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   173
    _TYPE_CNAME: "cname",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   174
    _TYPE_SOA:   "soa",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   175
    _TYPE_MB:    "mb",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   176
    _TYPE_MG:    "mg",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   177
    _TYPE_MR:    "mr",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   178
    _TYPE_NULL:  "null",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   179
    _TYPE_WKS:   "wks",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   180
    _TYPE_PTR:   "ptr",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   181
    _TYPE_HINFO: "hinfo",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   182
    _TYPE_MINFO: "minfo",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   183
    _TYPE_MX:    "mx",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   184
    _TYPE_TXT:   "txt",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   185
    _TYPE_AAAA:  "quada",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   186
    _TYPE_SRV:   "srv",
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   187
    _TYPE_ANY:   "any"
6046ffa2280f clean-up: fix PEP8 E201 whitespace after '{'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1746
diff changeset
   188
}
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   189
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   190
# utility functions
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   191
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   192
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   193
def currentTimeMillis():
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   194
    """Current system time in milliseconds"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   195
    return time.time() * 1000
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   196
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   197
# Exceptions
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   198
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   199
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   200
class NonLocalNameException(Exception):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   201
    pass
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   202
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   203
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   204
class NonUniqueNameException(Exception):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   205
    pass
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   206
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   207
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   208
class NamePartTooLongException(Exception):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   209
    pass
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   210
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   211
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   212
class AbstractMethodException(Exception):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   213
    pass
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   214
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   215
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   216
class BadTypeInNameException(Exception):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   217
    pass
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   218
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   219
# implementation classes
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   220
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   221
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   222
class DNSEntry(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   223
    """A DNS entry"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   224
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   225
    def __init__(self, name, type, clazz):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   226
        self.key = string.lower(name)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   227
        self.name = name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   228
        self.type = type
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   229
        self.clazz = clazz & _CLASS_MASK
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   230
        self.unique = (clazz & _CLASS_UNIQUE) != 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   231
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   232
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   233
        """Equality test on name, type, and class"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   234
        if isinstance(other, DNSEntry):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   235
            return self.name == other.name and self.type == other.type and self.clazz == other.clazz
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   236
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   237
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   238
    def __ne__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   239
        """Non-equality test"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   240
        return not self.__eq__(other)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   241
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   242
    def getClazz(self, clazz):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   243
        """Class accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   244
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   245
            return _CLASSES[clazz]
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   246
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   247
            return "?(%s)" % (clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   248
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   249
    def getType(self, type):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   250
        """Type accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   251
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   252
            return _TYPES[type]
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   253
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   254
            return "?(%s)" % (type)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   255
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   256
    def toString(self, hdr, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   257
        """String representation with additional information"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   258
        result = "%s[%s,%s" % (hdr, self.getType(self.type), self.getClazz(self.clazz))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   259
        if self.unique:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   260
            result += "-unique,"
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   261
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   262
            result += ","
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   263
        result += self.name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   264
        if other is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   265
            result += ",%s]" % (other)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   266
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   267
            result += "]"
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   268
        return result
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   269
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   270
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   271
class DNSQuestion(DNSEntry):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   272
    """A DNS question entry"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   273
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   274
    def __init__(self, name, type, clazz):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   275
        if not name.endswith(".local."):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   276
            raise NonLocalNameException
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   277
        DNSEntry.__init__(self, name, type, clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   278
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   279
    def answeredBy(self, rec):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   280
        """Returns true if the question is answered by the record"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   281
        return self.clazz == rec.clazz and (self.type == rec.type or self.type == _TYPE_ANY) and self.name == rec.name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   282
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   283
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   284
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   285
        return DNSEntry.toString(self, "question", None)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   286
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   287
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   288
class DNSRecord(DNSEntry):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   289
    """A DNS record - like a DNS entry, but has a TTL"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   290
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   291
    def __init__(self, name, type, clazz, ttl):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   292
        DNSEntry.__init__(self, name, type, clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   293
        self.ttl = ttl
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   294
        self.created = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   295
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   296
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   297
        """Tests equality as per DNSRecord"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   298
        if isinstance(other, DNSRecord):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   299
            return DNSEntry.__eq__(self, other)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   300
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   301
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   302
    def suppressedBy(self, msg):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   303
        """Returns true if any answer in a message can suffice for the
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   304
        information held in this record."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   305
        for record in msg.answers:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   306
            if self.suppressedByAnswer(record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   307
                return 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   308
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   309
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   310
    def suppressedByAnswer(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   311
        """Returns true if another record has same name, type and class,
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   312
        and if its TTL is at least half of this record's."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   313
        if self == other and other.ttl > (self.ttl / 2):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   314
            return 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   315
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   316
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   317
    def getExpirationTime(self, percent):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   318
        """Returns the time at which this record will have expired
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   319
        by a certain percentage."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   320
        return self.created + (percent * self.ttl * 10)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   321
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   322
    def getRemainingTTL(self, now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   323
        """Returns the remaining TTL in seconds."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   324
        return max(0, (self.getExpirationTime(100) - now) / 1000)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   325
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   326
    def isExpired(self, now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   327
        """Returns true if this record has expired."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   328
        return self.getExpirationTime(100) <= now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   329
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   330
    def isStale(self, now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   331
        """Returns true if this record is at least half way expired."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   332
        return self.getExpirationTime(50) <= now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   333
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   334
    def resetTTL(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   335
        """Sets this record's TTL and created time to that of
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   336
        another record."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   337
        self.created = other.created
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   338
        self.ttl = other.ttl
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   339
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   340
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   341
        """Abstract method"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   342
        raise AbstractMethodException
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   343
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   344
    def toString(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   345
        """String representation with addtional information"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   346
        arg = "%s/%s,%s" % (self.ttl, self.getRemainingTTL(currentTimeMillis()), other)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   347
        return DNSEntry.toString(self, "record", arg)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   348
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   349
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   350
class DNSAddress(DNSRecord):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   351
    """A DNS address record"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   352
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   353
    def __init__(self, name, type, clazz, ttl, address):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   354
        DNSRecord.__init__(self, name, type, clazz, ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   355
        self.address = address
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   356
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   357
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   358
        """Used in constructing an outgoing packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   359
        out.writeString(self.address, len(self.address))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   360
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   361
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   362
        """Tests equality on address"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   363
        if isinstance(other, DNSAddress):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   364
            return self.address == other.address
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   365
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   366
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   367
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   368
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   369
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   370
            return socket.inet_ntoa(self.address)
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   371
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   372
            return self.address
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   373
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   374
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   375
class DNSHinfo(DNSRecord):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   376
    """A DNS host information record"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   377
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   378
    def __init__(self, name, type, clazz, ttl, cpu, os):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   379
        DNSRecord.__init__(self, name, type, clazz, ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   380
        self.cpu = cpu
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   381
        self.os = os
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   382
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   383
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   384
        """Used in constructing an outgoing packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   385
        out.writeString(self.cpu, len(self.cpu))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   386
        out.writeString(self.os, len(self.os))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   387
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   388
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   389
        """Tests equality on cpu and os"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   390
        if isinstance(other, DNSHinfo):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   391
            return self.cpu == other.cpu and self.os == other.os
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   392
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   393
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   394
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   395
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   396
        return self.cpu + " " + self.os
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   397
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   398
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   399
class DNSPointer(DNSRecord):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   400
    """A DNS pointer record"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   401
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   402
    def __init__(self, name, type, clazz, ttl, alias):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   403
        DNSRecord.__init__(self, name, type, clazz, ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   404
        self.alias = alias
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   405
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   406
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   407
        """Used in constructing an outgoing packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   408
        out.writeName(self.alias)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   409
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   410
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   411
        """Tests equality on alias"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   412
        if isinstance(other, DNSPointer):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   413
            return self.alias == other.alias
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   414
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   415
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   416
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   417
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   418
        return self.toString(self.alias)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   419
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   420
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   421
class DNSText(DNSRecord):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   422
    """A DNS text record"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   423
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   424
    def __init__(self, name, type, clazz, ttl, text):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   425
        DNSRecord.__init__(self, name, type, clazz, ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   426
        self.text = text
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   427
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   428
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   429
        """Used in constructing an outgoing packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   430
        out.writeString(self.text, len(self.text))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   431
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   432
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   433
        """Tests equality on text"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   434
        if isinstance(other, DNSText):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   435
            return self.text == other.text
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   436
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   437
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   438
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   439
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   440
        if len(self.text) > 10:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   441
            return self.toString(self.text[:7] + "...")
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   442
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   443
            return self.toString(self.text)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   444
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   445
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   446
class DNSService(DNSRecord):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   447
    """A DNS service record"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   448
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   449
    def __init__(self, name, type, clazz, ttl, priority, weight, port, server):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   450
        DNSRecord.__init__(self, name, type, clazz, ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   451
        self.priority = priority
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   452
        self.weight = weight
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   453
        self.port = port
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   454
        self.server = server
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   455
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   456
    def write(self, out):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   457
        """Used in constructing an outgoing packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   458
        out.writeShort(self.priority)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   459
        out.writeShort(self.weight)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   460
        out.writeShort(self.port)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   461
        out.writeName(self.server)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   462
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   463
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   464
        """Tests equality on priority, weight, port and server"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   465
        if isinstance(other, DNSService):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   466
            return self.priority == other.priority and self.weight == other.weight and self.port == other.port and self.server == other.server
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   467
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   468
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   469
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   470
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   471
        return self.toString("%s:%s" % (self.server, self.port))
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   472
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   473
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   474
class DNSIncoming(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   475
    """Object representation of an incoming DNS packet"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   476
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   477
    def __init__(self, data):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   478
        """Constructor from string holding bytes of packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   479
        self.offset = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   480
        self.data = data
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   481
        self.questions = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   482
        self.answers = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   483
        self.numQuestions = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   484
        self.numAnswers = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   485
        self.numAuthorities = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   486
        self.numAdditionals = 0
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   487
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   488
        self.readHeader()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   489
        self.readQuestions()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   490
        self.readOthers()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   491
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   492
    def readHeader(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   493
        """Reads header portion of packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   494
        format = '!HHHHHH'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   495
        length = struct.calcsize(format)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   496
        info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   497
        self.offset += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   498
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   499
        self.id = info[0]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   500
        self.flags = info[1]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   501
        self.numQuestions = info[2]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   502
        self.numAnswers = info[3]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   503
        self.numAuthorities = info[4]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   504
        self.numAdditionals = info[5]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   505
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   506
    def readQuestions(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   507
        """Reads questions section of packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   508
        format = '!HH'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   509
        length = struct.calcsize(format)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   510
        for i in range(0, self.numQuestions):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   511
            name = self.readName()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   512
            info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   513
            self.offset += length
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   514
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   515
            question = DNSQuestion(name, info[0], info[1])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   516
            self.questions.append(question)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   517
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   518
    def readInt(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   519
        """Reads an integer from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   520
        format = '!I'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   521
        length = struct.calcsize(format)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   522
        info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   523
        self.offset += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   524
        return info[0]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   525
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   526
    def readCharacterString(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   527
        """Reads a character string from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   528
        length = ord(self.data[self.offset])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   529
        self.offset += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   530
        return self.readString(length)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   531
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   532
    def readString(self, len):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   533
        """Reads a string of a given length from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   534
        format = '!' + str(len) + 's'
1758
845ca626db09 clean-up: fix PEP8 E222 multiple spaces after operator
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1756
diff changeset
   535
        length = struct.calcsize(format)
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   536
        info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   537
        self.offset += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   538
        return info[0]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   539
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   540
    def readUnsignedShort(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   541
        """Reads an unsigned short from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   542
        format = '!H'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   543
        length = struct.calcsize(format)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   544
        info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   545
        self.offset += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   546
        return info[0]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   547
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   548
    def readOthers(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   549
        """Reads the answers, authorities and additionals section of the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   550
        format = '!HHiH'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   551
        length = struct.calcsize(format)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   552
        n = self.numAnswers + self.numAuthorities + self.numAdditionals
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   553
        for i in range(0, n):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   554
            domain = self.readName()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   555
            info = struct.unpack(format, self.data[self.offset:self.offset+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   556
            self.offset += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   557
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   558
            rec = None
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   559
            if info[0] == _TYPE_A:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   560
                rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(4))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   561
            elif info[0] == _TYPE_CNAME or info[0] == _TYPE_PTR:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   562
                rec = DNSPointer(domain, info[0], info[1], info[2], self.readName())
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   563
            elif info[0] == _TYPE_TXT:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   564
                rec = DNSText(domain, info[0], info[1], info[2], self.readString(info[3]))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   565
            elif info[0] == _TYPE_SRV:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   566
                rec = DNSService(domain, info[0], info[1], info[2], self.readUnsignedShort(), self.readUnsignedShort(), self.readUnsignedShort(), self.readName())
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   567
            elif info[0] == _TYPE_HINFO:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   568
                rec = DNSHinfo(domain, info[0], info[1], info[2], self.readCharacterString(), self.readCharacterString())
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   569
            elif info[0] == _TYPE_AAAA:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   570
                rec = DNSAddress(domain, info[0], info[1], info[2], self.readString(16))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   571
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   572
                # Try to ignore types we don't know about
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   573
                # this may mean the rest of the name is
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   574
                # unable to be parsed, and may show errors
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   575
                # so this is left for debugging.  New types
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   576
                # encountered need to be parsed properly.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   577
                #
1782
5b6ad7a7fd9d clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1780
diff changeset
   578
                # print "UNKNOWN TYPE = " + str(info[0])
5b6ad7a7fd9d clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1780
diff changeset
   579
                # raise BadTypeInNameException
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   580
                pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   581
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   582
            if rec is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   583
                self.answers.append(rec)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   584
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   585
    def isQuery(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   586
        """Returns true if this is a query"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   587
        return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_QUERY
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   588
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   589
    def isResponse(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   590
        """Returns true if this is a response"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   591
        return (self.flags & _FLAGS_QR_MASK) == _FLAGS_QR_RESPONSE
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   592
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   593
    def readUTF(self, offset, len):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   594
        """Reads a UTF-8 string of a given length from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   595
        result = self.data[offset:offset+len].decode('utf-8')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   596
        return result
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   597
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   598
    def readName(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   599
        """Reads a domain name from the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   600
        result = ''
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   601
        off = self.offset
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   602
        next = -1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   603
        first = off
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   604
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   605
        while 1:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   606
            len = ord(self.data[off])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   607
            off += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   608
            if len == 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   609
                break
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   610
            t = len & 0xC0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   611
            if t == 0x00:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   612
                result = ''.join((result, self.readUTF(off, len) + '.'))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   613
                off += len
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   614
            elif t == 0xC0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   615
                if next < 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   616
                    next = off + 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   617
                off = ((len & 0x3F) << 8) | ord(self.data[off])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   618
                if off >= first:
361
331d698e1118 Adding support for internationalization
laurent
parents: 223
diff changeset
   619
                    raise _("Bad domain name (circular) at ") + str(off)
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   620
                first = off
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   621
            else:
361
331d698e1118 Adding support for internationalization
laurent
parents: 223
diff changeset
   622
                raise _("Bad domain name at ") + str(off)
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   623
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   624
        if next >= 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   625
            self.offset = next
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   626
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   627
            self.offset = off
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   628
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   629
        return result
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   630
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   631
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   632
class DNSOutgoing(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   633
    """Object representation of an outgoing packet"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   634
1744
69dfdb26f600 clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1743
diff changeset
   635
    def __init__(self, flags, multicast=1):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   636
        self.finished = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   637
        self.id = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   638
        self.multicast = multicast
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   639
        self.flags = flags
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   640
        self.names = {}
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   641
        self.data = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   642
        self.size = 12
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   643
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   644
        self.questions = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   645
        self.answers = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   646
        self.authorities = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   647
        self.additionals = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   648
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   649
    def addQuestion(self, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   650
        """Adds a question"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   651
        self.questions.append(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   652
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   653
    def addAnswer(self, inp, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   654
        """Adds an answer"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   655
        if not record.suppressedBy(inp):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   656
            self.addAnswerAtTime(record, 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   657
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   658
    def addAnswerAtTime(self, record, now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   659
        """Adds an answer if if does not expire by a certain time"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   660
        if record is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   661
            if now == 0 or not record.isExpired(now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   662
                self.answers.append((record, now))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   663
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   664
    def addAuthorativeAnswer(self, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   665
        """Adds an authoritative answer"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   666
        self.authorities.append(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   667
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   668
    def addAdditionalAnswer(self, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   669
        """Adds an additional answer"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   670
        self.additionals.append(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   671
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   672
    def writeByte(self, value):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   673
        """Writes a single byte to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   674
        format = '!c'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   675
        self.data.append(struct.pack(format, chr(value)))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   676
        self.size += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   677
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   678
    def insertShort(self, index, value):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   679
        """Inserts an unsigned short in a certain position in the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   680
        format = '!H'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   681
        self.data.insert(index, struct.pack(format, value))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   682
        self.size += 2
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   683
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   684
    def writeShort(self, value):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   685
        """Writes an unsigned short to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   686
        format = '!H'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   687
        self.data.append(struct.pack(format, value))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   688
        self.size += 2
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   689
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   690
    def writeInt(self, value):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   691
        """Writes an unsigned integer to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   692
        format = '!I'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   693
        self.data.append(struct.pack(format, int(value)))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   694
        self.size += 4
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   695
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   696
    def writeString(self, value, length):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   697
        """Writes a string to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   698
        format = '!' + str(length) + 's'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   699
        self.data.append(struct.pack(format, value))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   700
        self.size += length
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   701
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   702
    def writeUTF(self, s):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   703
        """Writes a UTF-8 string of a given length to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   704
        utfstr = s.encode('utf-8')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   705
        length = len(utfstr)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   706
        if length > 64:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   707
            raise NamePartTooLongException
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   708
        self.writeByte(length)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   709
        self.writeString(utfstr, length)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   710
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   711
    def writeName(self, name):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   712
        """Writes a domain name to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   713
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   714
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   715
            # Find existing instance of this name in packet
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   716
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   717
            index = self.names[name]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   718
        except KeyError:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   719
            # No record of this name already, so write it
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   720
            # out as normal, recording the location of the name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   721
            # for future pointers to it.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   722
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   723
            self.names[name] = self.size
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   724
            parts = name.split('.')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   725
            if parts[-1] == '':
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   726
                parts = parts[:-1]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   727
            for part in parts:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   728
                self.writeUTF(part)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   729
            self.writeByte(0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   730
            return
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   731
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   732
        # An index was found, so write a pointer to it
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   733
        #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   734
        self.writeByte((index >> 8) | 0xC0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   735
        self.writeByte(index)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   736
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   737
    def writeQuestion(self, question):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   738
        """Writes a question to the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   739
        self.writeName(question.name)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   740
        self.writeShort(question.type)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   741
        self.writeShort(question.clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   742
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   743
    def writeRecord(self, record, now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   744
        """Writes a record (answer, authoritative answer, additional) to
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   745
        the packet"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   746
        self.writeName(record.name)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   747
        self.writeShort(record.type)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   748
        if record.unique and self.multicast:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   749
            self.writeShort(record.clazz | _CLASS_UNIQUE)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   750
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   751
            self.writeShort(record.clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   752
        if now == 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   753
            self.writeInt(record.ttl)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   754
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   755
            self.writeInt(record.getRemainingTTL(now))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   756
        index = len(self.data)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   757
        # Adjust size for the short we will write before this record
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   758
        #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   759
        self.size += 2
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   760
        record.write(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   761
        self.size -= 2
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   762
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   763
        length = len(''.join(self.data[index:]))
1737
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   764
        self.insertShort(index, length)  # Here is the short we adjusted for
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   765
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   766
    def packet(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   767
        """Returns a string containing the packet's bytes
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   768
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   769
        No further parts should be added to the packet once this
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   770
        is done."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   771
        if not self.finished:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   772
            self.finished = 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   773
            for question in self.questions:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   774
                self.writeQuestion(question)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   775
            for answer, time in self.answers:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   776
                self.writeRecord(answer, time)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   777
            for authority in self.authorities:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   778
                self.writeRecord(authority, 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   779
            for additional in self.additionals:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   780
                self.writeRecord(additional, 0)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   781
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   782
            self.insertShort(0, len(self.additionals))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   783
            self.insertShort(0, len(self.authorities))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   784
            self.insertShort(0, len(self.answers))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   785
            self.insertShort(0, len(self.questions))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   786
            self.insertShort(0, self.flags)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   787
            if self.multicast:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   788
                self.insertShort(0, 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   789
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   790
                self.insertShort(0, self.id)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   791
        return ''.join(self.data)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   792
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   793
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   794
class DNSCache(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   795
    """A cache of DNS entries"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   796
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   797
    def __init__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   798
        self.cache = {}
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   799
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   800
    def add(self, entry):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   801
        """Adds an entry"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   802
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   803
            list = self.cache[entry.key]
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   804
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   805
            list = self.cache[entry.key] = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   806
        list.append(entry)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   807
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   808
    def remove(self, entry):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   809
        """Removes an entry"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   810
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   811
            list = self.cache[entry.key]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   812
            list.remove(entry)
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   813
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   814
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   815
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   816
    def get(self, entry):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   817
        """Gets an entry by key.  Will return None if there is no
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   818
        matching entry."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   819
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   820
            list = self.cache[entry.key]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   821
            return list[list.index(entry)]
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   822
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   823
            return None
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   824
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   825
    def getByDetails(self, name, type, clazz):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   826
        """Gets an entry by details.  Will return None if there is
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   827
        no matching entry."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   828
        entry = DNSEntry(name, type, clazz)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   829
        return self.get(entry)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   830
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   831
    def entriesWithName(self, name):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   832
        """Returns a list of entries whose key matches the name."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   833
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   834
            return self.cache[name]
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   835
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   836
            return []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   837
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   838
    def entries(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   839
        """Returns a list of all entries"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   840
        def add(x, y): return x+y
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   841
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   842
            return reduce(add, self.cache.values())
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   843
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   844
            return []
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   845
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   846
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   847
class Engine(threading.Thread):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   848
    """An engine wraps read access to sockets, allowing objects that
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   849
    need to receive data from sockets to be called back when the
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   850
    sockets are ready.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   851
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   852
    A reader needs a handle_read() method, which is called when the socket
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   853
    it is interested in is ready for reading.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   854
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   855
    Writers are not implemented here, because we only send short
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   856
    packets.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   857
    """
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   858
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   859
    def __init__(self, zeroconf):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   860
        threading.Thread.__init__(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   861
        self.zeroconf = zeroconf
1737
a39c2918c015 clean-up: fix PEP8 E261 at least two spaces before inline comment
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1736
diff changeset
   862
        self.readers = {}  # maps socket to reader
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   863
        self.timeout = 5
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   864
        self.condition = threading.Condition()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   865
        self.start()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   866
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   867
    def run(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   868
        while not globals()['_GLOBAL_DONE']:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   869
            rs = self.getReaders()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   870
            if len(rs) == 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   871
                # No sockets to manage, but we wait for the timeout
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   872
                # or addition of a socket
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   873
                #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   874
                self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   875
                self.condition.wait(self.timeout)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   876
                self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   877
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   878
                try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   879
                    rr, wr, er = select.select(rs, [], [], self.timeout)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   880
                    for socket in rr:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   881
                        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   882
                            self.readers[socket].handle_read()
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   883
                        except Exception:
644
b511cab580eb Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents: 379
diff changeset
   884
                            # Ignore errors that occur on shutdown
b511cab580eb Better naming of IP address related variables in Beremiz_service.py, Ignore errors that occur on shutdown in Zeroconf.py, fixed discovery dialog crash due to asynchronous call from zeroconf
Edouard Tisserant
parents: 379
diff changeset
   885
                            pass
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
   886
                except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   887
                    pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   888
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   889
    def getReaders(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   890
        result = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   891
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   892
        result = self.readers.keys()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   893
        self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   894
        return result
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   895
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   896
    def addReader(self, reader, socket):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   897
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   898
        self.readers[socket] = reader
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   899
        self.condition.notify()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   900
        self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   901
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   902
    def delReader(self, socket):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   903
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   904
        del(self.readers[socket])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   905
        self.condition.notify()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   906
        self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   907
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   908
    def notify(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   909
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   910
        self.condition.notify()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   911
        self.condition.release()
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   912
1736
7e61baa047f0 clean-up: fix PEP8 E302 expected 2 blank lines, found 1
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1730
diff changeset
   913
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   914
class Listener(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   915
    """A Listener is used by this module to listen on the multicast
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   916
    group to which DNS messages are sent, allowing the implementation
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   917
    to cache information as it arrives.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   918
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   919
    It requires registration with an Engine object in order to have
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   920
    the read() method called when a socket is availble for reading."""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   921
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   922
    def __init__(self, zeroconf):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   923
        self.zeroconf = zeroconf
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   924
        self.zeroconf.engine.addReader(self, self.zeroconf.socket)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   925
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   926
    def handle_read(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   927
        data, (addr, port) = self.zeroconf.socket.recvfrom(_MAX_MSG_ABSOLUTE)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   928
        self.data = data
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   929
        msg = DNSIncoming(data)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   930
        if msg.isQuery():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   931
            # Always multicast responses
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   932
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   933
            if port == _MDNS_PORT:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   934
                self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   935
            # If it's not a multicast query, reply via unicast
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   936
            # and multicast
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   937
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   938
            elif port == _DNS_PORT:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   939
                self.zeroconf.handleQuery(msg, addr, port)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   940
                self.zeroconf.handleQuery(msg, _MDNS_ADDR, _MDNS_PORT)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   941
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   942
            self.zeroconf.handleResponse(msg)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   943
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   944
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   945
class Reaper(threading.Thread):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   946
    """A Reaper is used by this module to remove cache entries that
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   947
    have expired."""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   948
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   949
    def __init__(self, zeroconf):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   950
        threading.Thread.__init__(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   951
        self.zeroconf = zeroconf
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   952
        self.start()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   953
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   954
    def run(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   955
        while 1:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   956
            self.zeroconf.wait(10 * 1000)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   957
            if globals()['_GLOBAL_DONE']:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   958
                return
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   959
            now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   960
            for record in self.zeroconf.cache.entries():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   961
                if record.isExpired(now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   962
                    self.zeroconf.updateRecord(now, record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   963
                    self.zeroconf.cache.remove(record)
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   964
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   965
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
   966
class ServiceBrowser(threading.Thread):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   967
    """Used to browse for a service of a specific type.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   968
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   969
    The listener object will have its addService() and
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   970
    removeService() methods called when this browser
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   971
    discovers changes in the services availability."""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   972
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   973
    def __init__(self, zeroconf, type, listener):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   974
        """Creates a browser for a specific type"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   975
        threading.Thread.__init__(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   976
        self.zeroconf = zeroconf
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   977
        self.type = type
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   978
        self.listener = listener
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   979
        self.services = {}
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   980
        self.nextTime = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   981
        self.delay = _BROWSER_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   982
        self.list = []
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
   983
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   984
        self.done = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   985
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   986
        self.zeroconf.addListener(self, DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   987
        self.start()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   988
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   989
    def updateRecord(self, zeroconf, now, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   990
        """Callback invoked by Zeroconf when new information arrives.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   991
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   992
        Updates information required by browser in the Zeroconf cache."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   993
        if record.type == _TYPE_PTR and record.name == self.type:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   994
            expired = record.isExpired(now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   995
            try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   996
                oldrecord = self.services[record.alias.lower()]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   997
                if not expired:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   998
                    oldrecord.resetTTL(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
   999
                else:
1762
fcc406143e5b clean-up: fix PEP8 E731 do not assign a lambda expression, use a def
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1758
diff changeset
  1000
                    def callback(x):
fcc406143e5b clean-up: fix PEP8 E731 do not assign a lambda expression, use a def
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1758
diff changeset
  1001
                        return self.listener.removeService(x, self.type, record.alias)
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1002
                    del(self.services[record.alias.lower()])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1003
                    self.list.append(callback)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1004
                    return
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1005
            except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1006
                if not expired:
1762
fcc406143e5b clean-up: fix PEP8 E731 do not assign a lambda expression, use a def
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1758
diff changeset
  1007
                    def callback(x):
fcc406143e5b clean-up: fix PEP8 E731 do not assign a lambda expression, use a def
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1758
diff changeset
  1008
                        return self.listener.addService(x, self.type, record.alias)
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1009
                    self.services[record.alias.lower()] = record
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1010
                    self.list.append(callback)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1011
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1012
            expires = record.getExpirationTime(75)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1013
            if expires < self.nextTime:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1014
                self.nextTime = expires
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1015
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1016
    def cancel(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1017
        self.done = 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1018
        self.zeroconf.notifyAll()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1019
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1020
    def run(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1021
        while 1:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1022
            event = None
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1023
            now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1024
            if len(self.list) == 0 and self.nextTime > now:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1025
                self.zeroconf.wait(self.nextTime - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1026
            if globals()['_GLOBAL_DONE'] or self.done:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1027
                return
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1028
            now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1029
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1030
            if self.nextTime <= now:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1031
                out = DNSOutgoing(_FLAGS_QR_QUERY)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1032
                out.addQuestion(DNSQuestion(self.type, _TYPE_PTR, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1033
                for record in self.services.values():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1034
                    if not record.isExpired(now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1035
                        out.addAnswerAtTime(record, now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1036
                self.zeroconf.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1037
                self.nextTime = now + self.delay
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1038
                self.delay = min(20 * 1000, self.delay * 2)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1039
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1040
            if len(self.list) > 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1041
                event = self.list.pop(0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1042
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1043
            if event is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1044
                event(self.zeroconf)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1045
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1046
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1047
class ServiceInfo(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1048
    """Service information"""
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1049
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1050
    def __init__(self, type, name, address=None, port=None, weight=0, priority=0, properties=None, server=None):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1051
        """Create a service description.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1052
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1053
        type: fully qualified service type name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1054
        name: fully qualified service name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1055
        address: IP address as unsigned short, network byte order
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1056
        port: port that the service runs on
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1057
        weight: weight of the service
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1058
        priority: priority of the service
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1059
        properties: dictionary of properties (or a string holding the bytes for the text field)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1060
        server: fully qualified name for service host (defaults to name)"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1061
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1062
        if not name.endswith(type):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1063
            raise BadTypeInNameException
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1064
        self.type = type
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1065
        self.name = name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1066
        self.address = address
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1067
        self.port = port
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1068
        self.weight = weight
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1069
        self.priority = priority
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1070
        if server:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1071
            self.server = server
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1072
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1073
            self.server = name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1074
        self.setProperties(properties)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1075
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1076
    def setProperties(self, properties):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1077
        """Sets properties and text of this info from a dictionary"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1078
        if isinstance(properties, dict):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1079
            self.properties = properties
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1080
            list = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1081
            result = ''
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1082
            for key in properties:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1083
                value = properties[key]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1084
                if value is None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1085
                    suffix = ''.encode('utf-8')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1086
                elif isinstance(value, str):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1087
                    suffix = value.encode('utf-8')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1088
                elif isinstance(value, int):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1089
                    if value:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1090
                        suffix = 'true'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1091
                    else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1092
                        suffix = 'false'
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1093
                else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1094
                    suffix = ''.encode('utf-8')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1095
                list.append('='.join((key, suffix)))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1096
            for item in list:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1097
                result = ''.join((result, struct.pack('!c', chr(len(item))), item))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1098
            self.text = result
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1099
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1100
            self.text = properties
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1101
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1102
    def setText(self, text):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1103
        """Sets properties and text given a text field"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1104
        self.text = text
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1105
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1106
            result = {}
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1107
            end = len(text)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1108
            index = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1109
            strs = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1110
            while index < end:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1111
                length = ord(text[index])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1112
                index += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1113
                strs.append(text[index:index+length])
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1114
                index += length
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1115
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1116
            for s in strs:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1117
                eindex = s.find('=')
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1118
                if eindex == -1:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1119
                    # No equals sign at all
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1120
                    key = s
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1121
                    value = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1122
                else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1123
                    key = s[:eindex]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1124
                    value = s[eindex+1:]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1125
                    if value == 'true':
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1126
                        value = 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1127
                    elif value == 'false' or not value:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1128
                        value = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1129
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1130
                # Only update non-existent properties
1743
c3c3d1318130 clean-up: fix PEP8 E711 comparison to None should be 'if cond is not None:'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1740
diff changeset
  1131
                if key and result.get(key) is None:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1132
                    result[key] = value
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1133
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1134
            self.properties = result
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1135
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1136
            traceback.print_exc()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1137
            self.properties = None
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1138
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1139
    def getType(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1140
        """Type accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1141
        return self.type
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1142
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1143
    def getName(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1144
        """Name accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1145
        if self.type is not None and self.name.endswith("." + self.type):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1146
            return self.name[:len(self.name) - len(self.type) - 1]
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1147
        return self.name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1148
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1149
    def getAddress(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1150
        """Address accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1151
        return self.address
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1152
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1153
    def getPort(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1154
        """Port accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1155
        return self.port
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1156
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1157
    def getPriority(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1158
        """Pirority accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1159
        return self.priority
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1160
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1161
    def getWeight(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1162
        """Weight accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1163
        return self.weight
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1164
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1165
    def getProperties(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1166
        """Properties accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1167
        return self.properties
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1168
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1169
    def getText(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1170
        """Text accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1171
        return self.text
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1172
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1173
    def getServer(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1174
        """Server accessor"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1175
        return self.server
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1176
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1177
    def updateRecord(self, zeroconf, now, record):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1178
        """Updates service information from a DNS record"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1179
        if record is not None and not record.isExpired(now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1180
            if record.type == _TYPE_A:
373
a7f26d9f214f fix pyZeroconf bug where getServiceInfo returns None.
b.taylor@willowglen.ca
parents: 223
diff changeset
  1181
                if record.name == self.server:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1182
                    self.address = record.address
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1183
            elif record.type == _TYPE_SRV:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1184
                if record.name == self.name:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1185
                    self.server = record.server
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1186
                    self.port = record.port
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1187
                    self.weight = record.weight
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1188
                    self.priority = record.priority
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1189
                    self.updateRecord(zeroconf, now, zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1190
            elif record.type == _TYPE_TXT:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1191
                if record.name == self.name:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1192
                    self.setText(record.text)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1193
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1194
    def request(self, zeroconf, timeout):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1195
        """Returns true if the service could be discovered on the
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1196
        network, and updates this object with details discovered.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1197
        """
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1198
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1199
        delay = _LISTENER_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1200
        next = now + delay
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1201
        last = now + timeout
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1202
        result = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1203
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1204
            zeroconf.addListener(self, DNSQuestion(self.name, _TYPE_ANY, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1205
            while self.server is None or self.address is None or self.text is None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1206
                if last <= now:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1207
                    return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1208
                if next <= now:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1209
                    out = DNSOutgoing(_FLAGS_QR_QUERY)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1210
                    out.addQuestion(DNSQuestion(self.name, _TYPE_SRV, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1211
                    out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_SRV, _CLASS_IN), now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1212
                    out.addQuestion(DNSQuestion(self.name, _TYPE_TXT, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1213
                    out.addAnswerAtTime(zeroconf.cache.getByDetails(self.name, _TYPE_TXT, _CLASS_IN), now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1214
                    if self.server is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1215
                        out.addQuestion(DNSQuestion(self.server, _TYPE_A, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1216
                        out.addAnswerAtTime(zeroconf.cache.getByDetails(self.server, _TYPE_A, _CLASS_IN), now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1217
                    zeroconf.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1218
                    next = now + delay
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1219
                    delay = delay * 2
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1220
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1221
                zeroconf.wait(min(next, last) - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1222
                now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1223
            result = 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1224
        finally:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1225
            zeroconf.removeListener(self)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1226
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1227
        return result
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1228
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1229
    def __eq__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1230
        """Tests equality of service name"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1231
        if isinstance(other, ServiceInfo):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1232
            return other.name == self.name
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1233
        return 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1234
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1235
    def __ne__(self, other):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1236
        """Non-equality test"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1237
        return not self.__eq__(other)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1238
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1239
    def __repr__(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1240
        """String representation"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1241
        result = "service[%s,%s:%s," % (self.name, socket.inet_ntoa(self.getAddress()), self.port)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1242
        if self.text is None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1243
            result += "None"
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1244
        else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1245
            if len(self.text) < 20:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1246
                result += self.text
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1247
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1248
                result += self.text[:17] + "..."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1249
        result += "]"
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1250
        return result
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1251
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1252
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1253
class Zeroconf(object):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1254
    """Implementation of Zeroconf Multicast DNS Service Discovery
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1255
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1256
    Supports registration, unregistration, queries and browsing.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1257
    """
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1258
    def __init__(self, bindaddress=None):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1259
        """Creates an instance of the Zeroconf class, establishing
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1260
        multicast communications, listening and reaping threads."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1261
        globals()['_GLOBAL_DONE'] = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1262
        self.intf = bindaddress
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1263
        self.group = ('', _MDNS_PORT)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1264
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1265
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1266
            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1267
            self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1268
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1269
            # SO_REUSEADDR should be equivalent to SO_REUSEPORT for
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1270
            # multicast UDP sockets (p 731, "TCP/IP Illustrated,
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1271
            # Volume 2"), but some BSD-derived systems require
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1272
            # SO_REUSEPORT to be specified explicity.  Also, not all
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1273
            # versions of Python have SO_REUSEPORT available.  So
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1274
            # if you're on a BSD-based system, and haven't upgraded
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1275
            # to Python 2.3 yet, you may find this library doesn't
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1276
            # work as expected.
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1277
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1278
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1279
        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, 255)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1280
        self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1281
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1282
            self.socket.bind(self.group)
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1283
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1284
            # Some versions of linux raise an exception even though
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1285
            # the SO_REUSE* options have been set, so ignore it
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1286
            #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1287
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1288
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1289
        if self.intf is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1290
            self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_IF, socket.inet_aton(self.intf) + socket.inet_aton('0.0.0.0'))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1291
        self.socket.setsockopt(socket.SOL_IP, socket.IP_ADD_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1292
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1293
        self.listeners = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1294
        self.browsers = []
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1295
        self.services = {}
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1296
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1297
        self.cache = DNSCache()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1298
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1299
        self.condition = threading.Condition()
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1300
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1301
        self.engine = Engine(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1302
        self.listener = Listener(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1303
        self.reaper = Reaper(self)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1304
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1305
    def isLoopback(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1306
        if self.intf is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1307
            return self.intf.startswith("127.0.0.1")
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1308
        return False
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1309
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1310
    def isLinklocal(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1311
        if self.intf is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1312
            return self.intf.startswith("169.254.")
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1313
        return False
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1314
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1315
    def wait(self, timeout):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1316
        """Calling thread waits for a given number of milliseconds or
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1317
        until notified."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1318
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1319
        self.condition.wait(timeout/1000)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1320
        self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1321
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1322
    def notifyAll(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1323
        """Notifies all waiting threads"""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1324
        self.condition.acquire()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1325
        self.condition.notifyAll()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1326
        self.condition.release()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1327
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1328
    def getServiceInfo(self, type, name, timeout=3000):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1329
        """Returns network's service information for a particular
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1330
        name and type, or None if no service matches by the timeout,
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1331
        which defaults to 3 seconds."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1332
        info = ServiceInfo(type, name)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1333
        if info.request(self, timeout):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1334
            return info
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1335
        return None
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1336
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1337
    def addServiceListener(self, type, listener):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1338
        """Adds a listener for a particular service type.  This object
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1339
        will then have its updateRecord method called when information
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1340
        arrives for that type."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1341
        self.removeServiceListener(listener)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1342
        self.browsers.append(ServiceBrowser(self, type, listener))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1343
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1344
    def removeServiceListener(self, listener):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1345
        """Removes a listener from the set that is currently listening."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1346
        for browser in self.browsers:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1347
            if browser.listener == listener:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1348
                browser.cancel()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1349
                del(browser)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1350
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1351
    def registerService(self, info, ttl=_DNS_TTL):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1352
        """Registers service information to the network with a default TTL
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1353
        of 60 seconds.  Zeroconf will then respond to requests for
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1354
        information for that service.  The name of the service may be
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1355
        changed if needed to make it unique on the network."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1356
        self.checkService(info)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1357
        self.services[info.name.lower()] = info
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1358
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1359
        nextTime = now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1360
        i = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1361
        while i < 3:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1362
            if now < nextTime:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1363
                self.wait(nextTime - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1364
                now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1365
                continue
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1366
            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1367
            out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, ttl, info.name), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1368
            out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, ttl, info.priority, info.weight, info.port, info.server), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1369
            out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, ttl, info.text), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1370
            if info.address:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1371
                out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, ttl, info.address), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1372
            self.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1373
            i += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1374
            nextTime += _REGISTER_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1375
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1376
    def unregisterService(self, info):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1377
        """Unregister a service."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1378
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1379
            del(self.services[info.name.lower()])
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1380
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1381
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1382
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1383
        nextTime = now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1384
        i = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1385
        while i < 3:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1386
            if now < nextTime:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1387
                self.wait(nextTime - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1388
                now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1389
                continue
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1390
            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1391
            out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1392
            out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.name), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1393
            out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1394
            if info.address:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1395
                out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1396
            self.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1397
            i += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1398
            nextTime += _UNREGISTER_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1399
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1400
    def unregisterAllServices(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1401
        """Unregister all registered services."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1402
        if len(self.services) > 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1403
            now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1404
            nextTime = now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1405
            i = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1406
            while i < 3:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1407
                if now < nextTime:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1408
                    self.wait(nextTime - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1409
                    now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1410
                    continue
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1411
                out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1412
                for info in self.services.values():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1413
                    out.addAnswerAtTime(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, 0, info.name), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1414
                    out.addAnswerAtTime(DNSService(info.name, _TYPE_SRV, _CLASS_IN, 0, info.priority, info.weight, info.port, info.server), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1415
                    out.addAnswerAtTime(DNSText(info.name, _TYPE_TXT, _CLASS_IN, 0, info.text), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1416
                    if info.address:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1417
                        out.addAnswerAtTime(DNSAddress(info.server, _TYPE_A, _CLASS_IN, 0, info.address), 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1418
                self.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1419
                i += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1420
                nextTime += _UNREGISTER_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1421
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1422
    def checkService(self, info):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1423
        """Checks the network for a unique service name, modifying the
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1424
        ServiceInfo passed in if it is not unique."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1425
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1426
        nextTime = now
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1427
        i = 0
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1428
        while i < 3:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1429
            for record in self.cache.entriesWithName(info.type):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1430
                if record.type == _TYPE_PTR and not record.isExpired(now) and record.alias == info.name:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1431
                    if (info.name.find('.') < 0):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1432
                        info.name = info.name + ".[" + info.address + ":" + info.port + "]." + info.type
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1433
                        self.checkService(info)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1434
                        return
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1435
                    raise NonUniqueNameException
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1436
            if now < nextTime:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1437
                self.wait(nextTime - now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1438
                now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1439
                continue
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1440
            out = DNSOutgoing(_FLAGS_QR_QUERY | _FLAGS_AA)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1441
            self.debug = out
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1442
            out.addQuestion(DNSQuestion(info.type, _TYPE_PTR, _CLASS_IN))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1443
            out.addAuthorativeAnswer(DNSPointer(info.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, info.name))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1444
            self.send(out)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1445
            i += 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1446
            nextTime += _CHECK_TIME
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1447
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1448
    def addListener(self, listener, question):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1449
        """Adds a listener for a given question.  The listener will have
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1450
        its updateRecord method called when information is available to
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1451
        answer the question."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1452
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1453
        self.listeners.append(listener)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1454
        if question is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1455
            for record in self.cache.entriesWithName(question.name):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1456
                if question.answeredBy(record) and not record.isExpired(now):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1457
                    listener.updateRecord(self, now, record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1458
        self.notifyAll()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1459
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1460
    def removeListener(self, listener):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1461
        """Removes a listener."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1462
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1463
            self.listeners.remove(listener)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1464
            self.notifyAll()
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1465
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1466
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1467
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1468
    def updateRecord(self, now, rec):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1469
        """Used to notify listeners of new information that has updated
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1470
        a record."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1471
        for listener in self.listeners:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1472
            listener.updateRecord(self, now, rec)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1473
        self.notifyAll()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1474
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1475
    def handleResponse(self, msg):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1476
        """Deal with incoming response packets.  All answers
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1477
        are held in the cache, and listeners are notified."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1478
        now = currentTimeMillis()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1479
        for record in msg.answers:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1480
            expired = record.isExpired(now)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1481
            if record in self.cache.entries():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1482
                if expired:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1483
                    self.cache.remove(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1484
                else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1485
                    entry = self.cache.get(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1486
                    if entry is not None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1487
                        entry.resetTTL(record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1488
                        record = entry
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1489
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1490
                self.cache.add(record)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1491
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1492
            self.updateRecord(now, record)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1493
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1494
    def handleQuery(self, msg, addr, port):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1495
        """Deal with incoming query packets.  Provides a response if
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1496
        possible."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1497
        out = None
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1498
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1499
        # Support unicast client responses
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1500
        #
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1501
        if port != _MDNS_PORT:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1502
            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA, 0)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1503
            for question in msg.questions:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1504
                out.addQuestion(question)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1505
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1506
        for question in msg.questions:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1507
            if question.type == _TYPE_PTR:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1508
                for service in self.services.values():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1509
                    if question.name == service.type:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1510
                        if out is None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1511
                            out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1512
                        out.addAnswer(msg, DNSPointer(service.type, _TYPE_PTR, _CLASS_IN, _DNS_TTL, service.name))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1513
            else:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1514
                try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1515
                    if out is None:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1516
                        out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA)
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1517
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1518
                    # Answer A record queries for any service addresses we know
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1519
                    if question.type == _TYPE_A or question.type == _TYPE_ANY:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1520
                        for service in self.services.values():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1521
                            if service.server == question.name.lower():
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1522
                                out.addAnswer(msg, DNSAddress(question.name, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1523
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1524
                    service = self.services.get(question.name.lower(), None)
1756
08e4394ff4fb clean-up: fix PEP8 E701 multiple statements on one line (colon)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1752
diff changeset
  1525
                    if not service:
08e4394ff4fb clean-up: fix PEP8 E701 multiple statements on one line (colon)
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1752
diff changeset
  1526
                        continue
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1527
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1528
                    if question.type == _TYPE_SRV or question.type == _TYPE_ANY:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1529
                        out.addAnswer(msg, DNSService(question.name, _TYPE_SRV, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.priority, service.weight, service.port, service.server))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1530
                    if question.type == _TYPE_TXT or question.type == _TYPE_ANY:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1531
                        out.addAnswer(msg, DNSText(question.name, _TYPE_TXT, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.text))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1532
                    if question.type == _TYPE_SRV:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1533
                        out.addAdditionalAnswer(DNSAddress(service.server, _TYPE_A, _CLASS_IN | _CLASS_UNIQUE, _DNS_TTL, service.address))
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1534
                except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1535
                    traceback.print_exc()
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1536
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1537
        if out is not None and out.answers:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1538
            out.id = msg.id
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1539
            self.send(out, addr, port)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1540
1744
69dfdb26f600 clean-up: fix PEP8 E251 unexpected spaces around keyword / parameter equals
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1743
diff changeset
  1541
    def send(self, out, addr=_MDNS_ADDR, port=_MDNS_PORT):
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1542
        """Sends an outgoing packet."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1543
        # This is a quick test to see if we can parse the packets we generate
1782
5b6ad7a7fd9d clean-up: fix PEP8 E265 block comment should start with '# '
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1780
diff changeset
  1544
        # temp = DNSIncoming(out.packet())
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1545
        try:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1546
            bytes_sent = self.socket.sendto(out.packet(), 0, (addr, port))
1780
c52d1460cea8 clean-up: fix PEP8 E722 do not use bare except'
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1762
diff changeset
  1547
        except Exception:
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1548
            # Ignore this, it may be a temporary loss of network connection
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1549
            pass
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1550
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1551
    def close(self):
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1552
        """Ends the background threads, and prevent this instance from
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1553
        servicing further queries."""
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1554
        if globals()['_GLOBAL_DONE'] == 0:
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1555
            globals()['_GLOBAL_DONE'] = 1
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1556
            self.notifyAll()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1557
            self.engine.notify()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1558
            self.unregisterAllServices()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1559
            self.socket.setsockopt(socket.SOL_IP, socket.IP_DROP_MEMBERSHIP, socket.inet_aton(_MDNS_ADDR) + socket.inet_aton('0.0.0.0'))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1560
            self.socket.close()
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1561
203
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1562
# Test a few module features, including service registration, service
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1563
# query (for Zoe), and service unregistration.
cb9901076a21 Added concepts :
etisserant
parents:
diff changeset
  1564
1749
d73b64672238 clean-up: fix PEP8 E305 expected 2 blank lines after class or function definition
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1747
diff changeset
  1565
1730
64d8f52bc8c8 clean-up for PEP8: fix W291 trailing whitespace
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 726
diff changeset
  1566
if __name__ == '__main__':
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1567
    print "Multicast DNS Service Discovery for Python, version", __version__
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1568
    r = Zeroconf()
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1569
    print "1. Testing registration of a service..."
1740
b789b695b5c6 clean-up: fix PEP8 E231 missing whitespace after ':' or ','
Andrey Skvortsov <andrej.skvortzov@gmail.com>
parents: 1739
diff changeset
  1570
    desc = {'version': '0.10', 'a': 'test value', 'b': 'another value'}
223
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1571
    info = ServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local.", socket.inet_aton("127.0.0.1"), 1234, 0, 0, desc)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1572
    print "   Registering service..."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1573
    r.registerService(info)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1574
    print "   Registration done."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1575
    print "2. Testing query of service information..."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1576
    print "   Getting ZOE service:", str(r.getServiceInfo("_http._tcp.local.", "ZOE._http._tcp.local."))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1577
    print "   Query done."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1578
    print "3. Testing query of own service..."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1579
    print "   Getting self:", str(r.getServiceInfo("_http._tcp.local.", "My Service Name._http._tcp.local."))
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1580
    print "   Query done."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1581
    print "4. Testing unregister of service information..."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1582
    r.unregisterService(info)
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1583
    print "   Unregister done."
1c0d3aaacf3d Fixed bad bahavior when zeroconf bindaddress unspecified.
etisserant
parents: 203
diff changeset
  1584
    r.close()