diff --git a/confluent_client/bin/nodebmcpassword b/confluent_client/bin/nodebmcpassword new file mode 100755 index 00000000..f76b076c --- /dev/null +++ b/confluent_client/bin/nodebmcpassword @@ -0,0 +1,116 @@ +#!/usr/libexec/platform-python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2015-2017 Lenovo +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +__author__ = 'tkucherera' + +from getpass import getpass +import optparse +import os +import signal +import sys +try: + signal.signal(signal.SIGPIPE, signal.SIG_DFL) +except AttributeError: + pass + +path = os.path.dirname(os.path.realpath(__file__)) +path = os.path.realpath(os.path.join(path, '..', 'lib', 'python')) +if path.startswith('/opt'): + sys.path.append(path) + +import confluent.client as client + +argparser = optparse.OptionParser(usage="Usage: %prog ") +argparser.add_option('-m', '--maxnodes', type='int', + help='Number of nodes to affect before prompting for confirmation') +argparser.add_option('-p', '--prompt', action='store_true', + help='Prompt for password values interactively') +argparser.add_option('-e', '--environment', action='store_true', + help='Set passwod, but from environment variable of ' + 'same name') + + + +(options, args) = argparser.parse_args() + + +try: + noderange = args[0] + username = args[1] +except IndexError: + argparser.print_help() + sys.exit(1) + +client.check_globbing(noderange) +session = client.Command() +exitcode = 0 + +if options.prompt: + oneval = 1 + twoval = 2 + while oneval != twoval: + oneval = getpass('Enter pass for {0}: '.format(username)) + twoval = getpass('Confirm pass for {0}: '.format(username)) + if oneval != twoval: + print('Values did not match.') + new_password = twoval + +elif len(args) == 3: + if options.environment: + key = args[2] + new_password = os.environ.get(key, os.environ[key.upper()]) + else: + new_password = args[2] +else: + argparser.print_help() + sys.exit(1) + +errorNodes = set([]) +uid_dict = {} +session.stop_if_noderange_over(noderange, options.maxnodes) + +for rsp in session.read('/noderange/{0}/configuration/management_controller/users/all'.format(noderange)): + databynode = rsp["databynode"] + for node in databynode: + if 'error' in rsp['databynode'][node]: + print(node, ':', rsp['databynode'][node]['error']) + continue + for user in rsp['databynode'][node]['users']: + if user['username'] == username: + if not user['uid'] in uid_dict: + uid_dict[user['uid']] = node + continue + uid_dict[user['uid']] = uid_dict[user['uid']] + ',{}'.format(node) + break + +for uid in uid_dict: + success = session.simple_noderange_command(uid_dict[uid], 'configuration/management_controller/users/{0}'.format(uid), new_password, key='password', errnodes=errorNodes) # = 0 if successful + +allNodes = set([]) + +for node in session.read('/noderange/{0}/nodes/'.format(noderange)): + if 'error' in node and success != 0: + sys.exit(success) + allNodes.add(node['item']['href'].replace("/", "")) + +goodNodes = allNodes - errorNodes + +for node in goodNodes: + print(node + ": Password Change Successful") + + +sys.exit(success) \ No newline at end of file diff --git a/confluent_client/doc/man/nodebmcpassword.ronn b/confluent_client/doc/man/nodebmcpassword.ronn new file mode 100644 index 00000000..5927f670 --- /dev/null +++ b/confluent_client/doc/man/nodebmcpassword.ronn @@ -0,0 +1,28 @@ +nodebmcpassword(8) -- Change management controller password for a specified user +========================================================= + +## SYNOPSIS + +`nodebmcpassword ` + +## DESCRIPTION + +`nodebmcpassword` allows you to change the management controller password for a user on a specified noderange + +## OPTIONS + +* `-m MAXNODES`, `--maxnodes=MAXNODES`: + Number of nodes to affect before prompting for + confirmation + +* `-h`, `--help`: + Show help message and exit + +## EXAMPLES: + +* Reset the management controller for nodes n1 through n4: + `# nodebmcreset n1-n4` + `n1: Password Change Successful` + `n2: Password Change Successful` + `n3: Password Change Successful` + `n4: Password Change Successful` \ No newline at end of file