Skip to content

Commit

Permalink
Python 3 version of pybonjour
Browse files Browse the repository at this point in the history
  • Loading branch information
Wim Haanstra committed Apr 17, 2013
0 parents commit b90bef2
Show file tree
Hide file tree
Showing 9 changed files with 2,724 additions and 0 deletions.
19 changes: 19 additions & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
1.1.1 (2008-05-08)
------------------

* All DNS-SD API calls are now made after acquiring a global lock
object. This object is a dummy (i.e. acquire() and release() do
nothing), except in the case where pybonjour is using Avahi's
Bonjour compatibility layer, in which case the lock is a
threading.RLock instance. This is necessary because the
compatibility layer is not thread safe.

* Added browse_resolve_query.py to examples

* Moved unit tests to test_pybonjour.py


1.1.0 (2007-06-14)
------------------

* Added TXTRecord class for generating and parsing DNS TXT records
26 changes: 26 additions & 0 deletions PKG-INFO
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
Metadata-Version: 1.0
Name: pybonjour
Version: 1.1.1
Summary: Pure-Python interface to Apple Bonjour and compatible DNS-SD libraries
Home-page: http://o2s.csail.mit.edu/o2s-wiki/pybonjour
Author: Christopher Stawarz
Author-email: [email protected]
License: UNKNOWN
Download-URL: http://o2s.csail.mit.edu/download/pybonjour/
Description: pybonjour provides a pure-Python interface (via ctypes) to Apple
Bonjour and compatible DNS-SD libraries (such as Avahi). It allows
Python scripts to take advantage of Zero Configuration Networking
(Zeroconf) to register, discover, and resolve services on both local
and wide-area networks. Since pybonjour is implemented in pure
Python, scripts that use it can easily be ported to Mac OS X, Windows,
Linux, and other systems that run Bonjour.
Platform: UNKNOWN
Classifier: Development Status :: 5 - Production/Stable
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: MacOS :: MacOS X
Classifier: Operating System :: Microsoft :: Windows
Classifier: Operating System :: POSIX
Classifier: Programming Language :: Python
Classifier: Topic :: System :: Distributed Computing
Classifier: Topic :: System :: Networking
57 changes: 57 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
----------------------------------------------------
pybonjour: Pure-Python interface to Apple Bonjour

Author: Christopher Stawarz <[email protected]>
Version: 1.1.1
May 8, 2008
----------------------------------------------------


Introduction
------------

pybonjour provides a pure-Python interface (via ctypes) to Apple
Bonjour and compatible DNS-SD libraries (such as Avahi). It allows
Python scripts to take advantage of Zero Configuration Networking
(Zeroconf) to register, discover, and resolve services on both local
and wide-area networks. Since pybonjour is implemented in pure
Python, scripts that use it can easily be ported to Mac OS X, Windows,
Linux, and other systems that run Bonjour.

pybonjour is free software, distributed under the MIT license.


Requirements
------------

pybonjour requires Python 2.4 or later. It also depends on ctypes
(version 1.0.1 or later), which is part of the standard library in
Python 2.5 but must be downloaded and installed separately for Python
2.4.

No additional software is required to use pybonjour under Mac OS X.
To use it under Windows, the Bonjour for Windows package must be
installed on your system. Most Linux systems use Avahi rather than
Bonjour for DNS-SD. If this is the case on your system, you'll need
to install Avahi's Bonjour compatibility library. (Under Ubuntu, the
package to install is libavahi-compat-libdnssd1.) Otherwise, or to
use pybonjour under other POSIX systems, you must download, compile,
and install Bonjour from source.

Both the Bonjour for Windows package and the latest Bonjour source
code are available for download at

http://developer.apple.com/networking/bonjour/download/


Documentation
-------------

pybonjour provides extensive online documentation, which can be
accessed from the Python prompt via 'help(pybonjour)'. In addition,
the examples directory contains scripts that demonstrate basic usage
of the module.

For more information, please visit

http://o2s.csail.mit.edu/o2s-wiki/pybonjour
64 changes: 64 additions & 0 deletions examples/browse_and_resolve.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import select
import sys
import pybonjour


regtype = sys.argv[1]
timeout = 5
resolved = []


def resolve_callback(sdRef, flags, interfaceIndex, errorCode, fullname,
hosttarget, port, txtRecord):
if errorCode == pybonjour.kDNSServiceErr_NoError:
print 'Resolved service:'
print ' fullname =', fullname
print ' hosttarget =', hosttarget
print ' port =', port
resolved.append(True)


