diff --git a/confluent_client/bin/nodebmcpassword b/confluent_client/bin/nodebmcpassword new file mode 100755 index 00000000..ccaebac4 --- /dev/null +++ b/confluent_client/bin/nodebmcpassword @@ -0,0 +1,91 @@ +#!/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' + +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') + + + +(options, args) = argparser.parse_args() +try: + noderange = args[0] + username = args[1] + new_password = args[2] +except IndexError: + argparser.print_help() + sys.exit(1) +client.check_globbing(noderange) +session = client.Command() +exitcode = 0 + + + +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