def QueryCallback(sdRef,flags,interfaceIndex, errorCode,fullname,rrtype, rrclass,rdlen,rdata, ttl,userdata): # This is very ugly; should understand resource records better st = struct.unpack('%dc' % (rdlen-1), rdata) l1 = ord(st[0]) l2 = ord(st[l1+1]) typ = ''.join(st[1:l1+1]) klass = ''.join(st[l1+2:l1+l2+2]) serviceType = typ + '.' + klass if flags & SERVICE_ADD: # Add the service type to the browser app.frame.AddServiceType(serviceType) serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse( serviceRef, # DNSServiceRef *sdRef, 0, # DNSServiceFlags flags, 0, # uint32_t interfaceIndex, serviceType, # const char *regtype, 'local.', # const char *domain, /* may be NULL */ BrowseCallback, # DNSServiceBrowseReply callBack, None) if ret: print "ret = %d; exiting" % ret sys.exit(1) fd = bonjour.DNSServiceRefSockFD(serviceRef) serviceRefDict[fd] = serviceRef elif flags == 0: app.frame.RemoveServiceType(serviceType)
def Run(self): self.running = 1 # Allocate a service discovery ref and browse for the specified service type self.serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse(self.serviceRef, 0, 0, self.serviceType, 'local.', self.__BrowseCallback, None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret raise BrowserError('browse',ret) # Get socket descriptor fd = bonjour.DNSServiceRefSockFD(self.serviceRef) if fd <= 0: raise BrowserError('fd',fd) # Loop while self.IsRunning(): # print "do select" ret = select.select([fd],[],[],self.timeout) if ret[0]: #print "do process result" ret = bonjour.DNSServiceProcessResult(self.serviceRef) if ret != bonjour.kDNSServiceErr_NoError: raise BrowserError('processresult',ret)
def startBrowsing(self): """Advertise the service with Bonjour. This method returns a deferred. Upon success, the result is a dictionary of information about the service. Upon failure, the result is a Failure object that knows the BonjourError code. """ # Allocate a Bonjour Service Reference self.sdRef = bonjour.AllocateDNSServiceRef() # Initiate Registration of the service ret = bonjour.pyDNSServiceBrowse(self.sdRef, self.flags, self.interfaceIndex, self.regtype, self.domain, self.callback, self.context) # Error check for immediate failure if ret != bonjour.kDNSServiceErr_NoError: raise BonjourBrowseError(ret) # Get the file descriptor and integrate with twisted self.fd = bonjour.DNSServiceRefSockFD(self.sdRef) self.bonjourDesc = BonjourDescriptor(self.fd, self.sdRef) self.reactor.addReader(self.bonjourDesc) return None
def Run(self): self.running = 1 # Allocate a service discovery ref and browse for the specified service type self.serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse(self.serviceRef, 0, 0, self.serviceType, 'local.', self.__BrowseCallback, None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret raise BrowserError('browse', ret) # Get socket descriptor fd = bonjour.DNSServiceRefSockFD(self.serviceRef) if fd <= 0: raise BrowserError('fd', fd) # Loop while self.IsRunning(): # print "do select" ret = select.select([fd], [], [], self.timeout) if ret[0]: #print "do process result" ret = bonjour.DNSServiceProcessResult(self.serviceRef) if ret != bonjour.kDNSServiceErr_NoError: raise BrowserError('processresult', ret)
def run(self): serviceRefs = {} for stype in ['_tp', '_tps', '_tp-http', '_tp-https']: stype = stype+'._tcp' print "registering for", stype # Allocate a service discovery ref and browse for the specified service type serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse( serviceRef, # DNSServiceRef *sdRef, 0, # DNSServiceFlags flags, 0, # uint32_t interfaceIndex, stype, # const char *regtype, 'local.', # const char *domain, /* may be NULL */ self.BrowseCallback, # DNSServiceBrowseReply callBack, None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret fd = bonjour.DNSServiceRefSockFD(serviceRef) serviceRefs[fd] = serviceRef # Get socket descriptor and loop while not self._exit: ret = select.select(serviceRefs.keys(),[],[], 0.5) for fd in ret[0]: ret = bonjour.DNSServiceProcessResult(serviceRefs[fd]) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret # Deallocate the service discovery ref bonjour.DNSServiceRefDeallocate(serviceRef)
def _run(serviceRef): ret = bonjour.pyDNSServiceBrowse( serviceRef, 0, 0, self.type, None, self._browseCallback, None ) if ret != bonjour.kDNSServiceErr_NoError: raise Exception("Bonjour error %s" % ret) fd = bonjour.DNSServiceRefSockFD(serviceRef) while not self.found: select.select([fd],[],[]) bonjour.DNSServiceProcessResult(serviceRef)
def discover(stype='', adder=None, remover=None, *userdata): ''' ''' service_ref = bonjour.AllocateDNSServiceRef() args = {'adder': adder, 'remover': remover, 'other':userdata, 'ref': service_ref} if stype == '': stype = SERVICE_TYPE retval = bonjour.pyDNSServiceBrowse(service_ref, 0, 0, stype, SERVICE_DOMAIN, _browse_callback, args) if retval != bonjour.kDNSServiceErr_NoError: message = "unable to allocate service discovery" raise BrowseError(message, reference=service_ref, errorval=retval) fd = bonjour.DNSServiceRefSockFD(service_ref) source = gobject.io_add_watch(fd, gobject.IO_IN, _fd_callback, service_ref) _add_ref(service_ref, source)
def browse(self,name): sys.stderr.write("\nBrowsing for service '%s'\n" % (name)) ret = bonjour.pyDNSServiceBrowse( self.__serviceRef, 0, 0, self.regtype, None, self.__BrowseCallback, name) if ret != bonjour.kDNSServiceErr_NoError: print "browse: ret = %d; exiting" % ret sys.exit(1) #Block until service is found fd = bonjour.DNSServiceRefSockFD(self.__serviceRef) self.__waitEvent.clear() while not self.__waitEvent.isSet(): ret = select.select([fd],[],[]) ret = bonjour.DNSServiceProcessResult(self.__serviceRef) print "Found service: %s; resolving" % (__servicename) #Block until service is resolved while not self.__resolveEvent.isSet(): time.sleep(.5)
def scanServices(self): # Allocate a service discovery ref and browse for the specified service type serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse( serviceRef, 0, # no flags 0, # all network interfaces "_ssh._tcp", # meta-query record name "local.", self.BrowseCallback, # callback function ptr None, ) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret sys.exit(1) # Get socket descriptor and loop fd = bonjour.DNSServiceRefSockFD(serviceRef) while 1: ret = select.select([fd], [], [], 1) for fd in ret[0]: bonjour.DNSServiceProcessResult(serviceRef) bonjour.DNSServiceRefDeallocate(serviceRef)
sdRef2 = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceResolve(sdRef2, 0, 0, serviceName, regtype, replyDomain, ResolveCallback, None) bonjour.DNSServiceProcessResult(sdRef2) elif flags == 0: print "Service removed: ", serviceName, regtype # Allocate a service discovery ref and browse for the specified service type serviceRef = bonjour.AllocateDNSServiceRef() ret = bonjour.pyDNSServiceBrowse( serviceRef, # DNSServiceRef *sdRef, 0, # DNSServiceFlags flags, 0, # uint32_t interfaceIndex, sys.argv[1], # const char *regtype, 'local.', # const char *domain, /* may be NULL */ BrowseCallback, # DNSServiceBrowseReply callBack, None) if ret != bonjour.kDNSServiceErr_NoError: print "ret = %d; exiting" % ret sys.exit(1) # Get socket descriptor and loop fd = bonjour.DNSServiceRefSockFD(serviceRef) while 1: ret = select.select([fd], [], []) ret = bonjour.DNSServiceProcessResult(serviceRef) # Deallocate the service discovery ref bonjour.DNSServiceRefDeallocate(serviceRef)
ret = bonjour.pyDNSServiceRegister(serviceRef, flags, interfaceIndex, servicename, regtype, domain, host, port, txtRecordLength, txtRecord, RegisterCallback, userdata) if ret != bonjour.kDNSServiceErr_NoError: print "register: ret = %d; exiting" % ret sys.exit(1) # Get the socket and loop fd = bonjour.DNSServiceRefSockFD(serviceRef) while not waitEvent.isSet(): ret = select.select([fd], [], []) ret = bonjour.DNSServiceProcessResult(serviceRef) sys.stderr.write("\nBrowsing for service\n") ret = bonjour.pyDNSServiceBrowse(serviceRef, 0, 0, regtype, 'local.', BrowseCallback, None) if ret != bonjour.kDNSServiceErr_NoError: print "browse: ret = %d; exiting" % ret sys.exit(1) # Block until service is found fd = bonjour.DNSServiceRefSockFD(serviceRef) waitEvent.clear() while not waitEvent.isSet(): ret = select.select([fd], [], []) ret = bonjour.DNSServiceProcessResult(serviceRef) print "Found service: %s; resolving" % (servicename) # Block until service is resolved while not resolveEvent.isSet(): time.sleep(.5)