25 import os, sys, getopt |
25 import os, sys, getopt |
26 |
26 |
27 def usage(): |
27 def usage(): |
28 print """ |
28 print """ |
29 Usage of Beremiz PLC execution service :\n |
29 Usage of Beremiz PLC execution service :\n |
30 %s {[-n servicename] [-i ip] [-p port] [-x enabletaskbar] [-a autostart]|-h|--help} working_dir |
30 %s {[-n servicename] [-i IP] [-p port] [-x enabletaskbar] [-a autostart]|-h|--help} working_dir |
31 -n - zeroconf service name (default:disabled) |
31 -n - zeroconf service name (default:disabled) |
32 -i - ip of interface to bind to (default:localhost) |
32 -i - IP address of interface to bind to (default:localhost) |
33 -p - port number default:3000 |
33 -p - port number default:3000 |
34 -h - print this help text and quit |
34 -h - print this help text and quit |
35 -a - autostart PLC (0:disable 1:enable) (default:0) |
35 -a - autostart PLC (0:disable 1:enable) (default:0) |
36 -x - enable/disable wxTaskbarIcon (0:disable 1:enable) (default:1) |
36 -x - enable/disable wxTaskbarIcon (0:disable 1:enable) (default:1) |
37 -t - enable/disable Twisted web interface (0:disable 1:enable) (default:1) |
37 -t - enable/disable Twisted web interface (0:disable 1:enable) (default:1) |
347 if self.pyroserver.plcobj is not None: |
350 if self.pyroserver.plcobj is not None: |
348 self.pyroserver.plcobj.StopPLC() |
351 self.pyroserver.plcobj.StopPLC() |
349 evt.Skip() |
352 evt.Skip() |
350 |
353 |
351 def OnTaskBarChangeInterface(self, evt): |
354 def OnTaskBarChangeInterface(self, evt): |
352 dlg = ParamsEntryDialog(None, _("Enter the IP of the interface to bind"), defaultValue=self.pyroserver.ip) |
355 dlg = ParamsEntryDialog(None, _("Enter the IP of the interface to bind"), defaultValue=self.pyroserver.ip_addr) |
353 dlg.SetTests([(re.compile('\d{1,3}(?:\.\d{1,3}){3}$').match, _("IP is not valid!")), |
356 dlg.SetTests([(re.compile('\d{1,3}(?:\.\d{1,3}){3}$').match, _("IP is not valid!")), |
354 ( lambda ip :len([x for x in ip.split(".") if 0 <= int(x) <= 255]) == 4, _("IP is not valid!")) |
357 ( lambda x :len([x for x in x.split(".") if 0 <= int(x) <= 255]) == 4, _("IP is not valid!")) |
355 ]) |
358 ]) |
356 if dlg.ShowModal() == wx.ID_OK: |
359 if dlg.ShowModal() == wx.ID_OK: |
357 self.pyroserver.ip = dlg.GetValue() |
360 self.pyroserver.ip_addr = dlg.GetValue() |
358 self.pyroserver.Stop() |
361 self.pyroserver.Stop() |
359 evt.Skip() |
362 evt.Skip() |
360 |
363 |
361 def OnTaskBarChangePort(self, evt): |
364 def OnTaskBarChangePort(self, evt): |
362 dlg = ParamsEntryDialog(None, _("Enter a port number "), defaultValue=str(self.pyroserver.port)) |
365 dlg = ParamsEntryDialog(None, _("Enter a port number "), defaultValue=str(self.pyroserver.port)) |
428 |
431 |
429 def default_evaluator(callable, *args, **kwargs): |
432 def default_evaluator(callable, *args, **kwargs): |
430 return callable(*args,**kwargs) |
433 return callable(*args,**kwargs) |
431 |
434 |
432 class Server(): |
435 class Server(): |
433 def __init__(self, servicename, ip, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None): |
436 def __init__(self, servicename, ip_addr, port, workdir, argv, autostart=False, statuschange=None, evaluator=default_evaluator, website=None): |
434 self.continueloop = True |
437 self.continueloop = True |
435 self.daemon = None |
438 self.daemon = None |
436 self.servicename = servicename |
439 self.servicename = servicename |
437 self.ip = ip |
440 self.ip_addr = ip_addr |
438 self.port = port |
441 self.port = port |
439 self.workdir = workdir |
442 self.workdir = workdir |
440 self.argv = argv |
443 self.argv = argv |
441 self.plcobj = None |
444 self.plcobj = None |
442 self.servicepublisher = None |
445 self.servicepublisher = None |
456 self.continueloop = False |
459 self.continueloop = False |
457 self.Stop() |
460 self.Stop() |
458 |
461 |
459 def Start(self): |
462 def Start(self): |
460 pyro.initServer() |
463 pyro.initServer() |
461 self.daemon=pyro.Daemon(host=self.ip, port=self.port) |
464 self.daemon=pyro.Daemon(host=self.ip_addr, port=self.port) |
462 self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, self.statuschange, self.evaluator, self.website) |
465 self.plcobj = PLCObject(self.workdir, self.daemon, self.argv, self.statuschange, self.evaluator, self.website) |
463 uri = self.daemon.connect(self.plcobj,"PLCObject") |
466 uri = self.daemon.connect(self.plcobj,"PLCObject") |
464 |
467 |
465 print "Pyro port :",self.port |
468 print "Pyro port :",self.port |
466 print "Pyro object's uri :",uri |
469 print "Pyro object's uri :",uri |
467 print "Current working directory :",self.workdir |
470 print "Current working directory :",self.workdir |
468 |
471 |
469 # Configure and publish service |
472 # Configure and publish service |
470 # Not publish service if localhost in address params |
473 # Not publish service if localhost in address params |
471 if self.servicename is not None and self.ip != "localhost" and self.ip != "127.0.0.1": |
474 if self.servicename is not None and self.ip_addr != "localhost" and self.ip_addr != "127.0.0.1": |
472 print "Publishing service on local network" |
475 print "Publishing service on local network" |
473 self.servicepublisher = ServicePublisher.ServicePublisher() |
476 self.servicepublisher = ServicePublisher.ServicePublisher() |
474 self.servicepublisher.RegisterService(self.servicename, self.ip, self.port) |
477 self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) |
475 |
478 |
476 if self.autostart: |
479 if self.autostart: |
477 self.plcobj.StartPLC() |
480 self.plcobj.StartPLC() |
478 |
481 |
479 sys.stdout.flush() |
482 sys.stdout.flush() |
692 else: |
695 else: |
693 wx.CallAfter(wx_evaluator,callable,*args,**kwargs) |
696 wx.CallAfter(wx_evaluator,callable,*args,**kwargs) |
694 wx_eval_lock.acquire() |
697 wx_eval_lock.acquire() |
695 return eval_res |
698 return eval_res |
696 |
699 |
697 pyroserver = Server(servicename, ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website) |
700 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, statuschange, evaluator, website) |
698 taskbar_instance = BeremizTaskBarIcon(pyroserver) |
701 taskbar_instance = BeremizTaskBarIcon(pyroserver) |
699 else: |
702 else: |
700 pyroserver = Server(servicename, ip, port, WorkingDir, argv, autostart, website=website) |
703 pyroserver = Server(servicename, given_ip, port, WorkingDir, argv, autostart, website=website) |
701 |
704 |
702 if havetwisted or havewx: |
705 if havetwisted or havewx: |
703 pyro_thread=Thread(target=pyroserver.Loop) |
706 pyro_thread=Thread(target=pyroserver.Loop) |
704 pyro_thread.start() |
707 pyro_thread.start() |
705 |
708 |