import subprocess class local_dir_remote: def __init__(self, config): self.config = config self.path = config["path"] def list_dir(self, recursive_search = False): path = Path(self.path) file_list = [] delta = timedelta(minutes=2) glob_pattern = '*' glob_pattern_recursive = '**' if not recursive_search: #os. for file_demo in list(path.glob(glob_pattern)): mtime = datetime.fromtimestamp(os.stat(file_demo).st_mtime) if mtime < datetime.now() - delta: file_list.append(file_demo) else: for file_directory in list(path.glob(glob_pattern_recursive)): try: for files in list(file_directory.glob(glob_pattern)): if '/maps' in str(files): continue file_list.append(files) except Exception: continue return file_list def zip_local_directory(self, job): source_files = self.list_dir(True) zipname = f'{job["zipname"]}-{str(datetime.now()).split(" ")[0]}.tar.xz' #-T3 = 3 threads, the backups are meant to run in the night at 5 am to not interfere with players. exec_command_state = f"XZ_OPT='-T3 --memlimit-compress=70%' tar --exclude='/home/gameservers/.python_history' --exclude='/home/gameservers/.cache' --exclude='/home/gameservers/css_mg/cstrike/demos' --exclude='/home/gameservers/css_mg/cstrike/download' --exclude='/home/gameservers/css_mg/cstrike/addons/sourcemod/data' --exclude='/home/gameservers/css_jb/cstrike/logs' --exclude='/home/gameservers/css_jb/cstrike/download' --exclude='/home/gameservers/css_jb/cstrike/downloadlists' --exclude='/home/gameservers/css_ze/cstrike/download' --exclude='/home/gameservers/css_ze/cstrike/maps' --exclude='/home/gameservers/css_2_ze/cstrike/maps' --exclude='/home/gameservers/css_zr/cstrike/maps' --exclude='/home/gameservers/css_mg/cstrike/maps' --exclude='/home/gameservers/css_gg/cstrike/maps' --exclude='/home/gameservers/css_jb/cstrike/maps' --exclude='/home/gameservers/css_2_ze/cstrike/download' --exclude='/home/gameservers/css_dev/cstrike/download' --exclude='/home/gameservers/css_2_ze/cstrike/addons/sourcemod/data' --exclude='/home/gameservers/svencoop/svencoop/logs' --exclude='/home/gameservers/css_gg/cstrike/logs' --exclude='/home/gameservers/css_gg/cstrike/download' --exclude='/home/gameservers/css_gg/cstrike/downloadlists' --exclude='/home/gameservers/css_mg_dev/cstrike/demos' --exclude='/home/gameservers/css_mg_dev/cstrike/download' --exclude='/home/gameservers/css_zr/cstrike/download' --exclude='/home/gameservers/svencoop/svencoop_addon/maps' --ignore-failed-read -cJf {zipname} {self.path}" print("exec_command_state: ", exec_command_state) subprocess.run([exec_command_state], shell=True) return str(Path.cwd()) + '/' + zipname def delete_local_demo(self, pathfile): with contextlib.suppress(FileNotFoundError): if str(pathfile).endswith('.dem'): os.remove(pathfile) print('removed demo: ', pathfile) def delete_local_zip(self, zip_file_path): with contextlib.suppress(FileNotFoundError): if (str(zip_file_path).endswith('.tar.xz')): os.remove(zip_file_path) print('removed tar xz: ', zip_file_path)