added mysqldump support

This commit is contained in:
christian 2021-11-02 21:36:38 +01:00
parent 30f4228f24
commit 33749c149c
6 changed files with 47 additions and 8 deletions

View File

@ -10,6 +10,12 @@
##globally: apt-get install zip ##globally: apt-get install zip
##requires an ~/.my.cnf with
[mysqldump]
host=""
user=""
password=""
##python3 file_mover.py config.json ##python3 file_mover.py config.json

View File

@ -198,7 +198,8 @@
"job_description": "dumps the remote webservices vm databases and moves them to backup/fastdl/demo vm", "job_description": "dumps the remote webservices vm databases and moves them to backup/fastdl/demo vm",
"src": "sftp_vm_webservices_src_mysqldump", "src": "sftp_vm_webservices_src_mysqldump",
"dest": "sftp_vm_backups_dest_webservices", "dest": "sftp_vm_backups_dest_webservices",
"zipname":"webservices_mysqldump_backup" "zipname":"webservices_mysqldump_backup",
"download_dir": "/home/file_mover/"
}, },
{ {
"job_name": "backup_remote_xenforo_etc", "job_name": "backup_remote_xenforo_etc",
@ -229,7 +230,8 @@
"job_description": "dumps the remote xenforo vm databases and moves them to backup/fastdl/demo vm", "job_description": "dumps the remote xenforo vm databases and moves them to backup/fastdl/demo vm",
"src": "sftp_vm_xenforo_src_mysqldump", "src": "sftp_vm_xenforo_src_mysqldump",
"dest": "sftp_vm_backups_dest_xenforo", "dest": "sftp_vm_backups_dest_xenforo",
"zipname":"xenforo_mysqldump_backup" "zipname":"xenforo_mysqldump_backup",
"download_dir": "/home/file_mover/"
}, },
{ {
"job_name": "backup_remote_hlstats_etc", "job_name": "backup_remote_hlstats_etc",
@ -252,7 +254,8 @@
"job_description": "dumps the remote hlstats vm databases and moves them to backup/fastdl/demo vm", "job_description": "dumps the remote hlstats vm databases and moves them to backup/fastdl/demo vm",
"src": "sftp_vm_hlstats_src_mysqldump", "src": "sftp_vm_hlstats_src_mysqldump",
"dest": "sftp_vm_backups_dest_hlstats", "dest": "sftp_vm_backups_dest_hlstats",
"zipname":"hlstats_mysqldump_backup" "zipname":"hlstats_mysqldump_backup",
"download_dir": "/home/file_mover/"
}, },
{ {
"job_name": "backup_remote_hlstats_home", "job_name": "backup_remote_hlstats_home",
@ -320,7 +323,7 @@
} }
}, },
"ip":{ "ip":{
"password": { "username": {
"password": "password" "password": "password"
} }
} }

View File

@ -68,9 +68,24 @@ def main():
src.delete_local_zip(zip_file_path) src.delete_local_zip(zip_file_path)
dest.delete_remote_zips(zip_file_path) dest.delete_remote_zips(zip_file_path)
elif "mysqldump" in job["job_name"]: elif "mysqldump" in job["job_name"]:
pass src.remote_channel_command(job, "mysqldump")
zipname = src.remote_channel_command(job, "zip_mysqldump")
if zipname is None:
logging.warning(f'failed zipping remote directory at job {job}')
sys.exit(1)
local_zip_path_name = src.get_remote_files(job, zipname)
if local_zip_path_name is None:
logging.warning(f'failed getting remote zip at job {job}')
src.delete_remote_zip_temp(zipname)
sys.exit(1)
src.delete_remote_zip_temp(zipname)
if not dest.put(local_zip_path_name, dest.path):
logging.warning(f'failed putting local zip {local_zip_path_name} at job {job}')
src.delete_local_zip(local_zip_path_name)
sys.exit(1)
src.delete_local_zip(local_zip_path_name)
elif "backup_remote" in job["job_name"]: elif "backup_remote" in job["job_name"]:
zipname = src.zip_remote_directory(job) zipname = src.remote_channel_command(job, "zip_recursive")
if zipname is None: if zipname is None:
logging.warning(f'failed zipping remote directory at job {job}') logging.warning(f'failed zipping remote directory at job {job}')
sys.exit(1) sys.exit(1)

View File

@ -16,6 +16,7 @@ class local_dir_remote:
glob_pattern = '*' glob_pattern = '*'
glob_pattern_recursive = '**' glob_pattern_recursive = '**'
if not recursive_search: if not recursive_search:
#os.
for file_demo in list(path.glob(glob_pattern)): for file_demo in list(path.glob(glob_pattern)):
mtime = datetime.fromtimestamp(os.stat(file_demo).st_mtime) mtime = datetime.fromtimestamp(os.stat(file_demo).st_mtime)
if mtime < datetime.now() - delta: if mtime < datetime.now() - delta:

View File

@ -3,6 +3,7 @@ from paramiko.ssh_exception import SSHException, NoValidConnectionsError
import time import time
import hashlib import hashlib
import stat import stat
import sys
from datetime import datetime, timedelta from datetime import datetime, timedelta
import os import os
@ -43,11 +44,18 @@ class sftp_remote:
def ssh_disconnect(self): def ssh_disconnect(self):
self.ssh.close() self.ssh.close()
def zip_remote_directory(self, job): def remote_channel_command(self, job, command_state):
zipname = f'{job["zipname"]}-{str(datetime.now()).split(" ")[0]}.zip' zipname = f'{job["zipname"]}-{str(datetime.now()).split(" ")[0]}.zip'
self.ssh_connect() self.ssh_connect()
channel = self.ssh.get_transport().open_session(timeout=120) channel = self.ssh.get_transport().open_session(timeout=120)
exec_cmd = f'cd /home/{self.username}/; zip -r {zipname} {self.path}' if 'zip_recursive' == command_state:
exec_command_state = f'zip -r {zipname} {self.path}'
elif 'mysqldump' == command_state:
#check README for my.cnf regarding how this works
exec_command_state = f'mysqldump -u root --all-databases > mysqldump.sql'
else: #zip_mysqldump
exec_command_state = f'zip {zipname} /home/{self.username}/mysqldump.sql'
exec_cmd = f'cd /home/{self.username}/; {exec_command_state}'
keyboard_interrupt = False keyboard_interrupt = False
try: try:
channel.exec_command(exec_cmd) channel.exec_command(exec_cmd)
@ -63,6 +71,11 @@ class sftp_remote:
keyboard_interrupt = True keyboard_interrupt = True
finally: finally:
channel.close() channel.close()
if 'zip_mysqldump' == command_state:
file_path = f'/home/{self.username}/mysqldump.sql'
self.connect()
self.sftp.remove(file_path)
self.disconnect()
self.ssh_disconnect() self.ssh_disconnect()
if keyboard_interrupt: if keyboard_interrupt:
print("manually interrupted") print("manually interrupted")

View File

@ -3,6 +3,7 @@ Description=Moves demos from the local machine to remote destinations every 5 mi
[Service] [Service]
Type=simple Type=simple
#the ovh gameservers uses the gameserver user and /home/gameservers/demos instead due to permission problems with auto generated demos
User=file_mover User=file_mover
WorkingDirectory=/home/file_mover WorkingDirectory=/home/file_mover
ExecStart=/home/file_mover/run_demo_mover.sh ExecStart=/home/file_mover/run_demo_mover.sh