2024-03-16 15:14:14 -03:00
from django . contrib import messages
2024-04-11 14:44:39 -03:00
from django . db . models import Sum
2024-04-03 11:12:11 -03:00
from django . utils import timezone
2024-03-16 15:14:14 -03:00
from django . shortcuts import render , get_object_or_404 , redirect
from django . contrib . auth . decorators import login_required
2024-04-03 11:12:11 -03:00
2024-04-10 09:57:40 -03:00
from backup . models import BackupProfile
2024-04-03 11:12:11 -03:00
from backup_data . models import RouterBackup
2024-04-11 14:44:39 -03:00
from monitoring . models import RouterDownTime
2024-04-11 12:54:28 -03:00
from routerfleet_tools . models import WebadminSettings
2024-04-02 16:56:35 -03:00
from . models import Router , RouterGroup , RouterStatus , SSHKey , BackupSchedule
2024-03-16 18:03:01 -03:00
from . forms import RouterForm , RouterGroupForm , SSHKeyForm
2024-04-04 11:18:46 -03:00
from user_manager . models import UserAcl
2024-03-16 15:14:14 -03:00
@login_required
def view_router_list ( request ) :
2024-03-16 18:03:01 -03:00
router_list = Router . objects . all ( ) . order_by ( ' name ' )
2024-04-15 13:02:13 -03:00
last_router_status_change = RouterStatus . objects . filter ( last_status_change__isnull = False ) . order_by ( ' -last_status_change ' ) . first ( )
if last_router_status_change :
last_status_change_timestamp = last_router_status_change . last_status_change . isoformat ( )
else :
last_status_change_timestamp = 0
2024-04-10 09:57:40 -03:00
default_backup_profile , _ = BackupProfile . objects . get_or_create ( name = ' default ' )
2024-03-16 18:03:01 -03:00
filter_group = None
if request . GET . get ( ' filter_group ' ) :
if request . GET . get ( ' filter_group ' ) == ' all ' :
pass
else :
filter_group = get_object_or_404 ( RouterGroup , uuid = request . GET . get ( ' filter_group ' ) )
router_list = router_list . filter ( routergroup = filter_group )
if not filter_group and request . GET . get ( ' filter_group ' ) != ' all ' :
filter_group = RouterGroup . objects . filter ( default_group = True ) . first ( )
2024-03-16 15:14:14 -03:00
context = {
' router_list ' : router_list ,
' page_title ' : ' Router List ' ,
2024-03-16 18:03:01 -03:00
' filter_group_list ' : RouterGroup . objects . all ( ) . order_by ( ' name ' ) ,
' filter_group ' : filter_group ,
2024-04-15 13:02:13 -03:00
' last_status_change_timestamp ' : last_status_change_timestamp ,
2024-03-16 15:14:14 -03:00
}
return render ( request , ' router_manager/router_list.html ' , context = context )
2024-04-11 14:44:39 -03:00
@login_required ( )
def view_router_availability ( request ) :
router = get_object_or_404 ( Router , uuid = request . GET . get ( ' uuid ' ) )
data = {
' router ' : router ,
' downtime_list ' : router . routerdowntime_set . all ( ) . order_by ( ' -start_time ' ) ,
}
return render ( request , ' router_manager/router_availability.html ' , context = data )
2024-03-28 13:13:44 -03:00
@login_required ( )
def view_router_details ( request ) :
router = get_object_or_404 ( Router , uuid = request . GET . get ( ' uuid ' ) )
2024-04-02 16:56:35 -03:00
router_status , _ = RouterStatus . objects . get_or_create ( router = router )
2024-04-07 16:50:19 -03:00
router_backup_list = router . routerbackup_set . all ( ) . order_by ( ' -created ' )
2024-04-11 14:44:39 -03:00
downtime_last_week = router . routerdowntime_set . filter ( start_time__gte = timezone . now ( ) - timezone . timedelta ( days = 7 ) ) . aggregate ( total = Sum ( ' total_down_time ' ) ) [ ' total ' ]
if downtime_last_week is None :
downtime_last_week = 0
total_last_week = 7 * 24 * 60 * 60 # total seconds in a week
last_week_availability = round ( ( total_last_week - downtime_last_week ) / total_last_week * 100 , 3 )
if downtime_last_week > 0 and last_week_availability == 100 :
last_week_availability = 99.999
2024-04-07 16:50:19 -03:00
if router_status . backup_lock :
if not router_backup_list . filter ( success = False , error = False ) . exists ( ) :
router_status . backup_lock = None
router_status . save ( )
messages . warning ( request , ' Backup lock removed|Backup lock was removed as there are no active backup tasks ' )
2024-03-28 13:13:44 -03:00
context = {
' router ' : router ,
' router_status ' : router_status ,
2024-04-07 16:50:19 -03:00
' router_backup_list ' : router_backup_list ,
2024-03-28 13:13:44 -03:00
' page_title ' : ' Router Details ' ,
2024-04-11 14:44:39 -03:00
' offline_time_last_week ' : downtime_last_week ,
' last_week_availability ' : last_week_availability ,
2024-03-28 13:13:44 -03:00
}
2024-04-07 16:50:19 -03:00
2024-03-28 13:13:44 -03:00
return render ( request , ' router_manager/router_details.html ' , context = context )
2024-04-02 16:56:35 -03:00
2024-03-16 15:14:14 -03:00
@login_required ( )
def view_manage_router ( request ) :
2024-04-04 11:18:46 -03:00
if not UserAcl . objects . filter ( user = request . user ) . filter ( user_level__gte = 30 ) . exists ( ) :
return render ( request , ' access_denied.html ' , { ' page_title ' : ' Access Denied ' } )
2024-04-11 12:54:28 -03:00
webadmin_settings , _ = WebadminSettings . objects . get_or_create ( name = ' webadmin_settings ' )
2024-03-16 15:14:14 -03:00
if request . GET . get ( ' uuid ' ) :
router = get_object_or_404 ( Router , uuid = request . GET . get ( ' uuid ' ) )
if request . GET . get ( ' action ' ) == ' delete ' :
if request . GET . get ( ' confirmation ' ) == ' delete ' :
router . delete ( )
messages . success ( request , ' Router deleted successfully ' )
2024-04-11 12:54:28 -03:00
webadmin_settings . router_config_last_updated = timezone . now ( )
webadmin_settings . save ( )
2024-03-16 15:14:14 -03:00
return redirect ( ' router_list ' )
else :
messages . warning ( request , ' Router not deleted|Invalid confirmation ' )
return redirect ( ' router_list ' )
else :
router = None
form = RouterForm ( request . POST or None , instance = router )
if form . is_valid ( ) :
form . save ( )
2024-04-04 21:16:53 -03:00
messages . success ( request , ' Router saved successfully|It may take a few minutes until monitoring starts for this router. ' )
2024-04-02 16:56:35 -03:00
router_status , _ = RouterStatus . objects . get_or_create ( router = form . instance )
BackupSchedule . objects . filter ( router = form . instance ) . delete ( )
2024-04-11 12:54:28 -03:00
webadmin_settings . router_config_last_updated = timezone . now ( )
webadmin_settings . save ( )
2024-03-16 15:14:14 -03:00
return redirect ( ' router_list ' )
context = {
' form ' : form ,
' page_title ' : ' Manage Router ' ,
' instance ' : router
}
2024-03-16 18:03:01 -03:00
return render ( request , ' generic_form.html ' , context = context )
@login_required ( )
def view_router_group_list ( request ) :
context = {
' router_group_list ' : RouterGroup . objects . all ( ) . order_by ( ' name ' ) ,
' page_title ' : ' Router Group List ' ,
}
return render ( request , ' router_manager/router_group_list.html ' , context = context )
@login_required ( )
def view_manage_router_group ( request ) :
2024-04-04 11:18:46 -03:00
if not UserAcl . objects . filter ( user = request . user ) . filter ( user_level__gte = 40 ) . exists ( ) :
return render ( request , ' access_denied.html ' , { ' page_title ' : ' Access Denied ' } )
2024-03-16 18:03:01 -03:00
if request . GET . get ( ' uuid ' ) :
router_group = get_object_or_404 ( RouterGroup , uuid = request . GET . get ( ' uuid ' ) )
if request . GET . get ( ' action ' ) == ' delete ' :
if request . GET . get ( ' confirmation ' ) == ' delete ' :
router_group . delete ( )
messages . success ( request , ' Router Group deleted successfully ' )
return redirect ( ' router_group_list ' )
else :
messages . warning ( request , ' Router Group not deleted|Invalid confirmation ' )
return redirect ( ' router_group_list ' )
else :
router_group = None
form = RouterGroupForm ( request . POST or None , instance = router_group )
if form . is_valid ( ) :
form . save ( )
messages . success ( request , ' Router Group saved successfully ' )
return redirect ( ' router_group_list ' )
context = {
' form ' : form ,
' page_title ' : ' Manage Router Group ' ,
' instance ' : router_group
}
return render ( request , ' generic_form.html ' , context = context )
@login_required ( )
def view_ssh_key_list ( request ) :
context = {
' sshkey_list ' : SSHKey . objects . all ( ) . order_by ( ' name ' ) ,
' page_title ' : ' SSH Key List ' ,
}
return render ( request , ' router_manager/sshkey_list.html ' , context = context )
@login_required ( )
def view_manage_sshkey ( request ) :
2024-04-04 11:18:46 -03:00
if not UserAcl . objects . filter ( user = request . user ) . filter ( user_level__gte = 40 ) . exists ( ) :
return render ( request , ' access_denied.html ' , { ' page_title ' : ' Access Denied ' } )
2024-03-16 18:03:01 -03:00
if request . GET . get ( ' uuid ' ) :
sshkey = get_object_or_404 ( SSHKey , uuid = request . GET . get ( ' uuid ' ) )
if request . GET . get ( ' action ' ) == ' delete ' :
if request . GET . get ( ' confirmation ' ) == ' delete ' :
sshkey . delete ( )
messages . success ( request , ' SSH Key deleted successfully ' )
return redirect ( ' ssh_keys_list ' )
else :
messages . warning ( request , ' SSH Key not deleted|Invalid confirmation ' )
return redirect ( ' ssh_keys_list ' )
else :
sshkey = None
form = SSHKeyForm ( request . POST or None , instance = sshkey )
if form . is_valid ( ) :
form . save ( )
messages . success ( request , ' SSH Key saved successfully ' )
return redirect ( ' ssh_keys_list ' )
context = {
' form ' : form ,
' page_title ' : ' Manage SSH Key ' ,
' instance ' : sshkey
}
return render ( request , ' generic_form.html ' , context = context )
2024-04-03 11:12:11 -03:00
@login_required ( )
def view_create_instant_backup_task ( request ) :
2024-04-04 11:18:46 -03:00
if not UserAcl . objects . filter ( user = request . user ) . filter ( user_level__gte = 20 ) . exists ( ) :
return render ( request , ' access_denied.html ' , { ' page_title ' : ' Access Denied ' } )
2024-04-03 11:12:11 -03:00
router = get_object_or_404 ( Router , uuid = request . GET . get ( ' uuid ' ) )
router_details_url = f ' /router/details/?uuid= { router . uuid } '
if RouterBackup . objects . filter ( router = router , success = False , error = False ) . exists ( ) :
messages . warning ( request , ' Backup task not created|Active router backup task already exists ' )
return redirect ( router_details_url )
if router . routerstatus . backup_lock is not None :
messages . warning ( request , ' Backup task not created|Router backup is currently locked ' )
return redirect ( router_details_url )
if not router . backup_profile :
messages . warning ( request , ' Backup task not created|Router has no backup profile ' )
return redirect ( router_details_url )
router_backup = RouterBackup . objects . create ( router = router , schedule_time = timezone . now ( ) , schedule_type = ' instant ' )
router . routerstatus . backup_lock = router_backup . schedule_time
router . routerstatus . save ( )
messages . success ( request , ' Backup task created successfully ' )
return redirect ( router_details_url )
2025-01-31 01:31:41 +02:00
@login_required ( )
def view_create_instant_backup_multiple_routers ( request ) :
# Check user permissions
if not UserAcl . objects . filter ( user = request . user ) . filter ( user_level__gte = 20 ) . exists ( ) :
uuid = request . GET . get ( ' uuid ' )
if uuid :
router_details_url = f ' /router/details/?uuid= { uuid } '
messages . warning ( request , ' Sorry, you do not have permission to create instant backup. Please contact your system administrator if you believe this is an error. ' )
return redirect ( router_details_url )
else :
messages . warning ( request , ' Sorry, you do not have permission to create instant backup. Please contact your system administrator if you believe this is an error. ' )
return redirect ( ' /router/list/ ' )
# Get UUIDs from the request
uuids = request . GET . getlist ( ' uuid ' ) # Changed to getlist for multiple UUIDs
if not uuids :
messages . warning ( request , ' At least one UUID is required for Create Backup Task ' )
return redirect ( ' /router/list/ ' )
# Loop through each UUID and process the backup
for uuid in uuids :
router = get_object_or_404 ( Router , uuid = uuid )
router_details_url = f ' /router/details/?uuid= { router . uuid } '
# Check for existing backup tasks
if RouterBackup . objects . filter ( router = router , success = False , error = False ) . exists ( ) :
messages . warning ( request , f ' Backup task not created for { router . name } | Active router backup task already exists ' )
continue # Skip to the next router
if router . routerstatus . backup_lock is not None :
messages . warning ( request , f ' Backup task not created for { router . name } | Router backup is currently locked ' )
continue # Skip to the next router
if not router . backup_profile :
messages . warning ( request , f ' Backup task not created for { router . name } | Router has no backup profile ' )
continue # Skip to the next router
router_backup = RouterBackup . objects . create ( router = router , schedule_time = timezone . now ( ) , schedule_type = ' instant ' )
# Update backup lock status
router . routerstatus . backup_lock = router_backup . schedule_time
router . routerstatus . save ( )
messages . success ( request , f ' Backup task created successfully for { router . name } ' )
return redirect ( ' /router/list/ ' )