Author: sleon
Date: 2006-01-06 23:33:57 +0000 (Fri, 06 Jan 2006)
New Revision: 7775
Added:
trunk/apps/freeviz/db.py
trunk/apps/freeviz/gen.py
trunk/apps/freeviz/handler.py
trunk/apps/freeviz/histdata.py
trunk/apps/freeviz/parser.py
trunk/apps/freeviz/server.py
Log:
begiggning
Added: trunk/apps/freeviz/db.py
===================================================================
--- trunk/apps/freeviz/db.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/db.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,112 @@
+from sqlobject import *
+from sqlobject.sqlbuilder import *
+import sys,os
+from datetime import *
+#mport pydot
+
+
+uri = 'mysql://twisted:severe at 127.0.0.1/twisted'
+con = connectionForURI(uri)
+sqlhub.processConnection = con
+
+class NodePair(SQLObject):
+ node1 = ForeignKey('Node', notNull=True)
+ node2 = ForeignKey('Node', notNull=True)
+
+ backoffmax_node1 = StringCol(length=50, default='5000')
+ backoffmax_node2 = StringCol(length=50, default='5000')
+ backoffcur_node1 = StringCol(length=50, default='0')
+ backoffcur_node2 = StringCol(length=50, default='0')
+ index = DatabaseIndex('node1','node2', unique=True)
+
+class Node(SQLObject):
+ identity = StringCol(length=100, notNull=True)
+ lastUpdate = DateTimeCol(notNull=True, default=datetime.now())
+ name = StringCol(length=50, notNull=True, default='dummy')
+ version = StringCol(length=50, notNull=True, default='0')
+
+ location = StringCol(length=50, notNull=True,default='0')
+ testnet = StringCol(length=10, notNull=True, default='true')
+ testnetPort = StringCol(length=10, notNull=True, default='0')
+ inserts = StringCol(length=10, notNull=True, default='0')
+ requests = StringCol(length=10, notNull=True, default='0')
+ transferring_requests = StringCol(length=10, notNull=True, default='0')
+ address = StringCol(length=32,notNull=True,default='0.0.0.0:0')
+
+ index = DatabaseIndex('identity',unique=True)
+ #index2 = DatabaseIndex('name',unique=True)
+
+
+def init():
+ Node.createTable()
+ NodePair.createTable()
+
+def drop():
+ Node.dropTable()
+ NodePair.dropTable()
+
+def reinit():
+ drop()
+ init()
+
+def delete_conns(nodeinfo):
+ nodeid = getIdFromInfo(nodeinfo)
+ l = NodePair.select()
+ for i in l:
+ if i.node1.id == nodeid or i.node2.id == nodeid:
+ i.delete(i.id)
+
+def exists(nodeinfo):
+ result = Node.select(Node.q.identity == nodeinfo['identity'])
+
+ if list(result):
+ return True
+ else:
+ return False
+
+
+def refresh(nodeinfo):
+ if exists(nodeinfo):
+ n = Node.select(Node.q.identity == nodeinfo['identity'])[0]
+
+ else:
+ n = Node(identity=nodeinfo['identity'])
+
+ for key in nodeinfo.keys():
+ setattr(n, key, nodeinfo[key])
+
+ n.lastUpdate = datetime.now()
+
+
+def getIdFromInfo(nodeinfo):
+ n = Node.select(Node.q.identity == nodeinfo['identity'] )
+ if list(n):
+ return list(n)[0].id
+ else:
+ raise Exception('No such node!')
+
+def insert(nodeinfo1, nodeinfo2, backoff1={}, backoff2={}):
+
+ #NodePair.createTable( ifNotExists=True)
+ node1 = getIdFromInfo(nodeinfo1)
+ node2 = getIdFromInfo(nodeinfo2)
+ #sorting
+ if node1 > node2:
+ temp=node2
+ node2=node1
+ node1=temp
+
+ btemp=backoff2
+ backoff2=backoff1
+ backoff1=btemp
+
+
+ bla = NodePair( node1=node1, node2=node2 )
+ if backoff1:
+ bla.backoffmax_node1 = backoff1['backoffmax']
+ bla.backoffcur_node1 = backoff1['backoffcur']
+
+ if backoff2:
+ bla.backoffmax_node2 = backoff2['backoffmax']
+ bla.backoffcur_node2 = backoff2['backoffcur']
+
Added: trunk/apps/freeviz/gen.py
===================================================================
--- trunk/apps/freeviz/gen.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/gen.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,49 @@
+#! /usr/bin/python
+from sqlobject import *
+import sys,os
+import pydot
+import sys
+
+sys.path+=['/home/sleon/public_html/bla/']
+from db import *
+
+def gentopology():
+
+ #NodePair.createTable( ifNotExists=True )
+ node_pairs = list(NodePair.select())
+ nodes = list(Node.select())
+ g=pydot.Dot(type='digraph')
+
+
+ for node in nodes:
+ gnode = pydot.Node(node.name, label='''\
+<<table CELLBORDER="0" border="0"
+ CELLPADDING="0"
+ CELLSPACING="0"
+><tr><td>%s</td>
+</tr><tr><td>%s</td></tr>
+</table>>''' % (node.name,node.location) )
+ g.add_node(gnode)
+
+ #there are no dublicate edges in the database
+ for node_pair in node_pairs:
+ gedge = pydot.Edge(node_pair.node1.name, node_pair.node2.name,
arrowhead='none')
+ g.add_edge(gedge)
+
+
+ g.write_png('/home/sleon/public_html/output2.png',prog='dot')
+# g.write_dot('bla.dot')
+
+# return """\
+# <html>
+# <head>
+# <title>Topology of testnetwork(s):</title>
+# <META HTTP-EQUIV="REFRESH"
CONTENT="180;URL=http://sleon.dyndns.org/~sleon/functions.py/gentopology">
+# </head>
+# <body>
+# <img alt="topologymap" src=/~sleon/output.png>
+# </body>
+# </html>
+# """
+
+gentopology()
Property changes on: trunk/apps/freeviz/gen.py
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/apps/freeviz/handler.py
===================================================================
--- trunk/apps/freeviz/handler.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/handler.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,60 @@
+import db
+import parser
+import time
+
+timedelta=360
+
+def handle(data):
+ (nodeinfo, nodeinfos, backoffs)=parser.parse(data)
+ #deleting first
+ if 'identity' in nodeinfo:
+ db.refresh(nodeinfo)
+ db.delete_conns(nodeinfo)
+ if not nodeinfos:
+ db.insert(nodeinfo,nodeinfo)
+ else:
+
+ for nodeinfo2 in nodeinfos:
+ db.refresh(nodeinfo2)
+
+ if nodeinfo['identity'] in backoffs:
+ backoff1 = backoffs[
nodeinfo['identity']]
+ else:
+ backoff1={}
+
+ if nodeinfo2['identity'] in backoffs:
+ backoff2 = backoffs[
nodeinfo2['identity'] ]
+ else:
+ backoff2= {}
+
+ db.insert(nodeinfo,nodeinfo2,
backoff1=backoff1, backoff2=backoff2)
+ check_nodes()
+
+
+#check if the node is up to date, if not remove it from node-pairs
+def check_nodes():
+ nodes = db.Node.select()
+
+ for node in nodes:
+ nodetime = node.lastUpdate
+ if (curtime() - convtime(nodetime) ) > timedelta:
+ nodeinfo = getInfoFromNode(node)
+ db.delete_conns(nodeinfo)
+
+#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)
Added: trunk/apps/freeviz/histdata.py
===================================================================
--- trunk/apps/freeviz/histdata.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/histdata.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,18 @@
+import db
+
+def get():
+ data=[]
+ connections = list(db.NodePair.select())
+
+ for conn in connections:
+ left={}
+ right={}
+ left['identity'] = conn.node1.identity
+ left['location'] = conn.node1.location
+
+ right['identity'] = conn.node2.identity
+ right['location'] = conn.node2.location
+ data.append( (left, right) )
+
+ return data
+
Added: trunk/apps/freeviz/parser.py
===================================================================
--- trunk/apps/freeviz/parser.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/parser.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,92 @@
+import re
+import string
+
+testData="""
+physical.udp=213.83.30.166:28000
+identity=14475c717809d5367dda55f02f98cd9cefd30a6f28a1b14a2acce990a4b17e9f
+myName=superduper
+location=0.4590345916077352
+testnetPort=29000
+testnet=true
+version=Fred,0.7,1.0,310
+End
+"""
+
+testData3="""
+status
+physical.udp=213.83.30.166:28000
+identity=14475c717809d5367dda55f02f98cd9cefd30a6f28a1b14a2acce990a4b17e9f
+myName=superduper
+location=0.04174255978367547
+testnetPort=29000
+testnet=true
+version=Fred,0.7,1.0,321
+End
+
+
+CONNECTED 209.6.82.6:55555 mikeDOTd 0.5406312064503291 Fred,0.7,1.0,320
backoff: 5000 (0)
+CONNECTED 82.32.17.1:5000 Toad #1 0.8265089106725086 Fred,0.7,1.0,321
backoff: 5000 (0)
+CONNECTED 82.32.17.1:5001 Toad #2 0.7210865113995654 Fred,0.7,1.0,321
backoff: 5000 (0)
+CONNECTED 83.196.106.202:3000 NextGen$_#1 0.9417684116796216
Fred,0.7,1.0,321 backoff: 5000 (0)
+DISCONNECTED 128.100.171.30:4000 PVT 0.34696550532100745 Fred,0.7,1.0,305
backoff: 5000 (0)
+DISCONNECTED 81.178.70.127:19114 sanity1 0.42306327680182465 Fred,0.7,1.0,310
backoff: 5000 (0)
+DISCONNECTED 83.196.16.236:10001 NextGen5 0.3023100178897614 Fred,0.7,1.0,310
backoff: 5000 (0)
+
+
+
+"""
+
+testData2 ="""
+physical.udp=82.32.17.1:5001
+identity=3247b10f0b3f698a7712174d7b37b54a210356ce73fb564dd4ff19741bb64b55
+myName=Toad #2
+location=0.9417684116796216
+testnetPort=6001
+testnet=true
+version=Fred,0.7,1.0,320
+End
+
+
+CONNECTED 213.83.30.166:28000 superduper 0.8042879816850985
Fred,0.7,1.0,320 backoff: 5000
(0)|14475c717809d5367dda55f02f98cd9cefd30a6f28a1b14a2acce990a4b17e9f
+CONNECTED 82.32.17.1:5000 Toad #1 0.7495825470097687 Fred,0.7,1.0,320
backoff: 5000
(0)|21f6c377e5a5f7b4c14ca219bef9f334cf9e105503ecb54b034f28d347ad6156
+CONNECTED 82.32.17.1:5002 Toad #3 0.8265089106725086 Fred,0.7,1.0,320
backoff: 5000
(0)|9bad8e6fc84bece87ebec52c838b4c718f153966a0c8c2b70faccb7dc7ad0dbd
+CONNECTED 83.196.106.202:3000 NextGen$_#1 0.04941094442690597
Fred,0.7,1.0,320 backoff: 5000
(0)|72425091d95d8b463f8be45b6d6463f19de12d61bab684d9da4d7d9e62c93a6b
+CONNECTED 83.233.97.28:4000 sandos 0.04174255978367547 Fred,0.7,1.0,320
backoff: 5000
(0)|3257150a6fc3a6912467e368201d1c0872dabca9697bd456f7ec9f5232d346f5
+DISCONNECTED 213.10.90.196:37240 tubbie_node2 0.9243903267660739
Fred,0.7,1.0,305 backoff: 5000
(0)|7b985832b0b6326b8a949b9472c8a8a19ffce8deff0817f39b6a9237afe70e43
+DISCONNECTED 66.36.135.217:3155 odonata 0.4853282117965083 Fred,0.7,1.0,294
backoff: 5000
(0)|b5eb67ff7b19393a13dbb66f8126819200897734dccd6d81761af5303182e1be
+DISCONNECTED 66.36.153.156:3156 odonata #1 0.029565449588379145
Fred,0.7,1.0,307 backoff: 5000
(0)|42b950db0b4d07c0453992839292557d573662750031a53b3c2299ca53505f8e
+DISCONNECTED 67.40.225.97:61523 TheSeeker 0.3902854008904836 Fred,0.7,1.0,305
backoff: 5000
(0)|e97f9e797f8608f29d4a40eff63b14d411fb47ac09f9dee0f6f3b55836bc368c
+DISCONNECTED 70.81.24.164:7744 rek 0.11219091833051797 Fred,0.7,1.0,305
backoff: 5000
(0)|c238c425163075b59e5d3db20ca38defd2ecc0099409894b0d27c5db3eeefa99
+"""
+
+def parse(data):
+ optionsline = re.compile('(\S+)=(.+)')
+ connection =
re.compile('^CONNECTED\s+(\d+\.\d+\.\d+\.\d+:\d+)\s+(.+)\s+(0\.\d+)\s+(Fred\S+)\sbackoff:
(\d+) \((\d+)\)\|(\S+)')
+
+ options={}
+ connections=[]
+ backoffs={}
+
+ for i in string.split(data,sep='\n'):
+ op = optionsline.match(i)
+ con = connection.match(i)
+
+ if op:
+ options[op.group(1)]=op.group(2).strip()
+ elif con:
+ di={'address': con.group(1), 'name': con.group(2),
'location' : con.group(3) ,
+ 'version': con.group(4),
'identity':con.group(7) }
+ connections.append(di)
+ assert 'identity' in options
+ backoff={ 'identity': di['identity'],'backoffmax':
con.group(5), 'backoffcur': con.group(6) }
+ backoffs[ options['identity'] ]=backoff
+
+
+ options['name']=options['myName']
+ return (options, connections, backoffs)
+
+
+#pars = MyParser()
+#(a,o) = parse(testData)
+#print a
+#print o
Added: trunk/apps/freeviz/server.py
===================================================================
--- trunk/apps/freeviz/server.py 2006-01-06 23:31:06 UTC (rev 7774)
+++ trunk/apps/freeviz/server.py 2006-01-06 23:33:57 UTC (rev 7775)
@@ -0,0 +1,35 @@
+#!/usr/bin/python
+# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+#
+
+from twisted.internet.protocol import Protocol, Factory
+#from twisted.protocols.basic import NetstringReceiver
+from twisted.internet import reactor
+import handler
+
+### Protocol Implementation
+
+# This is just about the simplest possible protocol
+class Echo(Protocol):
+ buffer=''
+ def dataReceived(self, data):
+ """As soon as any data is received, write it back."""
+ self.buffer+=data
+ def connectionLost(self,reason):
+ print self.buffer
+ print "_______________________\n\n"
+
+ handler.handle(self.buffer)
+
+
+
+def main():
+ f = Factory()
+ f.protocol = Echo
+ reactor.listenTCP(23415, f)
+ reactor.run()
+
+if __name__ == '__main__':
+ main()