205 lines
10 KiB
Python
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()
|