Use Paramiko and Gitpython for backups

ticket-769
Vadim vtroshchinskiy 2024-09-16 17:40:09 +02:00
parent ef41ec5a89
commit 6e046b6dee
2 changed files with 25 additions and 10 deletions

View File

@ -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)

View File

@ -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