summaryrefslogtreecommitdiffstats
path: root/ipalib
diff options
context:
space:
mode:
Diffstat (limited to 'ipalib')
-rw-r--r--ipalib/__init__.py3
-rw-r--r--ipalib/backend.py1
-rw-r--r--ipalib/cli.py24
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():