217 lines
No EOL
9.5 KiB
HTML
217 lines
No EOL
9.5 KiB
HTML
{% extends "base.html" %}
|
|
{% block title %}Configuration Watchdog DND - GMAO{% endblock %}
|
|
|
|
{% block content %}
|
|
|
|
<div class="container-fluid">
|
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
|
<h1><i class="bi bi-shield-exclamation"></i> Watchdog DND</h1>
|
|
<div>
|
|
<a href="{{ url_for('yeastar.index') }}" class="btn btn-secondary">
|
|
<i class="bi bi-arrow-left"></i> Retour
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-8">
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<i class="bi bi-gear"></i> Configuration du Watchdog
|
|
</div>
|
|
<div class="card-body">
|
|
<p class="text-muted">
|
|
Le watchdog surveille les extensions en mode "Ne pas déranger" et les remet automatiquement
|
|
en statut "Disponible" après un délai configurable.
|
|
</p>
|
|
|
|
<form method="POST">
|
|
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
|
|
|
<div class="mb-3">
|
|
<div class="form-check form-switch">
|
|
<input class="form-check-input" type="checkbox" name="is_enabled"
|
|
id="is_enabled" {% if config.is_enabled %}checked{% endif %}>
|
|
<label class="form-check-label" for="is_enabled">
|
|
<strong>Activer le watchdog DND</strong>
|
|
</label>
|
|
</div>
|
|
<small class="text-muted d-block mt-1">
|
|
Lorsqu'activé, le watchdog remet automatiquement les extensions en "Disponible"
|
|
dès qu'elles passent en "Ne pas déranger".
|
|
</small>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Intervalle de vérification (secondes)</label>
|
|
<input type="number" class="form-control" name="refresh_seconds"
|
|
value="{{ config.refresh_seconds }}" min="1" max="60">
|
|
<small class="text-muted">Fréquence de vérification des statuts (défaut: 1s)</small>
|
|
</div>
|
|
<div class="col-md-6 mb-3">
|
|
<label class="form-label">Délai avant remise en disponible (secondes)</label>
|
|
<input type="number" class="form-control" name="reset_delay_seconds"
|
|
value="{{ config.reset_delay_seconds }}" min="1" max="60">
|
|
<small class="text-muted">Temps d'attente avant de repasser en "Disponible" (défaut: 3s)</small>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-4">
|
|
<label class="form-label">Extensions exclues</label>
|
|
<input type="text" class="form-control" name="excluded_extensions"
|
|
value="{{ config.excluded_extensions }}" placeholder="100,111,118">
|
|
<small class="text-muted">
|
|
Extensions à ignorer (séparées par des virgules). Ces extensions ne seront pas
|
|
automatiquement remises en "Disponible".
|
|
</small>
|
|
</div>
|
|
|
|
<div class="d-flex gap-2">
|
|
<button type="submit" class="btn btn-success">
|
|
<i class="bi bi-check-lg"></i> Sauvegarder la configuration
|
|
</button>
|
|
<button type="button" class="btn btn-warning" id="restart-btn">
|
|
<i class="bi bi-arrow-clockwise"></i> Redémarrer le watchdog
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<i class="bi bi-info-circle"></i> Fonctionnement
|
|
</div>
|
|
<div class="card-body">
|
|
<h6>Comment ça marche ?</h6>
|
|
<ol class="mb-0">
|
|
<li>Le watchdog vérifie périodiquement le statut de toutes les extensions</li>
|
|
<li>Quand une extension passe en <span class="badge bg-warning">Ne pas déranger</span>,
|
|
le watchdog attend le délai configuré</li>
|
|
<li>Après le délai, l'extension est automatiquement remise en
|
|
<span class="badge bg-success">Disponible</span></li>
|
|
<li>Les extensions exclues ne sont jamais modifiées automatiquement</li>
|
|
</ol>
|
|
|
|
<hr class="my-3">
|
|
|
|
<h6>Extensions généralement exclues :</h6>
|
|
<ul class="mb-0">
|
|
<li><strong>100</strong> - Standard (peut être en DND légitimement)</li>
|
|
<li><strong>111</strong> - CDI (bureau en DND)</li>
|
|
<li>Toute extension qui doit conserver son statut DND manuel</li>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<i class="bi bi-activity"></i> Statut actuel
|
|
</div>
|
|
<div class="card-body">
|
|
<div id="watchdog-status" class="mb-3">
|
|
<div class="text-center">
|
|
<div class="spinner-border spinner-border-sm" role="status"></div>
|
|
<span class="ms-2">Chargement...</span>
|
|
</div>
|
|
</div>
|
|
|
|
<div id="watchdog-info" class="small text-muted">
|
|
<!-- Infos chargées dynamiquement -->
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card mt-3">
|
|
<div class="card-header">
|
|
<i class="bi bi-clock-history"></i> Dernière modification
|
|
</div>
|
|
<div class="card-body">
|
|
<small class="text-muted">
|
|
{% if config.updated_at %}
|
|
{{ config.updated_at.strftime('%d/%m/%Y à %H:%M') }}
|
|
{% else %}
|
|
Jamais
|
|
{% endif %}
|
|
</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
// Charger le statut du watchdog
|
|
async function loadStatus() {
|
|
try {
|
|
const resp = await fetch('/yeastar/api/watchdog/status');
|
|
const data = await resp.json();
|
|
|
|
const statusDiv = document.getElementById('watchdog-status');
|
|
const infoDiv = document.getElementById('watchdog-info');
|
|
|
|
if (data.error) {
|
|
statusDiv.innerHTML = '<span class="badge bg-danger">Erreur: ' + data.error + '</span>';
|
|
return;
|
|
}
|
|
|
|
const enabled = data.enabled;
|
|
const statusBadge = enabled
|
|
? '<span class="badge bg-success fs-6"><i class="bi bi-check-circle"></i> Actif</span>'
|
|
: '<span class="badge bg-secondary fs-6"><i class="bi bi-pause-circle"></i> Inactif</span>';
|
|
|
|
statusDiv.innerHTML = statusBadge;
|
|
|
|
infoDiv.innerHTML = `
|
|
<div><strong>Intervalle:</strong> ${data.refresh_seconds}s</div>
|
|
<div><strong>Délai:</strong> ${data.reset_delay_seconds}s</div>
|
|
<div><strong>Exclues:</strong> ${data.excluded_extensions || 'Aucune'}</div>
|
|
`;
|
|
} catch (e) {
|
|
document.getElementById('watchdog-status').innerHTML =
|
|
'<span class="badge bg-danger">Erreur de connexion</span>';
|
|
}
|
|
}
|
|
|
|
// Redémarrer le watchdog
|
|
document.getElementById('restart-btn').addEventListener('click', async function() {
|
|
if (!confirm('Redémarrer le watchdog ?')) return;
|
|
|
|
this.disabled = true;
|
|
this.innerHTML = '<span class="spinner-border spinner-border-sm"></span> Redémarrage...';
|
|
|
|
try {
|
|
// Récupérer le CSRF token du formulaire
|
|
const csrfToken = document.querySelector('input[name="csrf_token"]').value;
|
|
|
|
const resp = await fetch('/yeastar/api/watchdog/restart', {
|
|
method: 'POST',
|
|
headers: {
|
|
'X-CSRFToken': csrfToken
|
|
}
|
|
});
|
|
const data = await resp.json();
|
|
|
|
if (data.success) {
|
|
alert('Watchdog redémarré avec succès');
|
|
loadStatus();
|
|
} else {
|
|
alert('Erreur: ' + (data.error || 'Échec du redémarrage'));
|
|
}
|
|
} catch (e) {
|
|
alert('Erreur de connexion au serveur');
|
|
}
|
|
|
|
this.disabled = false;
|
|
this.innerHTML = '<i class="bi bi-arrow-clockwise"></i> Redémarrer le watchdog';
|
|
});
|
|
|
|
// Charger au démarrage
|
|
loadStatus();
|
|
setInterval(loadStatus, 10000);
|
|
</script>
|
|
|
|
{% endblock %} |