Protocol implementation

portnov [2009-03-02 19:52:35]
Protocol implementation
Filename
centrixd/cxcore.py
centrixd/cxproto.py
centrixd/data.py
client_test.py
diff --git a/centrixd/cxcore.py b/centrixd/cxcore.py
index 5ada62a..82a1921 100644
--- a/centrixd/cxcore.py
+++ b/centrixd/cxcore.py
@@ -2,6 +2,8 @@
 # author: Sergey Shakshin
 # jid: rigid_mgn@jabber.ru

+import signal
+
 from cxutils import log
 from cxlogger import CXLogger
 from cxconfig import config
@@ -9,27 +11,28 @@ from sys import exit

 from louie import dispatcher
 from time import sleep
-

-def on_shutdown():
-    mCycle = False
-    sleep(3)
-    exit()
+def on_sigint(signum, frame):
+    print "Got SIGINT"
+    log("Ctrl-C pressed at console - exiting")
+    print "\nCtrl-C pressed at console - exiting\n"
+    dispatcher.send("shutdown")

-
-dispatcher.connect(on_shutdown,"shutdown")
+signal.signal(signal.SIGINT, on_sigint)

 logger = CXLogger()
 logger.start()

-import cxproto
+mode = config['Centrix']['Mode']
+master = (mode == 'Master')
+log("Entering %s mode" % mode)

-mCycle = True
-try:
-    while(mCycle):
-        sleep(1)
+if not master:
+    if 'Master' in config['Centrix']:
+        smarthost = config['Centrix']
+        log("Will use %s as master" % smarthost)
+    else:
+        log("Master not found.")
+        exit()

-except KeyboardInterrupt:
-    log("Ctrl-C pressed at console - exiting")
-    print "\nCtrl-C pressed at console - exiting\n"
-    dispatcher.send("shutdown")
+import cxproto
diff --git a/centrixd/cxproto.py b/centrixd/cxproto.py
index 9006636..a3b57f6 100644
--- a/centrixd/cxproto.py
+++ b/centrixd/cxproto.py
@@ -1,27 +1,49 @@
 from twisted.internet.protocol import Protocol, Factory
+from twisted.protocols.basic import LineReceiver
 from twisted.internet import reactor

-
 from louie import dispatcher
 from threading import Thread

 from cxutils import log
-from xmlserialize import serialize
-from data import CXMessage
+from xmlserialize import serialize, deserialize
+from data import CXMessage, Error, OK
 from cxconfig import config

+def shutdown():
+    global reactor
+#     zeroconf.stop()
+    reactor.stop()
+
+dispatcher.connect(shutdown, "shutdown")
+
 CXPORT = config['Network'].get('Port', 9222)

-class CXProto(Protocol):
+class CXProto(LineReceiver):
     status = None

     def connectionMade(self):
-        print "BLA"
-        log("Client connected")
-        hello = CXMessage("Hello")
-        hello.service = "Centrix"
-        hello.software = "centrixd"
-        self.transport.write(serialize(hello)+"\n")
+        print "Connection"
+
+    def lineReceived(self,line):
+        msg = CXMessage.parse(line)
+        if msg.type in self.callbacks:
+            answer = self.callbacks[msg.type](self,msg)
+        else:
+            answer = Error(reason="Unknown message type")
+        self.sendLine(serialize(answer))
+
+    def new_client(self,msg):
+        print "New client:", msg
+        return OK()
+
+    def send_configs(self,msg):
+        print "Searching for config for machine %s, template %s" % (msg.machine, msg.template)
+# FIXME: this is a dumb stub
+        return OK()
+
+    callbacks = dict(new_client = new_client,
+                     get_my_configs = send_configs)

 class CXFactory(Factory):
     protocol = CXProto
diff --git a/centrixd/data.py b/centrixd/data.py
index db3cbec..096cb8c 100644
--- a/centrixd/data.py
+++ b/centrixd/data.py
@@ -34,3 +34,9 @@ class CXMessage(object):
     @classmethod
     def parse(cls, text):
         return xml.deserialize(text,cls=cls)
+
+def Error(**kwargs):
+    return CXMessage("Error",**kwargs)
+
+def OK():
+    return CXMessage("OK")
diff --git a/client_test.py b/client_test.py
index 993328e..8c862a6 100755
--- a/client_test.py
+++ b/client_test.py
@@ -11,7 +11,7 @@ class Centrixc(LineReceiver):
         self.sendLine(data.CXMessage(msg_type,**kwargs).to_xml())

     def connectionMade(self):
-        self.sendMessage('register_machine')
+        self.sendMessage('new_client')

     def lineReceived(self,line):
         print data.CXMessage.parse(line)
@@ -30,6 +30,6 @@ class CClientFactory(ClientFactory):
         reactor.stop()

 factory = CClientFactory()
-reactor.connectTCP('localhost',2009,factory)
+reactor.connectTCP('localhost',9222,factory)
 reactor.run()
ViewGit