From 6e046b6deedd03f0ef6fed101a18d38fb345a504 Mon Sep 17 00:00:00 2001 From: Vadim Troshchinskiy Date: Mon, 16 Sep 2024 17:40:09 +0200 Subject: [PATCH] Use Paramiko and Gitpython for backups --- api/gitapi.py | 27 +++++++++++++++++---------- api/requirements.txt | 8 ++++++++ 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/api/gitapi.py b/api/gitapi.py index 9f051b0..da46772 100644 --- a/api/gitapi.py +++ b/api/gitapi.py @@ -10,6 +10,7 @@ from flask import Flask, request from flask_executor import Executor import subprocess from flask import stream_with_context, Response +import paramiko repositories_base_path = "/opt/opengnsys/images" @@ -22,17 +23,23 @@ executor = Executor(app) tasks = {} + def do_repo_backup(repo, params): - user = params["ssh_user"] - server = params["ssh_server"] - filename = params["filename"] + gitrepo = git.Repo(f"{repositories_base_path}/{repo}.git") - os.chdir(repositories_base_path) - os.chdir(f"{repo}.git") + ssh = paramiko.SSHClient() + ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) - subprocess.run(f"git archive --format=tar HEAD | ssh {user}@{server} -T \"cat > {filename}\"", shell=True, check=True) - #sleep(10) + ssh.connect(params["ssh_server"], params["ssh_port"], params["ssh_user"]) + sftp = ssh.open_sftp() + + + with sftp.file(params["filename"], mode='wb+') as remote_file: + gitrepo.archive(remote_file, format="tar.gz") + + + return True def do_repo_sync(repo, params): gitrepo = git.Repo(f"{repositories_base_path}/{repo}.git") @@ -137,9 +144,9 @@ def backup_repo(repo): if data is None: return jsonify({"error" : "Parameters missing"}), 400 - dest_server = data["ssh_server"] - dest_user = data["ssh_user"] - dest_file = data["filename"] + + if not "ssh_port" in data: + data["ssh_port"] = 22 future = executor.submit(do_repo_backup, repo, data) diff --git a/api/requirements.txt b/api/requirements.txt index 985e8b7..5c63be4 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -1,17 +1,25 @@ +bcrypt==4.0.1 +cffi==1.15.1 click==8.0.4 colorterm==0.3 +contextvars==2.4 +cryptography==40.0.2 dataclasses==0.8 Flask==2.0.3 Flask-Executor==1.0.0 gitdb==4.0.9 GitPython==3.1.20 +immutables==0.19 importlib-metadata==4.8.3 itsdangerous==2.0.1 Jinja2==3.0.3 libarchive==0.4.7 MarkupSafe==2.0.1 nose==1.3.7 +paramiko==3.5.0 pkg_resources==0.0.0 +pycparser==2.21 +PyNaCl==1.5.0 smmap==5.0.0 termcolor==1.1.0 typing_extensions==4.1.1