Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add method get_bin_path to module_common and update modules to use it #968

Merged
merged 5 commits into from
Aug 30, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
28 changes: 28 additions & 0 deletions lib/ansible/module_common.py
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,34 @@ def _log_invocation(self):
log_args = re.sub(r'login_password=.+ (.*)', r"login_password=NOT_LOGGING_PASSWORD \1", log_args)
syslog.syslog(syslog.LOG_NOTICE, 'Invoked with %s' % log_args)

def get_bin_path(self, arg, required=False, opt_dirs=[]):
'''
find system executable in PATH.
Optional arguments:
- required: if executable is not found and required is true, fail_json
- opt_dirs: optional list of directories to search in addition to PATH
if found return full path; otherwise return None
'''
sbin_paths = ['/sbin', '/usr/sbin', '/usr/local/sbin']
paths = []
for d in opt_dirs:
if d is not None and os.path.exists(d):
paths.append(d)
paths += os.environ.get('PATH').split(':')
bin_path = None
# mangle PATH to include /sbin dirs
for p in sbin_paths:
if p not in paths and os.path.exists(p):
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):
bin_path = path
break
if required and bin_path is None:
self.fail_json(msg='Failed to find required executable %s' % arg)
return bin_path

def boolean(self, arg):
''' return a bool for the arg '''
if arg is None or type(arg) == bool:
Expand Down
14 changes: 2 additions & 12 deletions library/apt_repository
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,7 @@
import platform

APT = "/usr/bin/apt-get"


def _find_binary(module):
binaries = ['/usr/bin/add-apt-repository']

for e in binaries:
if os.path.exists(e):
return e

module.fail_json(msg='Unabled to find any of the following executables '
'%s' % binaries)
ADD_APT_REPO = 'add-apt-repository'

def _run(cmd):
# returns (rc, stdout, stderr) from shell command
Expand All @@ -56,7 +46,7 @@ def main():

module = AnsibleModule(argument_spec=arg_spec)

add_apt_repository = _find_binary(module)
add_apt_repository = module.get_bin_path(ADD_APT_REPO, True)

repo = module.params['repo']
state = module.params['state']
Expand Down
20 changes: 6 additions & 14 deletions library/easy_install
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,6 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#

def _find_easy_install(env):
if env:
return os.path.join(env, 'bin', 'easy_install')

paths = ['/usr/local/bin', '/usr/bin']

for p in paths:
e = p + '/easy_install'
if os.path.exists(e):
return e


def _ensure_virtualenv(env, virtualenv):
if os.path.exists(os.path.join(env, 'bin', 'activate')):
return 0, '', ''
Expand Down Expand Up @@ -62,14 +50,18 @@ def main():

name = module.params['name']
env = module.params['virtualenv']
easy_install = _find_easy_install(env)
easy_install = module.get_bin_path('easy_install', True, ['%s/bin' % env])

rc = 0
err = ''
out = ''

if env:
rc_venv, out_venv, err_venv = _ensure_virtualenv(env, '/usr/local/bin/virtualenv')
virtualenv = module.get_bin_path('virtualenv', True)
if virtualenv is None:
module.fail_json(msg='virtualenv is not installed')

rc_venv, out_venv, err_venv = _ensure_virtualenv(env, virtualenv)

rc += rc_venv
out += out_venv
Expand Down
14 changes: 3 additions & 11 deletions library/group
Original file line number Diff line number Diff line change
Expand Up @@ -20,23 +20,15 @@

import grp

def get_bin_path(module, arg):
if os.path.exists('/usr/sbin/%s' % arg):
return '/usr/sbin/%s' % arg
elif os.path.exists('/sbin/%s' % arg):
return '/sbin/%s' % arg
else:
module.fail_json(msg="Cannot find %s" % arg)

