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()


Reply via email to