horizon/django-nova-syspanel/src/django_nova_syspanel/views/security.py

114 lines
4.5 KiB
Python

from django import template
from django.conf import settings
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect, render_to_response
from django_nova_syspanel.forms import DisableProject
from django_nova_syspanel.forms import DisableIpAddress
from django_nova_syspanel.models import NovaResponseError, get_nova_admin_connection
@login_required
def index(request):
disable_project_form = DisableProject()
disable_ip_form = DisableIpAddress()
return render_to_response('django_nova_syspanel/security/index.html',{
'project_form':disable_project_form,
'ip_form':disable_ip_form,
},context_instance = template.RequestContext(request))
@login_required
def disable_project_credentials(request):
if request.method == "POST":
nova = get_nova_admin_connection()
form = DisableProject(request.POST)
if form.is_valid():
name = form.cleaned_data['project_name']
conn = nova.connection_for(settings.NOVA_ADMIN_USER, name)
vpn = [x for x in nova.get_vpns() if x.project_id == name]
if vpn:
# NOTE(todd): Check, because it could already be shut-off
vpn = vpn[0]
try:
nova.disable_project_credentials(name)
if vpn and vpn.instance_id:
conn.terminate_instances([vpn.instance_id])
except NovaResponseError, e:
messages.error(request,
'Unable to disable project %s: %s - %s' %
(name, e.code, e.message))
return redirect('syspanel_security')
else:
messages.success(request,
'Project %s has been successfully disabled.' %
form.cleaned_data['project_name'])
return render_to_response(
'django_nova_syspanel/security/disable_project_credentials.html',
context_instance = template.RequestContext(request))
else:
messages.error(request, 'Invalid form data')
return redirect('syspanel_security')
else:
return redirect('syspanel_security')
@login_required
def disable_ip(request):
if request.method == "POST":
conn = get_nova_admin_connection()
form = DisableIpAddress(request.POST)
if form.is_valid():
try:
conn.block_ips(form.cleaned_data['cidr'])
except NovaResponseError, e:
messages.error(request,
'Unable to block IPs range %s: %s %s' %
(form.cleaned_data['cidr'], e.code, e.message))
else:
messages.success(request,
'IPs range %shas been successfully blocked' %
form.cleaned_data['cidr'])
return redirect('syspanel_security')
@login_required
def disable_public_ips(request):
if request.method == "POST":
try:
nova = get_nova_admin_connection()
nova.disable_all_floating_ips()
except NovaResponseError, e:
messages.error(request,
'Unable to shut off public IPs: %s - %s' %
(e.code, e.message,))
else:
messages.success(request, 'Public IPs have been turned off.')
return redirect('syspanel_security')
@login_required
def disable_vpn(request):
if request.method == "POST":
nova = get_nova_admin_connection()
conn = nova.connection_for(settings.NOVA_ADMIN_USER,
settings.NOVA_PROJECT)
try:
collector = []
for vpn in nova.get_vpns():
if not vpn.instance_id:
continue
collector.append(vpn)
if len(collector) >= 5:
conn.terminate_instances([x.instance_id for x in collector])
collector = []
if collector:
conn.terminate_instances([x.instance_id for x in collector])
except NovaResponseError, e:
messages.error(request, 'Unable to shut off all VPNs: %s - %s' %
(e.code, e.message,))
else:
messages.success(request, 'VPNs have been successfully turned off.')
return redirect('syspanel_security')
else:
return redirect('syspanel_security')