Files
cronhub/scripts/init_sync_job.py
T
Cursor AgentandCédric TOMAZ efb428b4e7 Ajout système de synchronisation automatique Gitea → GitHub
- Ajout du script sync_gitea_to_github.py pour synchroniser tous les repos
- Ajout du script init_sync_job.py pour créer le cron job dans CronHub
- Ajout du champ 'category' au modèle Job pour classification
- Configuration du job pour exécution toutes les heures (0 * * * *)
- Documentation complète dans scripts/README_SYNC.md
- Ajout .gitignore pour exclure __pycache__ et fichiers temporaires

Co-authored-by: Cédric TOMAZ <percolouco@users.noreply.github.com>
2026-03-18 09:33:11 +00:00

127 lines
3.8 KiB
Python
Executable File

#!/usr/bin/env python3
"""
Script d'initialisation du job de synchronisation Gitea → GitHub dans CronHub
Crée ou met à jour le cron job pour une exécution toutes les heures
"""
import json
import sys
from urllib.request import urlopen, Request
from urllib.error import URLError, HTTPError
# Configuration
CRONHUB_URL = "https://cronhub.nas.percolouco.com"
JOB_NAME = "Sync Gitea → GitHub"
JOB_CATEGORY = "sync"
JOB_SCHEDULE = "0 * * * *" # Toutes les heures à la minute 0
JOB_COMMAND = "nsenter --target 1 --mount --uts --ipc --net --pid -- python3 /opt/container/cronhub/scripts/sync_gitea_to_github.py"
JOB_DESCRIPTION = "Synchronisation automatique des dépôts Gitea (http://192.168.1.29:3500/perco) vers GitHub (percolouco)"
def log(message):
"""Affiche un message"""
print(f"[INFO] {message}")
def api_request(url, method="GET", data=None):
"""Effectue une requête HTTP vers l'API CronHub"""
headers = {"Content-Type": "application/json"}
if data:
data = json.dumps(data).encode('utf-8')
req = Request(url, headers=headers, data=data, method=method)
try:
with urlopen(req, timeout=30) as response:
return json.loads(response.read().decode('utf-8'))
except HTTPError as e:
error_msg = e.read().decode('utf-8')
log(f"Erreur HTTP {e.code} pour {url}: {error_msg}")
return None
except URLError as e:
log(f"Erreur URL pour {url}: {e.reason}")
return None
def find_existing_job():
"""Cherche si un job avec le même nom existe déjà"""
log(f"Recherche d'un job existant nommé '{JOB_NAME}'...")
url = f"{CRONHUB_URL}/api/jobs"
jobs = api_request(url)
if jobs is None:
log("Impossible de récupérer la liste des jobs")
return None
for job in jobs:
if job.get("name") == JOB_NAME:
log(f"Job existant trouvé: ID={job['id']}")
return job
log("Aucun job existant trouvé")
return None
def create_job():
"""Crée un nouveau job dans CronHub"""
log("Création d'un nouveau job...")
url = f"{CRONHUB_URL}/api/jobs"
data = {
"name": JOB_NAME,
"schedule": JOB_SCHEDULE,
"command": JOB_COMMAND,
"description": JOB_DESCRIPTION,
"category": JOB_CATEGORY,
"enabled": True
}
result = api_request(url, method="POST", data=data)
if result:
log(f"✓ Job créé avec succès: ID={result['id']}")
return True
else:
log("✗ Échec de la création du job")
return False
def update_job(job_id):
"""Met à jour un job existant dans CronHub"""
log(f"Mise à jour du job existant: ID={job_id}")
url = f"{CRONHUB_URL}/api/jobs/{job_id}"
data = {
"name": JOB_NAME,
"schedule": JOB_SCHEDULE,
"command": JOB_COMMAND,
"description": JOB_DESCRIPTION,
"category": JOB_CATEGORY,
"enabled": True
}
result = api_request(url, method="PUT", data=data)
if result:
log(f"✓ Job mis à jour avec succès")
return True
else:
log("✗ Échec de la mise à jour du job")
return False
def main():
"""Fonction principale"""
log("=== Initialisation du job de synchronisation Gitea → GitHub ===")
# Vérifier si le job existe déjà
existing_job = find_existing_job()
if existing_job:
# Mettre à jour le job existant
success = update_job(existing_job["id"])
else:
# Créer un nouveau job
success = create_job()
if success:
log("=== Configuration terminée avec succès ===")
log(f"Le job s'exécutera toutes les heures (schedule: {JOB_SCHEDULE})")
log(f"Vérifiez sur {CRONHUB_URL}")
sys.exit(0)
else:
log("=== Échec de la configuration ===")
sys.exit(1)
if __name__ == "__main__":
main()