|
|
|
@ -7,6 +7,12 @@ import argparse
|
|
|
|
|
from typing import List |
|
|
|
|
from rich import print |
|
|
|
|
from rich.prompt import Prompt |
|
|
|
|
from rich.padding import Padding |
|
|
|
|
from rich.panel import Panel |
|
|
|
|
from rich.text import Text |
|
|
|
|
from rich.table import Table |
|
|
|
|
from rich.console import Console |
|
|
|
|
from rich import box |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@dataclass |
|
|
|
@ -19,9 +25,8 @@ class Job:
|
|
|
|
|
|
|
|
|
|
# Добавить обозначения {warn} {good} {error} {nice}, менять их на |
|
|
|
|
# символы и красить вывод консоли |
|
|
|
|
def run_job(job: Job) -> None: |
|
|
|
|
def run_job(job: Job, console: Console) -> None: |
|
|
|
|
"""Запусить задачу бэкапа.""" |
|
|
|
|
print(f"Начинаю {job.name}") |
|
|
|
|
|
|
|
|
|
date = datetime.today().strftime("%Y-%m-%d") |
|
|
|
|
time = datetime.now().strftime("%H%M") |
|
|
|
@ -30,13 +35,20 @@ def run_job(job: Job) -> None:
|
|
|
|
|
|
|
|
|
|
if not os.path.isdir(path): |
|
|
|
|
os.makedirs(path) |
|
|
|
|
|
|
|
|
|
# BOLDYELLOW="\e[1;33m[!]\e[0m" |
|
|
|
|
# ENDCOLOR="\e[0m" |
|
|
|
|
cmd = ( |
|
|
|
|
job.action.replace("{name}", job.name) |
|
|
|
|
.replace("{date}", date) |
|
|
|
|
.replace("{time}", time) |
|
|
|
|
.replace("{warn}", "\033[33m[!]\033[0m") |
|
|
|
|
) |
|
|
|
|
os.system(cmd) |
|
|
|
|
with console.status( |
|
|
|
|
f"[bold yellow]\[..][/bold yellow] [bold]{job.name}[/bold] начинаю ..." |
|
|
|
|
): |
|
|
|
|
os.system(cmd) |
|
|
|
|
|
|
|
|
|
print(f"[bold green]\[OK][/bold green] [bold]{job.name}[/bold] выполнено") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ask_about_backups(jobs: List[Job], force_all: bool) -> List[Job]: |
|
|
|
@ -60,7 +72,12 @@ def ask_about_backups(jobs: List[Job], force_all: bool) -> List[Job]:
|
|
|
|
|
изменено на True (задача активна), либо установленно False |
|
|
|
|
(задача не активна). |
|
|
|
|
""" |
|
|
|
|
if force_all: |
|
|
|
|
for job in jobs: |
|
|
|
|
job.active = True |
|
|
|
|
return jobs |
|
|
|
|
|
|
|
|
|
print(Panel(Text("Составляю список задач", justify="center"))) |
|
|
|
|
for job in jobs: |
|
|
|
|
answer = Prompt.ask( |
|
|
|
|
f"Архивируем [bold]{job.name}[/bold]?", |
|
|
|
@ -74,6 +91,7 @@ def ask_about_backups(jobs: List[Job], force_all: bool) -> List[Job]:
|
|
|
|
|
job.active = False |
|
|
|
|
print("[bold red]\[-] Пропуск задачи[/bold red]") |
|
|
|
|
|
|
|
|
|
print(Panel(Text("Список задач составлен, начинаю бэкап", justify="center"))) |
|
|
|
|
return jobs |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -109,18 +127,29 @@ if __name__ == "__main__":
|
|
|
|
|
help="выполнить все задачи из списка без запроса подтверждения", |
|
|
|
|
) |
|
|
|
|
args = parser.parse_args() |
|
|
|
|
|
|
|
|
|
console = Console() |
|
|
|
|
jobs = yaml_loader(os.path.abspath(args.file)) |
|
|
|
|
|
|
|
|
|
# если флаг принудительного бэкапа всего, то мы прохоидм в цикле |
|
|
|
|
# все джобы и ставим их active в true |
|
|
|
|
if not args.forceall: |
|
|
|
|
ask_about_backups(jobs) |
|
|
|
|
print("-----------------------") |
|
|
|
|
else: |
|
|
|
|
for j in jobs: |
|
|
|
|
j.active = True |
|
|
|
|
jobs = ask_about_backups(jobs, args.forceall) |
|
|
|
|
|
|
|
|
|
for j in jobs: |
|
|
|
|
if j.active: |
|
|
|
|
run_job(j) |
|
|
|
|
run_job(j, console) |
|
|
|
|
|
|
|
|
|
# table = Table(title="Результаты бэкапов", box=box.SIMPLE) |
|
|
|
|
# table.add_column("Задача", justify="right", style="cyan", no_wrap=True) |
|
|
|
|
# table.add_column("Архив", style="magenta") |
|
|
|
|
# table.add_column("Статус", justify="right", style="green") |
|
|
|
|
|
|
|
|
|
# table.add_row( |
|
|
|
|
# "Archives криппи и прочее", |
|
|
|
|
# "/back/Archives/Archives-{date}-{time}", |
|
|
|
|
# "ОК", |
|
|
|
|
# ) |
|
|
|
|
# table.add_row( |
|
|
|
|
# "Archivebox-emacs", |
|
|
|
|
# "/back/Archives/Archivebox-emacs", |
|
|
|
|
# "Пропуск", |
|
|
|
|
# ) |
|
|
|
|
|
|
|
|
|
# console.print(table, justify="center") |
|
|
|
|