70 lines
2.2 KiB
Python
70 lines
2.2 KiB
Python
# 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
|