tools.win_pg_dump_controller
2022-01-30
Child:a22dd63ba19e
tools.win_pg_dump_controller/win_pg_dump_controller/executor.py
..init
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/win_pg_dump_controller/executor.py Sun Jan 30 22:17:39 2022 +0300 1.3 @@ -0,0 +1,64 @@ 1.4 +# coding: utf-8 1.5 + 1.6 +import subprocess as sp 1.7 +from os.path import join as p_join 1.8 +from os import environ 1.9 + 1.10 +from .store_controller import StoreController 1.11 +from .log_controller import LogController 1.12 +from .config import Config, DBTask 1.13 +from .error import Error 1.14 + 1.15 + 1.16 +class ExecutorError(Error): 1.17 + pass 1.18 + 1.19 + 1.20 +def backup(task: DBTask, config: Config, log_controller: LogController): 1.21 + log = log_controller.get_logger(f'{task.name}.executor') 1.22 + log_t = log.get_timing() 1.23 + log(log_t(f'Начинаем копирование {task.name}')) 1.24 + 1.25 + 1.26 + stor = StoreController(task) 1.27 + backup_item = stor.new_item() 1.28 + 1.29 + log(log_t(f'Копируется "{task.db_name}" -> "{backup_item.get_path()}" ' 1.30 + f'с параметрами pg_dump "{config.pg_dump_flags}"')) 1.31 + 1.32 + pg_dump = p_join(config.pg_bin_path, 'pg_dump.exe') 1.33 + pg_dump = ( 1.34 + f'"{pg_dump}" {config.pg_dump_flags} -F c -v --clean ' 1.35 + f'-U "{task.user_name}" -h "{task.host_name}" -p "{task.port}" ' 1.36 + f'-f "{backup_item.get_path()}" {task.db_name}' 1.37 + ) 1.38 + 1.39 + environ['PGPASSWORD'] = task.passwd 1.40 + 1.41 + pglog_name = log_controller.get_filename(task.name) 1.42 + pglog_fd = sp.DEVNULL if pglog_name is None else open(pglog_name, 'w') 1.43 + 1.44 + log(log_t(f'Пробуем запустить: {pg_dump}')) 1.45 + 1.46 + try: 1.47 + cmd = sp.Popen(pg_dump, stderr=sp.STDOUT, stdout=pglog_fd, shell=True) 1.48 + cmd.wait() 1.49 + 1.50 + log(log_t(f'Команда выполнена, статус возврата "{cmd.returncode}", журнал: "{pglog_name}"')) 1.51 + 1.52 + if cmd.returncode != 0: 1.53 + raise ExecutorError(f'Не нулевой код возврата, подробности в "{pglog_name}"') 1.54 + 1.55 + except: 1.56 + stor.remove(backup_item) 1.57 + raise 1.58 + 1.59 + else: 1.60 + stor.add_item(backup_item) 1.61 + 1.62 + log(log_t('Очистка старых копий')) 1.63 + 1.64 + log(log_t('\n'.join(map(lambda x: f'- {x}', stor.clean(config.teir1_days, config.teir2_copies_interval, 1.65 + config.tier2_store_days))))) 1.66 + 1.67 + stor.save_index()