Better synchronization.

portnov [2009-02-25 13:53:46]
Better synchronization.
Filename
client_test.py
discovery.py
test.py
diff --git a/client_test.py b/client_test.py
index d8718ec..db50921 100755
--- a/client_test.py
+++ b/client_test.py
@@ -7,11 +7,15 @@ from twisted.internet.protocol import ClientFactory
 import data

 class Centrixc(LineReceiver):
+    def sendMessage(self,msg_type,**kwargs):
+        self.sendLine(data.Message(msg_type,**kwargs).to_xml())
+
     def connectionMade(self):
-        self.sendLine(data.Message('register_machine').to_xml())
+        self.sendMessage('register_machine')

     def lineReceived(self,line):
         print data.Message.parse(line)
+        self.sendMessage('quit')
         self.transport.loseConnection()

 class CClientFactory(ClientFactory):
diff --git a/discovery.py b/discovery.py
index c1bdef0..8f62f66 100644
--- a/discovery.py
+++ b/discovery.py
@@ -6,6 +6,12 @@ import dbus
 from dbus.mainloop.glib import DBusGMainLoop
 import avahi

+import data
+import machines
+
+hosts = []
+services = {}
+
 def err(str):
     print "Error:", str

@@ -56,10 +62,52 @@ class Browser(threading.Thread):
     def remove_service(self,iface,proto,name,stype,domain,flags):
         print "Removing service", name

+    def quit(self):
+        print "Stop discovery."
+        self.ml.quit()
+        self.lock.release()
+        return False
+
     def run(self):
         DBusGMainLoop(set_as_default=True)
+        gobject.timeout_add(self.timeout,self.quit)
         self.browse(self.types)
         self.ml = gobject.MainLoop()
         gobject.threads_init()
         self.ml.run()

+class ZeroconfListener(object):
+    def new_service(self, iface,proto,name,stype,domain, host, aproto,addr, port, txt,flags):
+        global services
+        global hosts
+
+        if stype == '_workstation._tcp':
+            host = machines.Host()
+            host.hostname = name.split()[0]
+            host.ip = addr
+            hosts.append(host)
+            return
+
+        sname = servicenames[stype]
+        svc = data.Service()
+        svc.name = name
+        svc.ip = addr
+        svc.port = port
+        services[sname] = svc
+#         print "services[%s] = %s" % (sname, svc)
+
+def discover():
+    global browser
+    lock = threading.Lock()
+    lock.acquire()
+    listener = ZeroconfListener()
+    browser = Browser(args=('_ssh._tcp','_workstation._tcp','_nameserver._udp'))
+    browser.timeout = 3000
+    browser.lock = lock
+    browser.set_listener(listener)
+    browser.start()
+    return lock
+
+def stop():
+    global browser
+    browser.quit()
diff --git a/test.py b/test.py
index a0bf4c9..b75b239 100755
--- a/test.py
+++ b/test.py
@@ -21,34 +21,14 @@ import machines
 # Internal section

 def on_sigint(signum, frame):
-    global browser, reactor
+    global reactor
     print "Got SIGINT"
-    browser.ml.quit()
+    discovery.stop()
     reactor.stop()
-    sys.exit()
+#     sys.exit()

 signal.signal(signal.SIGINT, on_sigint)

-class ZeroconfListener(object):
-    def new_service(self, iface,proto,name,stype,domain, host, aproto,addr, port, txt,flags):
-        global services
-        global hosts
-
-        if stype == '_workstation._tcp':
-            host = machines.Host()
-            host.hostname = name.split()[0]
-            host.ip = addr
-            hosts.append(host)
-            return
-
-        sname = discovery.servicenames[stype]
-        svc = data.Service()
-        svc.name = name
-        svc.ip = addr
-        svc.port = port
-        services[sname] = svc
-#         print "services[%s] = %s" % (sname, svc)
-
 class Centrixd(LineReceiver):
     def lineReceived(self,line):
         msg = data.Message.parse(line)
@@ -63,31 +43,27 @@ class Centrixd(LineReceiver):
 #####################################
 # Setup

-listener = ZeroconfListener()
-browser = discovery.Browser(args=('_ssh._tcp','_workstation._tcp','_nameserver._udp'))
-browser.set_listener(listener)
-browser.start()
-
-hosts = []
+lock = discovery.discover()

-services = {}
-services['proxy'] = data.Service()
-services['proxy'].ip = '192.168.32.3'
-services['proxy'].port = 3128
-services['gateway'] = data.Service()
-services['gateway'].ip = '192.168.32.1'
+discovery.services['proxy'] = data.Service()
+discovery.services['proxy'].ip = '192.168.32.3'
+discovery.services['proxy'].port = 3128
+discovery.services['gateway'] = data.Service()
+discovery.services['gateway'].ip = '192.168.32.1'

 machine = machines.Host()
 machine.ip = '192.168.1.2'
 machine.hostname = 'portnov'

-templates.services = services
+templates.services = discovery.services
 templates.machine = machine
-time.sleep(5)
+# time.sleep(5)
+print "Waiting for discovery..."
+lock.acquire()

 # print services
 print "Found hosts:"
-for host in hosts:
+for host in discovery.hosts:
     print host

 # Read template
ViewGit