mirror of
https://github.com/xcat2/confluent.git
synced 2026-08-26 08:36:43 +00:00
644843b892
Entirely mechanical, produced by `ruff check --fix --select F401,F541,E713` and reviewed rather than taken on faith: deleting an import is only safe if nothing imports it for its side effects or re-exports it. None of the 19 removed names is referenced anywhere in its file, none appears in any string literal, and none of the touched files uses eval, exec, globals() or __import__, so there is no dynamic lookup that could reach them.
121 lines
3.7 KiB
Plaintext
Executable File
121 lines
3.7 KiB
Plaintext
Executable File
#!/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 <noderange> <username> <new_password>")
|
|
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 password, 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'])
|
|
errorNodes.add(node)
|
|
continue
|
|
for user in rsp['databynode'][node]['users']:
|
|
if user['username'] == username:
|
|
if user['uid'] not in uid_dict:
|
|
uid_dict[user['uid']] = node
|
|
continue
|
|
uid_dict[user['uid']] = uid_dict[user['uid']] + ',{}'.format(node)
|
|
break
|
|
|
|
if not uid_dict:
|
|
print("Error: Could not reach target node's bmc user")
|
|
sys.exit(1)
|
|
|
|
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) |