Пример #1
0
    def __init__(self, context):

        self.regtype  = '_machinekit._tcp'
        self.timeout  = 3
        self.querytimeout = 2
        self.queried  = []
        self.resolved = []
        self.results = []
        browse_sdRef = pybonjour.DNSServiceBrowse(regtype = self.regtype,
                                                  callBack = self.browse_callback)

        try:
            try:
                while True:
                    ready = select.select([browse_sdRef], [], [], self.timeout)
                    if browse_sdRef in ready[0]:
                        pybonjour.DNSServiceProcessResult(browse_sdRef)
                    else:
                        break
            except KeyboardInterrupt:
                pass
        finally:
            browse_sdRef.close()

        print("results: ", self.results)

        # connect to first result
        if not self.results:
            print("no results")
            sys.exit(1)
        (fullname, hosttarget, port, txt,ip) = self.results[0]

        print("connecting to '%s'" % fullname)
        uri = "tcp://%s:%d" % (ip, port)

        self.socket = context.socket(zmq.DEALER)
        self.socket.identity = "fooclient"
        self.socket.connect(uri)
        self.socket.RCVTIMEO = 2000
        self.rx = Container()
        self.tx = Container()
        self.run()
Пример #2
0
    def resolve_callback(self, sdRef, flags, interfaceIndex, errorCode,
                         fullname, hosttarget, port, txtRecord):
        if errorCode != pb.kDNSServiceErr_NoError:
            logging.error('AvahiService: resolve_callback: error={}'.
                          format(errorCode))
            return

        logging.debug('Resolved service: {}; {}; {}'.format(fullname,
                                                            hosttarget,
                                                            port))
        if fullname not in self._targets:
            self._targets[fullname] = []
        host = hosttarget[:hosttarget.rfind('.local')]
        if INCLUDE_SELF or host != platform.node():
            service = fullname[fullname.find('.') + 1:-7]
            target = {'host': host, 'port': port, 'service': service}
            self._targets[fullname].append(target)
        self.fire_event()

        self._lock.acquire()
        sd = pb.DNSServiceQueryRecord(interfaceIndex=interfaceIndex,
                                      fullname=hosttarget,
                                      rrtype=pb.kDNSServiceType_A,
                                      callBack=self.query_callback)
        old_input = self._input
        self._input = (sd,)
        self._lock.release()

        while not self._stoped and not self._queried:
            R, W, E = select(self._input, [], [], self.TIMEOUT)
            if not (R or W or E):
                break
            map(lambda sd: pb.DNSServiceProcessResult(sd), R)
        else:
            self._queried.pop()

        self.remove_input()
        self._lock.acquire()
        self._input = old_input
        self._lock.release()

        self._resolved.append(True)
def resolve_callback(sdRef, flags, interfaceIndex, errorCode, fullname,
                     hosttarget, port, txtRecord):
    global queried, resolved

    if errorCode != pybonjour.kDNSServiceErr_NoError:
        return

    query_sdRef = pybonjour.DNSServiceQueryRecord(interfaceIndex = interfaceIndex, fullname = hosttarget, rrtype = pybonjour.kDNSServiceType_A, callBack = query_record_callback(port))
    print "Service {} Resolved; Querying".format(hosttarget)

    while service_address is None and not queried:
        ready = select.select([query_sdRef], [], [], 5)
        if query_sdRef not in ready[0]:
            print 'Query record timed out'
            break
        pybonjour.DNSServiceProcessResult(query_sdRef)
    else:
        queried.pop()
    query_sdRef.close()
    resolved.append(True)
Пример #4
0
 def run(self):
     logging.debug("Bonjour: Started")
     if not have_bonjour:
         logging.warn("Bonjour: Missing Package Please Install")
         return
     
     sdRef = pybonjour.DNSServiceRegister(name = self.name,
                                          regtype = self.regtype,
                                          port = self.port,
                                          callBack = self.register_callback)
     try:
         try:
             while True:
                 ready = select.select([sdRef], [], [])
                 if sdRef in ready[0]:
                     pybonjour.DNSServiceProcessResult(sdRef)
         except KeyboardInterrupt:
             pass
     finally:
         sdRef.close()
