Revision 10b86782
b/lib/backend.py | ||
---|---|---|
711 | 711 |
if constants.NV_USERSCRIPTS in what: |
712 | 712 |
result[constants.NV_USERSCRIPTS] = \ |
713 | 713 |
[script for script in what[constants.NV_USERSCRIPTS] |
714 |
if not (os.path.exists(script) and os.access(script, os.X_OK))]
|
|
714 |
if not utils.IsExecutable(script)]
|
|
715 | 715 |
|
716 | 716 |
if constants.NV_OOB_PATHS in what: |
717 | 717 |
result[constants.NV_OOB_PATHS] = tmp = [] |
b/lib/utils/process.py | ||
---|---|---|
718 | 718 |
|
719 | 719 |
for relname in sorted(dir_contents): |
720 | 720 |
fname = utils_io.PathJoin(dir_name, relname) |
721 |
if not (os.path.isfile(fname) and os.access(fname, os.X_OK) and
|
|
722 |
constants.EXT_PLUGIN_MASK.match(relname) is not None):
|
|
721 |
if not (constants.EXT_PLUGIN_MASK.match(relname) is not None and
|
|
722 |
utils_wrapper.IsExecutable(fname)):
|
|
723 | 723 |
rr.append((relname, constants.RUNPARTS_SKIP, None)) |
724 | 724 |
else: |
725 | 725 |
try: |
b/lib/utils/wrapper.py | ||
---|---|---|
172 | 172 |
return path |
173 | 173 |
|
174 | 174 |
|
175 |
def IsExecutable(filename): |
|
176 |
"""Checks whether a file exists and is executable. |
|
177 |
|
|
178 |
@type filename: string |
|
179 |
@param filename: Filename |
|
180 |
@rtype: bool |
|
181 |
|
|
182 |
""" |
|
183 |
return os.path.isfile(filename) and os.access(filename, os.X_OK) |
|
184 |
|
|
185 |
|
|
175 | 186 |
def ResetTempfileModule(_time=time.time): |
176 | 187 |
"""Resets the random name generator of the tempfile module. |
177 | 188 |
|
b/test/ganeti.utils.wrapper_unittest.py | ||
---|---|---|
27 | 27 |
import socket |
28 | 28 |
import tempfile |
29 | 29 |
import unittest |
30 |
import shutil |
|
30 | 31 |
|
31 | 32 |
from ganeti import constants |
32 | 33 |
from ganeti import utils |
... | ... | |
122 | 123 |
self.assertEquals(utils.IgnoreSignals(self._Return, 33), 33) |
123 | 124 |
|
124 | 125 |
|
126 |
class TestIsExecutable(unittest.TestCase): |
|
127 |
def setUp(self): |
|
128 |
self.tmpdir = tempfile.mkdtemp() |
|
129 |
|
|
130 |
def tearDown(self): |
|
131 |
shutil.rmtree(self.tmpdir) |
|
132 |
|
|
133 |
def testNonExisting(self): |
|
134 |
fname = utils.PathJoin(self.tmpdir, "file") |
|
135 |
assert not os.path.exists(fname) |
|
136 |
self.assertFalse(utils.IsExecutable(fname)) |
|
137 |
|
|
138 |
def testNoFile(self): |
|
139 |
path = utils.PathJoin(self.tmpdir, "something") |
|
140 |
os.mkdir(path) |
|
141 |
assert os.path.isdir(path) |
|
142 |
self.assertFalse(utils.IsExecutable(path)) |
|
143 |
|
|
144 |
def testExecutable(self): |
|
145 |
fname = utils.PathJoin(self.tmpdir, "file") |
|
146 |
utils.WriteFile(fname, data="#!/bin/bash", mode=0700) |
|
147 |
assert os.path.exists(fname) |
|
148 |
self.assertTrue(utils.IsExecutable(fname)) |
|
149 |
|
|
150 |
self.assertTrue(self._TestSymlink(fname)) |
|
151 |
|
|
152 |
def testFileNotExecutable(self): |
|
153 |
fname = utils.PathJoin(self.tmpdir, "file") |
|
154 |
utils.WriteFile(fname, data="#!/bin/bash", mode=0600) |
|
155 |
assert os.path.exists(fname) |
|
156 |
self.assertFalse(utils.IsExecutable(fname)) |
|
157 |
|
|
158 |
self.assertFalse(self._TestSymlink(fname)) |
|
159 |
|
|
160 |
def _TestSymlink(self, fname): |
|
161 |
assert os.path.exists(fname) |
|
162 |
|
|
163 |
linkname = utils.PathJoin(self.tmpdir, "cmd") |
|
164 |
os.symlink(fname, linkname) |
|
165 |
|
|
166 |
assert os.path.islink(linkname) |
|
167 |
|
|
168 |
return utils.IsExecutable(linkname) |
|
169 |
|
|
170 |
|
|
125 | 171 |
if __name__ == "__main__": |
126 | 172 |
testutils.GanetiTestProgram() |
Also available in: Unified diff