forked from hyphanet/simulator-freeviz
/
handler.py
101 lines (74 loc) · 2.16 KB
/
handler.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
import db
import parser
import time
import re
timedelta=360
mandatory_version = 599
def handle(data,trans):
(nodeinfo, nodeinfos, backoffs)=parser.parse(data)
#checking the version
version_parser = re.compile('.*,(\d+)')
if 'version' in nodeinfo:
version = version_parser.match(nodeinfo['version']).group(1)
#print "Node version is " + version
version = int(version)
#exit when non mandatory version
if version < mandatory_version:
print "Skipping following data, because node is too old"
print data
return
#deleting first
if 'identity' in nodeinfo:
db.refresh(nodeinfo,trans)
db.delete_conns(nodeinfo,trans)
if nodeinfos:
for nodeinfo2 in nodeinfos:
db.refresh(nodeinfo2,trans)
if nodeinfo['identity'] in backoffs:
backoff1 = backoffs[ nodeinfo['identity']]
else:
backoff1={}
if nodeinfo2['identity'] in backoffs:
backoff2 = backoffs[ nodeinfo2['identity'] ]
else:
backoff2= {}
db.insert(trans, nodeinfo,nodeinfo2, backoff1=backoff1, backoff2=backoff2)
check_nodes(trans)
#check if the node is up to date, if not remove it from node-pairs
def check_nodes(trans):
nodes = db.Node.select(connection=trans)
for node in nodes:
if inactive(node):
nodeinfo = getInfoFromNode(node)
db.delete_conns(nodeinfo,trans)
node.active='N'
else:
node.active='Y'
def inactive(node):
nodetime = node.lastUpdate
return (curtime() - convtime(nodetime) ) > timedelta
def get_activenodes(trans):
active_nodes = list(db.Node.select( db.Node.q.active == 'Y', connection=trans))
return active_nodes
def get_lastgoodnodes(trans):
anodes = get_activenodes(trans)
lastGoodVer = db.getLastGoodVer(trans)
lgnodes = []
for anode in anodes:
if anode.version >= lastGoodVer:
lgnodes.append(anode)
return lgnodes
#time in seconds since epoch
def curtime():
return time.time()
def getInfoFromNode(node):
nodeinfo={}
nodeinfo['name']=node.name
nodeinfo['version']=node.version
nodeinfo['identity']=node.identity
return nodeinfo
#convert timeformat of lastupdated db entry to seconds
#maybe it belongs to db module
def convtime(lastUpdate):
ttuple = lastUpdate.timetuple()
return time.mktime(ttuple)