Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
O
opcua-asyncio
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Nikola Balog
opcua-asyncio
Commits
217fb21a
Commit
217fb21a
authored
Apr 26, 2016
by
Denis Štogl
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Generation of CustomEvents is working. Adding AuditEvent per hand for testing of inheritance.
parent
16acc718
Changes
4
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
176 additions
and
85 deletions
+176
-85
opcua/common/event.py
opcua/common/event.py
+16
-29
opcua/server/server.py
opcua/server/server.py
+10
-2
opcua/ua/uaevents_auto.py
opcua/ua/uaevents_auto.py
+20
-12
tests/tests_server.py
tests/tests_server.py
+130
-42
No files found.
opcua/common/event.py
View file @
217fb21a
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
])
opcua/server/server.py
View file @
217fb21a
...
...
@@ -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
]))
...
...
opcua/ua/uaevents_auto.py
View file @
217fb21a
...
...
@@ -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
=
No
deId
(
ObjectIds
.
Server
)
,
message
=
None
,
severity
=
1
,
extended
=
False
):
def
__init__
(
self
,
sourcenode
=
No
ne
,
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
,
}
tests/tests_server.py
View file @
217fb21a
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment