Ansible/bibliotheque/files/nsclient/scripts/python/test_external_script.py
2024-04-01 10:40:20 +02:00

205 lines
10 KiB
Python

from NSCP import Settings, Registry, Core, log, status, log_error, sleep
import sys, difflib
import os
from test_helper import BasicTest, TestResult, Callable, setup_singleton, install_testcases, init_testcases, shutdown_testcases
import plugin_pb2
from types import *
import socket
import uuid
import unicodedata
import threading
sync = threading.RLock()
LONG_OUTPUT = """Test arguments are: (LONG "$ARG2$" "$ARG3$")\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789\n
0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789"""
class ExternalScriptTest(BasicTest):
instance = None
key = ''
reg = None
conf = None
core = None
_responses = {}
_requests = {}
def setup(self, plugin_id, prefix):
self.key = '_%stest_command'%prefix
self.reg = Registry.get(plugin_id)
def teardown(self):
None
def do_one_test(self, script, expected = status.OK, message = "Foo Bar", args=[], cleanup=True):
result = TestResult('%s (%s)'%(script, args))
(ret, msg, perf) = self.core.simple_query(script, args)
if cleanup and os.name != 'nt':
message = message.replace('"', '')
message = message.replace('$ARG1$', '$')
message = message.replace('$ARG2$', '$')
message = message.replace('$ARG3$', '$')
message = message.replace('\r', '\n')
message = message.replace('\n\n', '\n')
msg = msg.replace('\r', '\n')
msg = msg.replace('\n\n', '\n')
result.assert_equals(ret, expected, 'Validate return code for %s'%script)
result.assert_equals(msg, message, 'Validate return message for %s'%script)
if msg != message:
diff = difflib.ndiff(msg.splitlines(1), message.splitlines(1))
for l in diff:
log_error(l)
return result
def run_test(self):
ret = TestResult('External scripts test suite')
result = TestResult('Arguments NOT allowed')
result.add(self.do_one_test('tes_script_ok', message='OK: Everything is going to be fine'))
result.add(self.do_one_test('tes_script_test', message='Test arguments are: ( )'))
result.add(self.do_one_test('tes_sa_test', status.OK, 'Test arguments are: ("ARG1" "ARG 2" "A R G 3")'))
result.add(self.do_one_test('tes_script_test', status.UNKNOWN, 'Arguments not allowed see nsclient.log for details', ['NOT ALLOWED']))
ret.add(result)
self.conf.set_string('/settings/test_external_scripts', 'allow arguments', 'true')
self.core.reload('test_external_scripts')
result = TestResult('Arguments allowed')
if os.name == 'nt':
tests = ['bat', 'ps1']
else:
tests = ['sh']
for t in tests:
script = 'tes_sca_%s'%t
subresult = TestResult(t)
subresult.add(self.do_one_test(script, status.OK, 'Test arguments are: (OK "$ARG2$" "$ARG3$")', ['OK']))
subresult.add(self.do_one_test(script, status.WARNING, 'Test arguments are: (WARN "$ARG2$" "$ARG3$")', ['WARN']))
subresult.add(self.do_one_test(script, status.CRITICAL, 'Test arguments are: (CRIT "$ARG2$" "$ARG3$")', ['CRIT']))
subresult.add(self.do_one_test(script, status.UNKNOWN, 'Test arguments are: (UNKNOWN "$ARG2$" "$ARG3$")', ['UNKNOWN']))
subresult.add(self.do_one_test(script, status.OK, 'Test arguments are: (OK "String with space" "A long long option with many spaces")', ['OK', 'String with space', 'A long long option with many spaces']))
subresult.add(self.do_one_test(script, status.OK, LONG_OUTPUT, ['LONG']))
subresult.add(self.do_one_test(script, status.UNKNOWN, 'Request contained illegal characters set /settings/external scripts/allow nasty characters=true!', ['OK', '$$$ \\ \\', '$$$ \\ \\']))
result.add(subresult)
subresult = TestResult('Upper and lower case')
subresult.add(self.do_one_test("tes_upper_LOWER", status.OK, 'OK: Everything is going to be fine', ['OK']))
subresult.add(self.do_one_test("alias_UPPER_lower", status.OK, 'OK: Everything is going to be fine', ['OK']))
result.add(subresult)
ret.add(result)
self.conf.set_string('/settings/test_external_scripts', 'allow nasty characters', 'true')
self.core.reload('test_external_scripts')
result = TestResult('Nasty Arguments allowed')
for t in tests:
script = 'tes_sca_%s'%t
subresult = TestResult(t)
if os.name == 'nt':
subresult.add(self.do_one_test(script, status.OK, 'Test arguments are: (OK "$$$ \\ \\" "$$$ \\ \\")', ['OK', '$$$ \\ \\', '$$$ \\ \\'], False))
else:
subresult.add(self.do_one_test(script, status.OK, 'Test arguments are: (OK $ \\ " $ ")', ['OK', '$ \\ \\', '$ \\ \\'], False))
result.add(subresult)
ret.add(result)
return ret
def install(self, arguments):
self.conf.set_string('/modules', 'test_external_scripts', 'CheckExternalScripts')
self.conf.set_string('/modules', 'pytest', 'PythonScript')
self.conf.set_string('/settings/pytest/scripts', 'test_external_script', 'test_external_script.py')
self.conf.set_string('/settings/test_external_scripts', 'allow arguments', 'false')
self.conf.set_string('/settings/test_external_scripts', 'allow nasty characters', 'false')
if os.name == 'nt':
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_UPPER_lower', 'scripts\\check_ok.bat')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_ok', 'scripts\\check_ok.bat')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_long', 'scripts\\check_long.bat')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_test', 'scripts\\check_test.bat')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_bat', 'scripts\\check_test.bat')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_ps1', 'cmd /c echo scripts\\check_test.ps1; exit($lastexitcode) | powershell.exe -command -')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_vbs', 'cscript.exe //T:30 //NoLogo scripts\\\\lib\\\\wrapper.vbs scripts\\check_test.vbs')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sa_test', 'scripts\\check_test.bat "ARG1" "ARG 2" "A R G 3"')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sa_ps1', 'scripts\\check_test.ps1 "ARG1" "ARG 2" "A R G 3"')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sa_vbs', 'scripts\\check_test.vbs "ARG1" "ARG 2" "A R G 3"')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sca_bat', 'scripts\\check_test.bat $ARG1$ "$ARG2$" "$ARG3$"')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sca_ps1', 'cmd /c echo scripts\\check_test.ps1 \'$ARG1$\' \'$ARG2$\' \'$ARG3$\'; exit($lastexitcode) | powershell.exe -command -')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sca_vbs', 'scripts\\check_test.vbs $ARG1$ "$ARG2$" "$ARG3$"')
self.conf.set_string('/settings/test_external_scripts/wrapped scripts', 'tes_ws_bat', 'check_test.bat')
self.conf.set_string('/settings/test_external_scripts/wrapped scripts', 'tes_ws_ps1', 'check_test.ps1')
self.conf.set_string('/settings/test_external_scripts/wrapped scripts', 'tes_ws_vbs', 'check_test.vbs')
self.conf.set_string('/settings/test_external_scripts/wrappings', 'vbs', 'cscript.exe //T:30 //NoLogo scripts\\\\lib\\\\wrapper.vbs %SCRIPT% %ARGS%')
self.conf.set_string('/settings/test_external_scripts/wrappings', 'ps1', 'cmd /c echo scripts\\\\%SCRIPT% %ARGS%; exit($lastexitcode) | powershell.exe -command -')
self.conf.set_string('/settings/test_external_scripts/wrappings', 'bat', 'scripts\\\\%SCRIPT% %ARGS%')
else:
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_UPPER_lower', 'scripts/check_ok.sh')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_ok', 'scripts/check_ok.sh')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_long', 'scripts/check_long.sh')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_sh', 'scripts/check_test.sh')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_script_test', 'scripts/check_test.sh')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sa_test', 'scripts/check_test.sh "ARG1" "ARG 2" "A R G 3"')
self.conf.set_string('/settings/test_external_scripts/scripts', 'tes_sca_sh', 'scripts/check_test.sh $ARG1$ "$ARG2$" "$ARG3$"')
self.conf.set_string('/settings/test_external_scripts/alias', 'tes_alias_ok', 'tes_script_test')
self.conf.set_string('/settings/test_external_scripts/alias', 'tes_aa_ok', 'tes_script_test "ARG1" "ARG 2" "A R G 3"')
self.conf.set_string('/settings/test_external_scripts/alias', 'alias_UPPER_lower', 'tes_UPPER_lower')
self.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
def require_boot(self):
return True
setup_singleton(ExternalScriptTest)
all_tests = [ExternalScriptTest]
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()