Commit 217fb21a authored by Denis Štogl's avatar Denis Štogl

Generation of CustomEvents is working. Adding AuditEvent per hand for testing of inheritance.

parent 16acc718
import logging
from datetime import datetime
from opcua import ua
......@@ -22,7 +22,11 @@ class EventGenerator(object):
etype: The event type, either an objectId, a NodeId or a Node object
"""
def __init__(self, isession, etype=ua.BaseEvent(), source=ua.ObjectIds.Server):
def __init__(self, isession, etype=None, source=ua.ObjectIds.Server):
if not etype:
etype = ua.BaseEvent()
self.logger = logging.getLogger(__name__)
self.isession = isession
self.event = None
node = None
......@@ -46,10 +50,14 @@ class EventGenerator(object):
else:
source = Node(isession, ua.NodeId(source))
if self.event.SourceNode.Identifier:
source = Node(self.isession, self.event.SourceNode)
if self.event.SourceNode:
if source.nodeid != self.event.SourceNode:
self.logger.warning("Source NodeId: '%s' and event SourceNode: '%s' are not the same. Using '%s' as SourceNode", str(source.nodeid), str(self.event.SourceNode), str(self.event.SourceNode))
source = Node(self.isession, self.event.SourceNode)
self.event.SourceNode = source.nodeid
self.event.SourceName = source.get_display_name().Text
source.set_attribute(ua.AttributeIds.EventNotifier, ua.DataValue(ua.Variant(1, ua.VariantType.Byte)))
def __str__(self):
......@@ -86,11 +94,10 @@ def get_event_from_node(node):
class CustomEvent(parent_eventtype):
def __init__(self):
super(CustomEvent, self).__init__()
super(CustomEvent, self).__init__(extended=True)
curr_node = node
while curr_node.nodeid.Identifier != parent_identifier:
properties = curr_node.get_referenced_nodes(refs=ua.ObjectIds.HasProperty, direction=ua.BrowseDirection.Forward)
for prop in properties:
for prop in curr_node.get_properties():
setattr(self, prop.get_browse_name().Name, prop.get_value())
parents = node.get_referenced_nodes(refs=ua.ObjectIds.HasSubtype, direction=ua.BrowseDirection.Inverse, includesubtypes=False)
......@@ -98,27 +105,7 @@ def get_event_from_node(node):
return None
curr_node = parents[0]
#TODO: Extend to show all fields of CustomEvent
def __str__(self):
s = 'CustomEvent('
s += 'EventId:{}'.format(self.EventId)
s += ', EventType:{}'.format(self.EventType)
s += ', SourceNode:{}'.format(self.SourceNode)
s += ', SourceName:{}'.format(self.SourceName)
s += ', Time:{}'.format(self.Time)
s += ', RecieveTime:{}'.format(self.RecieveTime)
s += ', LocalTime:{}'.format(self.LocalTime)
s += ', Message:{}'.format(self.Message)
s += ', Severity:{}'.format(self.Severity)
s += ')'
#class CustomEvent():
#pass
#references = node.get_children_descriptions(refs=ua.ObjectIds.HasProperty)
#for desc in references:
#child = Node(self.isession, desc.NodeId)
#setattr(self.event, desc.BrowseName.Name, child.get_value())
self._freeze = True
return CustomEvent()
......@@ -129,6 +116,6 @@ def _find_parent_eventtype(node):
if len(parents) != 1: # Something went wrong
return None
if parents[0].nodeid.Identifier in ua.uaevents_auto.IMPLEMNTED_EVENTS.keys():
return node.nodeid.Identifier, ua.uaevents_auto.IMPLEMNTED_EVENTS[parents[0].nodeid.Identifier]
return parents[0].nodeid.Identifier, ua.uaevents_auto.IMPLEMNTED_EVENTS[parents[0].nodeid.Identifier]
else:
_find_parent_eventtype(parents[0])
......@@ -329,16 +329,24 @@ class Server(object):
uries = self.get_namespace_array()
return uries.index(uri)
def get_event_generator(self, etype=ua.BaseEvent(), source=ua.ObjectIds.Server):
def get_event_generator(self, etype=None, source=ua.ObjectIds.Server):
"""
Returns an event object using an event type from address space.
Use this object to fire events
"""
if not etype:
etype = ua.BaseEvent()
return EventGenerator(self.iserver.isession, etype, source)
def create_custom_event(self, idx, name, baseetype=ua.ObjectIds.BaseEventType, properties=[]):
base_event = self.get_node(ua.NodeId(baseetype))
if isinstance(baseetype, Node):
base_event = baseetype
elif isinstance(baseetype, ua.NodeId):
base_event = Node(self.iserver.isession, baseetype)
else:
base_event = Node(self.iserver.isession, ua.NodeId(baseetype))
custom_event = base_event.add_subtype(idx, name)
for property in properties:
custom_event.add_property(idx, property[0], ua.Variant(None, property[1]))
......
......@@ -6,12 +6,13 @@ For now only events!
from opcua.ua import *
# TODO: This should be autogeneratd form XML description of EventTypes
class BaseEvent(FrozenClass):
'''
BaseEvent implements BaseEventType from which inherit all other events and it is used per default.
'''
def __init__(self, sourcenode=NodeId(ObjectIds.Server), message=None, severity=1, extended=False):
def __init__(self, sourcenode=None, message=None, severity=1, extended=False):
self.EventId = bytes()
self.EventType = NodeId(ObjectIds.BaseEventType)
self.SourceNode = sourcenode
......@@ -25,20 +26,27 @@ class BaseEvent(FrozenClass):
self._freeze = True
def __str__(self):
s = 'BaseEventType(EventId:{}'.format(self.EventId)
s += ', EventType:{}'.format(self.EventType)
s += ', SourceNode:{}'.format(self.SourceNode)
s += ', SourceName:{}'.format(self.SourceName)
s += ', Time:{}'.format(self.Time)
s += ', RecieveTime:{}'.format(self.RecieveTime)
s += ', LocalTime:{}'.format(self.LocalTime)
s += ', Message:{}'.format(self.Message)
s += ', Severity:{}'.format(self.Severity)
s += ')'
return s
return "{}({})".format(type(self).__name__, [str(k) + ":" + str(v) for k, v in self.__dict__.items()])
__repr__ = __str__
class AuditEvent(BaseEvent):
'''
Audit implements AuditEventType from which inherit all other Audit events.
'''
def __init__(self, sourcenode=None, message=None, severity=1, extended=False):
super(AuditEvent, self).__init__(sourcenode, message, severity, True)
self.ActionTimeStamp = None
self.Status = False
self.ServerId = None
self.ClientAuditEntryId = None
self.ClientUserId = None
if not extended:
self._freeze = True
IMPLEMNTED_EVENTS = {
ObjectIds.BaseEventType: BaseEvent,
ObjectIds.AuditEventType: AuditEvent,
}
This diff is collapsed.
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