You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			116 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			116 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Python
		
	
#!/usr/bin/env python3
 | 
						|
# -*- coding: utf-8 -*-
 | 
						|
 | 
						|
import os
 | 
						|
import sys
 | 
						|
 | 
						|
import xmir_base
 | 
						|
import gateway
 | 
						|
from gateway import die
 | 
						|
import read_info
 | 
						|
 | 
						|
 | 
						|
gw = gateway.Gateway()
 | 
						|
 | 
						|
dev = read_info.DevInfo(verbose = 0, infolevel = 1)
 | 
						|
dev.get_dmesg()
 | 
						|
dev.get_part_table()
 | 
						|
if not dev.partlist or len(dev.partlist) <= 1:
 | 
						|
  die("Partition list is empty!")
 | 
						|
 | 
						|
fn_dir    = 'backups/'
 | 
						|
fn_old    = fn_dir + 'full_dump.old'
 | 
						|
fn_local  = fn_dir + 'full_dump.bin'
 | 
						|
fn_remote = '/tmp/mtd_dump.bin'
 | 
						|
a_part = None
 | 
						|
pid = None
 | 
						|
if len(sys.argv) > 1:
 | 
						|
  for p, part in enumerate(dev.partlist):
 | 
						|
    print('  %2d > addr: 0x%08X  size: 0x%08X  name: "%s"' % (p, part['addr'], part['size'], part['name']))
 | 
						|
  print(" ")
 | 
						|
  a_part = input("Enter partition name or mtd number: ")
 | 
						|
  if a_part != 'a':
 | 
						|
    try:
 | 
						|
      i_part = int(a_part)
 | 
						|
    except:
 | 
						|
      i_part = None
 | 
						|
    if i_part is not None:
 | 
						|
      p = i_part
 | 
						|
      if p < 0 or p >= len(dev.partlist):
 | 
						|
        die('Partition "mtd{}" not found!'.format(a_part))
 | 
						|
    else:
 | 
						|
      p = dev.get_part_num(a_part)
 | 
						|
      if p < 0:
 | 
						|
        die('Partition "{}" not found!'.format(a_part))
 | 
						|
    name = dev.partlist[p]['name']
 | 
						|
    name = ''.join(e for e in name if e.isalnum())
 | 
						|
    fn_old    = fn_dir + 'mtd{id}_{name}.old'.format(id=p, name=name)
 | 
						|
    fn_local  = fn_dir + 'mtd{id}_{name}.bin'.format(id=p, name=name)
 | 
						|
    pid = p
 | 
						|
 | 
						|
os.makedirs(fn_dir, exist_ok = True)
 | 
						|
 | 
						|
if pid is None and a_part != 'a':
 | 
						|
  for p, part in enumerate(dev.partlist):
 | 
						|
    if part['addr'] == 0 and part['size'] > 0x00800000:  # 8MiB
 | 
						|
      pid = p
 | 
						|
      name = dev.partlist[p]['name']  # "ALL"
 | 
						|
      name = ''.join(e for e in name if e.isalnum())
 | 
						|
      addr = dev.partlist[p]['addr']
 | 
						|
      size = dev.partlist[p]['size']
 | 
						|
      break
 | 
						|
 | 
						|
if pid is not None:
 | 
						|
  if os.path.exists(fn_dir): 
 | 
						|
    if os.path.exists(fn_local): 
 | 
						|
      if os.path.exists(fn_old):
 | 
						|
        os.remove(fn_old)
 | 
						|
      os.rename(fn_local, fn_old)
 | 
						|
  if a_part is None:
 | 
						|
    print("Full backup creating...")
 | 
						|
  gw.run_cmd("dd if=/dev/mtd{id} of={o}".format(id=pid, o=fn_remote))
 | 
						|
  print('Dump of partition "{}" created!'.format(name))
 | 
						|
  print('Download dump to file "./{}"...'.format(fn_local))
 | 
						|
  gw.download(fn_remote, fn_local, verbose = 0)
 | 
						|
  print("Completed!")
 | 
						|
  gw.run_cmd("rm -f " + fn_remote)
 | 
						|
  print(" ")
 | 
						|
  if a_part is None:
 | 
						|
    print('Full backup saved to file "./{}"'.format(fn_local))
 | 
						|
  else:
 | 
						|
    print('Backup of "{}" saved to file "./{}"'.format(name, fn_local))
 | 
						|
else:
 | 
						|
  print("Full backup creating...")
 | 
						|
  for p, part in enumerate(dev.partlist):
 | 
						|
    if part['addr'] == 0 and part['size'] > 0x00800000:  # 8MiB
 | 
						|
      continue  # skip "ALL" part
 | 
						|
    name = dev.partlist[p]['name']
 | 
						|
    name = ''.join(e for e in name if e.isalnum())
 | 
						|
    addr = dev.partlist[p]['addr']
 | 
						|
    size = dev.partlist[p]['size']
 | 
						|
    fn_old    = fn_dir + 'mtd{id}_{name}.old'.format(id=p, name=name)
 | 
						|
    fn_local  = fn_dir + 'mtd{id}_{name}.bin'.format(id=p, name=name)    
 | 
						|
    if os.path.exists(fn_dir): 
 | 
						|
      if os.path.exists(fn_local): 
 | 
						|
        if os.path.exists(fn_old):
 | 
						|
          os.remove(fn_old)
 | 
						|
        os.rename(fn_local, fn_old)
 | 
						|
    cmd = "dd if=/dev/mtd{id} of={o}".format(id=p, o=fn_remote)
 | 
						|
    ret = gw.run_cmd(cmd, timeout=30, die_on_error = False)
 | 
						|
    if not ret:
 | 
						|
      print('ERROR on execute command: "{}"'.format(cmd))
 | 
						|
    else:
 | 
						|
      print('Download dump to file "./{}"...'.format(fn_local))
 | 
						|
      try:
 | 
						|
        gw.download(fn_remote, fn_local, verbose = 0)
 | 
						|
      except Exception:
 | 
						|
        print('Remote file "{}" not found!'.format(fn_remote))
 | 
						|
        continue
 | 
						|
    gw.run_cmd("rm -f " + fn_remote)
 | 
						|
    if ret:
 | 
						|
      print('Backup of "{}" saved to file "./{}"'.format(name, fn_local))
 | 
						|
  print(" ")
 | 
						|
  print("Completed!")
 | 
						|
 | 
						|
 |