mirror of
https://github.com/eduardogsilva/routerfleet.git
synced 2025-07-24 12:54:33 +02:00
Backup data
This commit is contained in:
parent
cc54ba0f73
commit
c9a7a69d4b
16 changed files with 207 additions and 7 deletions
|
@ -1,4 +1,5 @@
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ from django.contrib import messages
|
||||||
from .models import BackupProfile
|
from .models import BackupProfile
|
||||||
from .forms import BackupProfileForm
|
from .forms import BackupProfileForm
|
||||||
from router_manager.models import Router
|
from router_manager.models import Router
|
||||||
|
from backup_data.models import RouterBackup
|
||||||
|
|
||||||
|
|
||||||
@login_required()
|
@login_required()
|
||||||
|
@ -46,3 +47,34 @@ def view_manage_backup_profile(request):
|
||||||
'instance': backup_profile
|
'instance': backup_profile
|
||||||
}
|
}
|
||||||
return render(request, 'backup/backup_profile_form.html', context=context)
|
return render(request, 'backup/backup_profile_form.html', context=context)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required()
|
||||||
|
def view_backup_list(request):
|
||||||
|
backup_list = RouterBackup.objects.all().order_by('-created')
|
||||||
|
if request.GET.get('type') == 'queue':
|
||||||
|
backup_list = backup_list.filter(error=False, success=False).order_by('next_retry')
|
||||||
|
view_type = 'queue'
|
||||||
|
elif request.GET.get('type') == 'errors':
|
||||||
|
backup_list = backup_list.filter(error=True).order_by('-created')
|
||||||
|
view_type = 'errors'
|
||||||
|
else:
|
||||||
|
backup_list = backup_list.filter(success=True).order_by('-created')
|
||||||
|
view_type = 'success'
|
||||||
|
|
||||||
|
context = {
|
||||||
|
'backup_list': backup_list,
|
||||||
|
'page_title': 'Backup List',
|
||||||
|
'view_type': view_type
|
||||||
|
}
|
||||||
|
return render(request, 'backup/backup_list.html', context)
|
||||||
|
|
||||||
|
|
||||||
|
@login_required()
|
||||||
|
def view_backup_details(request):
|
||||||
|
backup = get_object_or_404(RouterBackup, uuid=request.GET.get('uuid'))
|
||||||
|
context = {
|
||||||
|
'backup': backup,
|
||||||
|
'page_title': 'Backup Details'
|
||||||
|
}
|
||||||
|
return render(request, 'backup/backup_details.html', context)
|
0
backup_data/__init__.py
Normal file
0
backup_data/__init__.py
Normal file
11
backup_data/admin.py
Normal file
11
backup_data/admin.py
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
from .models import RouterBackup
|
||||||
|
|
||||||
|
|
||||||
|
class RouterBackupAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('router', 'success', 'error', 'retry_count', 'next_retry', 'schedule_time', 'schedule_type', 'queue_length', 'finish_time', 'updated', 'created', 'uuid')
|
||||||
|
search_fields = ('router__name', 'error_message', 'backup_text')
|
||||||
|
list_filter = ('success', 'error', 'schedule_type')
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(RouterBackup, RouterBackupAdmin)
|
6
backup_data/apps.py
Normal file
6
backup_data/apps.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class BackupDataConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'backup_data'
|
37
backup_data/migrations/0001_initial.py
Normal file
37
backup_data/migrations/0001_initial.py
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
# Generated by Django 5.0.3 on 2024-03-17 21:51
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
|
import uuid
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('router_manager', '0009_router_backup_profile'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='RouterBackup',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('success', models.BooleanField(default=False)),
|
||||||
|
('error', models.BooleanField(default=False)),
|
||||||
|
('error_message', models.TextField(blank=True, null=True)),
|
||||||
|
('retry_count', models.IntegerField(default=0)),
|
||||||
|
('next_retry', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('schedule_time', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('schedule_type', models.CharField(choices=[('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('instant', 'Instant')], max_length=10)),
|
||||||
|
('queue_length', models.IntegerField(default=0)),
|
||||||
|
('finish_time', models.DateTimeField(blank=True, null=True)),
|
||||||
|
('backup_text', models.TextField(blank=True, null=True)),
|
||||||
|
('updated', models.DateTimeField(auto_now=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
|
||||||
|
('router', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='router_manager.router')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
0
backup_data/migrations/__init__.py
Normal file
0
backup_data/migrations/__init__.py
Normal file
23
backup_data/models.py
Normal file
23
backup_data/models.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
from django.db import models
|
||||||
|
from router_manager.models import Router
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
|
class RouterBackup(models.Model):
|
||||||
|
router = models.ForeignKey(Router, on_delete=models.CASCADE)
|
||||||
|
success = models.BooleanField(default=False)
|
||||||
|
error = models.BooleanField(default=False)
|
||||||
|
error_message = models.TextField(blank=True, null=True)
|
||||||
|
retry_count = models.IntegerField(default=0)
|
||||||
|
next_retry = models.DateTimeField(blank=True, null=True)
|
||||||
|
schedule_time = models.DateTimeField(blank=True, null=True)
|
||||||
|
schedule_type = models.CharField(max_length=10, choices=(('daily', 'Daily'), ('weekly', 'Weekly'), ('monthly', 'Monthly'), ('instant', 'Instant')))
|
||||||
|
queue_length = models.IntegerField(default=0) # Seconds
|
||||||
|
finish_time = models.DateTimeField(blank=True, null=True)
|
||||||
|
backup_text = models.TextField(blank=True, null=True)
|
||||||
|
|
||||||
|
updated = models.DateTimeField(auto_now=True)
|
||||||
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
|
uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4)
|
||||||
|
|
||||||
|
|
3
backup_data/tests.py
Normal file
3
backup_data/tests.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
3
backup_data/views.py
Normal file
3
backup_data/views.py
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
|
@ -43,6 +43,7 @@ INSTALLED_APPS = [
|
||||||
'router_manager',
|
'router_manager',
|
||||||
'monitoring',
|
'monitoring',
|
||||||
'backup',
|
'backup',
|
||||||
|
'backup_data'
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|
|
@ -4,7 +4,7 @@ from dashboard.views import view_dashboard, view_status
|
||||||
from user_manager.views import view_manage_user, view_user_list
|
from user_manager.views import view_manage_user, view_user_list
|
||||||
from accounts.views import view_login, view_logout, view_create_first_user
|
from accounts.views import view_login, view_logout, view_create_first_user
|
||||||
from router_manager.views import view_router_list, view_manage_router, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey
|
from router_manager.views import view_router_list, view_manage_router, view_router_group_list, view_ssh_key_list, view_manage_router_group, view_manage_sshkey
|
||||||
from backup.views import view_backup_profile_list, view_manage_backup_profile
|
from backup.views import view_backup_profile_list, view_manage_backup_profile, view_backup_list, view_backup_details
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
@ -23,6 +23,7 @@ urlpatterns = [
|
||||||
path('router/manage_group/', view_manage_router_group, name='manage_router_group'),
|
path('router/manage_group/', view_manage_router_group, name='manage_router_group'),
|
||||||
path('router/manage_sshkey/', view_manage_sshkey, name='manage_sshkey'),
|
path('router/manage_sshkey/', view_manage_sshkey, name='manage_sshkey'),
|
||||||
path('backup/profile_list/', view_backup_profile_list, name='backup_profile_list'),
|
path('backup/profile_list/', view_backup_profile_list, name='backup_profile_list'),
|
||||||
path('backup/manage_profile/', view_manage_backup_profile, name='manage_backup_profile')
|
path('backup/manage_profile/', view_manage_backup_profile, name='manage_backup_profile'),
|
||||||
|
path('backup/backup_list/', view_backup_list, name='backup_list'),
|
||||||
|
path('backup/backup_details/', view_backup_details, name='backup_info'),
|
||||||
]
|
]
|
||||||
|
|
5
templates/backup/backup_details.html
Normal file
5
templates/backup/backup_details.html
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
backup info
|
||||||
|
{% endblock %}
|
47
templates/backup/backup_list.html
Normal file
47
templates/backup/backup_list.html
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
{% extends 'base.html' %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class='row'>
|
||||||
|
<div class='col-lg-12'>
|
||||||
|
<div class="card card-primary card-outline">
|
||||||
|
{% if page_title %}
|
||||||
|
<div class="card-header">
|
||||||
|
<h3 class="card-title">{{ page_title }}</h3>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="card-body">
|
||||||
|
{% include 'backup/backup_nav_tabs.html' %}
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12">
|
||||||
|
<table class="table table-hover">
|
||||||
|
|
||||||
|
<tbody>
|
||||||
|
{% for backup in backup_list %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<a href="/backup/backup_details/?uuid={{ backup.uuid }}">
|
||||||
|
|
||||||
|
{{ backup.router }}
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
29
templates/backup/backup_nav_tabs.html
Normal file
29
templates/backup/backup_nav_tabs.html
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {% if request.path == '/backup/profile_list/' %}active{% endif %}" href="/backup/profile_list/" role="tab">
|
||||||
|
Backup Profiles
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {% if view_type == 'success' %}active{% endif %}" href="/backup/backup_list/"
|
||||||
|
role="tab">
|
||||||
|
Backup List
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {% if view_type == 'queue' %}active{% endif %}" href="/backup/backup_list/?type=queue"
|
||||||
|
role="tab">
|
||||||
|
Backup Queue
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="nav-item">
|
||||||
|
<a class="nav-link {% if view_type == 'errors' %}active{% endif %}" href="/backup/backup_list/?type=errors"
|
||||||
|
role="tab">
|
||||||
|
Backup Errors
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
</ul>
|
|
@ -11,13 +11,14 @@
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
|
{% include 'backup/backup_nav_tabs.html' %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<table class="table table-hover">
|
<table class="table table-hover">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>Router Count</th>
|
<th>Routers</th>
|
||||||
<th>Daily</th>
|
<th>Daily</th>
|
||||||
<th>Weekly</th>
|
<th>Weekly</th>
|
||||||
<th>Monthly</th>
|
<th>Monthly</th>
|
||||||
|
@ -29,11 +30,11 @@
|
||||||
{% for backup_profile in backup_profile_list %}
|
{% for backup_profile in backup_profile_list %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ backup_profile.name }}</td>
|
<td>{{ backup_profile.name }}</td>
|
||||||
|
|
||||||
<td>
|
<td>
|
||||||
{{ backup_profile.router_set.count }}
|
{{ backup_profile.router_set.count }}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td>
|
<td>
|
||||||
{% if backup_profile.daily_backup %}
|
{% if backup_profile.daily_backup %}
|
||||||
<i class="far fa-check-circle text-success"></i>
|
<i class="far fa-check-circle text-success"></i>
|
||||||
|
@ -44,7 +45,7 @@
|
||||||
<i class="far fa-check-circle text-success"></i>
|
<i class="far fa-check-circle text-success"></i>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
</td>
|
</td>
|
||||||
|
|
||||||
<td>
|
<td>
|
||||||
{% if backup_profile.monthly_backup %}
|
{% if backup_profile.monthly_backup %}
|
||||||
<i class="far fa-check-circle text-success"></i>
|
<i class="far fa-check-circle text-success"></i>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue