Commit 6c1464f5 authored by Olivier R-D's avatar Olivier R-D

implement findservers and make prosys client happy with servers on 0.0.0

parent 55e88337
......@@ -98,6 +98,14 @@ class InternalServer(object):
return edps
return self.endpoints[:]
def find_servers(self, params):
#FIXME: implement correctly
servers = []
for edp in self.endpoints:
servers.append(edp.Server)
return servers
def create_session(self, name):
return InternalSession(self, self.aspace, self.subcsription_service, name)
......@@ -128,7 +136,7 @@ class InternalSession(object):
def get_endpoints(self, params=None, sockname=None):
return self.iserver.get_endpoints(params, sockname)
def create_session(self, params):
def create_session(self, params, sockname=None):
self.logger.info("Create session request")
result = ua.CreateSessionResult()
......@@ -137,7 +145,7 @@ class InternalSession(object):
result.RevisedSessionTimeout = params.RequestedSessionTimeout
result.MaxRequestMessageSize = 65536
result.ServerNonce = self.nonce
result.ServerEndpoints = self.get_endpoints()
result.ServerEndpoints = self.get_endpoints(sockname=sockname)
return result
......
......@@ -108,12 +108,13 @@ class UAProcessor(object):
def process_message(self, algohdr, seqhdr, body):
typeid = ua.NodeId.from_binary(body)
requesthdr = ua.RequestHeader.from_binary(body)
if typeid == ua.NodeId(ua.ObjectIds.CreateSessionRequest_Encoding_DefaultBinary):
self.logger.info("Create session request")
params = ua.CreateSessionParameters.from_binary(body)
self.session = self.iserver.create_session(self.name) # create the session on server
sessiondata = self.session.create_session(params) # get a session creation result to send back
sessiondata = self.session.create_session(params, sockname=self.sockname) # get a session creation result to send back
response = ua.CreateSessionResponse()
response.Parameters = sessiondata
......@@ -199,6 +200,19 @@ class UAProcessor(object):
self.logger.info("sending get endpoints response")
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
elif typeid == ua.NodeId(ua.ObjectIds.FindServersRequest_Encoding_DefaultBinary):
self.logger.info("find servers request")
params = ua.FindServersParameters.from_binary(body)
servers = self.iserver.find_servers(params)
response = ua.FindServersResponse()
response.Servers = servers
self.logger.info("sending find servers response")
self.send_response(requesthdr.RequestHandle, algohdr, seqhdr, response)
elif typeid == ua.NodeId(ua.ObjectIds.TranslateBrowsePathsToNodeIdsRequest_Encoding_DefaultBinary):
self.logger.info("translate browsepaths to nodeids request")
......@@ -339,7 +353,7 @@ class UAProcessor(object):
def _open_secure_channel(self, params):
self.logger.info("open secure channel")
if params.RequestType == ua.SecurityTokenRequestType.Issue:
if not self.channel or params.RequestType == ua.SecurityTokenRequestType.Issue:
self.channel = ua.OpenSecureChannelResult()
self.channel.SecurityToken.TokenId = 13 # random value
self.channel.SecurityToken.ChannelId = self.iserver.get_new_channel_id()
......
......@@ -1186,36 +1186,6 @@ class FindServersRequest(FrozenClass):
__repr__ = __str__
class FindServersResult(FrozenClass):
'''
:ivar Servers:
:vartype Servers: ApplicationDescription
'''
def __init__(self):
self.Servers = []
self._freeze()
def to_binary(self):
packet = []
packet.append(struct.pack('<i', len(self.Servers)))
for fieldname in self.Servers:
packet.append(fieldname.to_binary())
return b''.join(packet)
@staticmethod
def from_binary(data):
obj = FindServersResult()
length = struct.unpack('<i', data.read(4))[0]
if length != -1:
for _ in range(0, length):
obj.Servers.append(ApplicationDescription.from_binary(data))
return obj
def __str__(self):
return 'FindServersResult(' + 'Servers:' + str(self.Servers) + ')'
__repr__ = __str__
class FindServersResponse(FrozenClass):
'''
Finds the servers known to the discovery server.
......@@ -1224,20 +1194,22 @@ class FindServersResponse(FrozenClass):
:vartype TypeId: NodeId
:ivar ResponseHeader:
:vartype ResponseHeader: ResponseHeader
:ivar Parameters:
:vartype Parameters: FindServersResult
:ivar Servers:
:vartype Servers: ApplicationDescription
'''
def __init__(self):
self.TypeId = FourByteNodeId(ObjectIds.FindServersResponse_Encoding_DefaultBinary)
self.ResponseHeader = ResponseHeader()
self.Parameters = FindServersResult()
self.Servers = []
self._freeze()
def to_binary(self):
packet = []
packet.append(self.TypeId.to_binary())
packet.append(self.ResponseHeader.to_binary())
packet.append(self.Parameters.to_binary())
packet.append(struct.pack('<i', len(self.Servers)))
for fieldname in self.Servers:
packet.append(fieldname.to_binary())
return b''.join(packet)
@staticmethod
......@@ -1245,13 +1217,16 @@ class FindServersResponse(FrozenClass):
obj = FindServersResponse()
obj.TypeId = NodeId.from_binary(data)
obj.ResponseHeader = ResponseHeader.from_binary(data)
obj.Parameters = FindServersResult.from_binary(data)
length = struct.unpack('<i', data.read(4))[0]
if length != -1:
for _ in range(0, length):
obj.Servers.append(ApplicationDescription.from_binary(data))
return obj
def __str__(self):
return 'FindServersResponse(' + 'TypeId:' + str(self.TypeId) + ', ' + \
'ResponseHeader:' + str(self.ResponseHeader) + ', ' + \
'Parameters:' + str(self.Parameters) + ')'
'Servers:' + str(self.Servers) + ')'
__repr__ = __str__
......
......@@ -14,7 +14,7 @@ IgnoredEnums = []#["IdType", "NodeIdType"]
#we want to implement som struct by hand, to make better interface or simply because they are too complicated
IgnoredStructs = []#["NodeId", "ExpandedNodeId", "Variant", "QualifiedName", "DataValue", "LocalizedText"]#, "ExtensionObject"]
#by default we split requests and respons in header and parameters, but some are so simple we do not split them
NoSplitStruct = ["GetEndpointsResponse", "CloseSessionRequest", "AddNodesResponse", "BrowseResponse", "HistoryReadResponse", "HistoryUpdateResponse", "RegisterServerResponse", "CloseSecureChannelRequest", "CloseSecureChannelResponse", "CloseSessionRequest", "CloseSessionResponse", "UnregisterNodesResponse", "MonitoredItemModifyRequest", "MonitoredItemsCreateRequest", "ReadResponse", "WriteResponse", "TranslateBrowsePathsToNodeIdsResponse", "DeleteSubscriptionsResponse", "DeleteMonitoredItemsResponse", "CreateMonitoredItemsResponse", "ServiceFault", "AddReferencesRequest", "AddReferencesResponse", "ModifyMonitoredItemsResponse", "RepublishResponse", "CallResponse"]
NoSplitStruct = ["GetEndpointsResponse", "CloseSessionRequest", "AddNodesResponse", "BrowseResponse", "HistoryReadResponse", "HistoryUpdateResponse", "RegisterServerResponse", "CloseSecureChannelRequest", "CloseSecureChannelResponse", "CloseSessionRequest", "CloseSessionResponse", "UnregisterNodesResponse", "MonitoredItemModifyRequest", "MonitoredItemsCreateRequest", "ReadResponse", "WriteResponse", "TranslateBrowsePathsToNodeIdsResponse", "DeleteSubscriptionsResponse", "DeleteMonitoredItemsResponse", "CreateMonitoredItemsResponse", "ServiceFault", "AddReferencesRequest", "AddReferencesResponse", "ModifyMonitoredItemsResponse", "RepublishResponse", "CallResponse", "FindServersResponse"]
#structs that end with Request or Response but are not
NotRequest = ["MonitoredItemCreateRequest", "MonitoredItemModifyRequest", "CallMethodRequest"]
OverrideTypes = {}#AttributeId": "AttributeID", "ResultMask": "BrowseResultMask", "NodeClassMask": "NodeClass", "AccessLevel": "VariableAccessLevel", "UserAccessLevel": "VariableAccessLevel", "NotificationData": "NotificationData"}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment