bin/ansible
01e51b12
 #!/usr/bin/env python
145a024d
 
be4cb64c
 # (c) 2012, Michael DeHaan <michael.dehaan@gmail.com>
9681e1fa
 #
be4cb64c
 # This file is part of Ansible
9681e1fa
 #
be4cb64c
 # Ansible is free software: you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 # the Free Software Foundation, either version 3 of the License, or
 # (at your option) any later version.
9681e1fa
 #
be4cb64c
 # Ansible is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 # GNU General Public License for more details.
 #
 # You should have received a copy of the GNU General Public License
 # along with Ansible.  If not, see <http://www.gnu.org/licenses/>.
9681e1fa
 
bf967adf
 ########################################################
f34b55ac
 from __future__ import (absolute_import, division, print_function)
ce3ef7f4
 __metaclass__ = type
bf967adf
 
fbadcfd4
 __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
 
35def422
 import os
1427ade3
 import sys
6d50a261
 import traceback
fde7de80
 
b85ce388
 from ansible.errors import AnsibleError, AnsibleOptionsError, AnsibleParserError
ce3ef7f4
 from ansible.utils.display import Display
de792ba3
 from ansible.utils.unicode import to_unicode
281f96b8
 
6eaf9b9f
 
f42b6237
 ########################################
 ### OUTPUT OF LAST RESORT ###
 class LastResort(object):
6d50a261
     def display(self, msg):
f42b6237
         print(msg, file=sys.stderr)
 
e49575ff
     def error(self, msg, wrap_text=None):
         print(msg, file=sys.stderr)
 
6d50a261
 
f42b6237
 ########################################
bf967adf
 
281f96b8
 if __name__ == '__main__':
aa552685
 
f42b6237
     display = LastResort()
ce3ef7f4
     cli = None
fdeca372
     me = os.path.basename(sys.argv[0])
ce3ef7f4
 
dfd2c6dc
     try:
6a75125f
         display = Display()
c8e6461d
         display.debug("starting run")
6a75125f
 
d0a22a7b
         sub = None
56a2412d
         try:
d0a22a7b
             if me.find('-') != -1:
                 target = me.split('-')
                 if len(target) > 1:
                     sub = target[1]
                     myclass = "%sCLI" % sub.capitalize()
                     mycli = getattr(__import__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass)
             elif me == 'ansible':
                 from ansible.cli.adhoc import AdHocCLI as mycli
10fd717a
             else:
                 raise AnsibleError("Unknown Ansible alias: %s" % me)
         except ImportError as e:
             if e.message.endswith(' %s' % sub):
                 raise AnsibleError("Ansible sub-program not implemented: %s" % me)
             else:
                 raise
 
318bfbb2
         cli = mycli(sys.argv)
56a2412d
         cli.parse()
         sys.exit(cli.run())
4ae98ed9
 
ce3ef7f4
     except AnsibleOptionsError as e:
         cli.parser.print_help()
de792ba3
         display.error(to_unicode(e), wrap_text=False)
b85ce388
         sys.exit(5)
     except AnsibleParserError as e:
de792ba3
         display.error(to_unicode(e), wrap_text=False)
b85ce388
         sys.exit(4)
 # TQM takes care of these, but leaving comment to reserve the exit codes
 #    except AnsibleHostUnreachable as e:
f42b6237
 #        display.error(str(e))
b85ce388
 #        sys.exit(3)
 #    except AnsibleHostFailed as e:
f42b6237
 #        display.error(str(e))
b85ce388
 #        sys.exit(2)
ce3ef7f4
     except AnsibleError as e:
de792ba3
         display.error(to_unicode(e), wrap_text=False)
b85ce388
         sys.exit(1)
ce3ef7f4
     except KeyboardInterrupt:
f42b6237
         display.error("User interrupted execution")
b85ce388
         sys.exit(99)
f42b6237
     except Exception as e:
6d50a261
         have_cli_options = cli is not None and cli.options is not None
de792ba3
         display.error("Unexpected Exception: %s" % to_unicode(e), wrap_text=False)
a5e6845c
         if not have_cli_options or have_cli_options and cli.options.verbosity > 2:
6eaf9b9f
             display.display(u"the full traceback was:\n\n%s" % to_unicode(traceback.format_exc()))
6d50a261
         else:
             display.display("to see the full traceback, use -vvv")
a5e6845c
         sys.exit(250)