|
1 #!/usr/bin/env python |
|
2 # -*- coding: utf-8 -*- |
|
3 |
|
4 # This file is part of Beremiz runtime. |
|
5 |
|
6 # Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD |
|
7 # Copyright (C) 2017: Andrey Skvortsov |
|
8 # Copyright (C) 2018: Edouard TISSERANT |
|
9 |
|
10 # See COPYING file for copyrights details. |
|
11 |
|
12 import sys |
|
13 |
|
14 import Pyro |
|
15 import Pyro.core as pyro |
|
16 import runtime |
|
17 from runtime.ServicePublisher import ServicePublisher |
|
18 |
|
19 class Server(object): |
|
20 def __init__(self, servicename, ip_addr, port): |
|
21 self.continueloop = True |
|
22 self.daemon = None |
|
23 self.servicename = servicename |
|
24 self.ip_addr = ip_addr |
|
25 self.port = port |
|
26 self.servicepublisher = None |
|
27 |
|
28 def _to_be_published(self): |
|
29 return self.servicename is not None and \ |
|
30 self.ip_addr is not None and \ |
|
31 self.ip_addr != "localhost" and \ |
|
32 self.ip_addr != "127.0.0.1" |
|
33 |
|
34 def PrintServerInfo(self): |
|
35 print(_("Pyro port :"), self.port) |
|
36 |
|
37 if self._to_be_published(): |
|
38 print(_("Publishing service on local network")) |
|
39 |
|
40 sys.stdout.flush() |
|
41 |
|
42 def PyroLoop(self, when_ready): |
|
43 while self.continueloop: |
|
44 Pyro.config.PYRO_MULTITHREADED = 0 |
|
45 pyro.initServer() |
|
46 self.daemon = pyro.Daemon(host=self.ip_addr, port=self.port) |
|
47 |
|
48 # pyro never frees memory after connection close if no timeout set |
|
49 # taking too small timeout value may cause |
|
50 # unwanted diconnection when IDE is kept busy for long periods |
|
51 self.daemon.setTimeout(60) |
|
52 |
|
53 pyro_obj=Pyro.core.ObjBase() |
|
54 pyro_obj.delegateTo(runtime.GetPLCObjectSingleton()) |
|
55 |
|
56 self.daemon.connect(pyro_obj, "PLCObject") |
|
57 |
|
58 if self._to_be_published(): |
|
59 self.servicepublisher = ServicePublisher() |
|
60 self.servicepublisher.RegisterService(self.servicename, self.ip_addr, self.port) |
|
61 |
|
62 when_ready() |
|
63 self.daemon.requestLoop() |
|
64 self.daemon.sock.close() |
|
65 |
|
66 def Restart(self): |
|
67 self._stop() |
|
68 |
|
69 def Quit(self): |
|
70 self.continueloop = False |
|
71 self._stop() |
|
72 |
|
73 def _stop(self): |
|
74 if self.servicepublisher is not None: |
|
75 self.servicepublisher.UnRegisterService() |
|
76 self.servicepublisher = None |
|
77 self.daemon.shutdown(True) |
|
78 |
|
79 |
|
80 |