Пример #5
0
 def __bonjour_browse_callback(self, sdRef, flags, interfaceIndex, errorCode, serviceName, regtype, replyDomain):
     if errorCode != pybonjour.kDNSServiceErr_NoError:
         return
     if not (flags & pybonjour.kDNSServiceFlagsAdd):
         if serviceName in self.httpd.peers:
             del self.httpd.peers[serviceName]
         print 'self.httpd.peers', self.httpd.peers
         return
     resolve_sdRef = pybonjour.DNSServiceResolve(0, interfaceIndex, serviceName, regtype, replyDomain, self.__bonjour_resolve_callback)
     try:
         while not resolved:
             ready = select.select([resolve_sdRef], [], [], 5)
             if resolve_sdRef not in ready[0]:
                 #print 'Resolve timed out'
                 break
             pybonjour.DNSServiceProcessResult(resolve_sdRef)
         else:
             resolved.pop()
     finally:
         resolve_sdRef.close()
Пример #6
0
	def wait(self, sdref):
		'''
		Wait (with timeout) for the provided Bonjour reference to
		complete, then process the result to invoke the provided
		callback.

		After the callback has been called in the call to
		DNSServiceProcessResult, copy and return the result.
		'''

		rec = None
		while not self.cbresult:
			# Wait until the resolution result is ready
			ready = select.select([sdref], [], [], self.timeout)
			if sdref not in ready[0]: break
			# Continue to attempt the query if an error occurred
			mdns.DNSServiceProcessResult(sdref)
		else: rec = self.cbresult.pop()

		return rec
Пример #7
0
def findConferoViewServer():
    """
    Call this to get a list of server s. A list will be returned in most cases
    because the computer running the server have multiple ip's.
    :return:
    """
    browse_sdRef = pybonjour.DNSServiceBrowse(regtype=regtype,
                                              callBack=browse_callback)

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

    return confero_server_bonjour_info[0]
Пример #8
0
    def resolve_callback(self, sdRef, flags, interfaceIndex, errorCode,
                         fullname, hosttarget, port, txtRecord):
        """
        Callback for resolving hosts that have been detected through the browse 
        routine.
        """
        if errorCode == pybonjour.kDNSServiceErr_NoError:
            if self.fullname == fullname:
                localhost = True
                self.debug("Resolved Self")
            else:
                localhost = False
            for client in self.clients.itervalues():
                if sdRef == client.resolve_sdRef:
                    client.hostname = hosttarget.decode('utf-8')
                    client.port = port
                    break;
            if localhost:
                if self.clients.has_key(client.serviceName):
                    del self.clients[client.serviceName]
                return

            client.query_sdRef = \
                    pybonjour.DNSServiceQueryRecord(interfaceIndex=interfaceIndex,
                                                    fullname=hosttarget,
                                                    rrtype=pybonjour.kDNSServiceType_A,
                                                    callBack=self.query_record_callback)
            try:
                while not self.queried:
                    ready = select.select([client.query_sdRef], [], [], self.timeout)
                    if client.query_sdRef not in ready[0]:
                        self.debug("Query record timed out")
                        break
                    pybonjour.DNSServiceProcessResult(client.query_sdRef)
                else:
                    self.queried.pop()
            finally:
                client.query_sdRef.close()
            self.resolved.append(True)
        else:
            self.error("Resolve failed with code: %s" % errorCode)
Пример #9
0
    def discovery(self, regtype):
        def resolve_callback(sdRef, flags, interfaceIndex, errorCode, fullname,
                             hosttarget, port, txtRecord):
            if errorCode == pybonjour.kDNSServiceErr_NoError:
                self.devices.append(hosttarget)

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

            if not (flags & pybonjour.kDNSServiceFlagsAdd):
                log.debug('Bonjour service removed')
                return

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

            while True:
                ready = select.select([resolve_sdRef], [], [], self.timeout)
                if resolve_sdRef not in ready[0]:
                    log.debug('Bonjour discovery timeout reached')
                    self.is_timeout = True
                    break
                pybonjour.DNSServiceProcessResult(resolve_sdRef)
            resolve_sdRef.close()

        browse_sdRef = pybonjour.DNSServiceBrowse(regtype = regtype,
                                                  callBack = browse_callback)
        try:
            while not self.devices and not self.is_timeout:
                ready = select.select([browse_sdRef], [], [])
                if browse_sdRef in ready[0]:
                    pybonjour.DNSServiceProcessResult(browse_sdRef)
        finally:
            browse_sdRef.close()
            return self.devices
