From 0d425f1f9fd180563fcf773c5de1fae6021c4904 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Mon, 10 Feb 2014 19:36:18 -0500 Subject: [PATCH] Add cli support for 'show' confetty interactive mode can now do 'show' (aka read, retrieve, whatever) on more abritrary resources. --- bin/confetty | 35 ++++++++++++++++++++--------- confluent/httpapi.py | 2 +- confluent/messages.py | 26 ++++++++++++--------- plugins/configuration/attributes.py | 2 +- 4 files changed, 42 insertions(+), 23 deletions(-) diff --git a/bin/confetty b/bin/confetty index a9565432..711d39fc 100755 --- a/bin/confetty +++ b/bin/confetty @@ -100,18 +100,32 @@ def do_command(command, server): sys.exit(0) if argv[0] == "cd": otarget = target - target = fullpath_target(argv[1]) + target = fullpath_target(argv[1], forcepath=True) for res in send_request('retrieve', target, server): if 'error' in res: print target + ': ' + res['error'] target = otarget if argv[0] in ('show', 'ls'): - for res in send_request('retrieve', target, server): - if type(res['item']) == dict: - print res['item']["href"] - else: - for item in res['item']: - print item["href"] + if len(argv) > 1: + targpath = fullpath_target(argv[1]) + else: + targpath = target + for res in send_request('retrieve', targpath, server): + if 'item' in res: # a link relation + if type(res['item']) == dict: + print res['item']["href"] + else: + for item in res['item']: + print item["href"] + else: # generic attributes to list + for key in res.iterkeys(): + if 'value' in res[key]: + print "%s=%s" % (key, res[key]['value']) + else: + if 'isset' in res[key] and res[key]['isset']: + print "%s=********" % key + else: + print "%s=" % key if argv[0] == 'start': targpath = fullpath_target(argv[1]) currconsole = targpath @@ -126,7 +140,7 @@ def do_command(command, server): prompt() -def fullpath_target(path): +def fullpath_target(path, forcepath=False): global target pathcomponents = path.split("/") if pathcomponents[0] == "": # absolute path @@ -141,9 +155,10 @@ def fullpath_target(path): del targparts[-1] else: targparts.append(component) - targparts.append('') + if forcepath: + targparts.append('') ntarget = '/'.join(targparts) - if len(ntarget) ==0 or ntarget[-1] != '/': + if forcepath and (len(ntarget) == 0 or ntarget[-1] != '/'): ntarget += '/' return ntarget diff --git a/confluent/httpapi.py b/confluent/httpapi.py index 145250f0..debd4dd7 100644 --- a/confluent/httpapi.py +++ b/confluent/httpapi.py @@ -352,7 +352,7 @@ def _assemble_json(responses, resource, url): else: links[hk] = haldata[hk] else: - rsp = rsp.rawdata() + rsp = rsp.raw() for dk in rsp.iterkeys(): if dk in rspdata: if isinstance(rspdata[dk], list): diff --git a/confluent/messages.py b/confluent/messages.py index 06733ceb..3d5c80cd 100644 --- a/confluent/messages.py +++ b/confluent/messages.py @@ -19,7 +19,7 @@ class ConfluentMessage(object): jsonsnippet = json.dumps(self.kvpairs, separators=(',', ':'))[1:-1] return jsonsnippet - def rawdata(self): + def raw(self): """Return pythonic representation of the response. Used by httpapi while assembling data prior to json serialization""" @@ -34,7 +34,6 @@ class ConfluentMessage(object): for key in self.kvpairs.iterkeys(): val = self.kvpairs[key] value = self.defaultvalue - note = '' type = self.defaulttype try: desc = self.desc @@ -44,24 +43,26 @@ class ConfluentMessage(object): value = val['value'] if value is None: value = '' - if 'note' in val: - note = '(' + val['note'] + ')' + if value == '' and 'isset' in val and val['isset'] is True: + # an encrypted value, put some *** to show it is set + # in the explorer + value = '********' if isinstance(val, list): snippet += key + ":" for v in val: snippet += ('{4}' - ).format(type, key, v, desc, note) + ' "title="{3}">' + ).format(type, key, v, desc) snippet += ( - '{3}' + '' '').format(type, key, desc, note) + 'value="{1}">').format(type, key, desc) return snippet snippet += (key + ":" + '{4}' - ).format(type, key, value, desc, note) + ).format(type, key, value, desc) return snippet @@ -291,7 +292,10 @@ class CryptedAttributes(Attributes): self.desc = desc nkv = {} for key in kv.iterkeys(): - nkv[key] = {'note': 'Encrypted'} + if kv[key]['cryptvalue'] != '': + nkv[key] = {'isset': True} + else: + nkv[key] = {'isset': False} if node is None: self.kvpairs = nkv else: diff --git a/plugins/configuration/attributes.py b/plugins/configuration/attributes.py index abbe487d..59503a5b 100644 --- a/plugins/configuration/attributes.py +++ b/plugins/configuration/attributes.py @@ -30,7 +30,7 @@ def retrieve(nodes, element, configmanager, inputdata): {attribute: currattr['value']}) elif 'cryptvalue' in currattr: yield msg.CryptedAttributes(node, - {attribute: currattr['cryptvalue']}) + {attribute: currattr}) elif isinstance(currattr, list): yield msg.ListAttributes(node, {attribute: currattr})