You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
1.3 KiB

  1. #!/usr/bin/python
  2. from backup import hashify
  3. import argparse
  4. import os
  5. import shutil
  6. import sqlite3
  7. import time
  8. import time
  9. def create_temp():
  10. name= 'fsb{}'.format(hex(time.time_ns())[2:])
  11. os.mkdir(name)
  12. return name
  13. def lookup(cur,imohash,realhash=None):
  14. if realhash is not None:
  15. cur.execute('SELECT path FROM paths where blake=?',[realhash])
  16. else:
  17. cur.execute('SELECT path FROM paths where imohash=?',[imohash])
  18. res = cur.fetchone()
  19. if len(res) == 1:
  20. return res[0]
  21. def restore(database,source,destination):
  22. con=sqlite3.connect(database)
  23. cur=con.cursor()
  24. temp = create_temp()
  25. hashes = hashify(source)
  26. for path,imohash,realhash in hashes:
  27. ppath = os.path.join(source,path)
  28. qpath=lookup(cur,imohash,realhash)
  29. qpath=os.path.join(temp,qpath)
  30. parent = os.path.dirname(qpath)
  31. if not os.path.exists(parent):
  32. os.makedirs(parent)
  33. print(ppath,qpath,sep = '->')
  34. os.rename(ppath,qpath)
  35. os.rename(temp,destination)
  36. if __name__ == "__main__":
  37. parser = argparse.ArgumentParser()
  38. parser.add_argument('database')
  39. parser.add_argument('src')
  40. parser.add_argument('dst',default = None,nargs='?')
  41. args = parser.parse_args()
  42. if args.dst is None:
  43. args.dst=args.src
  44. restore(args.database,args.src,args.dst)