From 894290f577cf450a9e702d8af8f6cffa96558ede Mon Sep 17 00:00:00 2001 From: tkucherera Date: Wed, 3 Apr 2024 18:46:37 -0400 Subject: [PATCH 1/3] nodebmcpassword --- confluent_client/bin/nodebmcpassword | 91 ++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100755 confluent_client/bin/nodebmcpassword 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 From 272c456435a4b3a3545298a508593cc38cdfb19a Mon Sep 17 00:00:00 2001 From: tkucherera Date: Wed, 3 Apr 2024 18:50:46 -0400 Subject: [PATCH 2/3] nodebmcpassword man page --- confluent_client/doc/man/nodebmcpassword.ronn | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 confluent_client/doc/man/nodebmcpassword.ronn 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 From 8f01f22bb5cae398cffd6d631232485c6993c409 Mon Sep 17 00:00:00 2001 From: tkucherera Date: Wed, 24 Apr 2024 10:00:49 -0400 Subject: [PATCH 3/3] add password prompting and env var --- confluent_client/bin/nodebmcpassword | 31 +++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/confluent_client/bin/nodebmcpassword b/confluent_client/bin/nodebmcpassword index ccaebac4..f76b076c 100755 --- a/confluent_client/bin/nodebmcpassword +++ b/confluent_client/bin/nodebmcpassword @@ -17,6 +17,7 @@ __author__ = 'tkucherera' +from getpass import getpass import optparse import os import signal @@ -36,25 +37,49 @@ 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] - new_password = args[2] 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)