def locate(self): """When invoked, this populates the MirrorDetector object with URLs that name dynamically discovered content mirrors.""" # Clear the list of mirrors. It will be repopulated later. self._mirrors = [] if not "pybonjour" in globals(): return timedout = False tval = self.__timeout def browse_cb(sd_hdl, flags, interface_idx, error_code, service_name, regtype, reply_domain): if error_code != pybonjour.kDNSServiceErr_NoError: return if not (flags & pybonjour.kDNSServiceFlagsAdd): return self._resolve_server(interface_idx, error_code, service_name, regtype, reply_domain) try: sd_hdl = pybonjour.DNSServiceBrowse( regtype=self.__service, callBack=browse_cb) except pybonjour.BonjourError as e: errstr = "mDNS Service Browse Failed: {0}\n".format( e.args[0][1]) raise tx.mDNSException(errstr) try: while not timedout: avail = select.select([sd_hdl], [], [], tval) if sd_hdl in avail[0]: pybonjour.DNSServiceProcessResult( sd_hdl) tval = 0 else: timedout = True except select.error as e: errstr = "Select failed: {0}\n".format(e.args[1]) raise tx.mDNSException(errstr) except pybonjour.BonjourError as e: errstr = "mDNS Process Result failed: {0}\n".format( e.args[0][1]) raise tx.mDNSException(errstr) finally: sd_hdl.close()
def _resolve_server(self, if_idx, ec, service_name, regtype, reply_domain): """Invoked to resolve mDNS information about a service that was discovered by a Browse call.""" timedout = False tval = self.__timeout def resolve_cb(sd_hdl, flags, interface_idx, error_code, full_name, host_target, port, txt_record): if error_code != pybonjour.kDNSServiceErr_NoError: return tr = pybonjour.TXTRecord.parse(txt_record) if "url" in tr: url = tr["url"] if not misc.valid_pub_url(url): return self._mirrors.append(pub.RepositoryURI(url)) try: sd_hdl = pybonjour.DNSServiceResolve(0, if_idx, service_name, regtype, reply_domain, resolve_cb) except pybonjour.BonjourError, e: errstr = "mDNS Service Resolve Failed: %s\n" % e[0][1] raise tx.mDNSException(errstr)
def locate(self): """When invoked, this populates the MirrorDetector object with URLs that name dynamically discovered content mirrors.""" # Clear the list of mirrors. It will be repopulated later. self._mirrors = [] if not "pybonjour" in globals(): return timedout = False tval = self.__timeout def browse_cb(sd_hdl, flags, interface_idx, error_code, service_name, regtype, reply_domain): if error_code != pybonjour.kDNSServiceErr_NoError: return if not (flags & pybonjour.kDNSServiceFlagsAdd): return self._resolve_server(interface_idx, error_code, service_name, regtype, reply_domain) try: sd_hdl = pybonjour.DNSServiceBrowse(regtype=self.__service, callBack=browse_cb) except pybonjour.BonjourError, e: errstr = "mDNS Service Browse Failed: %s\n" % e[0][1] raise tx.mDNSException(errstr)
def _resolve_server(self, if_idx, ec, service_name, regtype, reply_domain): """Invoked to resolve mDNS information about a service that was discovered by a Browse call.""" timedout = False tval = self.__timeout def resolve_cb(sd_hdl, flags, interface_idx, error_code, full_name, host_target, port, txt_record): if error_code != pybonjour.kDNSServiceErr_NoError: return tr = pybonjour.TXTRecord.parse(txt_record) if "url" in tr: url = tr["url"] if not misc.valid_pub_url(url): return self._mirrors.append(pub.RepositoryURI(url)) try: sd_hdl = pybonjour.DNSServiceResolve(0, if_idx, service_name, regtype, reply_domain, resolve_cb) except pybonjour.BonjourError as e: errstr = "mDNS Service Resolve Failed: {0}\n".format( e.args[0][1]) raise tx.mDNSException(errstr) try: while not timedout: avail = select.select([sd_hdl], [], [], tval) if sd_hdl in avail[0]: pybonjour.DNSServiceProcessResult( sd_hdl) tval = 0 else: timedout = True except select.error as e: errstr = "Select failed; {0}\n".format(e.args[1]) raise tx.mDNSException(errstr) except pybonjour.BonjourError as e: errstr = "mDNS Process Result Failed: {0}\n".format( e.args[0][1]) raise tx.mDNSException(errstr) finally: sd_hdl.close()
class MirrorDetector(object): """This class uses mDNS and DNS-SD to find link-local content mirrors that may be present on the client's subnet.""" def __init__(self): self._mirrors = [] self.__timeout = 1 self.__service = "_pkg5._tcp" def __contains__(self, key): return key in self._mirrors def __getitem__(self, pos): return self._mirrors[pos] def __iter__(self): """Each time iterator is invoked, randomly select up to five mirrors from the list of available mirrors.""" listlen = len(self._mirrors) iterlst = random.sample(xrange(listlen), min(listlen, 5)) for v in iterlst: yield self._mirrors[v] def locate(self): """When invoked, this populates the MirrorDetector object with URLs that name dynamically discovered content mirrors.""" # Clear the list of mirrors. It will be repopulated later. self._mirrors = [] if not "pybonjour" in globals(): return timedout = False tval = self.__timeout def browse_cb(sd_hdl, flags, interface_idx, error_code, service_name, regtype, reply_domain): if error_code != pybonjour.kDNSServiceErr_NoError: return if not (flags & pybonjour.kDNSServiceFlagsAdd): return self._resolve_server(interface_idx, error_code, service_name, regtype, reply_domain) try: sd_hdl = pybonjour.DNSServiceBrowse(regtype=self.__service, callBack=browse_cb) except pybonjour.BonjourError, e: errstr = "mDNS Service Browse Failed: %s\n" % e[0][1] raise tx.mDNSException(errstr) try: while not timedout: avail = select.select([sd_hdl], [], [], tval) if sd_hdl in avail[0]: pybonjour.DNSServiceProcessResult(sd_hdl) tval = 0 else: timedout = True except select.error, e: errstr = "Select failed: %s\n" % e[1] raise tx.mDNSException(errstr)
raise tx.mDNSException(errstr) try: while not timedout: avail = select.select([sd_hdl], [], [], tval) if sd_hdl in avail[0]: pybonjour.DNSServiceProcessResult(sd_hdl) tval = 0 else: timedout = True except select.error, e: errstr = "Select failed: %s\n" % e[1] raise tx.mDNSException(errstr) except pybonjour.BonjourError, e: errstr = "mDNS Process Result failed: %s\n" % e[0][1] raise tx.mDNSException(errstr) finally: sd_hdl.close() def _resolve_server(self, if_idx, ec, service_name, regtype, reply_domain): """Invoked to resolve mDNS information about a service that was discovered by a Browse call.""" timedout = False tval = self.__timeout def resolve_cb(sd_hdl, flags, interface_idx, error_code, full_name, host_target, port, txt_record): if error_code != pybonjour.kDNSServiceErr_NoError: return