forked from ungleich-public/cdist
Add tests related to transparent shebang support for executable remote scripts
This commit is contained in:
parent
e57cf1e70a
commit
cbb9bb165a
3 changed files with 167 additions and 0 deletions
|
@ -29,6 +29,8 @@ import random
|
||||||
import time
|
import time
|
||||||
import datetime
|
import datetime
|
||||||
import argparse
|
import argparse
|
||||||
|
import stat
|
||||||
|
import unittest
|
||||||
|
|
||||||
import cdist
|
import cdist
|
||||||
import cdist.configuration as cc
|
import cdist.configuration as cc
|
||||||
|
@ -278,6 +280,85 @@ class LocalTestCase(test.CdistTestCase):
|
||||||
for fmt, expected, actual in cases:
|
for fmt, expected, actual in cases:
|
||||||
self.assertEqual(expected, actual)
|
self.assertEqual(expected, actual)
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
# POLYGLOT tests:
|
||||||
|
# Ensure cdist is truely language-agnostic
|
||||||
|
# with proper support of shebang for "executable" scripts
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
@staticmethod
|
||||||
|
def _mark_as_executable(script):
|
||||||
|
# grant execute permission to everyone
|
||||||
|
os.chmod(script,
|
||||||
|
(os.stat(script).st_mode & 0o777)
|
||||||
|
| stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
|
||||||
|
|
||||||
|
def test_polyglot_run_shell_script_with_exec_permisions(self):
|
||||||
|
xc = self.local
|
||||||
|
xc.create_files_dirs()
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.writelines(["#!/bin/sh\n", "[ 1 == 1 ] && echo OK" ])
|
||||||
|
|
||||||
|
self._mark_as_executable(script)
|
||||||
|
|
||||||
|
xc.run_script(script)
|
||||||
|
|
||||||
|
def test_polyglot_run_shell_script_without_exec_permissions(self):
|
||||||
|
xc = self.local
|
||||||
|
xc.create_files_dirs()
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.writelines(["#!/bin/sh\n", "[ 1 == 1 ] && echo OK" ])
|
||||||
|
|
||||||
|
xc.run_script(script)
|
||||||
|
|
||||||
|
def test_polyglot_run_perl_script_with_exec_permissions(self):
|
||||||
|
xc = self.local
|
||||||
|
xc.create_files_dirs()
|
||||||
|
try:
|
||||||
|
xc.run(["/usr/bin/env", "perl", "-v"])
|
||||||
|
except:
|
||||||
|
raise unittest.SkipTest(
|
||||||
|
'perl interpreter or env program is not available.')
|
||||||
|
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.write(
|
||||||
|
"""#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
print 'OK';
|
||||||
|
""")
|
||||||
|
|
||||||
|
self._mark_as_executable(script)
|
||||||
|
|
||||||
|
self.assertEqual(xc.run_script(script, return_output=True), "OK")
|
||||||
|
|
||||||
|
def test_polyglot_run_perl_script_without_exec_permissions_and_fail(self):
|
||||||
|
xc = self.local
|
||||||
|
xc.create_files_dirs()
|
||||||
|
try:
|
||||||
|
xc.run(["/usr/bin/env", "perl", "-v"])
|
||||||
|
except:
|
||||||
|
raise unittest.SkipTest(
|
||||||
|
'perl interpreter or env program is not available.')
|
||||||
|
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.write(
|
||||||
|
"""#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
print 'OK';
|
||||||
|
""")
|
||||||
|
|
||||||
|
# NOTE that we deliberately abstain from setting execute permissions
|
||||||
|
# on the script, so that it ends up being fed into /bin/sh
|
||||||
|
# by the executor, which in turn should cause an error.
|
||||||
|
failed = False
|
||||||
|
try:
|
||||||
|
xc.run_script(script)
|
||||||
|
except:
|
||||||
|
failed = True
|
||||||
|
self.assertTrue(failed)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
import unittest
|
import unittest
|
||||||
|
|
|
@ -23,6 +23,8 @@ import os
|
||||||
import getpass
|
import getpass
|
||||||
import shutil
|
import shutil
|
||||||
import multiprocessing
|
import multiprocessing
|
||||||
|
import stat
|
||||||
|
import unittest
|
||||||
|
|
||||||
import cdist
|
import cdist
|
||||||
from cdist import test
|
from cdist import test
|
||||||
|
@ -220,6 +222,86 @@ class RemoteTestCase(test.CdistTestCase):
|
||||||
self.assertEqual(output, "test_object\n")
|
self.assertEqual(output, "test_object\n")
|
||||||
|
|
||||||
|
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
# POLYGLOT tests:
|
||||||
|
# Ensure cdist is truely language-agnostic
|
||||||
|
# with proper support of shebang for "executable" scripts
|
||||||
|
#------------------------------------------------------------------------
|
||||||
|
@staticmethod
|
||||||
|
def _mark_as_executable(script):
|
||||||
|
# grant execute permission to everyone
|
||||||
|
os.chmod(script,
|
||||||
|
(os.stat(script).st_mode & 0o777)
|
||||||
|
| stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH)
|
||||||
|
|
||||||
|
def test_polyglot_run_shell_script_with_exec_permisions(self):
|
||||||
|
xc = self.remote
|
||||||
|
xc.create_files_dirs()
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.writelines(["#!/bin/sh\n", "[ 1 == 1 ] && echo OK" ])
|
||||||
|
|
||||||
|
self._mark_as_executable(script)
|
||||||
|
|
||||||
|
xc.run_script(script)
|
||||||
|
|
||||||
|
def test_polyglot_run_shell_script_without_exec_permissions(self):
|
||||||
|
xc = self.remote
|
||||||
|
xc.create_files_dirs()
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.writelines(["#!/bin/sh\n", "[ 1 == 1 ] && echo OK" ])
|
||||||
|
|
||||||
|
xc.run_script(script)
|
||||||
|
|
||||||
|
def test_polyglot_run_perl_script_with_exec_permissions(self):
|
||||||
|
xc = self.remote
|
||||||
|
xc.create_files_dirs()
|
||||||
|
try:
|
||||||
|
xc.run(["/usr/bin/env", "perl", "-v"])
|
||||||
|
except:
|
||||||
|
raise unittest.SkipTest(
|
||||||
|
'perl interpreter or env program is not available.')
|
||||||
|
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.write(
|
||||||
|
"""#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
print 'OK';
|
||||||
|
""")
|
||||||
|
|
||||||
|
self._mark_as_executable(script)
|
||||||
|
|
||||||
|
self.assertEqual(xc.run_script(script, return_output=True), "OK")
|
||||||
|
|
||||||
|
def test_polyglot_run_perl_script_without_exec_permissions_and_fail(self):
|
||||||
|
xc = self.remote
|
||||||
|
xc.create_files_dirs()
|
||||||
|
try:
|
||||||
|
xc.run(["/usr/bin/env", "perl", "-v"])
|
||||||
|
except:
|
||||||
|
raise unittest.SkipTest(
|
||||||
|
'perl interpreter or env program is not available.')
|
||||||
|
|
||||||
|
handle, script = self.mkstemp(dir=self.temp_dir)
|
||||||
|
with os.fdopen(handle, "w") as fd:
|
||||||
|
fd.write(
|
||||||
|
"""#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
print 'OK';
|
||||||
|
""")
|
||||||
|
|
||||||
|
# NOTE that we deliberately abstain from setting execute permissions
|
||||||
|
# on the script, so that it ends up being fed into /bin/sh
|
||||||
|
# by the executor, which in turn should cause an error.
|
||||||
|
failed = False
|
||||||
|
try:
|
||||||
|
xc.run_script(script)
|
||||||
|
except:
|
||||||
|
failed = True
|
||||||
|
self.assertTrue(failed)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
import unittest
|
import unittest
|
||||||
|
|
||||||
|
|
4
cdist/test/explorer/fixtures/conf/explorer/polyglot_perl
Executable file
4
cdist/test/explorer/fixtures/conf/explorer/polyglot_perl
Executable file
|
@ -0,0 +1,4 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
use strict;
|
||||||
|
|
||||||
|
print "Polyglot - perl\n"
|
Loading…
Reference in a new issue