From 02791418bc88c82cdaf5bc458adaf8797a897e70 Mon Sep 17 00:00:00 2001 From: Jarrod Johnson Date: Thu, 2 Oct 2025 15:45:48 -0400 Subject: [PATCH] Support attribute expansion in filenames For nodemedia, nodelicense, and nodefirmware, support for expressions in filenames was fouled when pass by filehandle was added. Restore this by adding all the files matching an expression. --- confluent_client/bin/nodefirmware | 25 ++++++++++++++++------ confluent_client/bin/nodelicense | 26 +++++++++++++++++------ confluent_client/bin/nodemedia | 35 ++++++++++++++++++++++--------- 3 files changed, 64 insertions(+), 22 deletions(-) diff --git a/confluent_client/bin/nodefirmware b/confluent_client/bin/nodefirmware index 98ddc50a..9ac6acdf 100755 --- a/confluent_client/bin/nodefirmware +++ b/confluent_client/bin/nodefirmware @@ -1,4 +1,4 @@ -#!/usr/bin/python2 +#!/usr/bin/python3 # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2016-2017 Lenovo @@ -114,11 +114,24 @@ def update_firmware(session, filename): upargs['bank'] = 'backup' noderrs = {} if session.unixdomain: - of = open(filename, 'rb') - try: - session.add_file(filename, of.fileno(), 'rb') - except Exception: - pass + filesbynode = {} + for exp in session.create('/noderange/{0}/attributes/expression'.format(noderange), + {'expression': filename}): + if 'error' in exp: + sys.stderr.write(exp['error'] + '\n') + exitcode |= exp.get('errorcode', 1) + ex = exp.get('databynode', ()) + for node in ex: + filesbynode[node] = ex[node]['value'] + if not isinstance(filesbynode[node], bytes) and not isinstance(filesbynode[node], str): + filesbynode[node] = filesbynode[node].encode('utf-8') + for node in filesbynode: + endfilename = filesbynode[node] + of = open(endfilename, 'rb') + try: + session.add_file(endfilename, of.fileno(), 'rb') + except Exception: + pass for res in session.create(resource, upargs): if 'created' not in res: for nodename in res.get('databynode', ()): diff --git a/confluent_client/bin/nodelicense b/confluent_client/bin/nodelicense index 6478d011..b13140da 100755 --- a/confluent_client/bin/nodelicense +++ b/confluent_client/bin/nodelicense @@ -1,4 +1,4 @@ -#!/usr/bin/python2 +#!/usr/bin/python3 # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2019 Lenovo @@ -65,16 +65,30 @@ client.check_globbing(noderange) def install_license(session, filename): global exitcode + resource = '/noderange/{0}/configuration/' \ 'management_controller/licenses/'.format(noderange) filename = os.path.abspath(filename) instargs = {'filename': filename} if session.unixdomain: - of = open(filename, 'rb') - try: - session.add_file(filename, of.fileno(), 'rb') - except Exception: - pass + filesbynode = {} + for exp in session.create('/noderange/{0}/attributes/expression'.format(noderange), + {'expression': filename}): + if 'error' in exp: + sys.stderr.write(exp['error'] + '\n') + exitcode |= exp.get('errorcode', 1) + ex = exp.get('databynode', ()) + for node in ex: + filesbynode[node] = ex[node]['value'] + if not isinstance(filesbynode[node], bytes) and not isinstance(filesbynode[node], str): + filesbynode[node] = filesbynode[node].encode('utf-8') + for node in filesbynode: + endfilename = filesbynode[node] + of = open(endfilename, 'rb') + try: + session.add_file(endfilename, of.fileno(), 'rb') + except Exception: + pass for res in session.create(resource, instargs): for node in res.get('databynode', []): if 'error' in res['databynode'][node]: diff --git a/confluent_client/bin/nodemedia b/confluent_client/bin/nodemedia index 74be65e5..b2130e46 100644 --- a/confluent_client/bin/nodemedia +++ b/confluent_client/bin/nodemedia @@ -1,4 +1,4 @@ -#!/usr/bin/python2 +#!/usr/bin/python3 # vim: tabstop=4 shiftwidth=4 softtabstop=4 # Copyright 2018 Lenovo @@ -101,22 +101,37 @@ def detach_media(noderange, media): def upload_media(noderange, media): global exitcode - if not os.path.exists(media): - sys.stderr.write('Unable to locate requested file {0}\n'.format( - media)) - sys.exit(404) + session = client.Command() output = sq.ScreenPrinter(noderange, session) filename = os.path.abspath(media) resource = '/noderange/{0}/media/uploads/'.format(noderange) + filename = os.path.abspath(filename) upargs = {'filename': filename} noderrs = {} if session.unixdomain: - of = open(filename, 'rb') - try: - session.add_file(filename, of.fileno(), 'rb') - except Exception: - pass + filesbynode = {} + for exp in session.create('/noderange/{0}/attributes/expression'.format(noderange), + {'expression': filename}): + if 'error' in exp: + sys.stderr.write(exp['error'] + '\n') + exitcode |= exp.get('errorcode', 1) + ex = exp.get('databynode', ()) + for node in ex: + filesbynode[node] = ex[node]['value'] + if not isinstance(filesbynode[node], bytes) and not isinstance(filesbynode[node], str): + filesbynode[node] = filesbynode[node].encode('utf-8') + for node in filesbynode: + endfilename = filesbynode[node] + if not os.path.exists(endfilename): + sys.stderr.write('Unable to locate requested file {0}\n'.format( + endfilename)) + sys.exit(404) + of = open(endfilename, 'rb') + try: + session.add_file(endfilename, of.fileno(), 'rb') + except Exception: + pass nodeurls = {} for res in session.create(resource, upargs): if 'created' not in res: