--- a/LPCconnector/WAMP/__init__.py Thu Jun 01 10:23:17 2017 +0200
+++ b/LPCconnector/WAMP/__init__.py Thu Jun 01 10:24:03 2017 +0200
@@ -4,15 +4,25 @@
# Copyright (c) 2017 Smarteh d.o.o. <info@smarteh.si>
# THIS PROGRAM COMES WITH NO WARRANTY
from autobahn.twisted import wamp
from autobahn.twisted.websocket import WampWebSocketClientFactory, connectWS
from autobahn.wamp import types
from autobahn.wamp import auth
from autobahn.wamp.serializer import MsgPackSerializer
-import connectors.WAMP as WAMP
-from connectors.WAMP import WAMP_connector_factory, WampSession
-from threading import _sleep
+from twisted.internet import reactor, threads +from autobahn.wamp.exception import TransportLost +from threading import Thread, Event +# import connectors.WAMP as WAMP +# from connectors.WAMP import WAMP_connector_factory, WampSession +# from threading import _sleep +PLCObjDefaults = { "StartPLC": False, + "GetTraceVariables" : ("Broken",None), + "GetPLCstatus" : ("Broken",None), + "RemoteExec" : (-1, "RemoteExec script failed!")} @@ -20,11 +30,21 @@
-class MWWampSession(WampSession):
+_WampSessionEvent = Event() +class MWWampSession(wamp.ApplicationSession): self.join(u"Automation", [u"wampcra"], USER)
print "CRA checking init ..."
+ def onJoin(self, details): + global _WampSession, _WampSessionEvent + _WampSessionEvent.set() + print 'WAMP session joined for :', self.config.extra["ID"] def onChallenge(self, challenge):
if challenge.method == u"wampcra":
key = PASSWORDS[USER].encode('utf8')
@@ -42,12 +62,9 @@
print 'WAMP session left'
-DefalutWAMP_connector_factory = WAMP_connector_factory
+# DefalutWAMP_connector_factory = WAMP_connector_factory def MWRegisterWampClient(realm, ID, url, confnodesroot):
- ## start logging to console
- # log.startLogging(sys.stdout)
# create a WAMP application session factory
component_config = types.ComponentConfig(
@@ -72,17 +89,89 @@
def MWWAMP_connector_factory(uri, confnodesroot):
- def CustomFunctionCall(self, funcname, args=None):
- member = self.__dict__.get(funcname, None)
+ # def CustomFunctionCall(self, funcname, args=None): + # member = self.__dict__.get(funcname, None) + # member = WampSessionProcMapper(funcname) + # self.__dict__[funcname] = member + # WAMP.RegisterWampClient = MWRegisterWampClient + # WAMP.WampSession = MWWampSession + # wamp_connector = DefalutWAMP_connector_factory(uri, confnodesroot) + # wamp_connector.CustomFunctionCall = CustomFunctionCall + # return wamp_connector + servicetype, location = uri.split("://") + urlpath, realm, ID = location.split('#') + urlprefix = {"WAMP": "ws", + "WAMPS": "wss"}[servicetype] + url = urlprefix + "://" + urlpath + AddToDoBeforeQuit = confnodesroot.AppFrame.AddToDoBeforeQuit + _WampConnection = MWRegisterWampClient(realm, ID, url, confnodesroot) + AddToDoBeforeQuit(reactor.stop) + reactor.run(installSignalHandlers=False) + def WampSessionProcMapper(funcname): + wampfuncname = unicode('.'.join((ID, funcname))) + def catcher_func(*args, **kwargs): + if _WampSession is not None: + return threads.blockingCallFromThread( + reactor, _WampSession.call, wampfuncname, + except TransportLost, e: + confnodesroot.logger.write_error(_("Connection lost!\n")) + confnodesroot._SetConnector(None) + errmess = traceback.format_exc() + confnodesroot.logger.write_error(errmess + "\n") + # confnodesroot._SetConnector(None) + return PLCObjDefaults.get(funcname) + class WampPLCObjectProxy(object): + global _WampSessionEvent, _WampConnection + if not reactor.running: + Thread(target=ThreadProc).start() + _WampConnection = threads.blockingCallFromThread( + reactor, MWRegisterWampClient, realm, ID, url, confnodesroot) + if not _WampSessionEvent.wait(5): + _WampConnection = stopConnecting() + raise Exception, _("WAMP connection timeout") + _WampConnection.disconnect() + def __getattr__(self, attrName): + member = self.__dict__.get(attrName, None) - member = WampSessionProcMapper(funcname)
- self.__dict__[funcname] = member
+ member = WampSessionProcMapper(attrName) + self.__dict__[attrName] = member - WAMP.RegisterWampClient = MWRegisterWampClient
- WAMP.WampSession = MWWampSession
+ # Try to get the proxy object + return WampPLCObjectProxy() + confnodesroot.logger.write_error(_("WAMP connection to '%s' failed.\n") % location) + confnodesroot.logger.write_error(traceback.format_exc()) - wamp_connector = DefalutWAMP_connector_factory(uri, confnodesroot)
- wamp_connector.CustomFunctionCall = CustomFunctionCall
\ No newline at end of file
+connectors.connectors["WAMP"] = lambda: MWWAMP_connector_factory \ No newline at end of file