def group_del(module, group):
cmd = [get_bin_path(module, 'groupdel'), group]
cmd = [module.get_bin_path('groupdel', True), group]
p = subprocess.Popen(cmd, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
(out, err) = p.communicate()
rc = p.returncode
return (rc, out, err)

def group_add(module, group, **kwargs):
cmd = [get_bin_path(module, 'groupadd')]
cmd = [module.get_bin_path('groupadd', True)]
for key in kwargs:
if key == 'gid' and kwargs[key] is not None:
cmd.append('-g')
Expand All @@ -50,7 +42,7 @@ def group_add(module, group, **kwargs):
return (rc, out, err)

def group_mod(module, group, **kwargs):
cmd = [get_bin_path(module, 'groupmod')]
cmd = [module.get_bin_path('groupmod', True)]
info = group_info(group)
for key in kwargs:
if key == 'gid':
Expand Down
30 changes: 2 additions & 28 deletions library/pip
Original file line number Diff line number Diff line change
Expand Up @@ -27,32 +27,6 @@ def _get_full_name(name, version=None):
resp = name + '==' + version
return resp


def _find_pip(module, env):
paths = ['/usr/local/bin', '/usr/bin']

if env:
paths = [os.path.join(env, 'bin')] + paths

for p in paths:
pe = p + '/pip'
if os.path.exists(pe):
return pe

module.fail_json(msg='pip is not installed')


def _find_virtualenv(module):
paths = ['/usr/local/bin', '/usr/bin']

for p in paths:
ve = p + '/virtualenv'
if os.path.exists(ve):
return ve

module.fail_json(msg='virtualenv is not installed')


def _ensure_virtualenv(module, env, virtualenv):
if os.path.exists(os.path.join(env, 'bin', 'activate')):
return 0, '', ''
Expand Down Expand Up @@ -103,15 +77,15 @@ def main():
env = module.params['virtualenv']

if env:
virtualenv = _find_virtualenv(module)
virtualenv = module.get_bin_path('virtualenv', True)

rc_venv, out_venv, err_venv = _ensure_virtualenv(module, env, virtualenv)

rc += rc_venv
out += out_venv
err += err_venv

pip = _find_pip(module, env)
pip = module.get_bin_path('pip', True, ['%s/bin' % env])

state = module.params['state']
name = module.params['name']
Expand Down
5 changes: 1 addition & 4 deletions library/service
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,7 @@ def _find_binaries(m):
location[binary] = None

for binary in binaries:
for path in paths:
if os.path.exists(path + '/' + binary):
location[binary] = path + '/' + binary
break
location[binary] = m.get_bin_path(binary)

if location.get('systemctl', None):
CHKCONFIG = location['systemctl']
Expand Down
14 changes: 4 additions & 10 deletions library/setup
Original file line number Diff line number Diff line change
Expand Up @@ -436,7 +436,9 @@ class LinuxNetwork(Network):
Network.__init__(self)

def populate(self):
ip_path = self.get_ip_path()
ip_path = module.get_bin_path('ip')
if ip_path is None:
return self.facts
default_ipv4, default_ipv6 = self.get_default_interfaces(ip_path)
interfaces, ips = self.get_interfaces_info(ip_path, default_ipv4, default_ipv6)
self.facts['interfaces'] = interfaces.keys()
Expand All @@ -448,15 +450,6 @@ class LinuxNetwork(Network):
self.facts['all_ipv6_addresses'] = ips['all_ipv6_addresses']
return self.facts

def get_ip_path(self):
paths = ['/sbin/ip', '/usr/sbin/ip']
ip_path = None
for path in paths:
if os.path.exists(path):
ip_path = path
break
return ip_path

def get_default_interfaces(self, ip_path):
# Use the commands:
# ip -4 route get 8.8.8.8 -> Google public DNS
Expand Down Expand Up @@ -730,6 +723,7 @@ def run_setup(module):
return setup_result

def main():
global module
module = AnsibleModule(
argument_spec = dict()
)
Expand Down
17 changes: 4 additions & 13 deletions library/supervisorctl
Original file line number Diff line number Diff line change
Expand Up @@ -19,17 +19,8 @@
# along with Ansible. If not, see <http://www.gnu.org/licenses/>.
#

def _find_supervisorctl():
paths = ['/usr/local/bin', '/usr/bin']

for p in paths:
e = p + '/supervisorctl'
if os.path.exists(e):
return e


def _is_running(name):
rc, out, err = _run('%s status %s' % (_find_supervisorctl(), name))
def _is_running(name, supervisorctl):
rc, out, err = _run('%s status %s' % (supervisorctl, name))
return 'RUNNING' in out


Expand All @@ -52,12 +43,12 @@ def main():
name = module.params['name']
state = module.params['state']

SUPERVISORCTL = _find_supervisorctl()
SUPERVISORCTL = module.get_bin_path('supervisorctl', True)

if SUPERVISORCTL is None:
module.fail_json(msg='supervisorctl is not installed')

running = _is_running(name)
running = _is_running(name, SUPERVISORCTL)

if running and state == 'started':
module.exit_json(changed=False, name=name, state=state)
Expand Down
14 changes: 3 additions & 11 deletions library/user
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,8 @@ if os.path.exists('/etc/master.passwd'):
# invoke adduser in lieu of useradd, nor pw in lieu of usermod.
# That is, this won't work on FreeBSD.

def get_bin_path(module, arg):
if os.path.exists('/usr/sbin/%s' % arg):
return '/usr/sbin/%s' % arg
elif os.path.exists('/sbin/%s' % arg):
return '/sbin/%s' % arg
else:
module.fail_json(msg="Cannot find %s" % arg)

def user_del(module, user, **kwargs):
cmd = [get_bin_path(module, 'userdel')]
cmd = [module.get_bin_path('userdel', True)]
for key in kwargs:
if key == 'force' and kwargs[key] == 'yes':
cmd.append('-f')
Expand All @@ -57,7 +49,7 @@ def user_del(module, user, **kwargs):
return (rc, out, err)

def user_add(module, user, **kwargs):
cmd = [get_bin_path(module, 'useradd')]
cmd = [module.get_bin_path('useradd', True)]
for key in kwargs:
if key == 'uid' and kwargs[key] is not None:
cmd.append('-u')
Expand Down Expand Up @@ -104,7 +96,7 @@ Without spwd, we would have to resort to reading /etc/shadow
to get the encrypted string. For now, punt on idempotent password changes.
"""
def user_mod(module, user, **kwargs):
cmd = [get_bin_path(module, 'usermod')]
cmd = [module.get_bin_path('usermod', True)]
info = user_info(user)
for key in kwargs:
if key == 'uid':
Expand Down