diff options
Diffstat (limited to 'ipalib')
-rw-r--r-- | ipalib/__init__.py | 3 | ||||
-rw-r--r-- | ipalib/backend.py | 1 | ||||
-rw-r--r-- | ipalib/cli.py | 24 |
3 files changed, 23 insertions, 5 deletions
diff --git a/ipalib/__init__.py b/ipalib/__init__.py index 1efeeab4a..dd861a826 100644 --- a/ipalib/__init__.py +++ b/ipalib/__init__.py @@ -916,5 +916,8 @@ def create_api(mode='dummy'): api = create_api(mode=None) if os.environ.get('IPA_UNIT_TEST_MODE', None) == 'cli_test': + from cli import cli_plugins + for klass in cli_plugins: + api.register(klass) api.bootstrap(context='cli', in_server=False, in_tree=True) api.finalize() diff --git a/ipalib/backend.py b/ipalib/backend.py index 0232fa536..7be38ecc8 100644 --- a/ipalib/backend.py +++ b/ipalib/backend.py @@ -102,7 +102,6 @@ class Connectible(Backend): class Executioner(Backend): - def create_context(self, ccache=None, client_ip=None): """ client_ip: The IP address of the remote client. diff --git a/ipalib/cli.py b/ipalib/cli.py index f72cca587..8279345a9 100644 --- a/ipalib/cli.py +++ b/ipalib/cli.py @@ -123,7 +123,7 @@ class textui(backend.Backend): def __get_encoding(self, stream): assert stream in (sys.stdin, sys.stdout) - if stream.encoding is None: + if getattr(stream, 'encoding', None) is None: return 'UTF-8' return stream.encoding @@ -1007,7 +1007,11 @@ class cli(backend.Executioner): Backend plugin for executing from command line interface. """ - def run(self, argv): + def get_command(self, argv): + """Given CLI arguments, return the Command to use + + On incorrect invocation, prints out a help message and returns None + """ if len(argv) == 0: self.Command.help() return @@ -1022,15 +1026,27 @@ class cli(backend.Executioner): if name not in self.Command or self.Command[name].NO_CLI: raise CommandError(name=key) cmd = self.Command[name] - if not isinstance(cmd, frontend.Local): - self.create_context() + return cmd + + def argv_to_keyword_arguments(self, cmd, argv): + """Get the keyword arguments for a Command""" kw = self.parse(cmd, argv) if self.env.interactive: self.prompt_interactively(cmd, kw) kw = cmd.split_csv(**kw) kw['version'] = API_VERSION self.load_files(cmd, kw) + return kw + + def run(self, argv): + cmd = self.get_command(argv) + if cmd is None: + return + name = cmd.name + if not isinstance(cmd, frontend.Local): + self.create_context() try: + kw = self.argv_to_keyword_arguments(cmd, argv[1:]) result = self.execute(name, **kw) if callable(cmd.output_for_cli): for param in cmd.params(): |