Пример #10
0
    def run(self):
        while True:
            if not self.mdnsd.is_alive():
                self.mdnsd.wait(timeout=10)

            try:
                obj = self.queue.get(block=True, timeout=self.timeout)
            except queue.Empty:
                if self.finished.is_set():
                    break
                continue

            regtype = self.to_regtype(obj)
            if not regtype:
                continue

            sdRef = pybonjour.DNSServiceBrowse(
                regtype=regtype,
                callBack=self.on_discover
            )

            self.references.append(sdRef)
            _references = list(filter(self.active, self.references))

            r, w, x = select.select(_references + [self.pipe[0]], [], [])
            if self.pipe[0] in r:
                break
            for ref in r:
                pybonjour.DNSServiceProcessResult(ref)
            if not (obj.flags & kDNSServiceFlagsAdd):
                self.references.remove(sdRef)
                if self.active(sdRef):
                    sdRef.close()

            if self.finished.is_set():
                break

        for ref in self.references:
            self.references.remove(ref)
            if self.active(ref):
                ref.close()
Пример #11
0
    def find_all(self, protocol_version='5', timeout=5):
        self.pversion = protocol_version
        self.timeout = timeout
        self.moku_list = []

        browse_sdRef = pybonjour.DNSServiceBrowse(
            regtype='_moku._tcp', callBack=self.browse_callback)

        start = time.time()
        try:
            try:
                while time.time() - start < timeout:
                    ready = select.select([browse_sdRef], [], [], self.timeout)
                    if browse_sdRef in ready[0]:
                        pybonjour.DNSServiceProcessResult(browse_sdRef)
            except KeyboardInterrupt:
                pass
        finally:
            browse_sdRef.close()

        return self.moku_list
Пример #12
0
    def run(self):
        if not have_bonjour:
            logging.warning(
                "Cannot run bonjour server!  Maybe some packages need to be installed?"
            )
            return

        sdRef = pybonjour.DNSServiceRegister(name=self.name,
                                             regtype=self.regtype,
                                             port=self.port,
                                             callBack=self.register_callback)
        try:
            try:
                while True:
                    ready = select.select([sdRef], [], [])
                    if sdRef in ready[0]:
                        pybonjour.DNSServiceProcessResult(sdRef)
            except KeyboardInterrupt:
                pass
        finally:
            sdRef.close()
Пример #13
0
		def browse_callback(sd_ref, flags, interface_index, error_code, service_name, regtype, reply_domain):
			if error_code != pybonjour.kDNSServiceErr_NoError:
				return

			if not (flags & pybonjour.kDNSServiceFlagsAdd):
				return

			self._logger.debug("Got a browsing result for Zeroconf resolution of {service_type}, resolving...".format(service_type=service_type))
			resolve_ref = pybonjour.DNSServiceResolve(0, interface_index, service_name, regtype, reply_domain, resolve_callback)

			try:
				while not resolved:
					ready = select.select([resolve_ref], [], [], resolve_timeout)
					if resolve_ref not in ready[0]:
						break

					pybonjour.DNSServiceProcessResult(resolve_ref)
				else:
					resolved.pop()
			finally:
				resolve_ref.close()
Пример #14
0
 def register(self):
     """
     Register a service on the network for type "regtype"
     """
     reg_sdRef = pybonjour.DNSServiceRegister(name=self.name,
                                             regtype=self.regtype,
                                             port=self.port,
                                             callBack=self.register_callback)
     self.debug("Registration Service Started")
     try:
         try:
             while self._isRegisterRunning:
                 ready = select.select([reg_sdRef], [], [], self.timeout)
                 if reg_sdRef in ready[0]:
                     pybonjour.DNSServiceProcessResult(reg_sdRef)
         except Exception:
             self.error("Exception in Registration")
             pass
     finally:
         reg_sdRef.close()
         self.debug("Registration Service Stopped")
Пример #15
0
    def resolve(self, service_type, service_name=None):
        self.name_filter = service_name
        self.resolve_error = False
        browse_sdRef = pybonjour.DNSServiceBrowse(regtype = service_type, callBack = self._browse_callback)

        try:
            while True:
                ready = select.select([browse_sdRef], [], [])
                if browse_sdRef in ready[0]:
                    pybonjour.DNSServiceProcessResult(browse_sdRef)
    
                if (   self.resolve_error
                    or self.resolved):
                        break
        finally:
            browse_sdRef.close()        

        if self.resolved:
            return self.resolved
        
        return False
