diff --git a/lib/ansible/inventory/__init__.py b/lib/ansible/inventory/__init__.py index e41e9acb12..a5780c1982 100644 --- a/lib/ansible/inventory/__init__.py +++ b/lib/ansible/inventory/__init__.py @@ -76,7 +76,7 @@ class Inventory(object): all.add_host(Host(tokens[0], tokens[1])) else: all.add_host(Host(x)) - elif os.access(host_list, os.X_OK): + elif utils.is_executable(host_list): self._is_script = True self.parser = InventoryScript(filename=host_list) self.groups = self.parser.groups.values() diff --git a/lib/ansible/module_common.py b/lib/ansible/module_common.py index 32bba60164..d8648685ac 100644 --- a/lib/ansible/module_common.py +++ b/lib/ansible/module_common.py @@ -49,6 +49,7 @@ import syslog import types import time import shutil +import stat try: from hashlib import md5 as _md5 @@ -247,7 +248,7 @@ class AnsibleModule(object): paths.append(p) for d in paths: path = os.path.join(d, arg) - if os.path.exists(path) and os.access(path, os.X_OK): + if os.path.exists(path) and self.is_executable(path): bin_path = path break if required and bin_path is None: @@ -282,6 +283,12 @@ class AnsibleModule(object): print self.jsonify(kwargs) sys.exit(1) + def is_executable(path): + '''is the given path executable?''' + return (stat.S_IXUSR & os.stat(path)[stat.ST_MODE] + or stat.S_IXGRP & os.stat(path)[stat.ST_MODE] + or stat.S_IXOTH & os.stat(path)[stat.ST_MODE]) + def md5(self, filename): ''' Return MD5 hex digest of local file, or None if file is not present. ''' if not os.path.exists(filename): diff --git a/lib/ansible/utils.py b/lib/ansible/utils.py index 2e81a5db95..76459a8a3a 100644 --- a/lib/ansible/utils.py +++ b/lib/ansible/utils.py @@ -32,6 +32,7 @@ import StringIO import imp import glob import subprocess +import stat VERBOSITY=0 @@ -100,6 +101,12 @@ def check_conditional(conditional): return var.startswith("$") return eval(conditional) +def is_executable(path): + '''is the given path executable?''' + return (stat.S_IXUSR & os.stat(path)[stat.ST_MODE] + or stat.S_IXGRP & os.stat(path)[stat.ST_MODE] + or stat.S_IXOTH & os.stat(path)[stat.ST_MODE]) + def prepare_writeable_dir(tree): ''' make sure a directory exists and is writeable '''