[read_info] The method of dump a list of partitions from dmesg is no longer the main one

pull/24/head
remittor 1 year ago
parent 86150b71a9
commit 8a0e062b6f

@ -103,8 +103,10 @@ class DevInfo():
fn_remote = f'/tmp/{fn}' fn_remote = f'/tmp/{fn}'
if os.path.exists(fn_local): if os.path.exists(fn_local):
os.remove(fn_local) os.remove(fn_local)
if '>' not in cmd:
cmd += " > " + fn_remote
try: try:
self.gw.run_cmd(cmd + " > " + fn_remote) self.gw.run_cmd(cmd)
self.gw.download(fn_remote, fn_local, verbose = verbose) self.gw.download(fn_remote, fn_local, verbose = verbose)
self.gw.run_cmd("rm -f " + fn_remote) self.gw.run_cmd("rm -f " + fn_remote)
except Exception: except Exception:
@ -125,14 +127,14 @@ class DevInfo():
print(f'ERROR on downloading "/tmp/dmesg.log"') print(f'ERROR on downloading "/tmp/dmesg.log"')
return self.dmesg return self.dmesg
def get_part_table(self, verbose = None): def get_part_table_dmesg(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose verbose = verbose if verbose is not None else self.verbose
self.partlist = [] self.partlist = []
if not self.dmesg: if not self.dmesg:
return self.partlist return self.partlist
x = self.dmesg.find(" MTD partitions on ") x = self.dmesg.find(" MTD partitions on ")
if x <= 0: if x <= 0:
return self.get_part_table2(verbose) return self.partlist
parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg) parttbl = re.findall(r'0x0000(.*?)-0x0000(.*?) : "(.*?)"', self.dmesg)
if len(parttbl) <= 0: if len(parttbl) <= 0:
return self.partlist return self.partlist
@ -150,34 +152,60 @@ class DevInfo():
self.get_part_readonly() self.get_part_readonly()
return self.partlist return self.partlist
def get_part_table2(self, verbose = None): def get_part_table(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose verbose = verbose if verbose is not None else self.verbose
self.partlist = [] self.partlist = []
mtd_list = self.run_command('cat /proc/mtd', 'mtd_list.txt') mtd_list = self.run_command('cat /proc/mtd', 'mtd_list.txt')
if not mtd_list or len(mtd_list) <= 0: if not mtd_list or len(mtd_list) <= 1:
return [] return self.get_part_table_dmesg(verbose)
mtdtbl = re.findall(r'mtd([0-9]+): ([0-9a-fA-F]+) ([0-9a-fA-F]+) "(.*?)"', mtd_list) mtdtbl = re.findall(r'mtd([0-9]+): ([0-9a-fA-F]+) ([0-9a-fA-F]+) "(.*?)"', mtd_list)
if len(mtdtbl) <= 0: if len(mtdtbl) <= 1:
return [] return self.get_part_table_dmesg(verbose)
addr_list = self.get_part_addr_table(len(mtdtbl) - 1, verbose)
if not addr_list or addr_list[0] < 0:
return self.get_part_table_dmesg(verbose)
mtdlist = [] mtdlist = []
if self.verbose: if self.verbose:
print("MTD partitions :") print("MTD partitions :")
for i, mtd in enumerate(mtdtbl): for i, mtd in enumerate(mtdtbl):
mtdid = int(mtd[0]) mtdid = int(mtd[0])
if mtdid != i:
raise ValueError("Incorrect mtd id")
size = int(mtd[1], 16) size = int(mtd[1], 16)
name = mtd[3] name = mtd[3]
addr = self.run_command(f'cat /sys/class/mtd/mtd{mtdid}/offset', 'offset.txt', verbose = 0) addr = addr_list[mtdid]
if addr is None or len(addr) <= 0:
return []
addr = int(addr)
self.partlist.append( {'addr': addr, 'size': size, 'name': name} ) self.partlist.append( {'addr': addr, 'size': size, 'name': name} )
if verbose: if verbose:
print(' %2d > addr: 0x%08X size: 0x%08X name: "%s"' % (i, addr, size, name)) print(' %2d > addr: 0x%08X size: 0x%08X name: "%s"' % (i, addr, size, name))
if addr < 0:
return []
if verbose: if verbose:
print(" ") print(" ")
self.get_part_readonly() self.get_part_readonly()
return self.partlist return self.partlist
def get_part_addr_table(self, mtd_max_num, verbose = None):
verbose = verbose if verbose is not None else self.verbose
fn = 'mtd_addr.txt'
cmd = f'rm -f /tmp/{fn} ;'
cmd += f'for i in $(seq 0 {mtd_max_num}) ; do'
cmd += f' echo "" >> /tmp/{fn} ;'
cmd += f' echo -n $i= >> /tmp/{fn} ;'
cmd += f' cat /sys/class/mtd/mtd$i/offset >> /tmp/{fn} ;'
cmd += f'done'
addr_table = self.run_command(cmd, fn)
if not addr_table:
return [ ]
addr_list = [ -1 ] * (mtd_max_num + 1)
for line in addr_table.split('\n'):
line = line.strip()
if '=' in line:
data = line.split('=')
mtd_num = int(data[0])
if len(data[1]) >= 1:
addr_list[mtd_num] = int(data[1])
return addr_list
def get_part_readonly(self, verbose = None): def get_part_readonly(self, verbose = None):
verbose = verbose if verbose is not None else self.verbose verbose = verbose if verbose is not None else self.verbose
if self.partlist: if self.partlist:

Loading…
Cancel
Save