Пример #16
0
    def resolve_all(self):
        if not self.connected:
            return

        # for now put here as this is synchronous
        self.browse_loop()

        for val in self.contacts.values():
            resolve_sdRef = pybonjour.DNSServiceResolve(
                0, pybonjour.kDNSServiceInterfaceIndexAny,
                val[Constant.BARE_NAME], self.stype + '.',
                val[Constant.DOMAIN] + '.', self.service_resolved_all_callback)

            try:
                ready = select.select([resolve_sdRef], [], [], resolve_timeout)
                if resolve_sdRef not in ready[0]:
                    gajim.log.debug('Resolve timed out (in resolve_all)')
                    break
                pybonjour.DNSServiceProcessResult(resolve_sdRef)
            finally:
                resolve_sdRef.close()
Пример #17
0
    def resolve_all(self):
        if not self.connected:
            return False
        # for now put here as this is synchronous
        if not self.browse_loop():
            return False

        # Monitor TXT Records with DNSServiceQueryRecord because
        # its more efficient (see pybonjour documentation)
        for val in self.contacts.values():
            try:
                query_sdRef = None
                query_sdRef = \
                    pybonjour.DNSServiceQueryRecord(
                        interfaceIndex=pybonjour.kDNSServiceInterfaceIndexAny,
                        fullname=val[Constant.RESOLVED_INFO][0][Constant.BARE_NAME],
                        rrtype=pybonjour.kDNSServiceType_TXT,
                        callBack=self.query_txt_callback)

                while not self.queried:
                    ready = select.select([query_sdRef], [], [],
                                          resolve_timeout)
                    if query_sdRef not in ready[0]:
                        log.info('Query record timed out')
                        break
                    pybonjour.DNSServiceProcessResult(query_sdRef)
                else:
                    self.queried.pop()

            except pybonjour.BonjourError as error:
                if error.errorCode == pybonjour.kDNSServiceErr_ServiceNotRunning:
                    log.info('Service not running')
                    return False
                else:
                    log.error('Error in query for TXT records. %s', error)
            finally:
                if query_sdRef:
                    query_sdRef.close()

        return True
Пример #18
0
def findConferoViewServer():
    """
    Call this to get a list of server s. A list will be returned in most cases
    because the computer running the server have multiple ip's.
    :return:
    """
    browse_sdRef = pybonjour.DNSServiceBrowse(regtype=regtype,
                                              callBack=browse_callback)

    try:
        try:
            ready = select.select([browse_sdRef], [], [])
            if browse_sdRef in ready[0]:
                pybonjour.DNSServiceProcessResult(browse_sdRef)
        except KeyboardInterrupt:
            pass
    finally:
        browse_sdRef.close()
    ip_index = 1
    valid_inputs = len(confero_server_bonjour_info)
    print 'Number of IPs returned by Bonjour:', valid_inputs
    if valid_inputs > 1:
        print
        print
        print '*** Confero View Server IP Address Selection Required ***'
        for i, o in enumerate(confero_server_bonjour_info):
            print '\t', i + 1, ':', o['ip']
        print
        ok_ip_selected = False
        while ok_ip_selected is False:
            ip_index = raw_input(">> Enter the ID of the Server IP Address:")
            try:
                ip_index = int(ip_index)
                if ip_index > 0 and ip_index <= valid_inputs:
                    ok_ip_selected = True
            except:
                pass

    print 'Bonjour IP Selected:', ip_index
    return confero_server_bonjour_info[ip_index - 1]
Пример #19
0
def query_callback(sdRef, flags, interfaceIndex, errorCode, serviceName,
                   regtype, replyDomain):
    if errorCode != pybonjour.kDNSServiceErr_NoError:
        return
    if not (flags & pybonjour.kDNSServiceFlagsAdd):
        return
    if state.timeout:
        timeout = state.timeout
    else:
        timeout = None
    state.current = {'name': serviceName, 'type': regtype}
    sdRef = pybonjour.DNSServiceResolve(0, interfaceIndex, serviceName,
                                        regtype, replyDomain, resolve_callback)
    try:
        while 1:
            ready = select([sdRef], [], [], timeout)
            if sdRef not in ready[0]:
                break
            return pybonjour.DNSServiceProcessResult(sdRef)
    finally:
        state.current = None
        sdRef.close()
