Backup models implementation

This commit is contained in:
Eduardo Silva 2024-03-17 10:43:19 -03:00
parent a8952676d7
commit 15fdbe00fa
12 changed files with 183 additions and 1 deletions

0
backup/__init__.py Normal file
View file

3
backup/admin.py Normal file
View file

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
backup/apps.py Normal file
View file

@ -0,0 +1,6 @@
from django.apps import AppConfig
class BackupConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'backup'

View file

@ -0,0 +1,47 @@
# Generated by Django 5.0.3 on 2024-03-17 13:41
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='BackupProfile',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100, unique=True)),
('daily_backup', models.BooleanField(default=True)),
('weekly_backup', models.BooleanField(default=False)),
('monthly_backup', models.BooleanField(default=False)),
('daily_retenion', models.IntegerField(default=7)),
('weekly_retention', models.IntegerField(default=30)),
('monthly_retenion', models.IntegerField(default=365)),
('retain_backups_on_error', models.BooleanField(default=True)),
('daily_day_monday', models.BooleanField(default=True)),
('daily_day_tuesday', models.BooleanField(default=True)),
('daily_day_wednesday', models.BooleanField(default=True)),
('daily_day_thursday', models.BooleanField(default=True)),
('daily_day_friday', models.BooleanField(default=True)),
('daily_day_saturday', models.BooleanField(default=True)),
('daily_day_sunday', models.BooleanField(default=True)),
('weekly_day', models.CharField(choices=[('monday', 'Monday'), ('tuesday', 'Tuesday'), ('wednesday', 'Wednesday'), ('thursday', 'Thursday'), ('friday', 'Friday'), ('saturday', 'Saturday'), ('sunday', 'Sunday')], max_length=10)),
('monthly_day', models.IntegerField(choices=[(1, '1st'), (7, '7th'), (14, '14th'), (21, '21st'), (28, '28th')], default=1)),
('daily_hour', models.IntegerField(choices=[(0, '00:00'), (1, '01:00'), (2, '02:00'), (3, '03:00'), (4, '04:00'), (5, '05:00'), (6, '06:00'), (7, '07:00'), (8, '08:00'), (9, '09:00'), (10, '10:00'), (11, '11:00'), (12, '12:00'), (13, '13:00'), (14, '14:00'), (15, '15:00'), (16, '16:00'), (17, '17:00'), (18, '18:00'), (19, '19:00'), (20, '20:00'), (21, '21:00'), (22, '22:00'), (23, '23:00')], default=3)),
('weekly_hour', models.IntegerField(choices=[(0, '00:00'), (1, '01:00'), (2, '02:00'), (3, '03:00'), (4, '04:00'), (5, '05:00'), (6, '06:00'), (7, '07:00'), (8, '08:00'), (9, '09:00'), (10, '10:00'), (11, '11:00'), (12, '12:00'), (13, '13:00'), (14, '14:00'), (15, '15:00'), (16, '16:00'), (17, '17:00'), (18, '18:00'), (19, '19:00'), (20, '20:00'), (21, '21:00'), (22, '22:00'), (23, '23:00')], default=1)),
('monthly_hour', models.IntegerField(choices=[(0, '00:00'), (1, '01:00'), (2, '02:00'), (3, '03:00'), (4, '04:00'), (5, '05:00'), (6, '06:00'), (7, '07:00'), (8, '08:00'), (9, '09:00'), (10, '10:00'), (11, '11:00'), (12, '12:00'), (13, '13:00'), (14, '14:00'), (15, '15:00'), (16, '16:00'), (17, '17:00'), (18, '18:00'), (19, '19:00'), (20, '20:00'), (21, '21:00'), (22, '22:00'), (23, '23:00')], default=0)),
('max_retry', models.IntegerField(choices=[(1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')], default=3)),
('retry_interval', models.IntegerField(choices=[('1', '1 Minute'), ('15', '15 Minutes'), ('30', '30 Minutes'), ('60', '1 Hour')], default=30)),
('backup_interval', models.IntegerField(choices=[(0, 'No interval'), (5, '5 seconds'), (60, '1 minute')], default=60)),
('updated', models.DateTimeField(auto_now=True)),
('created', models.DateTimeField(auto_now_add=True)),
('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)),
],
),
]

View file

49
backup/models.py Normal file
View file

@ -0,0 +1,49 @@
from django.db import models
import uuid
HOUR_CHOICES = (
(0, '00:00'), (1, '01:00'), (2, '02:00'), (3, '03:00'), (4, '04:00'), (5, '05:00'), (6, '06:00'), (7, '07:00'),
(8, '08:00'), (9, '09:00'), (10, '10:00'), (11, '11:00'), (12, '12:00'), (13, '13:00'), (14, '14:00'),
(15, '15:00'), (16, '16:00'), (17, '17:00'), (18, '18:00'), (19, '19:00'), (20, '20:00'), (21, '21:00'),
(22, '22:00'), (23, '23:00')
)
class BackupProfile(models.Model):
name = models.CharField(max_length=100, unique=True)
daily_backup = models.BooleanField(default=True)
weekly_backup = models.BooleanField(default=False)
monthly_backup = models.BooleanField(default=False)
daily_retenion = models.IntegerField(default=7)
weekly_retention = models.IntegerField(default=30)
monthly_retenion = models.IntegerField(default=365)
retain_backups_on_error = models.BooleanField(default=True)
daily_day_monday = models.BooleanField(default=True)
daily_day_tuesday = models.BooleanField(default=True)
daily_day_wednesday = models.BooleanField(default=True)
daily_day_thursday = models.BooleanField(default=True)
daily_day_friday = models.BooleanField(default=True)
daily_day_saturday = models.BooleanField(default=True)
daily_day_sunday = models.BooleanField(default=True)
weekly_day = models.CharField(max_length=10, choices=(('monday', 'Monday'), ('tuesday', 'Tuesday'), ('wednesday', 'Wednesday'), ('thursday', 'Thursday'), ('friday', 'Friday'), ('saturday', 'Saturday'), ('sunday', 'Sunday')))
monthly_day = models.IntegerField(default=1, choices=((1, '1st'), (7, '7th'), (14, '14th'), (21, '21st'), (28, '28th')))
daily_hour = models.IntegerField(default=3, choices=HOUR_CHOICES)
weekly_hour = models.IntegerField(default=1, choices=HOUR_CHOICES)
monthly_hour = models.IntegerField(default=0, choices=HOUR_CHOICES)
max_retry = models.IntegerField(default=3, choices=((1, '1'), (2, '2'), (3, '3'), (4, '4'), (5, '5')))
retry_interval = models.IntegerField(default=30, choices=(('1', '1 Minute'), ('15', '15 Minutes'), ('30', '30 Minutes'), ('60', '1 Hour')))
backup_interval = models.IntegerField(default=60, choices=((0, 'No interval'), (5, '5 seconds'), (60, '1 minute')))
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4)
def __str__(self):
return self.name

3
backup/tests.py Normal file
View file

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

3
backup/views.py Normal file
View file

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

View file

@ -0,0 +1,33 @@
# Generated by Django 5.0.3 on 2024-03-17 13:41
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('router_manager', '0007_alter_routergroup_routers'),
]
operations = [
migrations.AddField(
model_name='routerstatus',
name='last_backup_failed',
field=models.DateTimeField(blank=True, null=True),
),
migrations.CreateModel(
name='BackupSchedule',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('next_daily_backup', models.DateTimeField(blank=True, null=True)),
('next_weekly_backup', models.DateTimeField(blank=True, null=True)),
('next_monthly_backup', models.DateTimeField(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.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='router_manager.router')),
],
),
]

