2024-04-01 10:40:20 +02:00

295 lines
14 KiB
Python

from NSCP import Settings, Registry, Core, log, status, sleep
from test_helper import BasicTest, TestResult, Callable, setup_singleton, install_testcases, init_testcases, shutdown_testcases
import plugin_pb2
from types import *
import socket
import unicodedata
import uuid
class Message:
uuid = None
channel = None
source = None
command = None
status = None
message = None
perf = None
tag = None
delivered = False
def __init__(self, channel = None, source = None, command = None, status = None, message = None, perf = None, tag = None):
if not channel:
self.uuid = str(uuid.uuid4())
self.channel = channel
self.source = source
self.command = command
self.status = status
self.message = message
self.perf = perf
self.delivered = False
self.tag = tag
def copy_from(self, other):
self.uuid = other.uuid
self.channel = other.channel
self.source = other.source
self.command = other.command
self.status = other.status
self.message = other.message
self.perf = other.perf
self.delivered = other.delivered
self.tag = other.tag
def __str__(self):
return 'Message: %s (%s, %s, %s)'%(self.uuid, self.channel, self.status, self.message)
def __repr__(self):
return self.__str__()
class EventLogTest(BasicTest):
instance = None
key = ''
reg = None
conf = None
core = None
last_tag = []
got_simple_response = None
message_count = 0
messages = []
class SingletonHelper:
def __call__( self, *args, **kw ) :
if EventLogTest.instance is None :
object = EventLogTest()
EventLogTest.instance = object
return EventLogTest.instance
getInstance = SingletonHelper()
def desc(self):
return 'Testcase for eventlog'
def title(self):
return 'EventLog test'
def setup(self, plugin_id, prefix):
self.key = '_%stest_command'%prefix
self.reg = Registry.get(plugin_id)
self.reg.simple_subscription('pytest_evlog_01', EventLogTest.simple_inbox_handler_01)
self.reg.simple_subscription('pytest_evlog_02', EventLogTest.simple_inbox_handler_02)
def simple_inbox_handler_01(channel, source, command, code, message, perf):
instance = EventLogTest.getInstance()
return instance.simple_inbox_handler_wrapped(channel, source, command, code, message, perf, '001')
simple_inbox_handler_01 = Callable(simple_inbox_handler_01)
def simple_inbox_handler_02(channel, source, command, code, message, perf):
instance = EventLogTest.getInstance()
return instance.simple_inbox_handler_wrapped(channel, source, command, code, message, perf, '002')
simple_inbox_handler_02 = Callable(simple_inbox_handler_02)
def simple_inbox_handler_wrapped(self, channel, source, command, status, message, perf, tag):
msg = Message(channel, source, command, status, message, perf, tag)
msg.delivered = True
self.messages.append(msg)
log('Recieved: %s'%msg)
return True
def teardown(self):
None
def test_create(self, source, id, level, severity, category, facility, arguments):
result = TestResult('Creating log message: i:%d, l:%s, s:%s, c:%d, f:%d'%(id, level, severity, category, facility))
args = ['--source', source,
'--id', id, # Any number (corresponds with message identifier) -- Identifies message
'--level', level, # error(1), warning(2), success(0), info(4), auditSuccess(8), auditFailure(10) -- Loglevel severity (ie log level)
'--severity', severity, # success(0), informational(1), warning(2), error(3) -- Developer severity (ie classification)
'--category', category, #
'--facility', facility #
]
for f in arguments:
args.append('--argument')
args.append(f)
(ret, msg) = self.core.simple_exec('eventlog', 'insert', args)
result.assert_equals(ret, 0, 'return code')
result.assert_equals(len(msg), 1, 'Message length')
if len(msg) == 1:
result.assert_equals(msg[0], 'Message reported successfully', 'Status message')
return result
def test_w_expected(self, filter, syntax, expected):
result = TestResult('Validating filter: %s (%d)'%(filter, expected))
(res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=gt:%d'%expected, 'crit=gt:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected])
result.assert_equals(res, status.OK, "Validate status OK for %s"%filter)
(res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=eq:%d'%expected, 'crit=gt:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected])
result.assert_equals(res, status.WARNING, "Validate status OK for %s"%filter)
(res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'debug=false', 'warn=eq:%d'%expected, 'crit=eq:%d'%expected, 'filter=%s'%filter, 'syntax=%s'%syntax, 'scan-range=-10m', 'top-syntax=${status} ${count}==%d: ${list}'%expected])
result.assert_equals(res, status.CRITICAL, "Validate status CRIT for %s"%filter)
return result
def test_syntax(self, filter, syntax, expected):
result = TestResult('Validating syntax: %s'%syntax)
(res, msg, perf) = self.core.simple_query('CheckEventLog', ['file=Application', 'warn=ne:1', 'filter=%s'%filter, 'syntax=%s'%syntax, 'descriptions', 'scan-range=-10m'])
result.assert_equals(msg, expected, "Validate message rendering syntax: %s"%msg)
return result
def run_test(self):
result = TestResult('Checking CheckEventLog')
cache = TestResult('Checking CheckEventLog CACHE')
sleep(2000)
#(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:2'])
#cache.assert_equals(res, status.OK, "Validate cache is empty")
#cache.assert_equals(msg, 'Eventlog check ok', "Validate cache is ok: %s"%msg)
a_list = ['a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a']
result.add(self.test_create('Application Error', 1000, 'error', 'success', 0, 0, a_list))
result.add(self.test_create('Application Error', 1000, 'warning', 'informational', 1, 5, a_list))
result.add(self.test_create('Application Error', 1000, 'success', 'warning', 2, 5, a_list))
result.add(self.test_create('Application Error', 1000, 'info', 'error', 3, 5, a_list))
for x in range(1,10):
log('Waiting...%d/4.'%len(self.messages))
sleep(100)
if len(self.messages) == 4:
break
log('Recieved %d messages.'%len(self.messages))
result.assert_equals(len(self.messages), 4, 'Verify that all 4 messages are sent through')
for msg in self.messages:
if msg.message.startswith('X1'):
r = TestResult('Validating message X1')
r.assert_equals(msg.message, 'X1 warning Application Error: ', 'Verify message')
r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel')
r.assert_equals(msg.tag, '001', 'Verify tag')
r.assert_equals(msg.status, status.WARNING, 'Verify status')
result.add(r)
elif msg.message.startswith('X2'):
r = TestResult('Validating message X2')
r.assert_equals(msg.message, 'X2 success Application Error: ', 'Verify message')
r.assert_equals(msg.channel, 'pytest_evlog_02', 'Verify channel')
r.assert_equals(msg.tag, '002', 'Verify tag')
r.assert_equals(msg.status, status.CRITICAL, 'Verify status')
result.add(r)
elif msg.message.startswith('X3'):
r = TestResult('Validating message X3')
r.assert_equals(msg.message, 'X3 info Application Error: ', 'Verify message')
r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel')
r.assert_equals(msg.tag, '001', 'Verify tag')
r.assert_equals(msg.status, status.UNKNOWN, 'Verify status')
result.add(r)
elif msg.message.startswith('X4'):
r = TestResult('Validating message X4')
r.assert_equals(msg.message, 'X4 error Application Error: ', 'Verify message')
r.assert_equals(msg.channel, 'pytest_evlog_01', 'Verify channel')
r.assert_equals(msg.tag, '001', 'Verify tag')
r.assert_equals(msg.status, status.OK, 'Verify status')
result.add(r)
#(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:4'])
#cache.assert_equals(res, status.CRITICAL, "Validate cache has items: %s"%msg)
#cache.assert_equals(msg, 'X4 error Application Error: , X1 warning Application Error: , X2 success Application Error: , X3 info Application Error: , eventlog: 4 = critical', "Validate cache message")
#cache.assert_equals(perf, "'eventlog'=4;1;4", "Validate cache performance")
#(res, msg, perf) = self.core.simple_query('CheckEventLogCACHE', ['warn=eq:1', 'crit=eq:2'])
#cache.assert_equals(res, status.OK, "Validate cache is empty (again)")
#cache.assert_equals(msg, 'Eventlog check ok', "Validate cache is ok: %s"%msg)
#result.add(cache)
r = TestResult('Checking filters')
r.add(self.test_w_expected('id = 1000 and generated gt 1m', '%generated%', 0))
r.add(self.test_w_expected('id = 1000 and generated gt -1m', '%generated%', 4))
r.add(self.test_w_expected('id = 1000 and generated gt -1m and id = 1000', '%generated%: %id%, %category%', 4))
r.add(self.test_w_expected('id = 1000 and generated gt -1m and category = 1', '%category%', 1))
r.add(self.test_w_expected('id = 1000 and generated gt -1m and category = 0', '%category%', 1))
r.add(self.test_w_expected("id = 1000 and generated gt -1m and level = 'error'", '%level%', 1))
r.add(self.test_w_expected("id = 1000 and generated gt -1m and level = 'warning'", '%level%', 1))
result.add(r)
r = TestResult('Checking syntax')
r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%source% - %type% - %category%', 'Application Error - error - 0'))
r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%source% - %type% - %category%', 'Application Error - warning - 1'))
r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 2', '%source% - %type% - %category%', 'Application Error - information - 2'))
r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 3', '%source% - %type% - %category%', 'Application Error - information - 3'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%facility% - %qualifier% - %customer%', '0 - 0 - 0'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%facility% - %qualifier% - %customer%', '5 - 5 - 0'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%rawid% - %severity% - %log%', '1000 - success - Application'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%rawid% - %severity% - %log%', '1074070504 - informational - Application'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 2', '%rawid% - %severity% - %log%', '2147812328 - warning - Application'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 3', '%rawid% - %severity% - %log%', '3221554152 - error - Application'))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 0', '%id% - %strings%', '1000 - a, a, a, a, a, a, a, a, a, a, a, a, a, '))
#r.add(self.test_syntax('id = 1000 and generated gt -2m and category = 1', '%id% - %strings%', '1000 - a, a, a, a, a, a, a, a, a, a, a, a, a, '))
result.add(r)
return result
def install_filter(self, conf, path, target, filter = None, syntax = '%type% %source%: %message%', severity = 'OK', lang = 'english', age = '5s'):
if filter:
conf.set_string(path, 'filter', filter)
if target:
conf.set_string(path, 'target', target)
if lang:
conf.set_string(path, 'language', lang)
if age:
conf.set_string(path, 'maximum age', age)
if syntax:
conf.set_string(path, 'detail syntax', syntax)
if severity:
conf.set_string(path, 'severity', severity)
conf.set_string(path, 'log', 'application')
conf.set_string(path, 'debug', 'true')
def install(self, arguments):
conf = self.conf
conf.set_string('/modules', 'pytest_eventlog', 'CheckEventLog')
conf.set_string('/modules', 'pytest', 'PythonScript')
conf.set_string('/settings/pytest/scripts', 'test_eventlog', 'test_eventlog.py')
conf.set_string('/settings/pytest_eventlog/real-time', 'enabled', 'true')
self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/default', 'pytest_evlog_01', 'id = 1000 and category = 0', '%type% %source%: %message%','OK')
base_syntax = '${id},${category} ${source}: ${message}'
self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_001', 'pytest_evlog_01', 'id = 1000 and category = 1', 'X1 %s'%base_syntax, 'WARNING')
self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_002', 'pytest_evlog_02', 'id = 1000 and category = 2', 'X2 %s'%base_syntax, 'CRITICAL')
self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_003', None, 'id = 1000 and category = 3', 'X3 %s'%base_syntax, 'UNKNOWN')
self.install_filter(conf, '/settings/pytest_eventlog/real-time/filters/py_test_004', None, None , 'X4 %s'%base_syntax, None)
conf.set_string('/settings/pytest_eventlog/real-time', 'maximum age', '5s')
conf.set_string('/settings/pytest_eventlog/real-time', 'debug', 'true')
conf.set_string('/settings/pytest_eventlog/real-time', 'enable active', 'true')
conf.save()
def uninstall(self):
None
def help(self):
None
def init(self, plugin_id, prefix):
self.reg = Registry.get(plugin_id)
self.core = Core.get(plugin_id)
self.conf = Settings.get(plugin_id)
def shutdown(self):
None
setup_singleton(EventLogTest)
all_tests = [EventLogTest]
def __main__(args):
install_testcases(all_tests)
def init(plugin_id, plugin_alias, script_alias):
init_testcases(plugin_id, plugin_alias, script_alias, all_tests)
def shutdown():
shutdown_testcases()