\x89PNG\r\n\x1a\n\x00\x00\x00\x0DIHDR\x00\x00\x00\x01\x00 \x00\x00\x01\x08\x06\x00\x00\x00\x1F\x15\xC4\x89\x00\x00\x00 \x0AIDATx\x9Ccb\x00\x00\x00\x06\x00\x03\x1A\x05\x9D\x00\x00 \x00\x00IEND\xAE\x42\x60\x82
| Path : /var/www/html/yedekledb24/DatabaseBackupMasterv2/templates/ |
|
B-Con CMD Config cPanel C-Rdp D-Log Info Jump Mass Ransom Symlink vHost Zone-H |
| Current File : /var/www/html/yedekledb24/DatabaseBackupMasterv2/templates/dashboard.html |
{% extends "base.html" %}
{% block content %}
<div class="container-fluid">
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
<h1 class="h2">Kontrol Paneli</h1>
<div class="btn-group me-2">
<a href="{{ url_for('backup_jobs') }}" class="btn btn-outline-secondary">
<i class="fas fa-plus"></i> Yeni Yedekleme Görevi
</a>
</div>
</div>
<!-- Stats cards -->
<div class="row">
<div class="col-md-3 mb-4">
<div class="card border-primary shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h6 class="card-title text-primary">Veritabanı Bağlantıları</h6>
<h2 class="mb-0">{{ db_count }}</h2>
</div>
<div class="rounded-circle bg-primary bg-opacity-10 p-3">
<i class="fas fa-database fa-2x text-primary"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-success shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h6 class="card-title text-success">Depolama Hedefleri</h6>
<h2 class="mb-0">{{ storage_count }}</h2>
</div>
<div class="rounded-circle bg-success bg-opacity-10 p-3">
<i class="fas fa-hdd fa-2x text-success"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-info shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h6 class="card-title text-info">Yedekleme İşleri</h6>
<h2 class="mb-0">{{ job_count }}</h2>
</div>
<div class="rounded-circle bg-info bg-opacity-10 p-3">
<i class="fas fa-tasks fa-2x text-info"></i>
</div>
</div>
</div>
</div>
</div>
<div class="col-md-3 mb-4">
<div class="card border-warning shadow-sm">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center">
<div>
<h6 class="card-title text-warning">Başarı Oranı</h6>
<h2 class="mb-0">
{% if success_count + failed_count > 0 %}
{{ (success_count / (success_count + failed_count) * 100) | round }}%
{% else %}
N/A
{% endif %}
</h2>
</div>
<div class="rounded-circle bg-warning bg-opacity-10 p-3">
<i class="fas fa-percentage fa-2x text-warning"></i>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Backup Chart -->
<div class="row mb-4">
<div class="col-md-8">
<div class="card">
<div class="card-header">
<h5 class="card-title">Yedekleme Geçmişi (Son 7 Gün)</h5>
</div>
<div class="card-body">
<canvas id="backupChart" height="250"></canvas>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card">
<div class="card-header">
<h5 class="card-title">Depolama Durumu</h5>
</div>
<div class="card-body">
{% for storage in storage_info %}
<div class="mb-3">
<div class="d-flex justify-content-between">
<span>{{ storage.name }}</span>
{% if storage.warning %}
<span class="badge bg-danger">
<i class="fas fa-exclamation-triangle"></i> Düşük Alan
</span>
{% else %}
<span class="badge bg-success">
<i class="fas fa-check"></i> OK
</span>
{% endif %}
</div>
<div class="progress mt-2" style="height: 10px;">
{% if storage.percent_free < 10 %}
<div class="progress-bar bg-danger" role="progressbar"
style="width: {{ 100 - storage.percent_free }}%;"
aria-valuenow="{{ 100 - storage.percent_free }}" aria-valuemin="0" aria-valuemax="100">
</div>
{% elif storage.percent_free < 20 %}
<div class="progress-bar bg-warning" role="progressbar"
style="width: {{ 100 - storage.percent_free }}%;"
aria-valuenow="{{ 100 - storage.percent_free }}" aria-valuemin="0" aria-valuemax="100">
</div>
{% else %}
<div class="progress-bar bg-success" role="progressbar"
style="width: {{ 100 - storage.percent_free }}%;"
aria-valuenow="{{ 100 - storage.percent_free }}" aria-valuemin="0" aria-valuemax="100">
</div>
{% endif %}
</div>
<div class="d-flex justify-content-between mt-1">
<small>Kullanılan: {{ ((storage.total_space - storage.free_space) / (1024*1024*1024)) | round(2) }} GB</small>
<small>Boş: {{ (storage.free_space / (1024*1024*1024)) | round(2) }} GB</small>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<!-- Recent Backups -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header d-flex justify-content-between align-items-center">
<h5 class="card-title">Son Yedeklemeler</h5>
<a href="{{ url_for('logs') }}" class="btn btn-sm btn-outline-secondary">Tümünü Gör</a>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-hover align-middle">
<thead>
<tr>
<th>Durum</th>
<th>İş Adı</th>
<th>Veritabanı</th>
<th>Depolama</th>
<th>Zaman</th>
<th>Boyut</th>
</tr>
</thead>
<tbody>
{% for log in recent_logs %}
<tr>
<td>
{% if log.status == 'success' %}
<span class="badge bg-success">
<i class="fas fa-check"></i> Başarılı
</span>
{% else %}
<span class="badge bg-danger">
<i class="fas fa-times"></i> Başarısız
</span>
{% endif %}
</td>
<td>{{ log.job.name }}</td>
<td>{{ log.job.database.name }}</td>
<td>{{ log.job.storage.name }}</td>
<td>{{ log.timestamp.strftime('%Y-%m-%d %H:%M:%S') }}</td>
<td>
{% if log.backup_size %}
{% if log.backup_size > 1024*1024*1024 %}
{{ (log.backup_size / (1024*1024*1024)) | round(2) }} GB
{% elif log.backup_size > 1024*1024 %}
{{ (log.backup_size / (1024*1024)) | round(2) }} MB
{% elif log.backup_size > 1024 %}
{{ (log.backup_size / 1024) | round(2) }} KB
{% else %}
{{ log.backup_size }} B
{% endif %}
{% else %}
N/A
{% endif %}
</td>
</tr>
{% endfor %}
{% if not recent_logs %}
<tr>
<td colspan="6" class="text-center">Yakın zamanda yedekleme kaydı bulunamadı</td>
</tr>
{% endif %}
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block scripts %}
<script src="{{ url_for('static', filename='js/dashboard.js') }}"></script>
<script src="{{ url_for('static', filename='js/charts.js') }}"></script>
<script>
// Initialize backup chart
document.addEventListener('DOMContentLoaded', function() {
fetchBackupStats();
});
// Fetch backup stats for the chart
function fetchBackupStats() {
fetch('/api/dashboard_stats')
.then(response => response.json())
.then(data => {
createBackupChart('backupChart', data.labels, data.success, data.failed);
})
.catch(error => {
console.error('Error fetching backup stats:', error);
});
}
</script>
{% endblock %}