Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Simplest way to publish over Zeroconf/Bonjour?

I've got some apps I would like to make visible with zeroconf.

  1. Is there an easy scriptable way to do this?
  2. Is there anything that needs to be done by my network admin to enable this?

Python or sh would be preferrable. OS-specific suggestions welcome for Linux and OS X.

like image 536
Mark Harrison Avatar asked Dec 16 '09 16:12

Mark Harrison


People also ask

What is Bonjour zeroconf?

Bonjour, also known as zero-configuration networking, enables automatic discovery of devices and services on a local network using industry standard IP protocols.

What is Bonjour Linux?

Bonjour (also meaning hello in French) enables users to easily set up a local area network (LAN) without any configuration. It allows devices and applications on LAN to discover and connect with each other. It's beneficial for connecting Apple devices and applications to Windows and Linux devices.


2 Answers

pybonjour doesn't seem to be actively maintained. I'm using python-zeroconf.

pip install zeroconf

Here is an excerpt from a script I use to announce a Twisted-Autobahn WebSocket to an iOS device:

from zeroconf import ServiceInfo, Zeroconf

class WebSocketManager(service.Service, object):
    ws_service_name = 'Verasonics WebSocket'
    wsPort = None
    wsInfo = None

    def __init__(self, factory, portCallback):
        factory.protocol = BroadcastServerProtocol
        self.factory = factory
        self.portCallback = portCallback
        self.zeroconf = Zeroconf()

    def privilegedStartService(self):
        self.wsPort = reactor.listenTCP(0, self.factory)
        port = self.wsPort.getHost().port

        fqdn = socket.gethostname()
        ip_addr = socket.gethostbyname(fqdn)
        hostname = fqdn.split('.')[0]

        wsDesc = {'service': 'Verasonics Frame', 'version': '1.0.0'}
        self.wsInfo = ServiceInfo('_verasonics-ws._tcp.local.',
                                  hostname + ' ' + self.ws_service_name + '._verasonics-ws._tcp.local.',
                                  socket.inet_aton(ip_addr), port, 0, 0,
                                  wsDesc, hostname + '.local.')
        self.zeroconf.register_service(self.wsInfo)
        self.portCallback(port)

        return super(WebSocketManager, self).privilegedStartService()

    def stopService(self):
        self.zeroconf.unregister_service(self.wsInfo)

        self.wsPort.stopListening()
        return super(WebSocketManager , self).stopService()
like image 167
Cameron Lowell Palmer Avatar answered Oct 03 '22 01:10

Cameron Lowell Palmer


Or you can just use bash:

dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]

This works by default on OS X. For other *nixes, refer to the avahi-publish man page (which you may need to install via your preferred package manager).

like image 45
Zack Avatar answered Oct 03 '22 01:10

Zack