diff --git a/public/api.php b/public/api.php index aa38c0f..d9cd532 100644 --- a/public/api.php +++ b/public/api.php @@ -2231,6 +2231,64 @@ try { echo json_encode($res); break; + case 'check_update': + $appDir = dirname(__DIR__); + $localVerJson = file_exists("{$appDir}/version.json") + ? json_decode((string)file_get_contents("{$appDir}/version.json"), true) + : ['version' => '1.2.0', 'changelog' => []]; + + $currentVer = $localVerJson['version'] ?? '1.2.0'; + $remoteVer = $currentVer; + $remoteChangelog = []; + $remoteDate = ''; + + exec("git --git-dir={$appDir}/.git fetch origin main --quiet 2>/dev/null", $output, $code); + $remoteJsonRaw = shell_exec("git --git-dir={$appDir}/.git show origin/main:version.json 2>/dev/null"); + if ($remoteJsonRaw) { + $remoteData = json_decode($remoteJsonRaw, true); + if (is_array($remoteData) && !empty($remoteData['version'])) { + $remoteVer = (string)$remoteData['version']; + $remoteChangelog = $remoteData['changelog'] ?? []; + $remoteDate = $remoteData['release_date'] ?? ''; + } + } + + $hasUpdate = version_compare($remoteVer, $currentVer, '>'); + $localHash = trim((string)shell_exec("git --git-dir={$appDir}/.git rev-parse HEAD 2>/dev/null")); + $remoteHash = trim((string)shell_exec("git --git-dir={$appDir}/.git rev-parse origin/main 2>/dev/null")); + if (!$hasUpdate && $localHash !== '' && $remoteHash !== '' && $localHash !== $remoteHash) { + $hasUpdate = true; + } + + echo json_encode([ + 'success' => true, + 'current_version' => $currentVer, + 'latest_version' => $remoteVer, + 'has_update' => $hasUpdate, + 'changelog' => $hasUpdate ? $remoteChangelog : ($localVerJson['changelog'] ?? []), + 'release_date' => $remoteDate ?: ($localVerJson['release_date'] ?? ''), + ]); + break; + + case 'run_update': + $output = []; + $code = 0; + exec("sudo /var/www/nexus-pbx/scripts/update.sh 2>&1", $output, $code); + $outputStr = implode("\n", $output); + + $appDir = dirname(__DIR__); + $newVerJson = file_exists("{$appDir}/version.json") + ? json_decode((string)file_get_contents("{$appDir}/version.json"), true) + : ['version' => '1.3.0']; + + echo json_encode([ + 'success' => ($code === 0), + 'new_version' => $newVerJson['version'] ?? '1.3.0', + 'output' => $outputStr, + 'message' => ($code === 0) ? "Mise à jour réussie !" : "Erreur lors de la mise à jour", + ]); + break; + default: http_response_code(400); echo json_encode([ diff --git a/public/assets/app.js b/public/assets/app.js index 0f24c9d..b504fae 100644 --- a/public/assets/app.js +++ b/public/assets/app.js @@ -144,6 +144,7 @@ async function loadState() { } renderAll(); loadBackups(); + checkSystemUpdate(false); startMetricsPolling(); } catch (err) { if (err.message !== 'Session expirée') { @@ -5636,3 +5637,132 @@ function copyYealinkUrl(inputId, btn) { showToast("Sélectionnez l'URL et appuyez sur Ctrl+C.", 'info'); }); } + +// ========================================================================= +// GESTIONNAIRE DE MISES À JOUR DU SYSTÈME NEXUSPBX (OTA) +// ========================================================================= +async function checkSystemUpdate(notify = false) { + const btnCheck = document.getElementById('btn-check-update'); + const btnRun = document.getElementById('btn-run-update'); + const statusText = document.getElementById('update-status-text'); + const lastChecked = document.getElementById('update-last-checked'); + const changelogContainer = document.getElementById('update-changelog-container'); + const changelogList = document.getElementById('update-changelog-list'); + const pingDot = document.getElementById('update-ping'); + const verTag = document.getElementById('system-version-tag'); + const appBadge = document.getElementById('app-version-badge'); + + if (btnCheck) { + btnCheck.disabled = true; + btnCheck.classList.add('opacity-50'); + } + + try { + const res = await fetch('/api.php?action=check_update'); + const data = await res.json(); + + if (lastChecked) { + const now = new Date(); + lastChecked.textContent = `Dernière vérification : ${now.toLocaleTimeString()}`; + } + + if (verTag && data.current_version) { + verTag.textContent = `v${data.current_version}`; + } + if (appBadge && data.current_version) { + appBadge.textContent = `v${data.current_version}`; + } + + if (data.has_update) { + if (statusText) { + statusText.className = 'text-amber-400 font-bold'; + statusText.innerHTML = `🚀 Nouvelle version disponible : v${escapeHtml(data.latest_version)} !`; + } + if (btnRun) { + btnRun.style.display = 'inline-flex'; + btnRun.innerHTML = `Mettre à jour vers v${escapeHtml(data.latest_version)} (1-Clic)`; + } + if (pingDot) pingDot.classList.remove('hidden'); + + if (changelogList && Array.isArray(data.changelog) && data.changelog.length > 0) { + changelogList.innerHTML = data.changelog.map(item => `
Vérifiez les nouvelles versions officielles et mettez à jour votre PBX en 1 clic sans coupure de service.
+