| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- # 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
|