tools.win_pg_dump_controller
tools.win_pg_dump_controller/win_pg_dump_controller/executor.py
. Не тот порт по умолчанию для postgres
| 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 stor = StoreController(task) |
| awgur@0 | 23 backup_item = stor.new_item() |
| awgur@0 | 24 |
| awgur@0 | 25 log(log_t(f'Копируется "{task.db_name}" -> "{backup_item.get_path()}" ' |
| awgur@0 | 26 f'с параметрами pg_dump "{config.pg_dump_flags}"')) |
| awgur@0 | 27 |
| awgur@0 | 28 pg_dump = p_join(config.pg_bin_path, 'pg_dump.exe') |
| awgur@0 | 29 pg_dump = ( |
| awgur@0 | 30 f'"{pg_dump}" {config.pg_dump_flags} -F c -v --clean ' |
| awgur@0 | 31 f'-U "{task.user_name}" -h "{task.host_name}" -p "{task.port}" ' |
| awgur@0 | 32 f'-f "{backup_item.get_path()}" {task.db_name}' |
| awgur@0 | 33 ) |
| awgur@0 | 34 |
| awgur@0 | 35 environ['PGPASSWORD'] = task.passwd |
| awgur@0 | 36 |
| awgur@0 | 37 pglog_name = log_controller.get_filename(task.name) |
| awgur@0 | 38 pglog_fd = sp.DEVNULL if pglog_name is None else open(pglog_name, 'w') |
| awgur@0 | 39 |
| awgur@0 | 40 log(log_t(f'Пробуем запустить: {pg_dump}')) |
| awgur@0 | 41 |
| awgur@0 | 42 try: |
| awgur@0 | 43 cmd = sp.Popen(pg_dump, stderr=sp.STDOUT, stdout=pglog_fd, shell=True) |
| awgur@0 | 44 cmd.wait() |
| awgur@0 | 45 |
| awgur@0 | 46 log(log_t(f'Команда выполнена, статус возврата "{cmd.returncode}", журнал: "{pglog_name}"')) |
| awgur@0 | 47 |
| awgur@0 | 48 if cmd.returncode != 0: |
| awgur@0 | 49 raise ExecutorError(f'Не нулевой код возврата, подробности в "{pglog_name}"') |
| awgur@0 | 50 |
| awgur@0 | 51 except: |
| awgur@0 | 52 stor.remove(backup_item) |
| awgur@0 | 53 raise |
| awgur@0 | 54 |
| awgur@0 | 55 else: |
| awgur@0 | 56 stor.add_item(backup_item) |
| awgur@0 | 57 |
| awgur@4 | 58 cleaned = stor.clean(config.teir1_days, config.tier2_store_days, config.teir2_copies_interval) |
| awgur@0 | 59 |
| awgur@1 | 60 if cleaned: |
| awgur@1 | 61 log(log_t('Очистка старых копий')) |
| awgur@4 | 62 log('\n'.join(map(lambda x: log_t(f'- {x}'), cleaned))) |
| awgur@1 | 63 |
| awgur@1 | 64 if stor.op_adv_status: |
| awgur@1 | 65 log(log_t('Расширенное состояние хранимых копий второго класса')) |
| awgur@4 | 66 log('\n'.join(map(lambda x: log_t(f'- {x}'), stor.op_adv_status))) |
| awgur@0 | 67 |
| awgur@0 | 68 stor.save_index() |