mirror of
https://github.com/retspen/webvirtcloud
synced 2026-11-10 20:26:48 +00:00
Twenty-five prompts asked only "Are you sure?", and on the storage page one handler asked the same before every button, Start and Enable included. Each destructive button now names its object and says what happens: a stopped network cuts running VMs off, a deleted pool keeps its files, a deleted volume loses its data, a reverted snapshot loses the changes made since. Saves no longer ask, and disabled buttons lose prompts they could not show. The VM QoS messages said to restart the network where the VM has to be powered off and on. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
184 lines
8.5 KiB
HTML
184 lines
8.5 KiB
HTML
{% extends "base.html" %}
|
|
{% load i18n %}
|
|
{% load static %}
|
|
{% load bootstrap_icons %}
|
|
|
|
{% block title %}{% trans "NWFilter" %}: {{ name }}{% endblock %}
|
|
|
|
{% block page_heading %}{% trans "NWFilter" %}: {{ name }}{% endblock page_heading %}
|
|
|
|
{% block content %}
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<ol class="breadcrumb shadow-sm">
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'overview' compute.id %}">{% bs_icon 'laptop' %} {% trans "Overview" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'instances' compute.id %}">{% bs_icon 'server' %} {% trans "Instances" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'storages' compute.id %}">{% bs_icon 'device-hdd' %} {% trans "Storages" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'networks' compute.id %}">{% bs_icon 'hdd-network' %} {% trans "Networks" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'interfaces' compute.id %}">{% bs_icon 'wifi' %} {% trans "Interfaces" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'nwfilters' compute.id %}">{% bs_icon 'filter' %} {% trans "NWFilters" %}</a>
|
|
</li>
|
|
<li class="breadcrumb-item">
|
|
<a href="{% url 'virtsecrets' compute.id %}">{% bs_icon 'key' %} {% trans "Secrets" %}</a>
|
|
</li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
|
|
<dl class="ms-3 row">
|
|
<dt class="col-4">{% trans "UUID" %}:</dt>
|
|
<dd class="col-8">{{ uuid }}</dd>
|
|
<dt class="col-4">{% trans "Name" %}:</dt>
|
|
<dd class="col-8">{{ name }}</dd>
|
|
</dl>
|
|
|
|
<div class="row">
|
|
<div class="d-grid col-lg-12">
|
|
<button class="btn btn-light mb-3" role="button" data-bs-toggle="collapse" data-bs-target="#collapseXML" aria-expanded="true" aria-controls="collapseXML">
|
|
<span>{% bs_icon 'chevron-down' %} </span>
|
|
{% trans 'XML' %}
|
|
</button>
|
|
<div class="collapse" id="collapseXML">
|
|
<div class="card card-body">
|
|
<form class="form" method="post" role="form">{% csrf_token %}
|
|
<div class="col-12 xmlheight">
|
|
<input type="hidden" name="edit_xml"/>
|
|
<textarea id="edit_editor">{{ xml }}</textarea>
|
|
</div>
|
|
<button type="submit" class="btn btn-primary float-end" name="edit_nwfilter">
|
|
{% trans "Edit" %}
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="row">
|
|
<div class="col-lg-12">
|
|
<h5 class="page-header mr-auto">{% trans "Filter References" %}
|
|
<form class="float-end" method="post" role="form" aria-label="Add NWFilter form">{% csrf_token %}
|
|
<div class="input-group">
|
|
<label class="input-group-text" for="nwfilter_select">{% trans "Filter" %}</label>
|
|
<select id="nwfilter_select" name="nwfilters_select" class="form-select">
|
|
<option value="" selected>{% trans 'None' %}</option>
|
|
{% for nwf in nwfilters_all %}
|
|
<option value="{{ nwf.name }}">{{ nwf.name }}</option>
|
|
{% endfor %}
|
|
</select>
|
|
<button type="submit" class="btn btn-success float-end" name="add_nwfilter_ref" title="{% trans "Add" %}">
|
|
<span aria-hidden="true">{% bs_icon 'plus-circle-fill' %} </span>
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</h5>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div class="col-12 col-sm-12">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover mb-3">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">#</th>
|
|
<th scope="col">{% trans "Reference" %}</th>
|
|
<th scope="col">{% trans "Action" %}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for ref in refs %}
|
|
<tr>
|
|
<th scope="row">{{ forloop.counter }}</th>
|
|
<td>{{ ref }}</td>
|
|
<td style="width:30px;">
|
|
<form action="" method="post" role="form" aria-label="Delete NWFilter form">{% csrf_token %}
|
|
<input type="hidden" name="ref" value="{{ ref }}">
|
|
<button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_ref" title="{% trans "Delete" %}" data-confirm="{% blocktrans with ref=ref %}Remove the reference to {{ ref }}? Its rules no longer apply through this filter.{% endblocktrans %}" onclick="return confirm(this.dataset.confirm)">
|
|
{% bs_icon 'trash' %}
|
|
</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
{% include 'add_nwf_rule.html' %}
|
|
<h5 class="page-header">{% trans "Rules" %}</h5>
|
|
|
|
<div class="table-responsive">
|
|
<table class="table table-hover">
|
|
<thead>
|
|
<tr>
|
|
<th scope="col">{% trans "Rule" %}</th>
|
|
<th scope="col" class="text-nowrap">{% trans "Action Type" %}</th>
|
|
<th scope="col">{% trans "Direction" %}</th>
|
|
<th scope="col">{% trans "Priority" %}</th>
|
|
<th scope="col">{% trans "Statematch" %}</th>
|
|
<th scope="col">{% trans "Directives" %}</th>
|
|
<th scope="col" style="width:30px;">{% trans "Action" %}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for rule in rules %}
|
|
<tr>
|
|
<th scope="row">{{ forloop.counter }}</th>
|
|
<td>{{ rule.action }}</td>
|
|
<td>{{ rule.direction }}</td>
|
|
<td>{{ rule.priority }}</td>
|
|
<td>{{ rule.statematch }}</td>
|
|
<td>{{ rule.directives }}</td>
|
|
<td>
|
|
<form action="" method="post" role="form" aria-label="Delete NWFilter rule">{% csrf_token %}
|
|
<input type="hidden" name="action" value="{{ rule.action }}">
|
|
<input type="hidden" name="direction" value="{{ rule.direction }}">
|
|
<input type="hidden" name="priority" value="{{ rule.priority }}">
|
|
<button type="submit" class="btn btn-sm btn-danger" name="del_nwfilter_rule" title="{% trans 'Delete' %}" data-confirm="{% trans "Delete this rule? Interfaces that use the filter no longer get it." %}" onclick="return confirm(this.dataset.confirm)">
|
|
{% bs_icon 'trash' %}
|
|
</button>
|
|
</form>
|
|
</td>
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endblock %}
|
|
|
|
{% block script %}
|
|
<script src="{% static 'js/sortable.min.js' %}"></script>
|
|
<script src="{% static 'js/ace/ace.js' %}"></script>
|
|
<script>
|
|
var editor = ace.edit("edit_editor");
|
|
editor.getSession().setMode("ace/mode/xml");
|
|
|
|
var edit_input = $('input[name="edit_xml"]');
|
|
editor.getSession().on("change",function () {
|
|
edit_input.val(editor.getSession().getValue());
|
|
});
|
|
|
|
var rule_editor = ace.edit("rule_editor");
|
|
rule_editor.getSession().setMode("ace/mode/xml");
|
|
|
|
var rule_input = $('input[name="nwfilterrule_xml"]');
|
|
rule_editor.getSession().on("change",function () {
|
|
rule_input.val(rule_editor.getSession().getValue());
|
|
});
|
|
</script>
|
|
|
|
{% endblock %}
|