diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/Registry/Registry.py b/squashfs_override/usr/lib/python2.7/dist-packages/Registry/Registry.py index 47b719e..4288ed0 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/Registry/Registry.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/Registry/Registry.py @@ -66,7 +66,7 @@ def __init__(self, value): super(RegistryKeyHasNoParentException, self).__init__(value) def __str__(self): - return "Registry key has no parent key: %s" % (self._value) + return f"Registry key has no parent key: {self._value}" class RegistryKeyNotFoundException(RegistryParse.RegistryStructureDoesNotExist): @@ -81,7 +81,7 @@ def __init__(self, value): super(RegistryKeyNotFoundException, self).__init__(value) def __str__(self): - return "Registry key not found: %s" % (self._value) + return f"Registry key not found: {self._value}" class RegistryValueNotFoundException(RegistryParse.RegistryStructureDoesNotExist): """ @@ -95,7 +95,7 @@ def __init__(self, value): super(RegistryValueNotFoundException, self).__init__(value) def __str__(self): - return "Registry value not found: %s" % (self._value) + return f"Registry value not found: {self._value}" class RegistryValue(object): """ @@ -111,10 +111,7 @@ def name(self): Get the name of the value as a string. The name of the default value is returned as "(default)". """ - if self._vkrecord.has_name(): - return self._vkrecord.name() - else: - return "(default)" + return self._vkrecord.name() if self._vkrecord.has_name() else "(default)" def value_type(self): """ @@ -273,8 +270,8 @@ def value(self, name): if v.name().lower() == name.lower(): return RegistryValue(v) except RegistryParse.RegistryStructureDoesNotExist: - raise RegistryValueNotFoundException(self.path() + " : " + name) - raise RegistryValueNotFoundException(self.path() + " : " + name) + raise RegistryValueNotFoundException(f"{self.path()} : {name}") + raise RegistryValueNotFoundException(f"{self.path()} : {name}") def find_key(self, path): """ diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/Registry/RegistryParse.py b/squashfs_override/usr/lib/python2.7/dist-packages/Registry/RegistryParse.py index e5e9a56..f9f27f4 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/Registry/RegistryParse.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/Registry/RegistryParse.py @@ -64,7 +64,7 @@ def __init__(self, value): self._value = value def __str__(self): - return "Registry Exception: %s" % (self._value) + return f"Registry Exception: {self._value}" class RegistryStructureDoesNotExist(RegistryException): @@ -82,7 +82,7 @@ def __init__(self, value): super(RegistryStructureDoesNotExist, self).__init__(value) def __str__(self): - return "Registry Structure Does Not Exist Exception: %s" % (self._value) + return f"Registry Structure Does Not Exist Exception: {self._value}" class ParseException(RegistryException): @@ -99,7 +99,7 @@ def __init__(self, value): super(ParseException, self).__init__(value) def __str__(self): - return "Registry Parse Exception(%s)" % (self._value) + return f"Registry Parse Exception({self._value})" class UnknownTypeException(RegistryException): @@ -129,7 +129,7 @@ def __init__(self, value): super(UnknownTypeException, self).__init__(value) def __str__(self): - return "Unknown Type Exception(%s)" % (self._value) + return f"Unknown Type Exception({self._value})" class RegistryBlock(object): @@ -163,7 +163,7 @@ def unpack_word(self, offset): Arguments: - `offset`: The relative offset from the start of the block. """ - return struct.unpack_from(str(" 0: off = self.abs_offset_from_hbin_offset(self.unpack_dword(4 * count)) size = min(0x3fd8, length) - b += HBINCell(self._buf, off, self).raw_data()[0:size] + b += HBINCell(self._buf, off, self).raw_data()[:size] count += 1 length -= size @@ -541,16 +534,7 @@ def decode_utf16le(s): if b"\x00\x00" in s: index = s.index(b"\x00\x00") if index > 2: - if s[index - 2] != b"\x00"[0]: #py2+3 - # 61 00 62 00 63 64 00 00 - # ^ ^-- end of string - # +-- index - s = s[:index + 2] - else: - # 61 00 62 00 63 00 00 00 - # ^ ^-- end of string - # +-- index - s = s[:index + 3] + s = s[:index + 2] if s[index - 2] != b"\x00"[0] else s[:index + 3] if (len(s) % 2) != 0: s = s + b"\x00" s = s.decode("utf16") @@ -610,22 +594,18 @@ def data_type_str(self): elif data_type == RegFileTime: return "RegFileTime" else: - return "Unknown type: %s" % (hex(data_type)) + return f"Unknown type: {hex(data_type)}" def __str__(self): - if self.has_name(): - name = self.name() - else: - name = "(default)" - + name = self.name() if self.has_name() else "(default)" data = "" data_type = self.data_type() - if data_type == RegSZ or data_type == RegExpandSZ: - data = self.data()[0:16] + "..." + if data_type in [RegSZ, RegExpandSZ]: + data = f"{self.data()[:16]}..." elif data_type == RegMultiSZ: - data = str(len(self.data())) + " strings" - elif data_type == RegDWord or data_type == RegQWord: - data = str(hex(self.data())) + data = f"{len(self.data())} strings" + elif data_type in [RegDWord, RegQWord]: + data = hex(self.data()) elif data_type == RegNone: data = "(none)" elif data_type == RegBin: @@ -660,9 +640,8 @@ def name(self): """ if not self.has_name(): return "" - else: - name_length = self.unpack_word(0x2) - return self.unpack_string(0x14, name_length).decode("windows-1252") + name_length = self.unpack_word(0x2) + return self.unpack_string(0x14, name_length).decode("windows-1252") def data_type(self): """ @@ -703,23 +682,22 @@ def raw_data(self): data_offset = self.data_offset() ret = None - if data_type == RegSZ or data_type == RegExpandSZ: + if data_type in [RegSZ, RegExpandSZ]: if data_length >= 0x80000000: # data is contained in the data_offset field ret = self._buf[data_offset:data_offset + 0x4] elif 0x3fd8 < data_length < 0x80000000: d = HBINCell(self._buf, data_offset, self) - if d.data_id() == b"db": - # this should always be the case - # but empirical testing does not confirm this - ret = d.child().large_data(data_length) - else: - ret = d.raw_data()[:data_length] + ret = ( + d.child().large_data(data_length) + if d.data_id() == b"db" + else d.raw_data()[:data_length] + ) else: d = HBINCell(self._buf, data_offset, self) data_offset = d.data_offset() ret = self._buf[data_offset:data_offset + data_length] - elif data_type == RegBin or data_type == RegNone: + elif data_type in [RegBin, RegNone]: if data_length >= 0x80000000: data_length -= 0x80000000 ret = self._buf[data_offset:data_offset + data_length] @@ -756,10 +734,12 @@ def raw_data(self): d = HBINCell(self._buf, data_offset, self) data_offset = d.data_offset() ret = self._buf[data_offset:data_offset + 4] - elif data_type == RegLink or \ - data_type == RegResourceList or \ - data_type == RegFullResourceDescriptor or \ - data_type == RegResourceRequirementsList: + elif data_type in [ + RegLink, + RegResourceList, + RegFullResourceDescriptor, + RegResourceRequirementsList, + ]: if data_length >= 0x80000000: data_length -= 0x80000000 ret = self._buf[data_offset:data_offset + data_length] @@ -777,20 +757,16 @@ def raw_data(self): ret = self._buf[data_offset + 4:data_offset + 4 + data_length] elif data_length < 5 or data_length >= 0x80000000: ret = self.unpack_binary(0x8, 4) - else: - if data_length >= 0x80000000: - data_length -= 0x80000000 - ret = self._buf[data_offset:data_offset + data_length] - elif 0x3fd8 < data_length < 0x80000000: - d = HBINCell(self._buf, data_offset, self) - if d.data_id() == b"db": - # this should always be the case - # but empirical testing does not confirm this - ret = d.child().large_data(data_length) - else: - ret = d.raw_data()[:data_length] + elif 0x3FD8 < data_length < 0x80000000: + d = HBINCell(self._buf, data_offset, self) + if d.data_id() == b"db": + # this should always be the case + # but empirical testing does not confirm this + ret = d.child().large_data(data_length) else: - ret = self._buf[data_offset + 4:data_offset + 4 + data_length] + ret = d.raw_data()[:data_length] + else: + ret = self._buf[data_offset + 4:data_offset + 4 + data_length] return ret def data(self): @@ -831,30 +807,32 @@ def data(self): data_length = self.raw_data_length() d = self.raw_data() - if data_type == RegSZ or data_type == RegExpandSZ: + if data_type in [RegSZ, RegExpandSZ]: return decode_utf16le(d) - elif data_type == RegBin or data_type == RegNone: + elif data_type in [RegBin, RegNone]: return d elif data_type == RegDWord: - return struct.unpack_from(str("I"), d, 0)[0] - elif data_type == RegLink or \ - data_type == RegResourceList or \ - data_type == RegFullResourceDescriptor or \ - data_type == RegResourceRequirementsList: + return struct.unpack_from(">I", d, 0)[0] + elif data_type in [ + RegLink, + RegResourceList, + RegFullResourceDescriptor, + RegResourceRequirementsList, + ]: # we don't really support these types, but can at least # return raw binary for someone else to work with. return d elif data_type == RegFileTime: return parse_windows_timestamp(d) elif data_length < 5 or data_length >= 0x80000000: - return struct.unpack_from(str("" % (self.__class__.__name__, self.message) + return f"<{self.__class__.__name__}: {self.message}>" def complete_message(self): if self.message: - return "%s: %s" % (self.ExceptionShortDescription, self.message) + return f"{self.ExceptionShortDescription}: {self.message}" else: - return "%s" % self.ExceptionShortDescription + return f"{self.ExceptionShortDescription}" ExceptionShortDescription = "pythondialog generic exception" # For backward-compatibility @@ -248,11 +248,7 @@ class UnableToCreateTemporaryDirectory(error): def _simple_option(option, enable): """Turn on or off the simplest dialog Common Options.""" - if enable: - return (option,) - else: - # This will not add any argument to the command line - return () + return (option, ) if enable else () def _find_in_path(prog_name): @@ -583,7 +579,7 @@ def __init__(self, dialog="dialog", DIALOGRC=None, compat="dialog", # even read them), but it is a bit late, now. So, we set them # based on the (global) _dialog_exit_status_vars.keys. for var in _dialog_exit_status_vars.keys(): - varname = "DIALOG_" + var + varname = f"DIALOG_{var}" setattr(self, varname, _dialog_exit_status_vars[var]) self._dialog_prg = _path_to_executable(dialog) @@ -591,11 +587,7 @@ def __init__(self, dialog="dialog", DIALOGRC=None, compat="dialog", self.dialog_persistent_arglist = [] # Use stderr or stdout? - if self.compat == "Xdialog": - # Default to stdout if Xdialog - self.use_stdout = True - else: - self.use_stdout = False + self.use_stdout = self.compat == "Xdialog" if use_stdout != None: # Allow explicit setting self.use_stdout = use_stdout diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_restorer.py b/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_restorer.py index 4a85437..8cdf5aa 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_restorer.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_restorer.py @@ -41,19 +41,22 @@ def __init__(self, manager, mode): @property def available_images(self): - images = [] - for d in os.listdir('/home/partimag'): - if os.path.isfile('/home/partimag/%s/davosInfo.json' % d): - images.append(d) - return images + return [ + d + for d in os.listdir('/home/partimag') + if os.path.isfile(f'/home/partimag/{d}/davosInfo.json') + ] def select_image(self): def _get_title(image_uuid): try: - _json = json.loads(open('/home/partimag/%s/davosInfo.json' % image_uuid, 'r').read()) + _json = json.loads( + open(f'/home/partimag/{image_uuid}/davosInfo.json', 'r').read() + ) return _json['title'] except: return image_uuid + available_images = self.available_images d = Dialog(dialog="dialog") choices = [(str(available_images.index(x) + 1), _get_title(x)) for x in available_images] @@ -68,12 +71,12 @@ def _get_title(image_uuid): def check_image(self): # Check if the image exists or not - if not os.path.isdir('/home/partimag/' + self.image_uuid): + if not os.path.isdir(f'/home/partimag/{self.image_uuid}'): d = Dialog(dialog="dialog") d.msgbox("Could not find image on server", backtitle="Pulse Imaging Client") raise Exception('Could not find image on server') # Check if image is compatible (davos) - if not os.path.isfile('/home/partimag/%s/davosInfo.json' % self.image_uuid): + if not os.path.isfile(f'/home/partimag/{self.image_uuid}/davosInfo.json'): d = Dialog(dialog="dialog") d.msgbox("Selected image is not compatible with this backend, please convert this image to the correct format.", backtitle="Pulse Imaging Client") raise Exception('Could not find image on server') @@ -102,9 +105,15 @@ def start(self): # Start the image restore if self.mode == 'multicast': - error_code = subprocess.call('yes 2>/dev/null| /usr/sbin/ocs-sr %s --mcast-port 2232 multicast_restoredisk %s %s 2>&1 1>/dev/null | tee /var/log/davos_restorer.log' % (self.manager.clonezilla_params['clonezilla_restorer_params'], self.image_uuid, self.device), shell=True) + error_code = subprocess.call( + f"yes 2>/dev/null| /usr/sbin/ocs-sr {self.manager.clonezilla_params['clonezilla_restorer_params']} --mcast-port 2232 multicast_restoredisk {self.image_uuid} {self.device} 2>&1 1>/dev/null | tee /var/log/davos_restorer.log", + shell=True, + ) else: - error_code = subprocess.call('yes 2>/dev/null| /usr/sbin/ocs-sr %s restoredisk %s %s 2>&1 1>/dev/null | tee /var/log/davos_restorer.log' % (self.manager.clonezilla_params['clonezilla_restorer_params'], self.image_uuid, self.device), shell=True) + error_code = subprocess.call( + f"yes 2>/dev/null| /usr/sbin/ocs-sr {self.manager.clonezilla_params['clonezilla_restorer_params']} restoredisk {self.image_uuid} {self.device} 2>&1 1>/dev/null | tee /var/log/davos_restorer.log", + shell=True, + ) # Save image JSON and LOG current_ts = time.strftime("%Y%m%d%H%M%S") @@ -113,7 +122,7 @@ def start(self): if error_code != 0: self.logger.warning('An error was encountered while restoring image, check davos_restorer.log for more details.') - saver_log_path = os.path.join(image_dir, 'davos_restorer-%s.log' % (current_ts) ) + saver_log_path = os.path.join(image_dir, f'davos_restorer-{current_ts}.log') open(saver_log_path, 'w').write(open('/var/log/davos_restorer.log', 'r').read()) time.sleep(15) diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_saver.py b/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_saver.py index 089747a..779b8cd 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_saver.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/davos/image_saver.py @@ -53,7 +53,10 @@ def start(self): self.device = 'vda' # Start the image saver - error_code = subprocess.call('yes 2>/dev/null|/usr/sbin/ocs-sr %s savedisk %s %s 2>&1 1>/dev/null | tee /var/log/davos_saver.log' % (self.manager.clonezilla_params['clonezilla_saver_params'], self.image_uuid, self.device), shell=True) + error_code = subprocess.call( + f"yes 2>/dev/null|/usr/sbin/ocs-sr {self.manager.clonezilla_params['clonezilla_saver_params']} savedisk {self.image_uuid} {self.device} 2>&1 1>/dev/null | tee /var/log/davos_saver.log", + shell=True, + ) image_dir = os.path.join('/home/partimag/', self.image_uuid) + '/' @@ -63,12 +66,18 @@ def start(self): open(saver_log_path, 'w').write(open('/var/log/davos_saver.log', 'r').read()) time.sleep(15) - # Save image JSON and LOG - info = {} current_ts = time.strftime("%Y-%m-%d %H:%M:%S") - info['title'] = 'Image of %s at %s' % (self.manager.hostname, current_ts) - info['description'] = '' - info['size'] = sum(os.path.getsize(image_dir+f) for f in os.listdir(image_dir) if os.path.isfile(image_dir+f)) + info = { + 'title': f'Image of {self.manager.hostname} at {current_ts}', + 'description': '', + 'size': sum( + ( + os.path.getsize(image_dir + f) + for f in os.listdir(image_dir) + if os.path.isfile(image_dir + f) + ) + ), + } info['has_error'] = (error_code == 0) log_path = os.path.join(image_dir, 'davos.log') diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/davos/inventory.py b/squashfs_override/usr/lib/python2.7/dist-packages/davos/inventory.py index e4ecb98..a5a63ec 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/davos/inventory.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/davos/inventory.py @@ -34,7 +34,7 @@ def __init__(self, manager): self.editNodeText('OSNAME', 'Unknown operating system (PXE network boot inventory)') self.editNodeText('FULL_NAME', 'Unknown operating system (PXE network boot inventory)') timestamp = time.ctime() - self.editNodeText('OSCOMMENTS', 'Inventory generated on ' + timestamp) + self.editNodeText('OSCOMMENTS', f'Inventory generated on {timestamp}') # If we have a detected OS, we inventory OS and SOFT #if self.OS: @@ -42,9 +42,7 @@ def __init__(self, manager): # Find mac address of connected interface pnic = psutil.net_io_counters(pernic=True) - stats = {} - for nicname in list(pnic.keys()): - stats[nicname] = pnic[nicname].bytes_sent + stats = {nicname: pnic[nicname].bytes_sent for nicname in list(pnic.keys())} self.interface = max(stats, key=stats.get) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) info = fcntl.ioctl(sock.fileno(), 0x8927, struct.pack('256s', self.interface[:15])) @@ -60,11 +58,13 @@ def __init__(self, manager): # Copy file to inventories folder on tftp server self.logger.info('Uploading inventory to Pulse server') - filehandler = open('/tmp' + self.macaddress + '.xml', 'w') - filehandler.write(data) - filehandler.close() + with open(f'/tmp{self.macaddress}.xml', 'w') as filehandler: + filehandler.write(data) tftpclient = tftpy.TftpClient(manager.tftp_ip, 69) - tftpclient.upload('/' + manager.dump_path + '/' + self.macaddress + '.xml', '/tmp' + self.macaddress + '.xml') + tftpclient.upload( + f'/{manager.dump_path}/{self.macaddress}.xml', + f'/tmp{self.macaddress}.xml', + ) @property @@ -87,12 +87,10 @@ def windowsHandler(self): from Registry import Registry reg = Registry.Registry('/mnt/Windows/System32/config/SOFTWARE') - # ======== OS SECTION =============================================== - - cv_dict = {} - for entry in reg.open('Microsoft\\Windows NT\\CurrentVersion').values(): - cv_dict[entry.name()] = entry.value() - + cv_dict = { + entry.name(): entry.value() + for entry in reg.open('Microsoft\\Windows NT\\CurrentVersion').values() + } if 'ProductName' in cv_dict: self.editNodeText('OSNAME', 'Microsoft ' + cv_dict['ProductName']) self.editNodeText('FULL_NAME', 'Microsoft ' + cv_dict['ProductName']) @@ -127,11 +125,7 @@ def windowsHandler(self): except: soft_dict[entry.name()] = entry.value() - soft = {} - soft['ARCH'] = 'x86_64' - soft['FROM'] = 'registry' - soft['GUID'] = key.name() - + soft = {'ARCH': 'x86_64', 'FROM': 'registry', 'GUID': key.name()} if 'HelpLink' in soft_dict: soft['HELPLINK'] = soft_dict['HelpLink'] @@ -163,7 +157,7 @@ def addSoftware(self, data): cont = self.dom.getElementsByTagName('CONTENT')[0] softnode = self.dom.createElement('SOFTWARES') for k in ['ARCH', 'FROM', 'GUID', 'NAME', 'PUBLISHER', 'UNINSTALL_STRING', 'URL_INFO_ABOUT', 'VERSION']: - if not k in data: + if k not in data: continue elem = self.dom.createElement(k) txt = self.dom.createTextNode(data[k]) diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/davos/xmlrpc_client.py b/squashfs_override/usr/lib/python2.7/dist-packages/davos/xmlrpc_client.py index c48b6d8..368e6e0 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/davos/xmlrpc_client.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/davos/xmlrpc_client.py @@ -12,7 +12,7 @@ def __init__(self, ip): # Building url (dirty, port and protocol are hardcoded # but we are limited by grub command line max length # We could pass them if we upgrade to grub2 - self.base_url = "https://%s:9990/" % ip + self.base_url = f"https://{ip}:9990/" def __getattr__(self, attr_name): # Return the corresponding api proxy according to attr diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/debconf.py b/squashfs_override/usr/lib/python2.7/dist-packages/debconf.py index bdfeb36..fbba1dd 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/debconf.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/debconf.py @@ -52,7 +52,7 @@ def __init__(self, title=None, read=None, write=None): def setUp(self, title): self.version = self.version(2) if self.version[:2] != '2.': - raise DebconfError(256, "wrong version: %s" % self.version) + raise DebconfError(256, f"wrong version: {self.version}") self.capabilities = self.capb().split() if title: self.title(title) @@ -76,21 +76,15 @@ def command(self, command, *params): else: raise - if ' ' in resp: - status, data = resp.split(' ', 1) - else: - status, data = resp, '' + status, data = resp.split(' ', 1) if ' ' in resp else (resp, '') status = int(status) if status == 0: return data - elif status == 1: # unescaped data + elif status == 1: unescaped = '' for chunk in re.split(r'(\\.)', data): if chunk.startswith('\\') and len(chunk) == 2: - if chunk[1] == 'n': - unescaped += '\n' - else: - unescaped += chunk[1] + unescaped += '\n' if chunk[1] == 'n' else chunk[1] else: unescaped += chunk return unescaped diff --git a/squashfs_override/usr/lib/python2.7/dist-packages/enum.py b/squashfs_override/usr/lib/python2.7/dist-packages/enum.py index 63f5026..3ae76a2 100644 --- a/squashfs_override/usr/lib/python2.7/dist-packages/enum.py +++ b/squashfs_override/usr/lib/python2.7/dist-packages/enum.py @@ -217,12 +217,13 @@ def __setitem__(self, index, value): def __delitem__(self, index): raise EnumImmutableError(index) - def __iter__(self): - return iter(self._values) - def __contains__(self, value): is_member = False - if isinstance(value, basestring): + return ( + (value in self._keys) + if isinstance(value, basestring) + else (value in self._values) + ) is_member = (value in self._keys) else: is_member = (value in self._values)