diff -r 2372284d9457 -r 687b865b95ad hgext/zeroconf/Zeroconf.py --- a/hgext/zeroconf/Zeroconf.py Sun Oct 06 09:45:02 2019 -0400 +++ b/hgext/zeroconf/Zeroconf.py Sun Oct 06 09:48:39 2019 -0400 @@ -76,9 +76,9 @@ ensure names end in '.local.' timeout on receiving socket for clean shutdown""" -__author__ = "Paul Scott-Murphy" -__email__ = "paul at scott dash murphy dot com" -__version__ = "0.12" +__author__ = b"Paul Scott-Murphy" +__email__ = b"paul at scott dash murphy dot com" +__version__ = b"0.12" import errno import itertools @@ -91,11 +91,11 @@ from mercurial import pycompat -__all__ = ["Zeroconf", "ServiceInfo", "ServiceBrowser"] +__all__ = [b"Zeroconf", b"ServiceInfo", b"ServiceBrowser"] # hook for threads -globals()['_GLOBAL_DONE'] = 0 +globals()[b'_GLOBAL_DONE'] = 0 # Some timing constants @@ -160,34 +160,34 @@ # Mapping constants to names _CLASSES = { - _CLASS_IN: "in", - _CLASS_CS: "cs", - _CLASS_CH: "ch", - _CLASS_HS: "hs", - _CLASS_NONE: "none", - _CLASS_ANY: "any", + _CLASS_IN: b"in", + _CLASS_CS: b"cs", + _CLASS_CH: b"ch", + _CLASS_HS: b"hs", + _CLASS_NONE: b"none", + _CLASS_ANY: b"any", } _TYPES = { - _TYPE_A: "a", - _TYPE_NS: "ns", - _TYPE_MD: "md", - _TYPE_MF: "mf", - _TYPE_CNAME: "cname", - _TYPE_SOA: "soa", - _TYPE_MB: "mb", - _TYPE_MG: "mg", - _TYPE_MR: "mr", - _TYPE_NULL: "null", - _TYPE_WKS: "wks", - _TYPE_PTR: "ptr", - _TYPE_HINFO: "hinfo", - _TYPE_MINFO: "minfo", - _TYPE_MX: "mx", - _TYPE_TXT: "txt", - _TYPE_AAAA: "quada", - _TYPE_SRV: "srv", - _TYPE_ANY: "any", + _TYPE_A: b"a", + _TYPE_NS: b"ns", + _TYPE_MD: b"md", + _TYPE_MF: b"mf", + _TYPE_CNAME: b"cname", + _TYPE_SOA: b"soa", + _TYPE_MB: b"mb", + _TYPE_MG: b"mg", + _TYPE_MR: b"mr", + _TYPE_NULL: b"null", + _TYPE_WKS: b"wks", + _TYPE_PTR: b"ptr", + _TYPE_HINFO: b"hinfo", + _TYPE_MINFO: b"minfo", + _TYPE_MX: b"mx", + _TYPE_TXT: b"txt", + _TYPE_AAAA: b"quada", + _TYPE_SRV: b"srv", + _TYPE_ANY: b"any", } # utility functions @@ -223,7 +223,7 @@ class BadDomainName(Exception): def __init__(self, pos): - Exception.__init__(self, "at position %s" % pos) + Exception.__init__(self, b"at position %s" % pos) class BadDomainNameCircular(BadDomainName): @@ -262,31 +262,31 @@ try: return _CLASSES[clazz] except KeyError: - return "?(%s)" % clazz + return b"?(%s)" % clazz def getType(self, type): """Type accessor""" try: return _TYPES[type] except KeyError: - return "?(%s)" % type + return b"?(%s)" % type def toString(self, hdr, other): """String representation with additional information""" - result = "%s[%s,%s" % ( + result = b"%s[%s,%s" % ( hdr, self.getType(self.type), self.getClazz(self.clazz), ) if self.unique: - result += "-unique," + result += b"-unique," else: - result += "," + result += b"," result += self.name if other is not None: - result += ",%s]" % other + result += b",%s]" % other else: - result += "]" + result += b"]" return result @@ -296,7 +296,7 @@ def __init__(self, name, type, clazz): if pycompat.ispy3 and isinstance(name, str): name = name.encode('ascii') - if not name.endswith(".local."): + if not name.endswith(b".local."): raise NonLocalNameException(name) DNSEntry.__init__(self, name, type, clazz) @@ -310,7 +310,7 @@ def __repr__(self): """String representation""" - return DNSEntry.toString(self, "question", None) + return DNSEntry.toString(self, b"question", None) class DNSRecord(DNSEntry): @@ -371,12 +371,12 @@ def toString(self, other): """String representation with additional information""" - arg = "%s/%s,%s" % ( + arg = b"%s/%s,%s" % ( self.ttl, self.getRemainingTTL(currentTimeMillis()), other, ) - return DNSEntry.toString(self, "record", arg) + return DNSEntry.toString(self, b"record", arg) class DNSAddress(DNSRecord): @@ -425,7 +425,7 @@ def __repr__(self): """String representation""" - return self.cpu + " " + self.os + return self.cpu + b" " + self.os class DNSPointer(DNSRecord): @@ -470,7 +470,7 @@ def __repr__(self): """String representation""" if len(self.text) > 10: - return self.toString(self.text[:7] + "...") + return self.toString(self.text[:7] + b"...") else: return self.toString(self.text) @@ -505,7 +505,7 @@ def __repr__(self): """String representation""" - return self.toString("%s:%s" % (self.server, self.port)) + return self.toString(b"%s:%s" % (self.server, self.port)) class DNSIncoming(object): @@ -528,7 +528,7 @@ def readHeader(self): """Reads header portion of packet""" - format = '!HHHHHH' + format = b'!HHHHHH' length = struct.calcsize(format) info = struct.unpack( format, self.data[self.offset : self.offset + length] @@ -544,7 +544,7 @@ def readQuestions(self): """Reads questions section of packet""" - format = '!HH' + format = b'!HH' length = struct.calcsize(format) for i in range(0, self.numquestions): name = self.readName() @@ -561,7 +561,7 @@ def readInt(self): """Reads an integer from the packet""" - format = '!I' + format = b'!I' length = struct.calcsize(format) info = struct.unpack( format, self.data[self.offset : self.offset + length] @@ -577,7 +577,7 @@ def readString(self, len): """Reads a string of a given length from the packet""" - format = '!%ds' % len + format = b'!%ds' % len length = struct.calcsize(format) info = struct.unpack( format, self.data[self.offset : self.offset + length] @@ -587,7 +587,7 @@ def readUnsignedShort(self): """Reads an unsigned short from the packet""" - format = '!H' + format = b'!H' length = struct.calcsize(format) info = struct.unpack( format, self.data[self.offset : self.offset + length] @@ -597,7 +597,7 @@ def readOthers(self): """Reads answers, authorities and additionals section of the packet""" - format = '!HHiH' + format = b'!HHiH' length = struct.calcsize(format) n = self.numanswers + self.numauthorities + self.numadditionals for i in range(0, n): @@ -746,31 +746,31 @@ def writeByte(self, value): """Writes a single byte to the packet""" - format = '!c' + format = b'!c' self.data.append(struct.pack(format, chr(value))) self.size += 1 def insertShort(self, index, value): """Inserts an unsigned short in a certain position in the packet""" - format = '!H' + format = b'!H' self.data.insert(index, struct.pack(format, value)) self.size += 2 def writeShort(self, value): """Writes an unsigned short to the packet""" - format = '!H' + format = b'!H' self.data.append(struct.pack(format, value)) self.size += 2 def writeInt(self, value): """Writes an unsigned integer to the packet""" - format = '!I' + format = b'!I' self.data.append(struct.pack(format, int(value))) self.size += 4 def writeString(self, value, length): """Writes a string to the packet""" - format = '!' + str(length) + 's' + format = b'!' + str(length) + b's' self.data.append(struct.pack(format, value)) self.size += length @@ -796,8 +796,8 @@ # for future pointers to it. # self.names[name] = self.size - parts = name.split('.') - if parts[-1] == '': + parts = name.split(b'.') + if parts[-1] == b'': parts = parts[:-1] for part in parts: self.writeUTF(part) @@ -835,7 +835,7 @@ record.write(self) self.size -= 2 - length = len(''.join(self.data[index:])) + length = len(b''.join(self.data[index:])) self.insertShort(index, length) # Here is the short we adjusted for def packet(self): @@ -863,7 +863,7 @@ self.insertShort(0, 0) else: self.insertShort(0, self.id) - return ''.join(self.data) + return b''.join(self.data) class DNSCache(object): @@ -939,7 +939,7 @@ self.start() def run(self): - while not globals()['_GLOBAL_DONE']: + while not globals()[b'_GLOBAL_DONE']: rs = self.getReaders() if len(rs) == 0: # No sockets to manage, but we wait for the timeout @@ -955,7 +955,7 @@ try: self.readers[sock].handle_read() except Exception: - if not globals()['_GLOBAL_DONE']: + if not globals()[b'_GLOBAL_DONE']: traceback.print_exc() except Exception: pass @@ -1035,7 +1035,7 @@ def run(self): while True: self.zeroconf.wait(10 * 1000) - if globals()['_GLOBAL_DONE']: + if globals()[b'_GLOBAL_DONE']: return now = currentTimeMillis() for record in self.zeroconf.cache.entries(): @@ -1108,7 +1108,7 @@ now = currentTimeMillis() if len(self.list) == 0 and self.nexttime > now: self.zeroconf.wait(self.nexttime - now) - if globals()['_GLOBAL_DONE'] or self.done: + if globals()[b'_GLOBAL_DONE'] or self.done: return now = currentTimeMillis() @@ -1174,24 +1174,24 @@ if isinstance(properties, dict): self.properties = properties list = [] - result = '' + result = b'' for key in properties: value = properties[key] if value is None: - suffix = '' + suffix = b'' elif isinstance(value, str): suffix = value elif isinstance(value, int): if value: - suffix = 'true' + suffix = b'true' else: - suffix = 'false' + suffix = b'false' else: - suffix = '' - list.append('='.join((key, suffix))) + suffix = b'' + list.append(b'='.join((key, suffix))) for item in list: - result = ''.join( - (result, struct.pack('!c', chr(len(item))), item) + result = b''.join( + (result, struct.pack(b'!c', chr(len(item))), item) ) self.text = result else: @@ -1212,7 +1212,7 @@ index += length for s in strs: - eindex = s.find('=') + eindex = s.find(b'=') if eindex == -1: # No equals sign at all key = s @@ -1220,9 +1220,9 @@ else: key = s[:eindex] value = s[eindex + 1 :] - if value == 'true': + if value == b'true': value = 1 - elif value == 'false' or not value: + elif value == b'false' or not value: value = 0 # Only update non-existent properties @@ -1240,7 +1240,7 @@ def getName(self): """Name accessor""" - if self.type is not None and self.name.endswith("." + self.type): + if self.type is not None and self.name.endswith(b"." + self.type): return self.name[: len(self.name) - len(self.type) - 1] return self.name @@ -1368,19 +1368,19 @@ def __repr__(self): """String representation""" - result = "service[%s,%s:%s," % ( + result = b"service[%s,%s:%s," % ( self.name, socket.inet_ntoa(self.getAddress()), self.port, ) if self.text is None: - result += "None" + result += b"None" else: if len(self.text) < 20: result += self.text else: - result += self.text[:17] + "..." - result += "]" + result += self.text[:17] + b"..." + result += b"]" return result @@ -1393,12 +1393,12 @@ def __init__(self, bindaddress=None): """Creates an instance of the Zeroconf class, establishing multicast communications, listening and reaping threads.""" - globals()['_GLOBAL_DONE'] = 0 + globals()[b'_GLOBAL_DONE'] = 0 if bindaddress is None: self.intf = socket.gethostbyname(socket.gethostname()) else: self.intf = bindaddress - self.group = ('', _MDNS_PORT) + self.group = (b'', _MDNS_PORT) self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) @@ -1414,8 +1414,8 @@ # work as expected. # pass - self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, "\xff") - self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, "\x01") + self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_TTL, b"\xff") + self.socket.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, b"\x01") try: self.socket.bind(self.group) except Exception: @@ -1442,10 +1442,10 @@ self.reaper = Reaper(self) def isLoopback(self): - return self.intf.startswith("127.0.0.1") + return self.intf.startswith(b"127.0.0.1") def isLinklocal(self): - return self.intf.startswith("169.254.") + return self.intf.startswith(b"169.254.") def wait(self, timeout): """Calling thread waits for a given number of milliseconds or @@ -1642,8 +1642,8 @@ and not record.isExpired(now) and record.alias == info.name ): - if info.name.find('.') < 0: - info.name = "%w.[%s:%d].%s" % ( + if info.name.find(b'.') < 0: + info.name = b"%w.[%s:%d].%s" % ( info.name, info.address, info.port, @@ -1726,14 +1726,14 @@ for question in msg.questions: if question.type == _TYPE_PTR: - if question.name == "_services._dns-sd._udp.local.": + if question.name == b"_services._dns-sd._udp.local.": for stype in self.servicetypes.keys(): if out is None: out = DNSOutgoing(_FLAGS_QR_RESPONSE | _FLAGS_AA) out.addAnswer( msg, DNSPointer( - "_services._dns-sd._udp.local.", + b"_services._dns-sd._udp.local.", _TYPE_PTR, _CLASS_IN, _DNS_TTL, @@ -1833,8 +1833,8 @@ def close(self): """Ends the background threads, and prevent this instance from servicing further queries.""" - if globals()['_GLOBAL_DONE'] == 0: - globals()['_GLOBAL_DONE'] = 1 + if globals()[b'_GLOBAL_DONE'] == 0: + globals()[b'_GLOBAL_DONE'] = 1 self.notifyAll() self.engine.notify() self.unregisterAllServices() @@ -1850,39 +1850,39 @@ # query (for Zoe), and service unregistration. if __name__ == '__main__': - print("Multicast DNS Service Discovery for Python, version", __version__) + print(b"Multicast DNS Service Discovery for Python, version", __version__) r = Zeroconf() - print("1. Testing registration of a service...") - desc = {'version': '0.10', 'a': 'test value', 'b': 'another value'} + print(b"1. Testing registration of a service...") + desc = {b'version': b'0.10', b'a': b'test value', b'b': b'another value'} info = ServiceInfo( - "_http._tcp.local.", - "My Service Name._http._tcp.local.", - socket.inet_aton("127.0.0.1"), + b"_http._tcp.local.", + b"My Service Name._http._tcp.local.", + socket.inet_aton(b"127.0.0.1"), 1234, 0, 0, desc, ) - print(" Registering service...") + print(b" Registering service...") r.registerService(info) - print(" Registration done.") - print("2. Testing query of service information...") + print(b" Registration done.") + print(b"2. Testing query of service information...") print( - " Getting ZOE service:", - str(r.getServiceInfo("_http._tcp.local.", "ZOE._http._tcp.local.")), + b" Getting ZOE service:", + str(r.getServiceInfo(b"_http._tcp.local.", b"ZOE._http._tcp.local.")), ) - print(" Query done.") - print("3. Testing query of own service...") + print(b" Query done.") + print(b"3. Testing query of own service...") print( - " Getting self:", + b" Getting self:", str( r.getServiceInfo( - "_http._tcp.local.", "My Service Name._http._tcp.local." + b"_http._tcp.local.", b"My Service Name._http._tcp.local." ) ), ) - print(" Query done.") - print("4. Testing unregister of service information...") + print(b" Query done.") + print(b"4. Testing unregister of service information...") r.unregisterService(info) - print(" Unregister done.") + print(b" Unregister done.") r.close()