diff --git a/templates/index.html b/templates/index.html
index 120ef6b..b00cb25 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -324,11 +324,12 @@
promptOvr: "GLOBAL OVERRIDE", promptOvrConfirm: "Confirm sending to ENTIRE network?",
modUpdateTitle: "🔄 GLOBAL UPDATE", confUpdate: "Do you want to request updated data and configuration files from all nodes in the fleet?", alertUpdateOk: "Request sent successfully!",
btnConfReset: "⚠️ CONFIRM RESET", btnCancel: "CANCEL", promptPass: "Enter the new password:",
- titleError: "❌ ERROR", titleSuccess: "✅ SUCCESS", titleAction: "⚙️ CONFIRM REBOOT", titleDelete: "🗑️ DELETE USER", titleSave: "💾 SAVE", titleGlobal: "🚨 GLOBAL OVERRIDE",
+ titleError: "❌ ERROR", titleSuccess: "✅ SUCCESS", titleAction: "⚙️ CONFIRM ACTION", titleDelete: "🗑️ DELETE USER", titleSave: "💾 SAVE", titleGlobal: "🚨 GLOBAL OVERRIDE",
btnYes: "YES, PROCEED", msgDelUser: "Confirm user deletion?", msgPassOk: "Password updated successfully!", msgPassErr: "Failed to update password.", msgLoginFail: "Login Failed",
msgConfigSaved: "Configuration saved!", msgConfigErr: "Error saving configuration", msgNetErr: "Network Error", msgOvrSel: "Select the profile to send to the ENTIRE network:",
msgOvrOk: "Command successfully sent to the network!", msgMissUser: "Missing Username", msgMissPass: "Password required for new user", btnSvcKo: "⚠️ DAEMON KO",
- phNewPass: "New pass (empty to keep)", phPass: "Password"
+ phNewPass: "New pass (empty to keep)", phPass: "Password",
+ titleSwitch: "SWITCH PROFILE", confSwitch: "Are you sure you want to switch to", titleBoot: "SYSTEM REBOOT", confBoot: "Are you sure you want to REBOOT node "
},
it: {
themeLight: "☀️ CHIARO", themeDark: "🌙 SCURO",
@@ -348,11 +349,12 @@
promptOvr: "OVERRIDE GLOBALE", promptOvrConfirm: "Confermi l'invio a TUTTA la rete?",
modUpdateTitle: "🔄 AGGIORNAMENTO GLOBALE", confUpdate: "Vuoi richiedere i dati e i file di configurazione aggiornati a tutti i nodi della flotta?", alertUpdateOk: "Richiesta inviata con successo!",
btnConfReset: "⚠️ CONFERMA RESET", btnCancel: "ANNULLA", promptPass: "Inserisci la nuova password:",
- titleError: "❌ ERRORE", titleSuccess: "✅ OK", titleAction: "⚙️ CONFERMA REBOOT", titleDelete: "🗑️ ELIMINA UTENTE", titleSave: "💾 SALVATAGGIO", titleGlobal: "🚨 OVERRIDE GLOBALE",
+ titleError: "❌ ERRORE", titleSuccess: "✅ OK", titleAction: "⚙️ CONFERMA AZIONE", titleDelete: "🗑️ ELIMINA UTENTE", titleSave: "💾 SALVATAGGIO", titleGlobal: "🚨 OVERRIDE GLOBALE",
btnYes: "SI, PROCEDI", msgDelUser: "Confermi l'eliminazione dell'utente?", msgPassOk: "Password aggiornata con successo!", msgPassErr: "Errore durante l'aggiornamento della password.", msgLoginFail: "Login Fallito",
msgConfigSaved: "Configurazione salvata!", msgConfigErr: "Errore durante il salvataggio", msgNetErr: "Errore di rete", msgOvrSel: "Seleziona il profilo da inviare a TUTTA la rete:",
msgOvrOk: "Comando inviato con successo a tutta la rete!", msgMissUser: "Username mancante", msgMissPass: "Password obbligatoria per il nuovo utente", btnSvcKo: "⚠️ DEMONE KO",
- phNewPass: "Nuova pass (vuota per non cambiare)", phPass: "Password"
+ phNewPass: "Nuova pass (vuota per non cambiare)", phPass: "Password",
+ titleSwitch: "CAMBIO PROFILO", confSwitch: "Sei sicuro di voler passare al", titleBoot: "RIAVVIO SISTEMA", confBoot: "Sei sicuro di voler RIAVVIARE il nodo "
}
};
@@ -415,8 +417,12 @@
}
// --- API & COMMAND FUNCTIONS ---
- function sendCommand(clientId, type) {
- customConfirm(t('titleAction'), `${t('confOp')}${clientId.toUpperCase()}?`, "var(--primary)", async () => {
+ function sendCommand(clientId, type, customTitle, customMsg, customColor) {
+ const title = customTitle || t('titleAction');
+ const msg = customMsg || `${t('confOp')}${clientId.toUpperCase()}?`;
+ const color = customColor || "var(--primary)";
+
+ customConfirm(title, msg, color, async () => {
try {
const res = await fetch('/api/command', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientId, type }) });
const data = await res.json();
@@ -426,8 +432,23 @@
});
}
- function confirmSwitch(id, mode) { sendCommand(id, mode); }
- function confirmReboot(id) { sendCommand(id, 'REBOOT'); }
+ function confirmSwitch(id, mode) {
+ const data = globalHealthData[id.toLowerCase()];
+ let profileName = mode === 'A' ? "PROFILE A" : "PROFILE B";
+ if (data && data.profiles && data.profiles[mode]) {
+ profileName = data.profiles[mode];
+ }
+ const title = `🔄 ${t('titleSwitch')}`;
+ const msg = `${t('confSwitch')} ${profileName} -> ${id.toUpperCase()}?`;
+ const color = mode === 'A' ? "var(--accent)" : "#eab308";
+ sendCommand(id, mode, title, msg, color);
+ }
+
+ function confirmReboot(id) {
+ const title = `🔄 ${t('titleBoot')}`;
+ const msg = `${t('confBoot')}${id.toUpperCase()}?`;
+ sendCommand(id, 'REBOOT', title, msg, "var(--danger)");
+ }
function confirmHatReset(id) {
currentResetHatId = id;
@@ -465,7 +486,7 @@
function sendTgCommand(clientId, comando) {
const msg = (comando === 'TG:ON') ? t('confTgOn') : t('confTgOff');
- customConfirm("💬 TELEGRAM", `${msg}${clientId.toUpperCase()}?`, "var(--primary)", async () => {
+ customConfirm("💬 TELEGRAM", `${msg}${clientId.toUpperCase()}?`, "var(--primary)", async () => {
try {
const res = await fetch('/api/command', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ clientId: clientId, type: comando }) });
const data = await res.json();
@@ -914,11 +935,11 @@
}
function controlService(clientId, service, action) {
- customConfirm(t('titleAction'), `${t('confOp')}${service}?`, "var(--accent)", async () => {
+ customConfirm(t('titleAction'), `${t('confOp')}${service}?`, "var(--accent)", async () => {
try {
const res = await fetch('/api/service_control', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ clientId, service, action }) });
const data = await res.json();
- if(!data.success) customAlert(t('titleError'), data.error, true);
+ if(!data.success) customAlert(t('titleError'), "Error: " + data.error, true);
} catch(e) { console.error(e); }
});
}
@@ -935,7 +956,7 @@
function saveConfig() {
const textValue = document.getElementById('config-textarea').value; const statusSpan = document.getElementById('editor-status');
- customConfirm(t('titleSave'), `${t('confOvr')}${currentEditClient.toUpperCase()}?`, "var(--danger)", async () => {
+ customConfirm(t('titleSave'), `${t('confOvr')}${currentEditClient.toUpperCase()}?`, "var(--danger)", async () => {
statusSpan.innerText = "Sending..."; statusSpan.style.color = "var(--success)";
try {
const res = await fetch('/api/config_file', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ clientId: currentEditClient, service: currentEditService, config_data: { "raw_text": textValue } }) });