Well.. I’ve done my django based configurator for my HTB shaper (bridge/linux).
I will try to translate this post in english; if you can read Ukrainian, try here.
*subj* :-)
Давно було зрозуміло, що без нормального конфігуратора керувати нормальним шейпером «важкувато», але… все ускладнювала одна обставина — я не програміст (тм).
Чим мене не влаштовують наявні інструменти?
По-перше, всі знайдені вирішують трохи інші задачі, простіші; зокрема, я так і не знайшов конфігуратора для «свого шейпера» — шейпера на мості (bridge/linux), з використанням хеш-таблиць. Для великої кількості клієнтів, для великої кількості IP адрес.
Отже, мені треба було написати щось своє.
Я собі спростив задачу:
- Хай його всі сварять — я використовуватиму django.
- Поєднувати в одній схемі «службові» («кістякові») та «клієнтські» класи здалося заважким — вирішив зробити інакше: для генерування «кістяка» шейпера використовуватиметься окремий скрипт, а для конфігурування (генерування відповідного скрипта) клієнтських класів зроблю собі GUI.
Мій шейпер (тм,-) використовує хеш-таблиці; ці таблиці створює вищезгаданий «окремий скрипт», а заповнюються вони вже скриптами, які генеруються автоматично, засобами django, через специфічні представлення даних.
Отже, «схема» містить такі сутності:
«Схема» трохи недоперемудрена, але поки що хай.
По суті, вся робота з конфігурацією базується на «допиляній» стандартній адмінці django; наприклад, отаке вікно з переліком «контрактів» (показано з уже вибраним окремим контрактом):
Для призначення клієнту діапазону адрес використовується трошки специфічних запитів та шматочок AJAX (генерується таблиця ще не виділених — не наявних у базі — діапазонів потрібного розміру). Це також дописаний до стандартної адмінки віджет:
Подібним чином можна «асоціювати» піддіапазон (шматочок із уже виділених клієнту адрес) з підсмугою:
Звісно, все це для того, щоб можна було автоматизувати процес генерування скрипта :-)
Скрипти генеруються за допомогою специфічних тегів у специфічних представленнях.
Наприклад, ось такий шаблон генерує скрипт для певного «підключення»:
{% load mylib %} <!-- START --> <div class="script"> <br /> <span class="comment">#<br /> # <span class="contract">Contract {{conn.contract}}</span>,<br /> {% if conn.contract.is_active %} # connection {{conn.id}} (0x{{conn.id|to_hex}}).</span><br /> {% if conn.is_active %} {% for DIR in directions %} <!-- {{DIR}}put --> <span class="comment">#<br /> # <span class="direction-{{DIR}}">{{DIR}}put</span>:</span><br /> {% tc_class action conn DIR %}<br /> {% if conn.subconnection_set.all %} {% for sub in conn.subconnection_set.all %} <span class="comment"># sub-conn. <b>{{sub.id}}</b>{% if sub.is_default %} (default) {% endif %}:</span><br /> {% tc_class action sub DIR %}<br /> {% ifequal action "add" %} {% tc_filters sub DIR %}<br /> {% endifequal %} {% endfor %} {% else %} {% ifequal action "add" %} {% tc_filters conn DIR %}<br /> {% endifequal %} {% endif %} {% ifequal action "add" %} {% if conn.peersrange_set.all %} <span class="comment"># own networks:</span><br /> {% tc_filters_own conn DIR %}<br /> {% endif %} {% endifequal %} {% endfor %} {% else %} <span class="comment"># inactive.</span> {% endif %} {% else %} # inactive.</span> {% endif %}<br /> </div> |
Ось такий вигляд має вікно зі згенерованим скриптом для створення класів та фільтрів для певного «підключення» (іденифікатор підключення передається у запиті; на запит без ідентифікатора буде згенеровано увесь скрипт, для всіх підключень всіх клієнтів):
Отакий «інтерфейс» доступний непривілейованим користувачам — це вікно перегляду стану клієнта:
Для цього клієнта створено підсмуги, певним підсмугам призначені певні адреси. Бачите, трафіка ще немає :-) Це пов’язано із тим, що конфігурацію щойно створено, клієнт ще «думає». Трафік буде :-)
Крім продемонстрованих можливостей конфігуратор може:
- призначати різні параметри на «день» та «ніч» (і генерувати скрипти, відповідно, для «день» та «ніч», а також скрипти для переходу між станами —
tc class change ...
) - перевіряти введені значення (наприклад, сума rate для всіх підсмуг не може перевищувати ceil відповідної смуги тощо)
- фіксувати делегування діапазонів у RIPE
- шукати клієнта за номером контракту, IP адресою, коментарем…
- … напевно, щось іще, але треба сформулювати :-)
Для моніторингу стану шейпера використовується py-htbstat.