add support to encrypt files
This commit is contained in:
@@ -12,8 +12,9 @@ from os import mkdir, remove, close
|
||||
from game_backuper.file import new_file, copy_file, File, mkdir_for_file
|
||||
from game_backuper.filetype import FileType
|
||||
from game_backuper.restorer import RestoreTask
|
||||
from game_backuper.file import remove_compress_files
|
||||
from game_backuper.file import remove_compress_files, remove_unencryped_files
|
||||
from game_backuper.compress import compress
|
||||
from game_backuper.enc import encrypt_file
|
||||
from tempfile import mkstemp
|
||||
|
||||
|
||||
@@ -28,6 +29,7 @@ class BackupTask(Thread):
|
||||
self.prog.clear_cache()
|
||||
prog = self.prog.name
|
||||
bp = join(self.cfg.dest, prog)
|
||||
ebp = join(self.cfg.dest, '.encrypt', prog)
|
||||
if not exists(bp):
|
||||
mkdir(bp)
|
||||
fl = self.db.get_file_list(prog)
|
||||
@@ -41,31 +43,54 @@ class BackupTask(Thread):
|
||||
nf = new_file(f[1], f[0], prog)
|
||||
if nf is None:
|
||||
continue
|
||||
de = join(bp, f[0])
|
||||
de = join(ebp if f.encrypt_files else bp, f[0])
|
||||
if ori is not None:
|
||||
if ori.size == nf.size and ori.hash == nf.hash:
|
||||
if c is None:
|
||||
if exists(de):
|
||||
if exists(de) and not f.encrypt_files:
|
||||
print(f'{prog}: Skip {f[0]}.')
|
||||
remove_compress_files(de, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
continue
|
||||
elif exists(de) and f.encrypt_files and not ori.compressed: # noqa: E501
|
||||
print(f'{prog}: Skip {f[0]}.')
|
||||
remove_unencryped_files(join(bp, f[0]), prog, f.name) # noqa: E501
|
||||
continue
|
||||
else:
|
||||
if exists(de + c.ext):
|
||||
if not f.encrypt_files and exists(de + c.ext):
|
||||
print(f'{prog}: Skip {f.name}.')
|
||||
remove_compress_files(de, prog, f.name, c.ext) # noqa: E501
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
continue
|
||||
if c is None:
|
||||
elif f.encrypt_files and ori.compressed_type == c.method: # noqa: E501
|
||||
print(f'{prog}: Skip {f.name}.')
|
||||
remove_unencryped_files(join(bp, f.name), prog, f.name) # noqa: E501
|
||||
continue
|
||||
stats = None
|
||||
if f.encrypt_files:
|
||||
stats = encrypt_file(f[1], de, nf, f.name, prog, c)
|
||||
remove_unencryped_files(join(bp, f[0]), prog, f.name) # noqa: E501
|
||||
elif c is None:
|
||||
copy_file(f[1], de, f[0], prog)
|
||||
remove_compress_files(de, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
else:
|
||||
compress(f[1], de, c, f.name, prog)
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
self.db.set_file(ori.id, nf.size, nf.hash)
|
||||
self.db.set_file_encrypt_information(ori.id, stats)
|
||||
else:
|
||||
if c is None:
|
||||
if f.encrypt_files:
|
||||
s = encrypt_file(f[1], de, nf, f.name, prog, c)
|
||||
nf = File.from_encrypt_stats(s, nf)
|
||||
remove_unencryped_files(join(bp, f[0]), prog, f.name) # noqa: E501
|
||||
elif c is None:
|
||||
copy_file(f[1], de, f[0], prog)
|
||||
remove_compress_files(de, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
else:
|
||||
compress(f[1], de, c, f.name, prog)
|
||||
self.remove_encrypted_file(join(ebp, f[0]), prog, f.name, ori) # noqa: E501
|
||||
self.db.add_file(nf)
|
||||
elif isinstance(f, ConfigLeveldb):
|
||||
from game_backuper.leveldb import have_leveldb
|
||||
@@ -84,47 +109,68 @@ class BackupTask(Thread):
|
||||
stats = leveldb_stats(f.full_path, ent)
|
||||
ori = self.db.get_file(prog, f.name)
|
||||
c = f.compress_config
|
||||
de = join(bp, f.name + ".db")
|
||||
de = join(ebp if f.encrypt_files else bp, f.name + ".db")
|
||||
if ori is not None:
|
||||
if ori.type is None or ori.type != FileType.LEVELDB:
|
||||
pp = join(bp, ori.file)
|
||||
if exists(pp):
|
||||
remove(pp)
|
||||
remove_compress_files(pp, prog, f.name)
|
||||
remove_compress_files(pp, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, ori.file), prog, f.name, ori) # noqa: E501
|
||||
self.db.remove_file(ori)
|
||||
ori = None
|
||||
if ori is not None:
|
||||
if ori.size == stats.size and ori.hash == stats.hash:
|
||||
if c is None:
|
||||
if exists(de):
|
||||
print(f'{prog}: Skip {f[0]}')
|
||||
if exists(de) and not f.encrypt_files:
|
||||
print(f'{prog}: Skip {f[0]}.')
|
||||
remove_compress_files(de, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, f[0] + '.db'), prog, f.name, ori) # noqa: E501
|
||||
continue
|
||||
elif exists(de) and f.encrypt_files and not ori.compressed: # noqa: E501
|
||||
print(f'{prog}: Skip {f[0]}.')
|
||||
remove_unencryped_files(join(bp, f[0] + '.db'), prog, f.name) # noqa: E501
|
||||
continue
|
||||
else:
|
||||
if exists(de + c.ext):
|
||||
print(f'{prog}: Skip {f.name}')
|
||||
if not f.encrypt_files and exists(de + c.ext):
|
||||
print(f'{prog}: Skip {f.name}.')
|
||||
remove_compress_files(de, prog, f.name, c.ext)
|
||||
self.remove_encrypted_file(join(ebp, f[0] + '.db'), prog, f.name, ori) # noqa: E501
|
||||
continue
|
||||
elif f.encrypt_files and ori.compressed_type == c.method: # noqa: E501
|
||||
print(f'{prog}: Skip {f.name}.')
|
||||
remove_unencryped_files(join(bp, f.name + '.db'), prog, f.name) # noqa: E501
|
||||
continue
|
||||
mkdir_for_file(de)
|
||||
st = None
|
||||
if c is None:
|
||||
leveldb_to_sqlite(f.full_path, de, ent)
|
||||
print(f'{prog}: Covert leveldb done. {f.full_path}({f.name}) -> {de}') # noqa: E501
|
||||
remove_compress_files(de, prog, f.name)
|
||||
self.remove_encrypted_file(join(ebp, f[0] + '.db'), prog, f.name, ori) # noqa: E501
|
||||
else:
|
||||
tmp = mkstemp()
|
||||
close(tmp[0])
|
||||
tmp = tmp[1]
|
||||
leveldb_to_sqlite(f.full_path, tmp, ent)
|
||||
print(f'{prog}: Covert leveldb done. {f.full_path}({f.name}) -> {tmp}') # noqa: E501
|
||||
compress(tmp, de, c, f.name, prog)
|
||||
if f.encrypt_files:
|
||||
st = encrypt_file(tmp, de, File.from_leveldb_stats(stats), f.name, prog, c) # noqa: E501
|
||||
remove_unencryped_files(join(bp, f[0] + '.db'), prog, f.name) # noqa: E501
|
||||
else:
|
||||
compress(tmp, de, c, f.name, prog)
|
||||
self.remove_encrypted_file(join(ebp, f[0] + '.db'), prog, f.name, ori) # noqa: E501
|
||||
remove(tmp)
|
||||
print(f'{prog}: Removed tempfile {tmp}')
|
||||
if ori is None:
|
||||
nf = File(None, f.name, stats.size, prog, stats.hash,
|
||||
FileType.LEVELDB)
|
||||
FileType.LEVELDB, None, None, None, None, None)
|
||||
if st:
|
||||
nf = File.from_encrypt_stats(st, nf)
|
||||
self.db.add_file(nf)
|
||||
else:
|
||||
self.db.set_file(ori.id, stats.size, stats.hash)
|
||||
self.db.set_file_encrypt_information(ori.id, st)
|
||||
for fn in fl:
|
||||
f = self.db.get_file(prog, fn)
|
||||
if f.type is None:
|
||||
@@ -140,6 +186,11 @@ class BackupTask(Thread):
|
||||
print(f'{prog}: Remove {de}({fn})')
|
||||
self.db.remove_file(f)
|
||||
|
||||
def remove_encrypted_file(self, loc: str, prog: str, name: str, f: File):
|
||||
if exists(loc):
|
||||
remove(loc)
|
||||
print(f'{prog}: Removed {loc}({name})')
|
||||
|
||||
|
||||
class Backuper:
|
||||
def __init__(self, db: Db, config: Config, opts: Opts):
|
||||
|
||||
Reference in New Issue
Block a user