creat script
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
FILES = [
|
||||||
|
"/sustancia/home/saves/Beetle PSX HW/Suikoden II (USA) (Bug Fix) (Pyriel) (2.02.078).1.mcr",
|
||||||
|
"/sustancia/home/saves/Beetle PSX HW/Suikoden II (USA) (Bug Fix) (Pyriel) (2.02.078).srm",
|
||||||
|
]
|
||||||
+76
@@ -0,0 +1,76 @@
|
|||||||
|
import os
|
||||||
|
import time
|
||||||
|
import shutil
|
||||||
|
import hashlib
|
||||||
|
from datetime import datetime
|
||||||
|
from files import FILES
|
||||||
|
|
||||||
|
CHECK_INTERVAL = 60 # segundos
|
||||||
|
|
||||||
|
def sha256sum(path):
|
||||||
|
"""Devuelve el hash SHA256 del fichero."""
|
||||||
|
h = hashlib.sha256()
|
||||||
|
with open(path, "rb") as f:
|
||||||
|
for chunk in iter(lambda: f.read(4096), b""):
|
||||||
|
h.update(chunk)
|
||||||
|
return h.hexdigest()
|
||||||
|
|
||||||
|
def ensure_backup_dir(file_path):
|
||||||
|
"""Crea backup/<nombre_sin_ext>/ si no existe."""
|
||||||
|
file_name = os.path.basename(file_path)
|
||||||
|
name, _ = os.path.splitext(file_name)
|
||||||
|
backup_dir = os.path.join("backup", name)
|
||||||
|
os.makedirs(backup_dir, exist_ok=True)
|
||||||
|
return backup_dir
|
||||||
|
|
||||||
|
def get_latest_backup(file_path):
|
||||||
|
"""Devuelve la ruta del backup más reciente o None si no hay."""
|
||||||
|
backup_dir = ensure_backup_dir(file_path)
|
||||||
|
files = sorted(os.listdir(backup_dir), reverse=True)
|
||||||
|
if not files:
|
||||||
|
return None
|
||||||
|
return os.path.join(backup_dir, files[0])
|
||||||
|
|
||||||
|
def backup_file(file_path):
|
||||||
|
"""Crea una copia con timestamp."""
|
||||||
|
backup_dir = ensure_backup_dir(file_path)
|
||||||
|
file_name = os.path.basename(file_path)
|
||||||
|
name, ext = os.path.splitext(file_name)
|
||||||
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||||
|
dest = os.path.join(backup_dir, f"{name}_{timestamp}{ext}")
|
||||||
|
shutil.copy2(file_path, dest)
|
||||||
|
print(f"[BACKUP] Copia creada: {dest}")
|
||||||
|
|
||||||
|
def process_file(file_path):
|
||||||
|
"""Comprueba si hay cambios y crea backup si es necesario."""
|
||||||
|
if not os.path.isfile(file_path):
|
||||||
|
print(f"[WARN] No existe: {file_path}")
|
||||||
|
return
|
||||||
|
|
||||||
|
latest = get_latest_backup(file_path)
|
||||||
|
|
||||||
|
if latest is None:
|
||||||
|
print(f"[INIT] No hay copia previa de {file_path}, creando primera copia...")
|
||||||
|
backup_file(file_path)
|
||||||
|
return
|
||||||
|
|
||||||
|
# Comparamos hashes
|
||||||
|
current_hash = sha256sum(file_path)
|
||||||
|
latest_hash = sha256sum(latest)
|
||||||
|
|
||||||
|
if current_hash != latest_hash:
|
||||||
|
print(f"[CHANGE] Detectado cambio en {file_path}, creando nueva copia...")
|
||||||
|
backup_file(file_path)
|
||||||
|
else:
|
||||||
|
print(f"[OK] Sin cambios en {file_path}")
|
||||||
|
|
||||||
|
def main():
|
||||||
|
print("Iniciando watcher de saves...")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
for f in FILES:
|
||||||
|
process_file(f)
|
||||||
|
time.sleep(CHECK_INTERVAL)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Reference in New Issue
Block a user