Beremiz_service.py
changeset 644 b511cab580eb
parent 641 b4eae24d05bf
child 648 73295e742da2
equal deleted inserted replaced
643:1013a69ed1ea 644:b511cab580eb
    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)
    46     print str(err) # will print something like "option -a not recognized"
    46     print str(err) # will print something like "option -a not recognized"
    47     usage()
    47     usage()
    48     sys.exit(2)
    48     sys.exit(2)
    49 
    49 
    50 # default values
    50 # default values
    51 ip = ""
    51 given_ip = None
    52 port = 3000
    52 port = 3000
    53 servicename = None
    53 servicename = None
    54 autostart = False
    54 autostart = False
    55 enablewx = True
    55 enablewx = True
    56 havewx = False
    56 havewx = False
    61     if o == "-h":
    61     if o == "-h":
    62         usage()
    62         usage()
    63         sys.exit()
    63         sys.exit()
    64     elif o == "-i":
    64     elif o == "-i":
    65         if len(a.split(".")) == 4 or a == "localhost":
    65         if len(a.split(".")) == 4 or a == "localhost":
    66             ip = a
    66             given_ip = a
       
    67         else:
       
    68             usage()
       
    69             sys.exit()
    67     elif o == "-p":
    70     elif o == "-p":
    68         # port: port that the service runs on
    71         # port: port that the service runs on
    69         port = int(a)
    72         port = int(a)
    70     elif o == "-n":
    73     elif o == "-n":
    71         servicename = a
    74         servicename = a
   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