Пример #20
0
    def run(self):
        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=self.name,
                                             regtype=self.regtype,
                                             port=self.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()
Пример #21
0
    def _register(self, name, regtype, port):
        if not (name and regtype and port):
            return

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

        while True:
            r, w, x = select.select([sdRef, self.pipe[0]], [], [])
            if self.pipe[0] in r:
                break

            for ref in r:
                pybonjour.DNSServiceProcessResult(ref)

            if self.finished.is_set():
                break

        # This deregisters service
        sdRef.close()
Пример #22
0
    def service_resolved_callback(self, sdRef, flags, interfaceIndex,
                                  errorCode, fullname, hosttarget, port,
                                  txtRecord):

        if errorCode != pybonjour.kDNSServiceErr_NoError:
            log.error('Error in service_resolved_callback: %s', str(errorCode))
            return

        self.resolved_contacts[hosttarget] = (fullname, port, txtRecord)

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

            while not self.queried:
                ready = select.select([query_sdRef], [], [], resolve_timeout)
                if query_sdRef not in ready[0]:
                    log.warning('Query record timed out')
                    break
                pybonjour.DNSServiceProcessResult(query_sdRef)
            else:
                self.queried.pop()

        except pybonjour.BonjourError as error:
            if error.errorCode == pybonjour.kDNSServiceErr_ServiceNotRunning:
                log.info('Service not running')
            else:
                self.error_CB(_('Error while adding service. %s') % error)

        finally:
            if query_sdRef:
                query_sdRef.close()

        self.resolved.append(True)
Пример #23
0
    def _callback_resolve(self, sdref, flags, interfaceindex, error, fullname,
                          hosttarget, port, txtrecord):
        if error != pybonjour.kDNSServiceErr_NoError:
            return

        self.__service._full_name = fullname
        self.__service._host_target = hosttarget
        self.__service._port = port
        self.__service._txt_record = txtrecord

        sdref = pybonjour.DNSServiceQueryRecord(
            interfaceIndex=interfaceindex,
            fullname=hosttarget,
            rrtype=pybonjour.kDNSServiceType_A,
            callBack=self._callback_query)

        ready = select.select([sdref], [], [], 5)
        if sdref not in ready[0]:
            return

        pybonjour.DNSServiceProcessResult(sdref)
        sdref.close()
Пример #24
0
def register(name, regtype, port, host=None, txt=None):
    if txt:
        txt = pybonjour.TXTRecord(txt)
    else:
        txt = ''
    sdRef = pybonjour.DNSServiceRegister(name=name,
                                         interfaceIndex=0,
                                         regtype=regtype,
                                         port=port,
                                         host=host,
                                         txtRecord=txt,
                                         callBack=None)
    try:
        try:
            while True:
                ready = select.select([sdRef], [], [])
                if sdRef in ready[0]:
                    pybonjour.DNSServiceProcessResult(sdRef)
        except KeyboardInterrupt:
            pass
    finally:
        sdRef.close()
Пример #25
0
    def browse_callback(self, sdRef, flags, interfaceIndex, errorCode,
                        serviceName, regtype, replyDomain):
        if errorCode != pybonjour.kDNSServiceErr_NoError:
            return

        if not (flags & pybonjour.kDNSServiceFlagsAdd):
            return

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

        try:
            while not self.resolved:
                ready = select.select([resolve_sdRef], [], [], timeout)
                if resolve_sdRef not in ready[0]:
                    print 'Resolve timed out'
                    break
                pybonjour.DNSServiceProcessResult(resolve_sdRef)
        finally:
            resolve_sdRef.close()
