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)
Exemple #3
0
    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)
Exemple #6
0
 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)
Exemple #7
0
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)
Exemple #8
0
    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)
Exemple #9
0
    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)
Exemple #11
0
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)