// JavaScript for Backup Monitor
document.addEventListener('DOMContentLoaded', function() {
console.log('Backup Monitor loaded');
// Update last updated time
updateLastUpdatedTime();
// Set up auto-refresh
setupAutoRefresh();
// Set up service card interactions
setupServiceCards();
});
function updateLastUpdatedTime() {
const lastUpdatedElement = document.getElementById('last-updated');
if (lastUpdatedElement) {
const now = new Date();
lastUpdatedElement.textContent = `Last updated: ${now.toLocaleTimeString()}`;
}
}
function setupAutoRefresh() {
// Auto-refresh every 30 seconds
setInterval(function() {
console.log('Auto-refreshing metrics...');
refreshMetrics();
}, 30000);
}
function setupServiceCards() {
// Add click handlers for service cards
const serviceCards = document.querySelectorAll('.service-card');
serviceCards.forEach(card => {
card.addEventListener('click', function(e) {
// Don't trigger if clicking on buttons
if (e.target.tagName === 'A' || e.target.tagName === 'BUTTON') {
return;
}
const serviceName = this.dataset.service;
if (serviceName) {
window.location.href = `/service/${serviceName}`;
}
});
// Add hover effects
card.style.cursor = 'pointer';
});
}
function refreshMetrics() {
// Show loading indicator
const refreshButton = document.querySelector('[onclick="refreshMetrics()"]');
if (refreshButton) {
const icon = refreshButton.querySelector('i');
if (icon) {
icon.classList.add('fa-spin');
}
refreshButton.disabled = true;
}
// Reload the page to get fresh data
setTimeout(() => {
location.reload();
}, 500);
}
function downloadBackup(serviceName) {
console.log(`Downloading backup for service: ${serviceName}`);
// Create a temporary link to trigger download
const link = document.createElement('a');
link.href = `/api/backup/download/${serviceName}`;
link.download = `${serviceName}-backup.tar.gz`;
link.target = '_blank';
// Append to body, click, and remove
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
// Utility functions
function formatFileSize(bytes) {
if (bytes === 0) return '0 Bytes';
const k = 1024;
const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
const i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
}
function formatDuration(seconds) {
if (seconds < 60) {
return `${seconds}s`;
} else if (seconds < 3600) {
const minutes = Math.floor(seconds / 60);
const remainingSeconds = seconds % 60;
return remainingSeconds > 0 ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
} else {
const hours = Math.floor(seconds / 3600);
const minutes = Math.floor((seconds % 3600) / 60);
return minutes > 0 ? `${hours}h ${minutes}m` : `${hours}h`;
}
}
function showNotification(message, type = 'info') {
// Create notification element
const notification = document.createElement('div');
notification.className = `alert alert-${type} alert-dismissible fade show position-fixed`;
notification.style.cssText = 'top: 20px; right: 20px; z-index: 9999; max-width: 300px;';
notification.innerHTML = `
${message}
`;
// Add to page
document.body.appendChild(notification);
// Auto-remove after 5 seconds
setTimeout(() => {
if (notification.parentNode) {
notification.parentNode.removeChild(notification);
}
}, 5000);
}
// Health check functionality
function checkSystemHealth() {
fetch('/health')
.then(response => response.json())
.then(data => {
const statusIndicator = document.getElementById('status-indicator');
if (statusIndicator) {
if (data.status === 'healthy') {
statusIndicator.className = 'text-success';
statusIndicator.innerHTML = 'Online';
} else {
statusIndicator.className = 'text-warning';
statusIndicator.innerHTML = 'Issues';
}
}
})
.catch(error => {
console.error('Health check failed:', error);
const statusIndicator = document.getElementById('status-indicator');
if (statusIndicator) {
statusIndicator.className = 'text-danger';
statusIndicator.innerHTML = 'Offline';
}
});
}
// Run health check every minute
setInterval(checkSystemHealth, 60000);
checkSystemHealth(); // Run immediately