From 5db7793fb15e1eaeb23a8b78275ec0844d957f10 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Tue, 7 Sep 2021 07:48:07 +0800 Subject: [PATCH] add list and list_leveldb_key --- game_backuper/backuper.py | 23 ++++++++++++++++++++--- game_backuper/cml.py | 26 ++++++++++++++++++++++---- 2 files changed, 42 insertions(+), 7 deletions(-) diff --git a/game_backuper/backuper.py b/game_backuper/backuper.py index defd185..04e3482 100644 --- a/game_backuper/backuper.py +++ b/game_backuper/backuper.py @@ -7,7 +7,7 @@ from game_backuper.config import ( ) from game_backuper.cml import Opts, OptAction from threading import Thread -from os.path import exists, join +from os.path import exists, join, isdir from os import mkdir, remove from game_backuper.file import new_file, copy_file, File, mkdir_for_file from game_backuper.filetype import FileType @@ -46,7 +46,7 @@ class BackupTask(Thread): elif isinstance(f, ConfigLeveldb): from game_backuper.leveldb import have_leveldb if not have_leveldb: - raise ValueError('Leveldb is not supported.') + raise NotImplementedError('Leveldb is not supported.') if not exists(f.full_path): continue from game_backuper.leveldb import ( @@ -93,9 +93,26 @@ class Backuper: t = BackupTask(prog, self.db, self.conf) self.tasks.append(t) t.start() + elif self.opts.action == OptAction.LIST: + print(prog.name) def run(self): - if self.opts.programs_list is None: + if self.opts.action == OptAction.LIST_LEVELDB_KEY: + from game_backuper.leveldb import have_leveldb + if not have_leveldb: + raise NotImplementedError('Leveldb is not supported.') + from game_backuper.leveldb import list_leveldb_entries + for db in self.opts.programs_list: + if exists(db): + if isdir(db): + print(f'Keys in "{db}":') + for i in list_leveldb_entries(db): + print(i) + else: + raise FileExistsError(f'"{db}" should be a directory.') + else: + raise FileNotFoundError(f'Can not find "{db}"') + elif self.opts.programs_list is None: for prog in self.conf.progs: self.deal_prog(prog) else: diff --git a/game_backuper/cml.py b/game_backuper/cml.py index d140e02..92204f5 100644 --- a/game_backuper/cml.py +++ b/game_backuper/cml.py @@ -13,6 +13,8 @@ else: class OptAction(IntEnum): BACKUP = 0 RESTORE = 1 + LIST = 2 + LIST_LEVELDB_KEY = 3 @staticmethod def from_str(v: str) -> IntEnum: @@ -22,6 +24,10 @@ class OptAction(IntEnum): return OptAction.BACKUP elif t == 'restore': return OptAction.RESTORE + elif t == 'list': + return OptAction.LIST + elif t == 'list_leveldb_key': + return OptAction.LIST_LEVELDB_KEY else: raise TypeError('Must be str.') @@ -33,19 +39,26 @@ class Opts: def __init__(self, cml: List[str]): try: - r = getopt(cml, 'hc:', []) + r = getopt(cml, 'hc:', ['help', 'config=']) for i in r[0]: - if i[0] == '-h': + if i[0] == '-h' or i[0] == '--help': self.print_help() import sys sys.exit(0) - elif i[0] == '-c': + elif i[0] == '-c' or i[0] == '--config': self.config_file = i[1] if len(r[1]) > 0: cm = r[1] re = OptAction.from_str(cm[0]) if re is not None: self.action = re + if re == OptAction.LIST: + return + elif re == OptAction.LIST_LEVELDB_KEY: + if len(cm) == 1: + raise GetoptError('list_leveldb_key need at least one db_path.') # noqa: E501 + self.programs_list = cm[1:] + return li = cm if re is None else cm[1:] if len(li) > 0: self.programs_list = li @@ -56,4 +69,9 @@ class Opts: sys.exit(-1) def print_help(self): - print('''game-backuper [options] [backup|restore] [game names]''') + print('''game-backuper [options] [backup|restore] [ [...]] +game-backuper [options] list +game-backuper [options] list_leveldb_key [ [...]] +Options: + -h, --help Print help message. + -c, --config Set config file.''')