pyghmi 1.6.2__py3-none-any.whl → 1.6.4__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pyghmi/ipmi/private/session.py +4 -0
- pyghmi/redfish/command.py +6 -3
- pyghmi/redfish/oem/generic.py +37 -21
- pyghmi/redfish/oem/lenovo/smm3.py +32 -0
- pyghmi/redfish/oem/lenovo/xcc3.py +34 -7
- pyghmi/util/webclient.py +18 -11
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/METADATA +1 -1
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/RECORD +14 -14
- pyghmi-1.6.4.dist-info/pbr.json +1 -0
- pyghmi-1.6.2.dist-info/pbr.json +0 -1
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/AUTHORS +0 -0
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/LICENSE +0 -0
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/WHEEL +0 -0
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/entry_points.txt +0 -0
- {pyghmi-1.6.2.dist-info → pyghmi-1.6.4.dist-info}/top_level.txt +0 -0
pyghmi/ipmi/private/session.py
CHANGED
@@ -375,6 +375,10 @@ class Session(object):
|
|
375
375
|
tmpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
376
376
|
else:
|
377
377
|
tmpsocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
|
378
|
+
try:
|
379
|
+
tmpsocket.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 16777216)
|
380
|
+
except Exception:
|
381
|
+
pass
|
378
382
|
if server is None:
|
379
383
|
# Rather than wait until send() to bind, bind now so that we have
|
380
384
|
# a port number allocated no matter what
|
pyghmi/redfish/command.py
CHANGED
@@ -415,8 +415,11 @@ class Command(object):
|
|
415
415
|
Operator, and ReadOnly
|
416
416
|
"""
|
417
417
|
accinfo = self._account_url_info_by_id(uid)
|
418
|
-
if
|
419
|
-
|
418
|
+
if accinfo:
|
419
|
+
method = 'PATCH'
|
420
|
+
else:
|
421
|
+
accinfo = (self._accountserviceurl + '/Accounts', {})
|
422
|
+
method = 'POST'
|
420
423
|
if privilege_level.startswith('custom.'):
|
421
424
|
privilege_level = privilege_level.replace('custom.', '')
|
422
425
|
for role in self._validroles:
|
@@ -429,7 +432,7 @@ class Command(object):
|
|
429
432
|
"Password": password,
|
430
433
|
"RoleId": privilege_level,
|
431
434
|
}
|
432
|
-
self._do_web_request(accinfo[0], userinfo, method=
|
435
|
+
self._do_web_request(accinfo[0], userinfo, method=method, etag=etag)
|
433
436
|
return True
|
434
437
|
|
435
438
|
def get_screenshot(self, outfile):
|
pyghmi/redfish/oem/generic.py
CHANGED
@@ -21,6 +21,7 @@ import re
|
|
21
21
|
from datetime import datetime
|
22
22
|
from datetime import timedelta
|
23
23
|
from dateutil import tz
|
24
|
+
import socket
|
24
25
|
import time
|
25
26
|
|
26
27
|
import pyghmi.constants as const
|
@@ -1065,22 +1066,7 @@ class OEMHandler(object):
|
|
1065
1066
|
|
1066
1067
|
def update_firmware(self, filename, data=None, progress=None, bank=None, otherfields=()):
|
1067
1068
|
# disable cache to make sure we trigger the token renewal logic if needed
|
1068
|
-
usd = self.
|
1069
|
-
upurl = usd.get('MultipartHttpPushUri', None)
|
1070
|
-
ismultipart = True
|
1071
|
-
if not upurl:
|
1072
|
-
ismultipart = False
|
1073
|
-
if usd.get('HttpPushUriTargetsBusy', False):
|
1074
|
-
raise exc.TemporaryError('Cannot run multtiple updates to '
|
1075
|
-
'same target concurrently')
|
1076
|
-
try:
|
1077
|
-
upurl = usd['HttpPushUri']
|
1078
|
-
except KeyError:
|
1079
|
-
raise exc.UnsupportedFunctionality('Redfish firmware update only supported for implementations with push update support')
|
1080
|
-
if 'HttpPushUriTargetsBusy' in usd:
|
1081
|
-
self._do_web_request(
|
1082
|
-
'/redfish/v1/UpdateService',
|
1083
|
-
{'HttpPushUriTargetsBusy': True}, method='PATCH')
|
1069
|
+
usd, upurl, ismultipart = self.retrieve_firmware_upload_url()
|
1084
1070
|
try:
|
1085
1071
|
uploadthread = webclient.FileUploader(
|
1086
1072
|
self.webclient, upurl, filename, data, formwrap=ismultipart,
|
@@ -1105,8 +1091,19 @@ class OEMHandler(object):
|
|
1105
1091
|
except Exception:
|
1106
1092
|
raise Exception(uploadthread.rsp)
|
1107
1093
|
raise Exception(errmsg)
|
1094
|
+
return self.continue_update(uploadthread, progress)
|
1095
|
+
finally:
|
1096
|
+
if 'HttpPushUriTargetsBusy' in usd:
|
1097
|
+
self._do_web_request(
|
1098
|
+
'/redfish/v1/UpdateService',
|
1099
|
+
{'HttpPushUriTargetsBusy': False}, method='PATCH')
|
1100
|
+
|
1101
|
+
def continue_update(self, uploadthread, progress):
|
1108
1102
|
rsp = json.loads(uploadthread.rsp)
|
1109
1103
|
monitorurl = rsp['@odata.id']
|
1104
|
+
return self.monitor_update_progress(monitorurl, progress)
|
1105
|
+
|
1106
|
+
def monitor_update_progress(self, monitorurl, progress):
|
1110
1107
|
complete = False
|
1111
1108
|
phase = "apply"
|
1112
1109
|
statetype = 'TaskState'
|
@@ -1151,11 +1148,26 @@ class OEMHandler(object):
|
|
1151
1148
|
if not retry:
|
1152
1149
|
raise Exception('Falied to monitor update progress due to excessive timeouts')
|
1153
1150
|
return 'pending'
|
1154
|
-
|
1151
|
+
|
1152
|
+
|
1153
|
+
def retrieve_firmware_upload_url(self):
|
1154
|
+
usd = self._do_web_request('/redfish/v1/UpdateService', cache=False)
|
1155
|
+
upurl = usd.get('MultipartHttpPushUri', None)
|
1156
|
+
ismultipart = True
|
1157
|
+
if not upurl:
|
1158
|
+
ismultipart = False
|
1159
|
+
if usd.get('HttpPushUriTargetsBusy', False):
|
1160
|
+
raise exc.TemporaryError('Cannot run multtiple updates to '
|
1161
|
+
'same target concurrently')
|
1162
|
+
try:
|
1163
|
+
upurl = usd['HttpPushUri']
|
1164
|
+
except KeyError:
|
1165
|
+
raise exc.UnsupportedFunctionality('Redfish firmware update only supported for implementations with push update support')
|
1155
1166
|
if 'HttpPushUriTargetsBusy' in usd:
|
1156
|
-
self._do_web_request(
|
1157
|
-
'
|
1158
|
-
|
1167
|
+
self._do_web_request('/redfish/v1/UpdateService',
|
1168
|
+
{'HttpPushUriTargetsBusy': True}, method='PATCH')
|
1169
|
+
|
1170
|
+
return usd,upurl,ismultipart
|
1159
1171
|
|
1160
1172
|
|
1161
1173
|
def _do_bulk_requests(self, urls, cache=True):
|
@@ -1191,17 +1203,21 @@ class OEMHandler(object):
|
|
1191
1203
|
wc.stdheaders['X-Auth-Token'] = self.xauthtoken
|
1192
1204
|
self.webclient.stdheaders['X-Auth-Token'] = self.xauthtoken
|
1193
1205
|
|
1194
|
-
def _do_web_request(self, url, payload=None, method=None, cache=True):
|
1206
|
+
def _do_web_request(self, url, payload=None, method=None, cache=True, etag=None):
|
1195
1207
|
res = None
|
1196
1208
|
if cache and payload is None and method is None:
|
1197
1209
|
res = self._get_cache(url)
|
1198
1210
|
if res:
|
1199
1211
|
return res
|
1200
1212
|
wc = self.webclient.dupe()
|
1213
|
+
if etag:
|
1214
|
+
wc.stdheaders['If-Match'] = etag
|
1201
1215
|
res = wc.grab_json_response_with_status(url, payload, method=method)
|
1202
1216
|
if res[1] == 401 and 'X-Auth-Token' in self.webclient.stdheaders:
|
1203
1217
|
wc.set_basic_credentials(self.username, self.password)
|
1204
1218
|
self._get_session_token(wc)
|
1219
|
+
if etag:
|
1220
|
+
wc.stdheaders['If-Match'] = etag
|
1205
1221
|
res = wc.grab_json_response_with_status(url, payload,
|
1206
1222
|
method=method)
|
1207
1223
|
if res[1] < 200 or res[1] >= 300:
|
@@ -19,6 +19,7 @@ import pyghmi.constants as pygconst
|
|
19
19
|
import pyghmi.util.webclient as webclient
|
20
20
|
import pyghmi.exceptions as exc
|
21
21
|
import time
|
22
|
+
import socket
|
22
23
|
|
23
24
|
healthlookup = {
|
24
25
|
'ok': pygconst.Health.Ok,
|
@@ -78,6 +79,37 @@ class OEMHandler(generic.OEMHandler):
|
|
78
79
|
def get_system_configuration(self, hideadvanced=True, fishclient=None):
|
79
80
|
return {}
|
80
81
|
|
82
|
+
def retrieve_firmware_upload_url(self):
|
83
|
+
# SMMv3 needs to do the non-multipart upload
|
84
|
+
usd = self._do_web_request('/redfish/v1/UpdateService', cache=False)
|
85
|
+
if usd.get('HttpPushUriTargetsBusy', False):
|
86
|
+
raise exc.TemporaryError('Cannot run multtiple updates to '
|
87
|
+
'same target concurrently')
|
88
|
+
try:
|
89
|
+
upurl = usd['HttpPushUri']
|
90
|
+
except KeyError:
|
91
|
+
raise exc.UnsupportedFunctionality('Redfish firmware update only supported for implementations with push update support')
|
92
|
+
if 'HttpPushUriTargetsBusy' in usd:
|
93
|
+
self._do_web_request(
|
94
|
+
'/redfish/v1/UpdateService',
|
95
|
+
{'HttpPushUriTargetsBusy': True}, method='PATCH')
|
96
|
+
return usd,upurl,False
|
97
|
+
|
98
|
+
def continue_update(self, uploadthread, progress):
|
99
|
+
# SMMv3 does not provide a response, must hardcode the continuation
|
100
|
+
# /redfish/v1/UpdateService/FirmwareInventory/fwuimage
|
101
|
+
rsp = self._do_web_request('/redfish/v1/UpdateService/FirmwareInventory/fwuimage')
|
102
|
+
for ri in rsp.get('RelatedItem', []):
|
103
|
+
targ = ri.get('@odata.id', None)
|
104
|
+
parms = {'Oem': {'Lenovo': {'SecureRollBack': False}}}
|
105
|
+
rsp = self._do_web_request('/redfish/v1/UpdateService', parms, method='PATCH')
|
106
|
+
targspec = {'target': targ}
|
107
|
+
rsp = self._do_web_request('/redfish/v1/UpdateService/Actions/UpdateService.StartUpdate', targspec)
|
108
|
+
monitorurl = rsp.get('@odata.id', None)
|
109
|
+
return self.monitor_update_progress(monitorurl, progress)
|
110
|
+
|
111
|
+
|
112
|
+
|
81
113
|
def get_diagnostic_data(self, savefile, progress=None, autosuffix=False):
|
82
114
|
tsk = self._do_web_request(
|
83
115
|
'/redfish/v1/Managers/bmc/LogServices/Dump/Actions/LogService.CollectDiagnosticData',
|
@@ -64,7 +64,11 @@ class SensorReading(object):
|
|
64
64
|
|
65
65
|
class OEMHandler(generic.OEMHandler):
|
66
66
|
|
67
|
-
|
67
|
+
def __init__(self, sysinfo, sysurl, webclient, cache, gpool=None):
|
68
|
+
super(OEMHandler, self).__init__(sysinfo, sysurl, webclient, cache,
|
69
|
+
gpool)
|
70
|
+
self.datacache = {}
|
71
|
+
|
68
72
|
|
69
73
|
def supports_expand(self, url):
|
70
74
|
return True
|
@@ -115,8 +119,8 @@ class OEMHandler(generic.OEMHandler):
|
|
115
119
|
# raise pygexc.TemporaryError(
|
116
120
|
# 'Cannot read extended inventory during firmware update')
|
117
121
|
if self.webclient:
|
118
|
-
adapterdata = self._do_bulk_requests([i['@odata.id'] for i in self.webclient.grab_json_response(
|
119
|
-
'/redfish/v1/Chassis/1')['Links']['PCIeDevices']])
|
122
|
+
adapterdata = list(self._do_bulk_requests([i['@odata.id'] for i in self.webclient.grab_json_response(
|
123
|
+
'/redfish/v1/Chassis/1')['Links']['PCIeDevices']]))
|
120
124
|
if adapterdata:
|
121
125
|
self.datacache['lenovo_cached_adapters'] = (
|
122
126
|
adapterdata, util._monotonic_time())
|
@@ -164,8 +168,21 @@ class OEMHandler(generic.OEMHandler):
|
|
164
168
|
# Could be identified also through Oem->Lenovo->FunctionClass
|
165
169
|
if fundata['Members'][0]['DeviceClass'] == 'NetworkController':
|
166
170
|
ports_data = self._get_expanded_data('{0}/Ports'.format(adata['@odata.id'].replace('PCIeDevices','NetworkAdapters')))
|
171
|
+
macidx = 1
|
167
172
|
for port in ports_data['Members']:
|
168
|
-
|
173
|
+
if port.get('Ethernet', None):
|
174
|
+
macs = [x for x in port['Ethernet'].get('AssociatedMACAddresses', [])]
|
175
|
+
for mac in macs:
|
176
|
+
label = 'MAC Address {}'.format(macidx)
|
177
|
+
bdata[label] = generic._normalize_mac(mac)
|
178
|
+
macidx += 1
|
179
|
+
ibinfo = port.get('InfiniBand', {})
|
180
|
+
if ibinfo:
|
181
|
+
macs = [x for x in ibinfo.get('AssociatedPortGUIDs', [])]
|
182
|
+
for mac in macs:
|
183
|
+
label = 'Port GUID {}'.format(macidx)
|
184
|
+
bdata[label] = mac
|
185
|
+
macidx += 1
|
169
186
|
hwmap[aname] = bdata
|
170
187
|
self.datacache['lenovo_cached_hwmap'] = (hwmap,
|
171
188
|
util._monotonic_time())
|
@@ -924,13 +941,19 @@ class OEMHandler(generic.OEMHandler):
|
|
924
941
|
src, dst = currval.split(',')
|
925
942
|
mappings.append('{}:{}'.format(src,dst))
|
926
943
|
settings['usb_forwarded_ports'] = {'value': ','.join(mappings)}
|
944
|
+
cfgin = self._get_lnv_bmcstgs(self)[0]
|
945
|
+
for stgname in cfgin:
|
946
|
+
settings[f'{stgname}'] = cfgin[stgname]
|
927
947
|
return settings
|
928
948
|
|
929
949
|
def set_bmc_configuration(self, changeset):
|
930
950
|
acctattribs = {}
|
931
951
|
usbsettings = {}
|
952
|
+
bmchangeset = {}
|
953
|
+
rawchangeset = {}
|
932
954
|
for key in changeset:
|
933
955
|
if isinstance(changeset[key], str):
|
956
|
+
rawchangeset[key] = changeset[key]
|
934
957
|
changeset[key] = {'value': changeset[key]}
|
935
958
|
currval = changeset[key].get('value', None)
|
936
959
|
if key == 'password_complexity':
|
@@ -946,7 +969,10 @@ class OEMHandler(generic.OEMHandler):
|
|
946
969
|
elif currval and 'enabled'.startswith(currval):
|
947
970
|
currval = 'True'
|
948
971
|
else:
|
949
|
-
|
972
|
+
try:
|
973
|
+
currval = int(currval)
|
974
|
+
except ValueError:
|
975
|
+
pass
|
950
976
|
if key.lower() in self.oemacctmap:
|
951
977
|
if 'Oem' not in acctattribs:
|
952
978
|
acctattribs['Oem'] = {'Lenovo': {}}
|
@@ -963,14 +989,15 @@ class OEMHandler(generic.OEMHandler):
|
|
963
989
|
'usb_forwarded_ports'):
|
964
990
|
usbsettings[key] = currval
|
965
991
|
else:
|
966
|
-
|
967
|
-
'{0} not a known setting'.format(key))
|
992
|
+
bmchangeset[key.replace('bmc.', '')] = rawchangeset[key]
|
968
993
|
if acctattribs:
|
969
994
|
self._do_web_request(
|
970
995
|
'/redfish/v1/AccountService', acctattribs, method='PATCH')
|
971
996
|
self._do_web_request('/redfish/v1/AccountService', cache=False)
|
972
997
|
if usbsettings:
|
973
998
|
self.apply_usb_configuration(usbsettings)
|
999
|
+
if bmchangeset:
|
1000
|
+
self._set_xcc3_settings(bmchangeset, self)
|
974
1001
|
|
975
1002
|
def apply_usb_configuration(self, usbsettings):
|
976
1003
|
bmcattribs = {}
|
pyghmi/util/webclient.py
CHANGED
@@ -24,6 +24,7 @@ import json
|
|
24
24
|
import socket
|
25
25
|
import ssl
|
26
26
|
import threading
|
27
|
+
import os
|
27
28
|
|
28
29
|
import six
|
29
30
|
|
@@ -96,7 +97,9 @@ class FileDownloader(threading.Thread):
|
|
96
97
|
self.exc = e
|
97
98
|
|
98
99
|
|
99
|
-
def get_upload_form(filename, data, formname, otherfields):
|
100
|
+
def get_upload_form(filename, data, formname, otherfields, boundary=BND):
|
101
|
+
if not boundary:
|
102
|
+
boundary = base64.b64encode(os.urandom(54))[:70]
|
100
103
|
ffilename = filename.split('/')[-1]
|
101
104
|
if not formname:
|
102
105
|
formname = ffilename
|
@@ -114,18 +117,18 @@ def get_upload_form(filename, data, formname, otherfields):
|
|
114
117
|
if isinstance(tfield, dict):
|
115
118
|
tfield = json.dumps(tfield)
|
116
119
|
xtra = '\r\nContent-Type: application/json'
|
117
|
-
form += (b'--' +
|
120
|
+
form += (b'--' + boundary
|
118
121
|
+ '\r\nContent-Disposition: form-data; '
|
119
122
|
'name="{0}"{1}\r\n\r\n{2}\r\n'.format(
|
120
123
|
ofield, xtra, tfield).encode('utf-8'))
|
121
|
-
form += (b'--' +
|
124
|
+
form += (b'--' + boundary
|
122
125
|
+ '\r\nContent-Disposition: form-data; '
|
123
126
|
'name="{0}"; filename="{1}"\r\n'.format(
|
124
127
|
formname, ffilename).encode('utf-8'))
|
125
128
|
form += b'Content-Type: application/octet-stream\r\n\r\n' + data
|
126
|
-
form += b'\r\n--' +
|
127
|
-
uploadforms[filename] = form
|
128
|
-
return
|
129
|
+
form += b'\r\n--' + boundary + b'--\r\n'
|
130
|
+
uploadforms[filename] = form, boundary
|
131
|
+
return uploadforms[filename]
|
129
132
|
|
130
133
|
|
131
134
|
class SecureHTTPConnection(httplib.HTTPConnection, object):
|
@@ -142,6 +145,7 @@ class SecureHTTPConnection(httplib.HTTPConnection, object):
|
|
142
145
|
self.broken = False
|
143
146
|
self.thehost = host
|
144
147
|
self.theport = port
|
148
|
+
self._upbuffer = None
|
145
149
|
try:
|
146
150
|
httplib.HTTPConnection.__init__(self, host, port, strict=strict,
|
147
151
|
**kwargs)
|
@@ -336,11 +340,12 @@ class SecureHTTPConnection(httplib.HTTPConnection, object):
|
|
336
340
|
data = open(filename, 'rb')
|
337
341
|
ulhdrs = self.stdheaders.copy()
|
338
342
|
if formwrap:
|
339
|
-
|
340
|
-
filename, data, formname, otherfields)
|
341
|
-
|
342
|
-
ulhdrs['Content-
|
343
|
-
|
343
|
+
guf = get_upload_form(
|
344
|
+
filename, data, formname, otherfields, boundary=None)
|
345
|
+
self._upbuffer = io.BytesIO(guf[0])
|
346
|
+
ulhdrs['Content-Type'] = b'multipart/form-data; boundary=' + guf[1]
|
347
|
+
ulhdrs['Content-Length'] = len(uploadforms[filename][0])
|
348
|
+
self.ulsize = len(uploadforms[filename][0])
|
344
349
|
else:
|
345
350
|
canseek = True
|
346
351
|
try:
|
@@ -383,6 +388,8 @@ class SecureHTTPConnection(httplib.HTTPConnection, object):
|
|
383
388
|
return body
|
384
389
|
|
385
390
|
def get_upload_progress(self):
|
391
|
+
if self._upbuffer is None:
|
392
|
+
return 0.0
|
386
393
|
return float(self._upbuffer.tell()) / float(self.ulsize)
|
387
394
|
|
388
395
|
def request(self, method, url, body=None, headers=None, referer=None):
|
@@ -38,24 +38,24 @@ pyghmi/ipmi/private/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSu
|
|
38
38
|
pyghmi/ipmi/private/constants.py,sha256=ViuB_nXsMM5LjkT9FGf2it2KQKvEehd5cZJgewjmVds,66936
|
39
39
|
pyghmi/ipmi/private/localsession.py,sha256=DThuwgvsAJT2AQ8byg4TA8AZG4hBBHnT-pxIJRsISCE,4879
|
40
40
|
pyghmi/ipmi/private/serversession.py,sha256=H5toINVu7sEuc13MWJHVG3zqNCyMY1tYXjQ4ZOOjQfE,16411
|
41
|
-
pyghmi/ipmi/private/session.py,sha256=
|
41
|
+
pyghmi/ipmi/private/session.py,sha256=d6Mk6bPN-2B53dm_AQ4cVk99noEKqlGRcGJamarWzsQ,81933
|
42
42
|
pyghmi/ipmi/private/simplesession.py,sha256=cNGaoT0uWIKDut6gUG9kAOX_b_qTzdB26R6I6Qk7cns,58834
|
43
43
|
pyghmi/ipmi/private/spd.py,sha256=oEPSXm19X2eNXDiyW_6fVjBFqhuuMAtBI9quRJgclH4,27094
|
44
44
|
pyghmi/ipmi/private/util.py,sha256=ayYodiSydlrrt0_pQppoRB1T6n-KNOiHZSfAlCMcpG0,3847
|
45
45
|
pyghmi/redfish/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
46
|
-
pyghmi/redfish/command.py,sha256=
|
46
|
+
pyghmi/redfish/command.py,sha256=_HLICBri_ON1GqSqqPNWoNKnGz7YBrqHo_l6tjGRiDc,61350
|
47
47
|
pyghmi/redfish/oem/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
48
|
-
pyghmi/redfish/oem/generic.py,sha256=
|
48
|
+
pyghmi/redfish/oem/generic.py,sha256=fX6ADqGURX9cQr-Q8cyncQtxLM1oz5CMv57IQ8ijxoY,57313
|
49
49
|
pyghmi/redfish/oem/lookup.py,sha256=pfJW5xSkUY61OirMeYy0b1SbjBFz6IDfN5ZOYog_Yq4,1530
|
50
50
|
pyghmi/redfish/oem/dell/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
51
51
|
pyghmi/redfish/oem/dell/idrac.py,sha256=pNnmqdV1sOP3ABw0xq0wF1QEO2L8onT7Osc_-sDO8EU,2146
|
52
52
|
pyghmi/redfish/oem/dell/main.py,sha256=g8773SShUpbYxXB9zVx2pD5z1xP04wB_sXAxcAs6_xY,793
|
53
53
|
pyghmi/redfish/oem/lenovo/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
54
54
|
pyghmi/redfish/oem/lenovo/main.py,sha256=bnx8LuC_C4_OluNR8JSHIxtSlM4_jdBb4cUzJM6mazE,2597
|
55
|
-
pyghmi/redfish/oem/lenovo/smm3.py,sha256=
|
55
|
+
pyghmi/redfish/oem/lenovo/smm3.py,sha256=QHasf5QofFuYqtHPeqcwCEJUbd0PV5_C6u-Y8FVdqCk,7598
|
56
56
|
pyghmi/redfish/oem/lenovo/tsma.py,sha256=6GELCuriumARj_kv7fgqtUpo9ekiWHpQcM9v_mnGILI,34645
|
57
57
|
pyghmi/redfish/oem/lenovo/xcc.py,sha256=78ksNj2-0jquj61lmAZldy3DdcR5KndqbLQ2Y4ZSFOM,84234
|
58
|
-
pyghmi/redfish/oem/lenovo/xcc3.py,sha256=
|
58
|
+
pyghmi/redfish/oem/lenovo/xcc3.py,sha256=8LxWzqXCkNmQ9PT-bu2ZSvgziTar3u1J37x8IRBshx8,55843
|
59
59
|
pyghmi/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
60
60
|
pyghmi/tests/unit/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
61
61
|
pyghmi/tests/unit/base.py,sha256=xWImA7zPRgfrEe2xAdRZ6w_dLwExGRBJ5CBybssUQGg,744
|
@@ -63,12 +63,12 @@ pyghmi/tests/unit/ipmi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3
|
|
63
63
|
pyghmi/tests/unit/ipmi/test_sdr.py,sha256=vb3iLY0cnHJ2K_m4xgYUjEcbPd_ZYhYx-uBowByplXw,824
|
64
64
|
pyghmi/util/__init__.py,sha256=GZLBWJiun2Plb_VE9dDSh4_PQMCha3gA7QLUqx3oSYI,25
|
65
65
|
pyghmi/util/parse.py,sha256=6VlyBCEcE8gy8PJWmEDdtCyWATaKwPaTswCdioPCWOE,2120
|
66
|
-
pyghmi/util/webclient.py,sha256=
|
67
|
-
pyghmi-1.6.
|
68
|
-
pyghmi-1.6.
|
69
|
-
pyghmi-1.6.
|
70
|
-
pyghmi-1.6.
|
71
|
-
pyghmi-1.6.
|
72
|
-
pyghmi-1.6.
|
73
|
-
pyghmi-1.6.
|
74
|
-
pyghmi-1.6.
|
66
|
+
pyghmi/util/webclient.py,sha256=i1rJ7NBlPQFTRv7kgzbTaOHsWuPeXcMAjRXm_i8CI0A,15652
|
67
|
+
pyghmi-1.6.4.dist-info/AUTHORS,sha256=yv4aQom_PII-SNqbeeKrfH-spcG85PRPsZ71Iqjl_fU,2083
|
68
|
+
pyghmi-1.6.4.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
69
|
+
pyghmi-1.6.4.dist-info/METADATA,sha256=iunjBkI12heq3smej-gMbCPO3KdWK4Y60I6yuxqmwd0,1136
|
70
|
+
pyghmi-1.6.4.dist-info/WHEEL,sha256=iAkIy5fosb7FzIOwONchHf19Qu7_1wCWyFNR5gu9nU0,91
|
71
|
+
pyghmi-1.6.4.dist-info/entry_points.txt,sha256=-OpJliDzATxmuPXK0VR3Ma-Yk_i4ZhfIIB-12A26dSI,168
|
72
|
+
pyghmi-1.6.4.dist-info/pbr.json,sha256=G84aunNCSzzeuUMkVxkxXAfI8E9qATe2tf_kPWkiFWs,46
|
73
|
+
pyghmi-1.6.4.dist-info/top_level.txt,sha256=aDtt6S9eVu6-tNdaUs4Pz9PbdUd69bziZZMhNvk9Ulc,7
|
74
|
+
pyghmi-1.6.4.dist-info/RECORD,,
|
@@ -0,0 +1 @@
|
|
1
|
+
{"git_version": "99af22b", "is_release": true}
|
pyghmi-1.6.2.dist-info/pbr.json
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
{"git_version": "6bf4e17", "is_release": true}
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|