Я хочу создать имитатор потери пакетов / задержки по времени / дрожания с помощью Flask, и я хочу реализовать пару проверок для введенных пользователем значений полей.
У меня есть целочисленное поле для потери пакетов, задержки по времени и дрожания, и поле выбора для сетевого интерфейса.
Я хочу сделать сетевой интерфейс обязательным для заполнения, и форма не должна публиковаться, если там ничего не выбрано.Потеря пакета должна быть между 0 и 100 и задержкой, а затем дрожанием.Последняя проверка должна быть для джиттера, который должен быть меньше или равен временной задержке.
Я создал несколько методов в моем файле forms.py для этих проверок:
from flask_wtf import FlaskForm
from wtforms import IntegerField, SubmitField, ValidationError
from wtforms.validators import DataRequired
class NetemuForm(FlaskForm):
ploss = IntegerField('Packet Loss [0% - 100%]: ')
tdelay = IntegerField('Time Delay [ms]: ')
jitter = IntegerField('Jitter [ms]: ')
interface = IntegerField('Network Interface: ', validators=[DataRequired()])
submit = SubmitField('Submit')
def ploss_check(self, ploss):
if ploss > 100 or ploss < 0:
raise ValidationError('The packet loss has to be between 0 and 100%!')
def tdelay_check(self, tdelay):
if tdelay < 0:
raise ValidationError('The time delay must be positive!')
def jitter_check(self, jitter, tdelay):
if jitter < 0:
raise ValidationError('The jitter must be positive!')
if jitter > tdelay:
raise ValidationError('The jitter must be lower or equal to the configured time delay!')
Мой views.py:
from flask import render_template, url_for, flash, redirect, request, Blueprint
from flask_login import login_required
from webapp.netemulator.forms import NetemuForm
from webapp.netemulator.network_emulator import ListNetIfaces
netemulator = Blueprint('netemulator', __name__)
@netemulator.route('/netemulator', methods = ['GET', 'POST'])
@login_required
def index():
ifaces = ListNetIfaces.network_interfaces()
form = NetemuForm()
if form.validate_on_submit():
ploss = form.ploss.data
tdelay = form.tdelay.data
jitter = form.jitter.data
interface = request.form.get('interface')
return render_template('netemulator.html', form = form, ifaces = ifaces)
Мой netemulator.HTML-шаблон:
{% extends "base.html" %}
{% block content %}
<div class="jumbotron">
<h1>Network Emulation Script</h1>
<p>Here, you can define the packet loss in percentage, time delay and the jitter in miliseconds. <br> Please note that the jitter has to be lower or equal to the time delay value.</p>
</div>
<div class="container" style="min-height:100% width:80%">
{% with messages = get_flashed_messages() %}
{% if messages %}
{% for message in messages %}
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
{{message}}
</div>
{% endfor %}
{% endif %}
{% endwith %}
</div>
<div class="container">
<form class="form-group" method="POST">
{{form.hidden_tag()}}
{{form.ploss.label(class = "form-control-label")}}
{{form.ploss(class = "form-control form-control-lg", autofocus=true, placeholder="0", type=int, help="Please define the packet loss value in percentage between 0 and 100")}}<br>
{{form.tdelay.label(class = "form-control-label")}}
{{form.tdelay(class = "form-control form-control-lg", placeholder="0")}}<br>
{{form.jitter.label(class = "form-control-label")}}
{{form.jitter(class = "form-control form-control-lg", placeholder="0")}}<br>
{{form.interface.label(class="my-1 mr-2", for="inlineFormCustomSelectPref")}}<br>
<select class="custom-select my-1 mr-sm-2 required" name="interface" id="inlineFormCustomSelectPref">
<option selected>Choose...</option>
{% for iface in ifaces %}
<option>{{ iface }}</option>
{% endfor %}
</select><br><br>
{{form.submit(class = "btn btn-outline-info")}}
</form>
{% endblock %}
И, наконец, мой netemulator.py, где я получаю список сетевых интерфейсов, выглядит следующим образом:
import os
class ListNetIfaces:
def network_interfaces():
net_ifaces = sorted(os.listdir('/sys/class/net'))
net_ifaces.remove('lo')
return net_ifaces
Так что в настоящее время любое значение, которое я помещаю в полязапрос POST обрабатывается без каких-либо предупреждений.