diff --git a/v2/ansible/utils/cli.py b/v2/ansible/cli/__init__.py similarity index 83% rename from v2/ansible/utils/cli.py rename to v2/ansible/cli/__init__.py index 0cceab0196..e1ea576301 100644 --- a/v2/ansible/utils/cli.py +++ b/v2/ansible/cli/__init__.py @@ -31,9 +31,6 @@ from ansible import constants as C from ansible.errors import AnsibleError from ansible.utils.unicode import to_bytes -# FIXME: documentation for methods here, which have mostly been -# copied directly over from the old utils/__init__.py - class SortedOptParser(optparse.OptionParser): '''Optparser which sorts the options by opt before outputting --help''' @@ -92,6 +89,7 @@ class CLI(object): @staticmethod def ask_vault_passwords(ask_vault_pass=False, ask_new_vault_pass=False, confirm_vault=False, confirm_new=False): + ''' prompt for vault password and/or password change ''' vault_pass = None new_vault_pass = None @@ -122,6 +120,7 @@ class CLI(object): def ask_passwords(self): + ''' prompt for connection and become passwords if needed ''' op = self.options sshpass = None @@ -162,6 +161,7 @@ class CLI(object): def validate_conflicts(self): + ''' check for conflicting options ''' op = self.options @@ -186,7 +186,7 @@ class CLI(object): @staticmethod def base_parser(usage="", output_opts=False, runas_opts=False, meta_opts=False, async_opts=False, connect_opts=False, subset_opts=False, check_opts=False, diff_opts=False): - ''' create an options parser for any ansible script ''' + ''' create an options parser for most ansible scripts ''' parser = SortedOptParser(usage, version=CLI.version("%prog")) @@ -290,6 +290,7 @@ class CLI(object): @staticmethod def version(prog): + ''' return ansible version ''' result = "{0} {1}".format(prog, __version__) gitinfo = _gitinfo() if gitinfo: @@ -299,6 +300,7 @@ class CLI(object): @staticmethod def version_info(gitinfo=False): + ''' return full ansible version info ''' if gitinfo: # expensive call, user with care ansible_version_string = version('') @@ -322,61 +324,63 @@ class CLI(object): 'minor': ansible_versions[1], 'revision': ansible_versions[2]} -def _git_repo_info(repo_path): - ''' returns a string containing git branch, commit id and commit date ''' - result = None - if os.path.exists(repo_path): - # Check if the .git is a file. If it is a file, it means that we are in a submodule structure. - if os.path.isfile(repo_path): - try: - gitdir = yaml.safe_load(open(repo_path)).get('gitdir') - # There is a possibility the .git file to have an absolute path. - if os.path.isabs(gitdir): - repo_path = gitdir - else: - repo_path = os.path.join(repo_path[:-4], gitdir) - except (IOError, AttributeError): - return '' - f = open(os.path.join(repo_path, "HEAD")) - branch = f.readline().split('/')[-1].rstrip("\n") - f.close() - branch_path = os.path.join(repo_path, "refs", "heads", branch) - if os.path.exists(branch_path): - f = open(branch_path) - commit = f.readline()[:10] + @staticmethod + def _git_repo_info(repo_path): + ''' returns a string containing git branch, commit id and commit date ''' + result = None + if os.path.exists(repo_path): + # Check if the .git is a file. If it is a file, it means that we are in a submodule structure. + if os.path.isfile(repo_path): + try: + gitdir = yaml.safe_load(open(repo_path)).get('gitdir') + # There is a possibility the .git file to have an absolute path. + if os.path.isabs(gitdir): + repo_path = gitdir + else: + repo_path = os.path.join(repo_path[:-4], gitdir) + except (IOError, AttributeError): + return '' + f = open(os.path.join(repo_path, "HEAD")) + branch = f.readline().split('/')[-1].rstrip("\n") f.close() - else: - # detached HEAD - commit = branch[:10] - branch = 'detached HEAD' - branch_path = os.path.join(repo_path, "HEAD") + branch_path = os.path.join(repo_path, "refs", "heads", branch) + if os.path.exists(branch_path): + f = open(branch_path) + commit = f.readline()[:10] + f.close() + else: + # detached HEAD + commit = branch[:10] + branch = 'detached HEAD' + branch_path = os.path.join(repo_path, "HEAD") - date = time.localtime(os.stat(branch_path).st_mtime) - if time.daylight == 0: - offset = time.timezone + date = time.localtime(os.stat(branch_path).st_mtime) + if time.daylight == 0: + offset = time.timezone + else: + offset = time.altzone + result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, + time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36)) else: - offset = time.altzone - result = "({0} {1}) last updated {2} (GMT {3:+04d})".format(branch, commit, - time.strftime("%Y/%m/%d %H:%M:%S", date), int(offset / -36)) - else: - result = '' - return result + result = '' + return result -def _gitinfo(): - basedir = os.path.join(os.path.dirname(__file__), '..', '..', '..') - repo_path = os.path.join(basedir, '.git') - result = _git_repo_info(repo_path) - submodules = os.path.join(basedir, '.gitmodules') - if not os.path.exists(submodules): - return result - f = open(submodules) - for line in f: - tokens = line.strip().split(' ') - if tokens[0] == 'path': - submodule_path = tokens[2] - submodule_info =_git_repo_info(os.path.join(basedir, submodule_path, '.git')) - if not submodule_info: - submodule_info = ' not found - use git submodule update --init ' + submodule_path - result += "\n {0}: {1}".format(submodule_path, submodule_info) - f.close() - return result + @staticmethod + def _gitinfo(): + basedir = os.path.join(os.path.dirname(__file__), '..', '..', '..') + repo_path = os.path.join(basedir, '.git') + result = _git_repo_info(repo_path) + submodules = os.path.join(basedir, '.gitmodules') + if not os.path.exists(submodules): + return result + f = open(submodules) + for line in f: + tokens = line.strip().split(' ') + if tokens[0] == 'path': + submodule_path = tokens[2] + submodule_info =_git_repo_info(os.path.join(basedir, submodule_path, '.git')) + if not submodule_info: + submodule_info = ' not found - use git submodule update --init ' + submodule_path + result += "\n {0}: {1}".format(submodule_path, submodule_info) + f.close() + return result diff --git a/v2/bin/ansible b/v2/ansible/cli/adhoc.py old mode 100755 new mode 100644 similarity index 83% rename from v2/bin/ansible rename to v2/ansible/cli/adhoc.py index d08fd5ce5c..5b34acf13e --- a/v2/bin/ansible +++ b/v2/ansible/cli/adhoc.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - # (c) 2012, Michael DeHaan # # This file is part of Ansible @@ -18,18 +16,6 @@ # along with Ansible. If not, see . ######################################################## - -__requires__ = ['ansible'] -try: - import pkg_resources -except Exception: - # Use pkg_resources to find the correct versions of libraries and set - # sys.path appropriately when there are multiversion installs. But we - # have code that better expresses the errors in the places where the code - # is actually used (the deps are optional for many code paths) so we don't - # want to fail here. - pass - import os import sys @@ -47,7 +33,7 @@ from ansible.vars import VariableManager ######################################################## -class AdHocCli(CLI): +class AdHocCLI(CLI): ''' code behind ansible ad-hoc cli''' def parse(self): @@ -72,8 +58,7 @@ class AdHocCli(CLI): self.options, self.args = self.parser.parse_args() if len(self.args) != 1: - self.parser.print_help() - sys.exit(1) + raise AnsibleOptionsError("Missing target hosts") self.display.verbosity = self.options.verbosity self.validate_conflicts() @@ -141,10 +126,10 @@ class AdHocCli(CLI): play = Play().load(play_ds, variable_manager=variable_manager, loader=loader) # now create a task queue manager to execute the play + tqm = None try: tqm = TaskQueueManager( inventory=inventory, - callback='minimal', variable_manager=variable_manager, loader=loader, display=self.display, @@ -170,23 +155,3 @@ class AdHocCli(CLI): return poller.results - -######################################################## - -if __name__ == '__main__': - - display = Display() - try: - cli = AdHocCli(sys.argv, display=display) - cli.parse() - sys.exit(cli.run()) - except AnsibleOptionsError as e: - cli.parser.print_help() - display.display(str(e), stderr=True, color='red') - sys.exit(1) - except AnsibleError as e: - display.display(str(e), stderr=True, color='red') - sys.exit(2) - except KeyboardInterrupt: - display.error("interrupted") - sys.exit(4) diff --git a/v2/bin/ansible-galaxy b/v2/ansible/cli/galaxy.py old mode 100755 new mode 100644 similarity index 96% rename from v2/bin/ansible-galaxy rename to v2/ansible/cli/galaxy.py index 30b97535c9..76633162ed --- a/v2/bin/ansible-galaxy +++ b/v2/ansible/cli/galaxy.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - ######################################################################## # # (C) 2013, James Cammarata @@ -495,24 +493,3 @@ class GalaxyCLI(CLI): version = "(unknown version)" self.display.display("- %s, %s" % (path_file, version)) return 0 - -#------------------------------------------------------------------------------------- -# The main entry point -#------------------------------------------------------------------------------------- -if __name__ == '__main__': - - display = Display() - try: - cli = GalaxyCLI(sys.argv, display=display) - cli.parse() - sys.exit(cli.run()) - except AnsibleOptionsError as e: - cli.parser.print_help() - display.display(str(e), stderr=True, color='red') - sys.exit(1) - except AnsibleError as e: - display.display(str(e), stderr=True, color='red') - sys.exit(2) - except KeyboardInterrupt: - display.error("interrupted") - sys.exit(4) diff --git a/v2/bin/ansible-playbook b/v2/ansible/cli/playbook.py old mode 100755 new mode 100644 similarity index 88% rename from v2/bin/ansible-playbook rename to v2/ansible/cli/playbook.py index 724c3ce027..e7666682e3 --- a/v2/bin/ansible-playbook +++ b/v2/ansible/cli/playbook.py @@ -18,20 +18,6 @@ # along with Ansible. If not, see . ######################################################## -from __future__ import (absolute_import, division, print_function) -__metaclass__ = type - -__requires__ = ['ansible'] -try: - import pkg_resources -except Exception: - # Use pkg_resources to find the correct versions of libraries and set - # sys.path appropriately when there are multiversion installs. But we - # have code that better expresses the errors in the places where the code - # is actually used (the deps are optional for many code paths) so we don't - # want to fail here. - pass - import os import stat import sys @@ -191,24 +177,3 @@ class PlaybookCLI(CLI): return 0 else: return results - -######################################################## - -if __name__ == "__main__": - - display = Display() - try: - cli = PlaybookCLI(sys.argv, display=display) - cli.parse() - sys.exit(cli.run()) - except AnsibleOptionsError as e: - cli.parser.print_help() - display.display(str(e), stderr=True, color='red') - sys.exit(1) - except AnsibleError as e: - display.display(str(e), stderr=True, color='red') - sys.exit(2) - except KeyboardInterrupt: - display.error("interrupted") - sys.exit(4) - diff --git a/v2/bin/ansible-vault b/v2/ansible/cli/vault.py old mode 100755 new mode 100644 similarity index 80% rename from v2/bin/ansible-vault rename to v2/ansible/cli/vault.py index 0437eac409..62ec5a373b --- a/v2/bin/ansible-vault +++ b/v2/ansible/cli/vault.py @@ -1,5 +1,3 @@ -#!/usr/bin/env python - # (c) 2014, James Tanner # # Ansible is free software: you can redistribute it and/or modify @@ -18,17 +16,6 @@ # ansible-vault is a script that encrypts/decrypts YAML files. See # http://docs.ansible.com/playbooks_vault.html for more details. -__requires__ = ['ansible'] -try: - import pkg_resources -except Exception: - # Use pkg_resources to find the correct versions of libraries and set - # sys.path appropriately when there are multiversion installs. But we - # have code that better expresses the errors in the places where the code - # is actually used (the deps are optional for many code paths) so we don't - # want to fail here. - pass - import os import sys import traceback @@ -38,7 +25,7 @@ from ansible.parsing.vault import VaultEditor from ansible.utils.cli import CLI from ansible.utils.display import Display -class VaultCli(CLI): +class VaultCLI(CLI): """ Vault command line class """ VALID_ACTIONS = ("create", "decrypt", "edit", "encrypt", "rekey", "view") @@ -132,23 +119,3 @@ class VaultCli(CLI): this_editor.rekey_file(new_password) self.display.display("Rekey successful") - -######################################################## - -if __name__ == "__main__": - - display = Display() - try: - cli = VaultCli(sys.argv, display=display) - cli.parse() - sys.exit(cli.run()) - except AnsibleOptionsError as e: - cli.parser.print_help() - display.display(str(e), stderr=True, color='red') - sys.exit(1) - except AnsibleError as e: - display.display(str(e), stderr=True, color='red') - sys.exit(2) - except KeyboardInterrupt: - display.error("interrupted") - sys.exit(4)