haxorqt
Home
Console
Upload
information
Create File
Create Folder
About
:
/
home
/
sc1jaqa5103
/
dev.puv-editions.fr
/
SFTP-SYNC
/
Filename :
ftp-onix.php
back
Copy
<?php /** * Script de synchronisation ONIX quotidien * À exécuter via cron tous les matins * * Fonctionnalités : * - Récupération du fichier ONIX daté du jour via SFTP * - Copie dans le répertoire local * - Exécution de la commande wp sync-onix * - Envoi d'un rapport par email */ // Configuration $config = [ 'sftp' => [ 'host' => 'depot-v2.adilibre.io', 'port' => 22, 'username' => 'sftp-afpu', 'password' => 'XbsBO+IxK/LiwyHr:ufNtNN85', 'source_dir' => '/' ], 'local' => [ 'target_dir' => '/home/sc1jaqa5103/dev.puv-editions.fr/DEPOT-PIM', 'wp_path' => '/home/sc1jaqa5103/dev.puv-editions.fr', 'wp_cli_path' => '/usr/local/bin/wp' ], 'mail' => [ 'to' => 'admin@monsoft.com', 'from' => 'noreply@puv-editions.fr', 'subject' => 'Rapport de synchronisation PIM/ONIX' ] ]; // Logs $logFile = '/home/sc1jaqa5103/dev.puv-editions.fr/SFTP-SYNC/onix-sync.log'; function writeLog($message) { global $logFile; $timestamp = date('Y-m-d H:i:s'); file_put_contents($logFile, "[$timestamp] $message\n", FILE_APPEND | LOCK_EX); echo "[$timestamp] $message\n"; } function sendEmail($subject, $message, $config) { $headers = [ 'From' => $config['mail']['from'], 'Reply-To' => $config['mail']['from'], 'X-Mailer' => 'PHP/' . phpversion(), 'Content-Type' => 'text/plain; charset=UTF-8' ]; $headerString = ''; foreach ($headers as $key => $value) { $headerString .= "$key: $value\r\n"; } return mail($config['mail']['to'], $subject, $message, $headerString); } function generateFileName($date = null) { if (!$date) { $date = new DateTime(); } // Format : adilibre-pim-AFPU-20240511T002201124Z-2.onix // On cherche les fichiers du jour (peu importe l'heure) $dateStr = $date->format('Ymd'); return "adilibre-pim-AFPU-{$dateStr}*-*.onix"; } function connectSFTP($config) { $connection = ssh2_connect($config['sftp']['host'], $config['sftp']['port']); if (!$connection) { throw new Exception("Impossible de se connecter au serveur SFTP"); } if (!ssh2_auth_password($connection, $config['sftp']['username'], $config['sftp']['password'])) { throw new Exception("Échec de l'authentification SFTP"); } $sftp = ssh2_sftp($connection); if (!$sftp) { throw new Exception("Impossible d'initialiser la session SFTP"); } return ['connection' => $connection, 'sftp' => $sftp]; } function findTodayFile($sftp, $sourceDir) { $today = new DateTime(); $datePattern = $today->format('Ymd'); // Liste les fichiers dans le répertoire source $handle = opendir("ssh2.sftp://$sftp$sourceDir"); if (!$handle) { throw new Exception("Impossible de lister le répertoire distant"); } $foundFile = null; while (($file = readdir($handle)) !== false) { if ($file === '.' || $file === '..') continue; // Vérifie si le fichier correspond au pattern du jour if (preg_match("/^adilibre-pim-AFPU-{$datePattern}T\d+Z-\d+\.onix$/", $file)) { $foundFile = $file; break; } } closedir($handle); return $foundFile; } function downloadFile($sftp, $remoteFile, $localFile, $sourceDir) { $remotePath = rtrim($sourceDir, '/') . '/' . $remoteFile; $remoteStream = fopen("ssh2.sftp://$sftp$remotePath", 'r'); if (!$remoteStream) { throw new Exception("Impossible d'ouvrir le fichier distant : $remotePath"); } $localStream = fopen($localFile, 'w'); if (!$localStream) { fclose($remoteStream); throw new Exception("Impossible de créer le fichier local : $localFile"); } $bytes = stream_copy_to_stream($remoteStream, $localStream); fclose($remoteStream); fclose($localStream); if ($bytes === false) { throw new Exception("Erreur lors du téléchargement du fichier"); } return $bytes; } function executeWpCommand($wpPath, $wpCliPath) { // Forcer un PATH minimal pour l'environnement cron putenv('PATH=/usr/local/bin:/usr/bin:/bin'); $command = "$wpCliPath --path=$wpPath sync-onix 2>&1"; writeLog("Exécution de la commande : $command"); $output = []; $returnCode = 0; exec($command, $output, $returnCode); $outputStr = implode("\n", $output); writeLog("Code de retour : $returnCode"); writeLog("Sortie : $outputStr"); if ($returnCode !== 0) { throw new Exception("Erreur lors de l'exécution de wp sync-onix : $outputStr"); } return $outputStr; } // Script principal try { writeLog("=== DÉBUT DU TRAITEMENT PIM/ONIX ==="); // Vérification des dépendances if (!extension_loaded('ssh2')) { throw new Exception("L'extension PHP ssh2 n'est pas installée"); } // Création du répertoire cible si nécessaire if (!is_dir($config['local']['target_dir'])) { if (!mkdir($config['local']['target_dir'], 0755, true)) { throw new Exception("Impossible de créer le répertoire : " . $config['local']['target_dir']); } writeLog("Répertoire créé : " . $config['local']['target_dir']); } // Connexion SFTP writeLog("Connexion au serveur SFTP..."); $sftpConnection = connectSFTP($config); $sftp = $sftpConnection['sftp']; // Recherche du fichier du jour writeLog("Recherche du fichier ONIX du jour..."); $todayFile = findTodayFile($sftp, $config['sftp']['source_dir']); if (!$todayFile) { throw new Exception("Aucun fichier ONIX trouvé pour la date du jour"); } writeLog("Fichier trouvé : $todayFile"); // Téléchargement du fichier $localFilePath = rtrim($config['local']['target_dir'], '/') . '/' . $todayFile; writeLog("Téléchargement vers : $localFilePath"); $bytesDownloaded = downloadFile($sftp, $todayFile, $localFilePath, $config['sftp']['source_dir']); writeLog("Téléchargement terminé : $bytesDownloaded octets"); // Fermeture de la connexion SFTP ssh2_disconnect($sftpConnection['connection']); // Exécution de la commande wp writeLog("Lancement de la synchronisation WordPress..."); $wpOutput = executeWpCommand($config['local']['wp_path'], $config['local']['wp_cli_path']); // Rapport de succès $successMessage = "Le traitement du fichier $todayFile s'est bien déroulé.\n\n"; $successMessage .= "Détails :\n"; $successMessage .= "- Fichier téléchargé : $todayFile ($bytesDownloaded octets)\n"; $successMessage .= "- Emplacement local : $localFilePath\n"; $successMessage .= "- Commande wp exécutée avec succès\n"; $successMessage .= "\nSortie de la commande wp :\n$wpOutput"; writeLog("Envoi du rapport par email..."); if (sendEmail($config['mail']['subject'] . ' - Succès', $successMessage, $config)) { writeLog("Email de succès envoyé"); } else { writeLog("ERREUR : Impossible d'envoyer l'email de succès"); } writeLog("=== TRAITEMENT TERMINÉ AVEC SUCCÈS ==="); } catch (Exception $e) { $errorMessage = $e->getMessage(); writeLog("ERREUR : $errorMessage"); // Rapport d'erreur par email $errorReport = "Une erreur s'est produite lors du traitement PIM/ONIX :\n\n"; $errorReport .= "Erreur : $errorMessage\n"; $errorReport .= "Date/Heure : " . date('Y-m-d H:i:s') . "\n"; $errorReport .= "\nConsultez le fichier de log pour plus de détails : $logFile"; if (sendEmail($config['mail']['subject'] . ' - ERREUR', $errorReport, $config)) { writeLog("Email d'erreur envoyé"); } else { writeLog("ERREUR : Impossible d'envoyer l'email d'erreur"); } writeLog("=== TRAITEMENT TERMINÉ AVEC ERREUR ==="); exit(1); } ?>