diff options
Diffstat (limited to 'khashmir/util.py')
-rw-r--r-- | khashmir/util.py | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/khashmir/util.py b/khashmir/util.py new file mode 100644 index 0000000..3bc456e --- /dev/null +++ b/khashmir/util.py @@ -0,0 +1,69 @@ +# The contents of this file are subject to the BitTorrent Open Source License +# Version 1.1 (the License). You may not copy or use this file, in either +# source code or executable form, except in compliance with the License. You +# may obtain a copy of the License at http://www.bittorrent.com/license/. +# +# Software distributed under the License is distributed on an AS IS basis, +# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License +# for the specific language governing rights and limitations under the +# License. + +from struct import pack, unpack + +def bucket_stats(l): + """given a list of khashmir instances, finds min, max, and average number of nodes in tables""" + max = avg = 0 + min = None + def count(buckets): + c = 0 + for bucket in buckets: + c = c + len(bucket.l) + return c + for node in l: + c = count(node.table.buckets) + if min == None: + min = c + elif c < min: + min = c + if c > max: + max = c + avg = avg + c + avg = avg / len(l) + return {'min':min, 'max':max, 'avg':avg} + +def compact_peer_info(ip, port): + return pack('!BBBBH', *([int(i) for i in ip.split('.')] + [port])) + +def packPeers(peers): + return map(lambda a: compact_peer_info(a[0], a[1]), peers) + +def reducePeers(peers): + return reduce(lambda a, b: a + b, peers, '') + +def unpackPeers(p): + peers = [] + if type(p) == type(''): + for x in xrange(0, len(p), 6): + ip = '.'.join([str(ord(i)) for i in p[x:x+4]]) + port = unpack('!H', p[x+4:x+6])[0] + peers.append((ip, port, None)) + else: + for x in p: + peers.append((x['ip'], x['port'], x.get('peer id'))) + return peers + + +def compact_node_info(id, ip, port): + return id + compact_peer_info(ip, port) + +def packNodes(nodes): + return ''.join([compact_node_info(x['id'], x['host'], x['port']) for x in nodes]) + +def unpackNodes(n): + nodes = [] + for x in xrange(0, len(n), 26): + id = n[x:x+20] + ip = '.'.join([str(ord(i)) for i in n[x+20:x+24]]) + port = unpack('!H', n[x+24:x+26])[0] + nodes.append({'id':id, 'host':ip, 'port': port}) + return nodes |