View file

@ -0,0 +1,20 @@
# Generated by Django 5.0.3 on 2024-03-17 13:41
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('backup', '0001_initial'),
('router_manager', '0008_routerstatus_last_backup_failed_backupschedule'),
]
operations = [
migrations.AddField(
model_name='router',
name='backup_profile',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='backup.backupprofile'),
),
]

View file

@ -1,4 +1,5 @@
from django.db import models from django.db import models
from backup.models import BackupProfile
import uuid import uuid
@ -23,6 +24,7 @@ class Router(models.Model):
password = models.CharField(max_length=100, null=True, blank=True) password = models.CharField(max_length=100, null=True, blank=True)
ssh_key = models.ForeignKey(SSHKey, on_delete=models.SET_NULL, null=True, blank=True) ssh_key = models.ForeignKey(SSHKey, on_delete=models.SET_NULL, null=True, blank=True)
monitoring = models.BooleanField(default=True) monitoring = models.BooleanField(default=True)
backup_profile = models.ForeignKey(BackupProfile, on_delete=models.SET_NULL, null=True, blank=True)
router_type = models.CharField(max_length=100, choices=(('routeros', 'Mikrotik (RouterOS)'), ('openwrt', 'OpenWRT'))) router_type = models.CharField(max_length=100, choices=(('routeros', 'Mikrotik (RouterOS)'), ('openwrt', 'OpenWRT')))
enabled = models.BooleanField(default=True) enabled = models.BooleanField(default=True)
@ -40,6 +42,7 @@ class RouterStatus(models.Model):
status_online = models.BooleanField(default=False) status_online = models.BooleanField(default=False)
last_status_change = models.DateTimeField(blank=True, null=True) last_status_change = models.DateTimeField(blank=True, null=True)
last_backup = models.DateTimeField(blank=True, null=True) last_backup = models.DateTimeField(blank=True, null=True)
last_backup_failed = models.DateTimeField(blank=True, null=True)
updated = models.DateTimeField(auto_now=True) updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
@ -58,3 +61,17 @@ class RouterGroup(models.Model):
def __str__(self): def __str__(self):
return self.name return self.name
class BackupSchedule(models.Model):
router = models.OneToOneField(Router, on_delete=models.CASCADE)
next_daily_backup = models.DateTimeField(null=True, blank=True)
next_weekly_backup = models.DateTimeField(null=True, blank=True)
next_monthly_backup = models.DateTimeField(null=True, blank=True)
updated = models.DateTimeField(auto_now=True)
created = models.DateTimeField(auto_now_add=True)
uuid = models.UUIDField(unique=True, editable=False, default=uuid.uuid4)

View file

@ -41,7 +41,8 @@ INSTALLED_APPS = [
'crispy_bootstrap4', 'crispy_bootstrap4',
'user_manager', 'user_manager',
'router_manager', 'router_manager',
'monitoring' 'monitoring',
'backup',
] ]
MIDDLEWARE = [ MIDDLEWARE = [