tools.win_pg_dump_controller
2022-01-30
Child:a22dd63ba19e
tools.win_pg_dump_controller/win_pg_dump_controller/executor.py
..init
| awgur@0 | 1 # coding: utf-8 |
| awgur@0 | 2 |
| awgur@0 | 3 import subprocess as sp |
| awgur@0 | 4 from os.path import join as p_join |
| awgur@0 | 5 from os import environ |
| awgur@0 | 6 |
| awgur@0 | 7 from .store_controller import StoreController |
| awgur@0 | 8 from .log_controller import LogController |
| awgur@0 | 9 from .config import Config, DBTask |
| awgur@0 | 10 from .error import Error |
| awgur@0 | 11 |
| awgur@0 | 12 |
| awgur@0 | 13 class ExecutorError(Error): |
| awgur@0 | 14 pass |
| awgur@0 | 15 |
| awgur@0 | 16 |
| awgur@0 | 17 def backup(task: DBTask, config: Config, log_controller: LogController): |
| awgur@0 | 18 log = log_controller.get_logger(f'{task.name}.executor') |
| awgur@0 | 19 log_t = log.get_timing() |
| awgur@0 | 20 log(log_t(f'Начинаем копирование {task.name}')) |
| awgur@0 | 21 |
| awgur@0 | 22 |
| awgur@0 | 23 stor = StoreController(task) |
| awgur@0 | 24 backup_item = stor.new_item() |
| awgur@0 | 25 |
| awgur@0 | 26 log(log_t(f'Копируется "{task.db_name}" -> "{backup_item.get_path()}" ' |
| awgur@0 | 27 f'с параметрами pg_dump "{config.pg_dump_flags}"')) |
| awgur@0 | 28 |
| awgur@0 | 29 pg_dump = p_join(config.pg_bin_path, 'pg_dump.exe') |
| awgur@0 | 30 pg_dump = ( |
| awgur@0 | 31 f'"{pg_dump}" {config.pg_dump_flags} -F c -v --clean ' |
| awgur@0 | 32 f'-U "{task.user_name}" -h "{task.host_name}" -p "{task.port}" ' |
| awgur@0 | 33 f'-f "{backup_item.get_path()}" {task.db_name}' |
| awgur@0 | 34 ) |
| awgur@0 | 35 |
| awgur@0 | 36 environ['PGPASSWORD'] = task.passwd |
| awgur@0 | 37 |
| awgur@0 | 38 pglog_name = log_controller.get_filename(task.name) |
| awgur@0 | 39 pglog_fd = sp.DEVNULL if pglog_name is None else open(pglog_name, 'w') |
| awgur@0 | 40 |
| awgur@0 | 41 log(log_t(f'Пробуем запустить: {pg_dump}')) |
| awgur@0 | 42 |
| awgur@0 | 43 try: |
| awgur@0 | 44 cmd = sp.Popen(pg_dump, stderr=sp.STDOUT, stdout=pglog_fd, shell=True) |
| awgur@0 | 45 cmd.wait() |
| awgur@0 | 46 |
| awgur@0 | 47 log(log_t(f'Команда выполнена, статус возврата "{cmd.returncode}", журнал: "{pglog_name}"')) |
| awgur@0 | 48 |
| awgur@0 | 49 if cmd.returncode != 0: |
| awgur@0 | 50 raise ExecutorError(f'Не нулевой код возврата, подробности в "{pglog_name}"') |
| awgur@0 | 51 |
| awgur@0 | 52 except: |
| awgur@0 | 53 stor.remove(backup_item) |
| awgur@0 | 54 raise |
| awgur@0 | 55 |
| awgur@0 | 56 else: |
| awgur@0 | 57 stor.add_item(backup_item) |
| awgur@0 | 58 |
| awgur@0 | 59 log(log_t('Очистка старых копий')) |
| awgur@0 | 60 |
| awgur@0 | 61 log(log_t('\n'.join(map(lambda x: f'- {x}', stor.clean(config.teir1_days, config.teir2_copies_interval, |
| awgur@0 | 62 config.tier2_store_days))))) |
| awgur@0 | 63 |
| awgur@0 | 64 stor.save_index() |