From b714cfdf0f3d9baf55bd7f5ad516a2967a064212 Mon Sep 17 00:00:00 2001 From: Allen Lin37 Date: Tue, 28 Feb 2017 13:27:22 -0500 Subject: [PATCH] Adding nodeattrib to change and update node attributes --- confluent_client/bin/nodeattrib | 58 +++++++++++------- confluent_client/doc/man/nodeattrib.ronn | 76 ++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 20 deletions(-) create mode 100644 confluent_client/doc/man/nodeattrib.ronn diff --git a/confluent_client/bin/nodeattrib b/confluent_client/bin/nodeattrib index 8874a472..2ae05aa1 100644 --- a/confluent_client/bin/nodeattrib +++ b/confluent_client/bin/nodeattrib @@ -28,7 +28,6 @@ if path.startswith('/opt'): import confluent.client as client - def attrrequested(attr, attrlist, seenattributes): for candidate in attrlist: truename = candidate @@ -42,10 +41,13 @@ def attrrequested(attr, attrlist, seenattributes): return True return False argparser = optparse.OptionParser( - usage='''Usage: %prog [options] noderange [list of attributes]\n \ - %prog [options] noderange attribute1=value1,attribute2=value,... ''') + usage='''\n %prog [options] noderange [list of attributes] \ + \n %prog [options] noderange attribute1=value1,attribute2=value,... + \n ''') argparser.add_option('-b', '--blame', action='store_true', help='Show information about how attributes inherited') +argparser.add_option('-c', '--clear', action='store_true', + help='Clear variables') (options, args) = argparser.parse_args() showtype = 'current' @@ -58,27 +60,43 @@ except IndexError: session = client.Command() exitcode = 0 + +#Sets attributes if len(args) > 1: - if args[1] == 'all': - showtype = 'all' - elif args[1] == 'current': - showtype = 'current' - elif "=" in args[1]: - try: - if len(args[1:]) > 1: - for val in args[1:].split(','): - val = val.split('=') - exitcode=session.simple_noderange_command(noderange, 'attributes/all'.format(noderange), val[1], val[0]) - else: - val=args[1].split('=') - exitcode=session.simple_noderange_command(noderange, 'attributes/all'.format(noderange),val[1],val[0]) - except: - sys.stderr.write('Error: {0} not a valid expression\n'.format(str (args[1:]))) - exitcode = 1 + #clears attribute + if options.clear: + targpath = '/noderange/{0}/attributes/all'.format(noderange) + keydata = {} + for attrib in args[1:]: + keydata[attrib] = None + for res in session.update(targpath, keydata): + if 'error' in res: + if 'errorcode' in res: + exitcode = res['errorcode'] + sys.stderr.write('Error: ' + res['error'] + '\n') sys.exit(exitcode) else: - requestargs = args[1:] + if args[1] == 'all': + showtype = 'all' + elif args[1] == 'current': + showtype = 'current' + elif "=" in args[1]: + try: + if len(args[1:]) > 1: + for val in args[1:]: + val = val.split('=') + exitcode=session.simple_noderange_command(noderange, 'attributes/all'.format(noderange), val[1], val[0]) + else: + val=args[1].split('=') + exitcode=session.simple_noderange_command(noderange, 'attributes/all'.format(noderange),val[1],val[0]) + except: + sys.stderr.write('Error: {0} not a valid expression\n'.format(str (args[1:]))) + exitcode = 1 + sys.exit(exitcode) + else: + requestargs = args[1:] +# Lists all attributes if len(args) > 0: seenattributes = set([]) for res in session.read('/noderange/{0}/attributes/{1}'.format(noderange,showtype)): diff --git a/confluent_client/doc/man/nodeattrib.ronn b/confluent_client/doc/man/nodeattrib.ronn new file mode 100644 index 00000000..63ecf145 --- /dev/null +++ b/confluent_client/doc/man/nodeattrib.ronn @@ -0,0 +1,76 @@ +nodeattrib(1) -- List or change confluent nodes attributes +========================================================= + +## SYNOPSIS + +`nodeattrib` `noderange` [ current | all ] +`nodeattrib` `noderange` [-b] [...] +`nodeattrib` `noderange` [ ...] +`nodeattrib` `noderange` [-c] [ ...] + +## DESCRIPTION + +**nodeattrib** queries the confluent server to get information about nodes. In +the simplest form, it simply takes the given noderange(5) and lists the +matching nodes, one line at a time. + +If a list of node attribute names are given, the value of those are also +displayed. If `-b` is specified, it will also display information on +how inherited and expression based attributes are defined. There is more +information on node attributes in nodeattributes(5) man page. +If `-c` is specified, this will set the nodeattribute to a null valid. +This is different from setting the value to an empty string. + +## OPTIONS + +* `-b`, `--blame`: + Annotate inherited and expression based attributes to show their base value. +* `-c`, `--clear`: + Clear given nodeattributes since '' is not the same as empty + +## EXAMPLES +* Listing matching nodes of a simple noderange: + `# nodeattrib n1-n2` + `n1`: console.method: ipmi + `n1`: hardwaremanagement.manager: 172.30.3.1 + `n2`: console.method: ipmi + `n2`: hardwaremanagement.manager: 172.30.3.2 + +* Getting an attribute of nodes matching a noderange: + `# nodeattrib n1,n2 hardwaremanagement.manager` + `n1: hardwaremanagement.manager: 172.30.3.1` + `n2: hardwaremanagement.manager: 172.30.3.2` + +* Getting a group of attributes while determining what group defines them: + `# nodeattrib n1,n2 hardwaremanagement --blame` + `n1: hardwaremanagement.manager: 172.30.3.1` + `n1: hardwaremanagement.method: ipmi (inherited from group everything)` + `n1: hardwaremanagement.switch: r8e1` + `n1: hardwaremanagement.switchport: 14` + `n2: hardwaremanagement.manager: 172.30.3.2` + `n2: hardwaremanagement.method: ipmi (inherited from group everything)` + `n2: hardwaremanagement.switch: r8e1` + `n2: hardwaremanagement.switchport: 2` + + * Listing matching nodes of a simple noderange that are set: + `# nodeattrib n1-n2 current` + `n1`: console.method: ipmi + `n1`: hardwaremanagement.manager: 172.30.3.1 + `n2`: console.method: ipmi + `n2`: hardwaremanagement.manager: 172.30.3.2 + + * Change attribute on nodes of a simple noderange: + `# nodeattrib n1-n2 console.method=serial` + `n1`: console.method: serial + `n1`: hardwaremanagement.manager: 172.30.3.1 + `n2`: console.method: serial + `n2`: hardwaremanagement.manager: 172.30.3.2 + + * Clear attribute on nodes of a simple noderange: + `# nodeattrib n1-n2 -c console.method` + `n1`: console.method: + `n1`: hardwaremanagement.manager: 172.30.3.1 + `n2`: console.method: + `n2`: hardwaremanagement.manager: 172.30.3.2 + +