Пример #26
0
    def __register(self):
        #return

        server = jsonrpc.Server(
            jsonrpc.JsonRpc20(),
            jsonrpc.TransportTcpIp(addr=('', self.rpc_port))
        )  #, logfunc=jsonrpc.log_file("myrpc.%i.log"%self.rpc_port)
        server.register_function(self.get_hg_port)
        server.register_function(self.get_bt_port)
        server.register_function(self.you_should_pull_from)
        server.register_function(self.please_mirror)
        server.register_function(self.get_active_info_hashes)
        server.register_function(self.get_free_space)
        server.register_function(self.please_stop_mirroring)

        t = threading.Thread(target=server.serve)
        t.daemon = True
        t.start()

        t = threading.Thread(target=self.repo.hg_serve, args=(self.hg_port, ))
        t.daemon = True
        t.start()
        print 'http://localhost:%i/' % self.hg_port

        print 'registering bonjour listener...'
        self.bj_name = self.name + '__' + uuid.uuid4().hex
        bjservice = pybonjour.DNSServiceRegister(
            name=self.bj_name,
            regtype="_delugefs._tcp",
            port=self.rpc_port,
            callBack=self.__bonjour_register_callback)
        try:
            while True:
                ready = select.select([bjservice], [], [])
                if bjservice in ready[0]:
                    pybonjour.DNSServiceProcessResult(bjservice)
        except KeyboardInterrupt:
            pass
Пример #27
0
    def create_service(self):
        txt = {}

        # remove empty keys
        for key, val in self.txt.items():
            if val:
                txt[key] = val

        txt['port.p2pj'] = self.port
        txt['version'] = 1
        txt['txtvers'] = 1

        # replace gajim's show messages with compatible ones
        if 'status' in self.txt:
            txt['status'] = self.replace_show(self.txt['status'])
        else:
            txt['status'] = 'avail'
        self.txt = txt
        try:
            self.service_sdRef = pybonjour.DNSServiceRegister(
                name=self.name,
                regtype=self.stype,
                port=self.port,
                txtRecord=pybonjour.TXTRecord(self.txt, strict=True),
                callBack=self.service_added_callback)

            log.info('Publishing service %s of type %s', self.name, self.stype)

            ready = select.select([self.service_sdRef], [], [])
            if self.service_sdRef in ready[0]:
                pybonjour.DNSServiceProcessResult(self.service_sdRef)

        except pybonjour.BonjourError as error:
            if error.errorCode == pybonjour.kDNSServiceErr_ServiceNotRunning:
                log.info('Service not running')
            else:
                self.error_CB(_('Error while adding service. %s') % error)
            self.disconnect()
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 'DC Service found; resolving'
    global resolved_addrs
    resolve_sdRef = pybonjour.DNSServiceResolve(0, interfaceIndex, serviceName,
                                                regtype, replyDomain,
                                                resolve_callback)

    try:
        while True:
            ready = select.select([resolve_sdRef], [], [], timeout)
            if resolve_sdRef not in ready[0]:
                break
            pybonjour.DNSServiceProcessResult(resolve_sdRef)
    finally:
        resolve_sdRef.close()
Пример #29
0
def register_service(name, regtype, port):
    def register_callback(sdRef, flags, errorCode, name, regtype, domain):
        if errorCode == pybonjour.kDNSServiceErr_NoError:
            logger.debug('Registered bonjour service %s.%s', name, regtype)

    record = pybonjour.TXTRecord(appletv.DEVICE_INFO)

    service = pybonjour.DNSServiceRegister(name=name,
                                           regtype=regtype,
                                           port=port,
                                           txtRecord=record,
                                           callBack=register_callback)

    try:
        try:
            while True:
                ready = select.select([service], [], [])
                if service in ready[0]:
                    pybonjour.DNSServiceProcessResult(service)
        except KeyboardInterrupt:
            pass
    finally:
        service.close()
Пример #30
0
    def create_service(self):
        txt = {}

        #remove empty keys
        for key, val in self.txt:
            if val:
                txt[key] = val

        txt['port.p2pj'] = self.port
        txt['version'] = 1
        txt['txtvers'] = 1

        # replace gajim's show messages with compatible ones
        if 'status' in self.txt:
            txt['status'] = self.replace_show(self.txt['status'])
        else:
            txt['status'] = 'avail'

        self.txt = pybonjour.TXTRecord(txt, strict=True)

        try:
            sdRef = pybonjour.DNSServiceRegister(
                name=self.name,
                regtype=self.stype,
                port=self.port,
                txtRecord=self.txt,
                callBack=self.service_added_callback)
            self.service_sdRef = sdRef
        except pybonjour.BonjourError as e:
            self.service_add_fail_callback(e)
        else:
            gajim.log.debug('Publishing service %s of type %s' %
                            (self.name, self.stype))

            ready = select.select([sdRef], [], [], resolve_timeout)
            if sdRef in ready[0]:
                pybonjour.DNSServiceProcessResult(sdRef)