def browse_callback(sdRef, flags, interfaceIndex, errorCode, serviceName,
regtype, replyDomain):
if errorCode != pybonjour.kDNSServiceErr_NoError:
return

if not (flags & pybonjour.kDNSServiceFlagsAdd):
print 'Service removed'
return

print 'Service added; resolving'

resolve_sdRef = pybonjour.DNSServiceResolve(0,
interfaceIndex,
serviceName,
regtype,
replyDomain,
resolve_callback)

try:
while not resolved:
ready = select.select([resolve_sdRef], [], [], timeout)
if resolve_sdRef not in ready[0]:
print 'Resolve timed out'
break
pybonjour.DNSServiceProcessResult(resolve_sdRef)
else:
resolved.pop()
finally:
resolve_sdRef.close()


browse_sdRef = pybonjour.DNSServiceBrowse(regtype = regtype,
callBack = browse_callback)

try:
try:
while True:
ready = select.select([browse_sdRef], [], [])
if browse_sdRef in ready[0]:
pybonjour.DNSServiceProcessResult(browse_sdRef)
except KeyboardInterrupt:
pass
finally:
browse_sdRef.close()
94 changes: 94 additions & 0 deletions examples/browse_resolve_query.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
import select
import socket
import sys
import pybonjour


regtype = sys.argv[1]
timeout = 5
queried = []
resolved = []


def query_record_callback(sdRef, flags, interfaceIndex, errorCode, fullname,
rrtype, rrclass, rdata, ttl):
if errorCode == pybonjour.kDNSServiceErr_NoError:
print ' IP =', socket.inet_ntoa(rdata)
queried.append(True)


def resolve_callback(sdRef, flags, interfaceIndex, errorCode, fullname,
hosttarget, port, txtRecord):
if errorCode != pybonjour.kDNSServiceErr_NoError:
return

print 'Resolved service:'
print ' fullname =', fullname
print ' hosttarget =', hosttarget
print ' port =', port

query_sdRef = \
pybonjour.DNSServiceQueryRecord(interfaceIndex = interfaceIndex,
fullname = hosttarget,
rrtype = pybonjour.kDNSServiceType_A,
callBack = query_record_callback)

try:
while not queried:
ready = select.select([query_sdRef], [], [], timeout)
if query_sdRef not in ready[0]:
print 'Query record timed out'
break
pybonjour.DNSServiceProcessResult(query_sdRef)
else:
queried.pop()
finally:
query_sdRef.close()

resolved.append(True)


def browse_callback(sdRef, flags, interfaceIndex, errorCode, serviceName,
regtype, replyDomain):
if errorCode != pybonjour.kDNSServiceErr_NoError:
return

if not (flags & pybonjour.kDNSServiceFlagsAdd):
print 'Service removed'
return

print 'Service added; resolving'

resolve_sdRef = pybonjour.DNSServiceResolve(0,
interfaceIndex,
serviceName,
regtype,
replyDomain,
resolve_callback)

try:
while not resolved:
ready = select.select([resolve_sdRef], [], [], timeout)
if resolve_sdRef not in ready[0]:
print 'Resolve timed out'
break
pybonjour.DNSServiceProcessResult(resolve_sdRef)
else:
resolved.pop()
finally:
resolve_sdRef.close()


browse_sdRef = pybonjour.DNSServiceBrowse(regtype = regtype,
callBack = browse_callback)

try:
try:
while True:
ready = select.select([browse_sdRef], [], [])
if browse_sdRef in ready[0]:
pybonjour.DNSServiceProcessResult(browse_sdRef)
except KeyboardInterrupt:
pass
finally:
browse_sdRef.close()
33 changes: 33 additions & 0 deletions examples/register.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import select
import sys
import pybonjour


name = sys.argv[1]
regtype = sys.argv[2]
port = int(sys.argv[3])


def register_callback(sdRef, flags, errorCode, name, regtype, domain):
if errorCode == pybonjour.kDNSServiceErr_NoError:
print 'Registered service:'
print ' name =', name
print ' regtype =', regtype
print ' domain =', domain


sdRef = pybonjour.DNSServiceRegister(name = name,
regtype = regtype,
port = port,
callBack = register_callback)

try:
try:
while True:
ready = select.select([sdRef], [], [])
if sdRef in ready[0]:
pybonjour.DNSServiceProcessResult(sdRef)
except KeyboardInterrupt:
pass
finally:
sdRef.close()
Loading

0 comments on commit b90bef2

Please sign in to comment.