mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2026-08-03 22:36:44 +00:00
update 1.2.4
This commit is contained in:
@@ -126,13 +126,13 @@ export function HealthStatusModal({ open, onOpenChange, getApiUrl }: HealthStatu
|
|||||||
const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set())
|
const [expandedCategories, setExpandedCategories] = useState<Set<string>>(new Set())
|
||||||
const [showUpdateTerminal, setShowUpdateTerminal] = useState(false)
|
const [showUpdateTerminal, setShowUpdateTerminal] = useState(false)
|
||||||
|
|
||||||
const fetchHealthDetails = useCallback(async () => {
|
const fetchHealthDetails = useCallback(async (force = false) => {
|
||||||
setLoading(true)
|
setLoading(true)
|
||||||
setError(null)
|
setError(null)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
let newOverallStatus = "OK"
|
let newOverallStatus = "OK"
|
||||||
|
|
||||||
// Use the new combined endpoint for fewer round-trips
|
// Use the new combined endpoint for fewer round-trips
|
||||||
const token = getAuthToken()
|
const token = getAuthToken()
|
||||||
const authHeaders: Record<string, string> = {}
|
const authHeaders: Record<string, string> = {}
|
||||||
@@ -140,7 +140,7 @@ export function HealthStatusModal({ open, onOpenChange, getApiUrl }: HealthStatu
|
|||||||
authHeaders["Authorization"] = `Bearer ${token}`
|
authHeaders["Authorization"] = `Bearer ${token}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const response = await fetch(getApiUrl("/api/health/full"), { headers: authHeaders })
|
const response = await fetch(getApiUrl(force ? "/api/health/full?refresh=1" : "/api/health/full"), { headers: authHeaders })
|
||||||
let infoCount = 0
|
let infoCount = 0
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
@@ -222,7 +222,7 @@ export function HealthStatusModal({ open, onOpenChange, getApiUrl }: HealthStatu
|
|||||||
if (open) {
|
if (open) {
|
||||||
fetchHealthDetails()
|
fetchHealthDetails()
|
||||||
// Auto-refresh every 5 minutes while modal is open
|
// Auto-refresh every 5 minutes while modal is open
|
||||||
const refreshInterval = setInterval(fetchHealthDetails, 300000)
|
const refreshInterval = setInterval(() => fetchHealthDetails(), 300000)
|
||||||
return () => clearInterval(refreshInterval)
|
return () => clearInterval(refreshInterval)
|
||||||
}
|
}
|
||||||
}, [open, fetchHealthDetails])
|
}, [open, fetchHealthDetails])
|
||||||
@@ -872,10 +872,10 @@ export function HealthStatusModal({ open, onOpenChange, getApiUrl }: HealthStatu
|
|||||||
open={showUpdateTerminal}
|
open={showUpdateTerminal}
|
||||||
onClose={() => {
|
onClose={() => {
|
||||||
setShowUpdateTerminal(false)
|
setShowUpdateTerminal(false)
|
||||||
// Refresh health checks so the "System Updates" row updates
|
// Force a fresh read (cache-busting via ?refresh=1) so the
|
||||||
// (pending count / kernel version) without waiting for the
|
// "System Updates" row reflects the state right after the
|
||||||
// next polling tick after the update finishes.
|
// update finished, instead of the pre-update cached value.
|
||||||
fetchHealthDetails().catch(() => {})
|
fetchHealthDetails(true).catch(() => {})
|
||||||
}}
|
}}
|
||||||
scriptPath="/usr/local/share/proxmenux/scripts/utilities/proxmox_update.sh"
|
scriptPath="/usr/local/share/proxmenux/scripts/utilities/proxmox_update.sh"
|
||||||
scriptName="proxmox_update"
|
scriptName="proxmox_update"
|
||||||
|
|||||||
@@ -230,14 +230,25 @@ def get_full_health():
|
|||||||
Get complete health data in a single request: detailed status + active errors + dismissed.
|
Get complete health data in a single request: detailed status + active errors + dismissed.
|
||||||
Uses background-cached results if fresh (< 6 min) for instant response,
|
Uses background-cached results if fresh (< 6 min) for instant response,
|
||||||
otherwise runs a fresh check.
|
otherwise runs a fresh check.
|
||||||
|
|
||||||
|
?refresh=1 busts the background + per-check caches for updates/services/
|
||||||
|
security before returning, so an event that just changed underlying state
|
||||||
|
(Update Now finished, dismiss action) sees the new value immediately
|
||||||
|
instead of waiting for the next polling tick.
|
||||||
"""
|
"""
|
||||||
import time as _time
|
import time as _time
|
||||||
try:
|
try:
|
||||||
|
if request.args.get('refresh') == '1':
|
||||||
|
for ck in ('updates_check', 'pve_services', 'security_check',
|
||||||
|
'_bg_detailed', '_bg_overall', 'overall_health'):
|
||||||
|
health_monitor.last_check_times.pop(ck, None)
|
||||||
|
health_monitor.cached_results.pop(ck, None)
|
||||||
|
|
||||||
# Try to use the background-cached detailed result for instant response
|
# Try to use the background-cached detailed result for instant response
|
||||||
bg_key = '_bg_detailed'
|
bg_key = '_bg_detailed'
|
||||||
bg_last = health_monitor.last_check_times.get(bg_key, 0)
|
bg_last = health_monitor.last_check_times.get(bg_key, 0)
|
||||||
bg_age = _time.time() - bg_last
|
bg_age = _time.time() - bg_last
|
||||||
|
|
||||||
if bg_age < 360 and bg_key in health_monitor.cached_results:
|
if bg_age < 360 and bg_key in health_monitor.cached_results:
|
||||||
# Use cached result (at most ~5 min old)
|
# Use cached result (at most ~5 min old)
|
||||||
details = health_monitor.cached_results[bg_key]
|
details = health_monitor.cached_results[bg_key]
|
||||||
|
|||||||
+1
-1
@@ -12,7 +12,7 @@ This release adds two in-dashboard improvements — a one-click Proxmox update t
|
|||||||
- New **Update Now** button inside the Health Monitor modal, under the **System Updates** section.
|
- New **Update Now** button inside the Health Monitor modal, under the **System Updates** section.
|
||||||
- Runs the standard Proxmox update flow (`apt update` + `dist-upgrade` + post-update cleanup) in an in-dashboard terminal — no need to open a shell.
|
- Runs the standard Proxmox update flow (`apt update` + `dist-upgrade` + post-update cleanup) in an in-dashboard terminal — no need to open a shell.
|
||||||
- Only appears when updates are pending; when the system is up to date the button stays hidden.
|
- Only appears when updates are pending; when the system is up to date the button stays hidden.
|
||||||
- On close, the Health Monitor refreshes so the pending-update count and kernel row update immediately.
|
- On close, the Health Monitor forces a cache-busting refresh (`/api/health/full?refresh=1`) so the pending-update count and kernel row reflect the post-update state right away, instead of the pre-update value that the background cache had stored moments before the run.
|
||||||
- The underlying script is context-aware: on an already-configured production host it respects the operator's custom repositories (never disables enterprise/ceph, never deletes legacy sources, never purges alternate NTP, never force-installs zfsutils/chrony); on a bare host it lays down only the missing base repos. It also detects a newly installed kernel that isn't the running one and prompts for reboot at the end.
|
- The underlying script is context-aware: on an already-configured production host it respects the operator's custom repositories (never disables enterprise/ceph, never deletes legacy sources, never purges alternate NTP, never force-installs zfsutils/chrony); on a bare host it lays down only the missing base repos. It also detects a newly installed kernel that isn't the running one and prompts for reboot at the end.
|
||||||
- During the upgrade, `service_fail` notifications for PVE services (pve-cluster, pveproxy, corosync…) are suppressed — their restart is a normal part of the upgrade cycle. Suppression extends 60 s past apt exit so the trailing restart events don't leak through.
|
- During the upgrade, `service_fail` notifications for PVE services (pve-cluster, pveproxy, corosync…) are suppressed — their restart is a normal part of the upgrade cycle. Suppression extends 60 s past apt exit so the trailing restart events don't leak through.
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Esta versión suma dos mejoras visibles en el propio dashboard — un botón par
|
|||||||
- Nuevo botón **Update Now** dentro del modal del Monitor de Salud, en la sección **System Updates**.
|
- Nuevo botón **Update Now** dentro del modal del Monitor de Salud, en la sección **System Updates**.
|
||||||
- Ejecuta el flujo estándar de actualización de Proxmox (`apt update` + `dist-upgrade` + limpieza posterior) en una terminal dentro del dashboard — sin necesidad de abrir una shell.
|
- Ejecuta el flujo estándar de actualización de Proxmox (`apt update` + `dist-upgrade` + limpieza posterior) en una terminal dentro del dashboard — sin necesidad de abrir una shell.
|
||||||
- Solo aparece cuando hay actualizaciones pendientes; si el sistema está al día, el botón queda oculto.
|
- Solo aparece cuando hay actualizaciones pendientes; si el sistema está al día, el botón queda oculto.
|
||||||
- Al cerrar, el Monitor de Salud se refresca automáticamente para que el contador de actualizaciones pendientes y la fila del kernel se actualicen al instante.
|
- Al cerrar, el Monitor de Salud fuerza un refresh con invalidación de caché (`/api/health/full?refresh=1`) para que el contador de actualizaciones pendientes y la fila del kernel reflejen el estado post-actualización al instante, en lugar del valor pre-actualización que la caché de fondo había guardado justo antes de la ejecución.
|
||||||
- El script subyacente distingue el contexto: si se ejecuta sobre un host ya en producción, respeta los repositorios personalizados del operador (no desactiva enterprise/ceph, no borra sources legacy, no purga NTP alternativos ni fuerza instalar zfsutils/chrony); si detecta un servidor virgen crea los repos base necesarios. Detecta también si hay un kernel nuevo instalado distinto del que está corriendo y pide el reboot al terminar.
|
- El script subyacente distingue el contexto: si se ejecuta sobre un host ya en producción, respeta los repositorios personalizados del operador (no desactiva enterprise/ceph, no borra sources legacy, no purga NTP alternativos ni fuerza instalar zfsutils/chrony); si detecta un servidor virgen crea los repos base necesarios. Detecta también si hay un kernel nuevo instalado distinto del que está corriendo y pide el reboot al terminar.
|
||||||
- Durante la actualización se suprimen las notificaciones de `service_fail` de servicios PVE (pve-cluster, pveproxy, corosync…) porque su reinicio es parte normal del upgrade; volvían a notificarse hasta 60 s después de que apt termine.
|
- Durante la actualización se suprimen las notificaciones de `service_fail` de servicios PVE (pve-cluster, pveproxy, corosync…) porque su reinicio es parte normal del upgrade; volvían a notificarse hasta 60 s después de que apt termine.
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user