2018-09-21 13:50:44 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
from __future__ import unicode_literals
|
|
|
|
|
|
|
|
from django.http import HttpResponseRedirect
|
|
|
|
from django.shortcuts import render, get_object_or_404
|
|
|
|
from django.utils.translation import ugettext_lazy as _
|
2020-01-24 07:09:46 +00:00
|
|
|
from django.urls import reverse
|
2018-09-21 13:50:44 +00:00
|
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from computes.models import Compute
|
|
|
|
from vrtManager import util
|
|
|
|
from vrtManager.nwfilters import wvmNWFilters, wvmNWFilter
|
2018-09-21 15:46:33 +00:00
|
|
|
from vrtManager.instance import wvmInstances, wvmInstance
|
2018-09-21 13:50:44 +00:00
|
|
|
from libvirt import libvirtError
|
2018-09-21 15:46:33 +00:00
|
|
|
from logs.views import addlogmsg
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def nwfilters(request, compute_id):
|
|
|
|
"""
|
|
|
|
:param request:
|
2019-10-30 08:05:50 +00:00
|
|
|
:param compute_id:
|
2018-09-21 13:50:44 +00:00
|
|
|
:return:
|
|
|
|
"""
|
|
|
|
|
|
|
|
if not request.user.is_superuser:
|
|
|
|
return HttpResponseRedirect(reverse('index'))
|
|
|
|
|
|
|
|
error_messages = []
|
|
|
|
nwfilters_all = []
|
|
|
|
compute = get_object_or_404(Compute, pk=compute_id)
|
|
|
|
|
|
|
|
try:
|
|
|
|
conn = wvmNWFilters(compute.hostname,
|
2019-10-30 08:05:50 +00:00
|
|
|
compute.login,
|
|
|
|
compute.password,
|
|
|
|
compute.type)
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
if 'create_nwfilter' in request.POST:
|
|
|
|
xml = request.POST.get('nwfilter_xml', '')
|
|
|
|
if xml:
|
|
|
|
try:
|
|
|
|
util.etree.fromstring(xml)
|
|
|
|
name = util.get_xml_path(xml, '/filter/@name')
|
|
|
|
uuid = util.get_xml_path(xml, '/filter/uuid')
|
|
|
|
except util.etree.ParseError:
|
|
|
|
name = None
|
|
|
|
|
|
|
|
for nwf in nwfilters:
|
|
|
|
if name == nwf.name():
|
|
|
|
error_msg = _("A network filter with this name already exists")
|
|
|
|
raise Exception(error_msg)
|
|
|
|
if uuid == nwf.UUIDString():
|
|
|
|
error_msg = _("A network filter with this uuid already exists")
|
|
|
|
raise Exception(error_msg)
|
|
|
|
else:
|
|
|
|
try:
|
2018-09-21 15:46:33 +00:00
|
|
|
msg = _("Creating NWFilter: %s" % name)
|
2018-09-21 13:50:44 +00:00
|
|
|
conn.create_nwfilter(xml)
|
2018-09-21 15:46:33 +00:00
|
|
|
addlogmsg(request.user.username, compute.hostname, msg)
|
2018-09-21 13:50:44 +00:00
|
|
|
except libvirtError as lib_err:
|
2020-03-16 13:59:45 +00:00
|
|
|
error_messages.append(lib_err)
|
|
|
|
addlogmsg(request.user.username, compute.hostname, lib_err)
|
2018-09-21 15:46:33 +00:00
|
|
|
|
2018-09-21 13:50:44 +00:00
|
|
|
if 'del_nwfilter' in request.POST:
|
2019-10-30 08:05:50 +00:00
|
|
|
name = request.POST.get('nwfiltername', '')
|
2018-09-21 15:46:33 +00:00
|
|
|
msg = _("Deleting NWFilter: %s" % name)
|
|
|
|
in_use = False
|
2018-09-21 13:50:44 +00:00
|
|
|
nwfilter = conn.get_nwfilter(name)
|
2018-09-21 15:46:33 +00:00
|
|
|
|
|
|
|
is_conn = wvmInstances(compute.hostname, compute.login, compute.password, compute.type)
|
|
|
|
instances = is_conn.get_instances()
|
|
|
|
for inst in instances:
|
|
|
|
i_conn = wvmInstance(compute.hostname, compute.login, compute.password, compute.type, inst)
|
|
|
|
dom_filterrefs = i_conn.get_filterrefs()
|
|
|
|
|
|
|
|
if name in dom_filterrefs:
|
|
|
|
in_use = True
|
|
|
|
msg = _("NWFilter is in use by %s. Cannot be deleted." % inst)
|
|
|
|
error_messages.append(msg)
|
|
|
|
addlogmsg(request.user.username, compute.hostname, msg)
|
|
|
|
i_conn.close()
|
|
|
|
break
|
|
|
|
|
|
|
|
is_conn.close()
|
|
|
|
if nwfilter and not in_use:
|
2018-09-21 13:50:44 +00:00
|
|
|
nwfilter.undefine()
|
2018-09-21 15:46:33 +00:00
|
|
|
addlogmsg(request.user.username, compute.hostname, msg)
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
if 'cln_nwfilter' in request.POST:
|
2018-09-21 15:46:33 +00:00
|
|
|
|
2019-10-30 08:05:50 +00:00
|
|
|
name = request.POST.get('nwfiltername', '')
|
2018-09-21 13:50:44 +00:00
|
|
|
cln_name = request.POST.get('cln_name', name + '-clone')
|
|
|
|
|
2019-10-30 08:05:50 +00:00
|
|
|
conn.clone_nwfilter(name, cln_name)
|
2018-09-21 15:46:33 +00:00
|
|
|
msg = _("Cloning NWFilter %s as %s" % (name, cln_name))
|
|
|
|
addlogmsg(request.user.username, compute.hostname, msg)
|
|
|
|
|
|
|
|
for nwf in conn.get_nwfilters():
|
2018-09-24 11:41:13 +00:00
|
|
|
nwfilters_all.append(conn.get_nwfilter_info(nwf))
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
conn.close()
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
error_messages.append(lib_err)
|
2018-09-21 15:46:33 +00:00
|
|
|
addlogmsg(request.user.username, compute.hostname, lib_err)
|
2018-09-21 13:50:44 +00:00
|
|
|
except Exception as err:
|
|
|
|
error_messages.append(err)
|
2018-09-21 15:46:33 +00:00
|
|
|
addlogmsg(request.user.username, compute.hostname, err)
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
return render(request, 'nwfilters.html', {'error_messages': error_messages,
|
|
|
|
'nwfilters': nwfilters_all,
|
|
|
|
'compute': compute})
|
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def nwfilter(request, compute_id, nwfltr):
|
|
|
|
|
|
|
|
error_messages = []
|
|
|
|
nwfilters_all = []
|
|
|
|
compute = get_object_or_404(Compute, pk=compute_id)
|
|
|
|
|
|
|
|
try:
|
|
|
|
nwfilter = wvmNWFilter(compute.hostname,
|
2019-10-30 08:05:50 +00:00
|
|
|
compute.login,
|
|
|
|
compute.password,
|
|
|
|
compute.type,
|
|
|
|
nwfltr)
|
2018-09-21 13:50:44 +00:00
|
|
|
conn = wvmNWFilters(compute.hostname,
|
2019-10-30 08:05:50 +00:00
|
|
|
compute.login,
|
|
|
|
compute.password,
|
|
|
|
compute.type)
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
for nwf in conn.get_nwfilters():
|
2018-09-24 11:41:13 +00:00
|
|
|
nwfilters_all.append(conn.get_nwfilter_info(nwf))
|
2018-09-21 13:50:44 +00:00
|
|
|
|
|
|
|
uuid = nwfilter.get_uuid()
|
|
|
|
name = nwfilter.get_name()
|
|
|
|
xml = nwfilter.get_xml()
|
|
|
|
rules = nwfilter.get_rules()
|
|
|
|
refs = nwfilter.get_filter_refs()
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
|
|
|
|
|
|
if 'edit_nwfilter' in request.POST:
|
|
|
|
new_xml = request.POST.get('edit_xml', '')
|
|
|
|
|
|
|
|
if new_xml:
|
|
|
|
nwfilter.delete()
|
|
|
|
try:
|
|
|
|
conn.create_nwfilter(new_xml)
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
conn.create_nwfilter(xml)
|
|
|
|
raise libvirtError(lib_err)
|
|
|
|
|
|
|
|
if 'del_nwfilter_rule' in request.POST:
|
|
|
|
action = request.POST.get('action', '')
|
|
|
|
direction = request.POST.get('direction', '')
|
|
|
|
priority = request.POST.get('priority', '')
|
|
|
|
|
|
|
|
new_xml = nwfilter.delete_rule(action, direction, priority)
|
|
|
|
nwfilter.delete()
|
|
|
|
try:
|
|
|
|
conn.create_nwfilter(new_xml)
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
conn.create_nwfilter(xml)
|
|
|
|
raise libvirtError(lib_err)
|
|
|
|
|
|
|
|
if 'del_nwfilter_ref' in request.POST:
|
|
|
|
ref_name = request.POST.get('ref')
|
|
|
|
new_xml = nwfilter.delete_ref(ref_name)
|
|
|
|
nwfilter.delete()
|
|
|
|
try:
|
|
|
|
conn.create_nwfilter(new_xml)
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
conn.create_nwfilter(xml)
|
|
|
|
raise libvirtError(lib_err)
|
|
|
|
|
|
|
|
if 'add_nwfilter_rule' in request.POST:
|
|
|
|
rule_xml = request.POST.get('nwfilterrule_xml', '')
|
|
|
|
if not rule_xml:
|
|
|
|
return HttpResponseRedirect(request.get_full_path())
|
|
|
|
new_xml = nwfilter.add_rule(rule_xml)
|
|
|
|
nwfilter.delete()
|
|
|
|
try:
|
|
|
|
conn.create_nwfilter(new_xml)
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
conn.create_nwfilter(xml)
|
|
|
|
raise libvirtError(lib_err)
|
|
|
|
|
|
|
|
if 'add_nwfilter_ref' in request.POST:
|
|
|
|
ref_name = request.POST.get('nwfilters_select', '')
|
|
|
|
if not ref_name:
|
|
|
|
return HttpResponseRedirect(request.get_full_path())
|
|
|
|
new_xml = nwfilter.add_ref(ref_name)
|
|
|
|
nwfilter.delete()
|
|
|
|
try:
|
|
|
|
conn.create_nwfilter(new_xml)
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
conn.create_nwfilter(xml)
|
|
|
|
raise libvirtError(lib_err)
|
|
|
|
|
|
|
|
return HttpResponseRedirect(request.get_full_path())
|
|
|
|
conn.close()
|
|
|
|
nwfilter.close()
|
|
|
|
except libvirtError as lib_err:
|
|
|
|
error_messages.append(lib_err)
|
|
|
|
except Exception as error_msg:
|
|
|
|
error_messages.append(error_msg)
|
|
|
|
|
2019-10-30 08:05:50 +00:00
|
|
|
return render(request, 'nwfilter.html', locals())
|