Sphinx generate docs

This commit is contained in:
Merelden 2025-10-14 12:17:13 +05:00
parent 5bc23e7eb8
commit af1420dbde
216 changed files with 39471 additions and 13 deletions

View file

@ -0,0 +1,453 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.arp_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.arp_service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Сервис низкоуровневого ARP-сканирования локальной сети.</span>
<span class="sd">Назначение:</span>
<span class="sd">- Обнаружение активных узлов в пределах сетей хоста путём широковещательных ARP‑запросов от имени выбранного интерфейса.</span>
<span class="sd">- Помощь сервисам более высокого уровня (например, IPService) при проверке занятости адресов перед применением конфигураций.</span>
<span class="sd">Особенности реализации:</span>
<span class="sd">- Определяет подключённые сети интерфейса через `netifaces` и строит CIDR для сканирования.</span>
<span class="sd">- Формирует ARP‑пакеты с помощью `scapy` (Ether/ARP) и отправляет их с таймаутом.</span>
<span class="sd">- Добавляет локальный адрес интерфейса в результирующий список клиентов.</span>
<span class="sd">Требования/ограничения:</span>
<span class="sd">- Для отправки ARP‑кадров могут потребоваться повышенные привилегии или capability на сырой сокет.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">scapy.layers.l2</span><span class="w"> </span><span class="kn">import</span> <span class="n">ARP</span><span class="p">,</span> <span class="n">Ether</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">scapy.sendrecv</span><span class="w"> </span><span class="kn">import</span> <span class="n">srp</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">netifaces</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">netaddr</span><span class="w"> </span><span class="kn">import</span> <span class="n">IPNetwork</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span><span class="p">,</span> <span class="n">_</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<div class="viewcode-block" id="NetworkScanner">
<a class="viewcode-back" href="../../api/services/arp_service.html#services.arp_service.NetworkScanner">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">NetworkScanner</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Инициализация сетевого сканера.</span>
<span class="sd"> Предоставляет методы для сканирования сети с использованием ARP-запросов и</span>
<span class="sd"> вывода информации о клиентах.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">interface</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Инициализация параметров сетевого сканера.</span>
<span class="sd"> Args:</span>
<span class="sd"> interface (str, optional): Название сетевого интерфейса. По умолчанию</span>
<span class="sd"> используется интерфейс по умолчанию из netifaces.gateways().</span>
<span class="sd"> translations: Объект переводов для текущего языка.</span>
<span class="sd"> Инициализирует интерфейс, информацию об IP-адресах и локальный MAC-адрес.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interface</span> <span class="o">=</span> <span class="p">(</span>
<span class="n">interface</span> <span class="ow">or</span> <span class="n">netifaces</span><span class="o">.</span><span class="n">gateways</span><span class="p">()[</span><span class="s2">&quot;default&quot;</span><span class="p">][</span><span class="n">netifaces</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">ip_info</span> <span class="o">=</span> <span class="n">netifaces</span><span class="o">.</span><span class="n">ifaddresses</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span><span class="o">.</span><span class="n">get</span><span class="p">(</span>
<span class="n">netifaces</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="p">[])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">networks</span> <span class="o">=</span> <span class="p">[</span>
<span class="n">IPNetwork</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">ip</span><span class="p">[</span><span class="s1">&#39;addr&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">ip</span><span class="p">[</span><span class="s1">&#39;netmask&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">ip</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ip_info</span>
<span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">local_mac</span> <span class="o">=</span> <span class="n">netifaces</span><span class="o">.</span><span class="n">ifaddresses</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">)[</span><span class="n">netifaces</span><span class="o">.</span><span class="n">AF_LINK</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;addr&quot;</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_create_arp_packet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">target_ip</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Создаёт ARP-пакет для отправки на указанный IP-адрес.</span>
<span class="sd"> Args:</span>
<span class="sd"> target_ip (str): Целевой IP-адрес или подсеть для сканирования.</span>
<span class="sd"> Returns:</span>
<span class="sd"> scapy.packet.Packet: Сформированный ARP-пакет с Ethernet-заголовком.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">arp</span> <span class="o">=</span> <span class="n">ARP</span><span class="p">(</span><span class="n">pdst</span><span class="o">=</span><span class="n">target_ip</span><span class="p">)</span>
<span class="n">ether</span> <span class="o">=</span> <span class="n">Ether</span><span class="p">(</span><span class="n">dst</span><span class="o">=</span><span class="s2">&quot;ff:ff:ff:ff:ff:ff&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">ether</span> <span class="o">/</span> <span class="n">arp</span>
<div class="viewcode-block" id="NetworkScanner.scan_network">
<a class="viewcode-back" href="../../api/services/arp_service.html#services.arp_service.NetworkScanner.scan_network">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">scan_network</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">attempts</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">2</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сканирует сеть для обнаружения активных клиентов.</span>
<span class="sd"> Args:</span>
<span class="sd"> attempts (int, optional): Количество попыток отправки ARP-запросов.</span>
<span class="sd"> По умолчанию 3.</span>
<span class="sd"> timeout (int, optional): Таймаут ожидания ответа в секундах.</span>
<span class="sd"> По умолчанию 2.</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[dict]: Список словарей с ключами &quot;ip&quot; и &quot;mac&quot;, представляющих</span>
<span class="sd"> обнаруженных клиентов, включая локальные IP-адреса.</span>
<span class="sd"> Note:</span>
<span class="sd"> Учитывает локальные IP-адреса интерфейса и удаляет дубликаты.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">all_clients</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">network</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">networks</span><span class="p">:</span>
<span class="n">target_ip</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">network</span><span class="o">.</span><span class="n">network</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">network</span><span class="o">.</span><span class="n">prefixlen</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">packet</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_create_arp_packet</span><span class="p">(</span><span class="n">target_ip</span><span class="p">)</span>
<span class="n">clients</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">attempts</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">srp</span><span class="p">(</span><span class="n">packet</span><span class="p">,</span>
<span class="n">timeout</span><span class="o">=</span><span class="n">timeout</span><span class="p">,</span>
<span class="n">iface</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">,</span>
<span class="n">verbose</span><span class="o">=</span><span class="mi">0</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">received</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
<span class="n">client</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;ip&quot;</span><span class="p">:</span> <span class="n">received</span><span class="o">.</span><span class="n">psrc</span><span class="p">,</span> <span class="s2">&quot;mac&quot;</span><span class="p">:</span> <span class="n">received</span><span class="o">.</span><span class="n">hwsrc</span><span class="p">}</span>
<span class="k">if</span> <span class="n">client</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">clients</span><span class="p">:</span>
<span class="n">clients</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">client</span><span class="p">)</span>
<span class="n">all_clients</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">clients</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ip_info</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">ip_info</span><span class="p">:</span>
<span class="n">local_client</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;ip&quot;</span><span class="p">:</span> <span class="n">ip_info</span><span class="p">[</span><span class="s2">&quot;addr&quot;</span><span class="p">],</span> <span class="s2">&quot;mac&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">local_mac</span><span class="p">}</span>
<span class="k">if</span> <span class="n">local_client</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">all_clients</span><span class="p">:</span>
<span class="n">all_clients</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">local_client</span><span class="p">)</span>
<span class="n">unique_clients</span> <span class="o">=</span> <span class="p">{</span><span class="nb">tuple</span><span class="p">(</span><span class="n">client</span><span class="o">.</span><span class="n">items</span><span class="p">())</span> <span class="k">for</span> <span class="n">client</span> <span class="ow">in</span> <span class="n">all_clients</span><span class="p">}</span>
<span class="k">return</span> <span class="p">[</span><span class="nb">dict</span><span class="p">(</span><span class="n">client</span><span class="p">)</span> <span class="k">for</span> <span class="n">client</span> <span class="ow">in</span> <span class="n">unique_clients</span><span class="p">]</span></div>
<div class="viewcode-block" id="NetworkScanner.print_clients">
<a class="viewcode-back" href="../../api/services/arp_service.html#services.arp_service.NetworkScanner.print_clients">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">print_clients</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">clients</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Выводит список адресов клиентов в формате таблицы.</span>
<span class="sd"> Args:</span>
<span class="sd"> clients (List[dict]): Список словарей с ключами &quot;ip&quot; и &quot;mac&quot;,</span>
<span class="sd"> представляющих клиентов.</span>
<span class="sd"> Выводит IP-адреса и MAC-адреса в отсортированном по IP порядке.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Доступные устройства в сети:&quot;</span><span class="p">))</span>
<span class="nb">print</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;IP&quot;</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot; &quot;</span> <span class="o">*</span> <span class="mi">18</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;MAC&quot;</span><span class="p">))</span>
<span class="k">for</span> <span class="n">client</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">clients</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="s2">&quot;ip&quot;</span><span class="p">]):</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">client</span><span class="p">[</span><span class="s1">&#39;ip&#39;</span><span class="p">]</span><span class="si">:</span><span class="s2">&lt;16</span><span class="si">}</span><span class="s2"> </span><span class="si">{</span><span class="n">client</span><span class="p">[</span><span class="s1">&#39;mac&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
</div>
<span class="c1"># Оставил нативный запуск сервиса для тестов</span>
<span class="k">if</span> <span class="vm">__name__</span> <span class="o">==</span> <span class="s2">&quot;__main__&quot;</span><span class="p">:</span>
<span class="n">scanner</span> <span class="o">=</span> <span class="n">NetworkScanner</span><span class="p">()</span>
<span class="n">clients</span> <span class="o">=</span> <span class="n">scanner</span><span class="o">.</span><span class="n">scan_network</span><span class="p">()</span>
<span class="n">scanner</span><span class="o">.</span><span class="n">print_clients</span><span class="p">(</span><span class="n">clients</span><span class="p">)</span>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,487 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.auth_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.auth_service</h1><div class="highlight"><pre>
<span></span><span class="kn">from</span><span class="w"> </span><span class="nn">jose</span><span class="w"> </span><span class="kn">import</span> <span class="n">JWTError</span><span class="p">,</span> <span class="n">jwt</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">datetime</span><span class="w"> </span><span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">HTTPException</span><span class="p">,</span> <span class="n">Depends</span><span class="p">,</span> <span class="n">Request</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi.security</span><span class="w"> </span><span class="kn">import</span> <span class="n">OAuth2PasswordBearer</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">models.auth</span><span class="w"> </span><span class="kn">import</span> <span class="n">UserCreate</span><span class="p">,</span> <span class="n">UserLogin</span><span class="p">,</span> <span class="n">UserResponse</span><span class="p">,</span> <span class="n">Token</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">storage.json_storage</span><span class="w"> </span><span class="kn">import</span> <span class="n">JsonStorage</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">storage.session_storage</span><span class="w"> </span><span class="kn">import</span> <span class="n">SessionStorage</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Optional</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">configparser</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span><span class="p">,</span> <span class="n">_</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">configparser</span><span class="o">.</span><span class="n">ConfigParser</span><span class="p">()</span>
<span class="n">config_path</span> <span class="o">=</span> <span class="s2">&quot;/etc/gonets/config.ini&quot;</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">config_path</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Configuration file </span><span class="si">{</span><span class="n">config_path</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="n">config_path</span><span class="p">)</span>
<span class="n">SECRET_KEY</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="s2">&quot;JWT&quot;</span><span class="p">][</span><span class="s2">&quot;secret_key&quot;</span><span class="p">]</span>
<span class="n">ALGORITHM</span> <span class="o">=</span> <span class="s2">&quot;HS256&quot;</span>
<span class="n">ACCESS_TOKEN_EXPIRE_MINUTES</span> <span class="o">=</span> <span class="mi">30</span>
<span class="n">oauth2_scheme</span> <span class="o">=</span> <span class="n">OAuth2PasswordBearer</span><span class="p">(</span><span class="n">tokenUrl</span><span class="o">=</span><span class="s2">&quot;/auth/login&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="AuthService">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">AuthService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис для регистрации, авторизации и управления сессиями&quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span> <span class="o">=</span> <span class="n">JsonStorage</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_storage</span> <span class="o">=</span> <span class="n">SessionStorage</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<div class="viewcode-block" id="AuthService.create_access_token">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.create_access_token">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">create_access_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Создаёт токен&quot;&quot;&quot;</span>
<span class="n">to_encode</span> <span class="o">=</span> <span class="n">data</span><span class="o">.</span><span class="n">copy</span><span class="p">()</span>
<span class="n">expire</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span>
<span class="n">minutes</span><span class="o">=</span><span class="n">ACCESS_TOKEN_EXPIRE_MINUTES</span><span class="p">)</span>
<span class="n">to_encode</span><span class="o">.</span><span class="n">update</span><span class="p">({</span><span class="s2">&quot;exp&quot;</span><span class="p">:</span> <span class="n">expire</span><span class="p">})</span>
<span class="n">encoded_jwt</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">to_encode</span><span class="p">,</span> <span class="n">SECRET_KEY</span><span class="p">,</span> <span class="n">algorithm</span><span class="o">=</span><span class="n">ALGORITHM</span><span class="p">)</span>
<span class="k">return</span> <span class="n">encoded_jwt</span></div>
<div class="viewcode-block" id="AuthService.verify_token">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.verify_token">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">verify_token</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">dict</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Проверяет токен&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">payload</span> <span class="o">=</span> <span class="n">jwt</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="n">token</span><span class="p">,</span> <span class="n">SECRET_KEY</span><span class="p">,</span> <span class="n">algorithms</span><span class="o">=</span><span class="p">[</span><span class="n">ALGORITHM</span><span class="p">])</span>
<span class="n">username</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">payload</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;sub&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">username</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;username&quot;</span><span class="p">:</span> <span class="n">username</span><span class="p">}</span>
<span class="k">except</span> <span class="n">JWTError</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span></div>
<div class="viewcode-block" id="AuthService.register">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.register">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">:</span> <span class="n">UserCreate</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">UserResponse</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Регистрирует нового пользователя&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">db_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">create_user</span><span class="p">(</span><span class="n">user</span><span class="p">)</span>
<span class="k">return</span> <span class="n">db_user</span>
<span class="k">except</span> <span class="ne">ValueError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Error registering user </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">400</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Error registering user </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка регистрации&quot;</span><span class="p">))</span></div>
<div class="viewcode-block" id="AuthService.login">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.login">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">login</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user</span><span class="p">:</span> <span class="n">UserLogin</span><span class="p">,</span> <span class="n">client_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Авторизует пользователя, создаёт сессию и возвращает токен&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">db_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_user_by_username</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">db_user</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;User </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Неверный логин или пароль&quot;</span><span class="p">))</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">verify_password</span><span class="p">(</span><span class="n">user</span><span class="o">.</span><span class="n">password</span><span class="p">,</span> <span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;password_hash&quot;</span><span class="p">]):</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Invalid password for user </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Неверный логин или пароль&quot;</span><span class="p">))</span>
<span class="n">access_token</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">create_access_token</span><span class="p">(</span>
<span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;sub&quot;</span><span class="p">:</span> <span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">})</span>
<span class="n">session_id</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_storage</span><span class="o">.</span><span class="n">create_session</span><span class="p">(</span>
<span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="p">,</span> <span class="n">access_token</span><span class="p">,</span> <span class="n">client_id</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;User </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2"> successfully logged in&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;access_token&quot;</span><span class="p">:</span> <span class="n">access_token</span><span class="p">,</span>
<span class="s2">&quot;token_type&quot;</span><span class="p">:</span> <span class="s2">&quot;bearer&quot;</span><span class="p">,</span>
<span class="s2">&quot;session_id&quot;</span><span class="p">:</span> <span class="n">session_id</span><span class="p">,</span>
<span class="s2">&quot;user&quot;</span><span class="p">:</span> <span class="n">UserResponse</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">],</span> <span class="n">username</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">],</span> <span class="n">is_admin</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;is_admin&quot;</span><span class="p">]),</span>
<span class="p">}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Error logging in user </span><span class="si">{</span><span class="n">user</span><span class="o">.</span><span class="n">username</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка авторизации&quot;</span><span class="p">))</span></div>
<div class="viewcode-block" id="AuthService.get_current_user">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.get_current_user">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_current_user</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">token</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">oauth2_scheme</span><span class="p">))</span> <span class="o">-&gt;</span> <span class="n">UserResponse</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает текущего пользователя по токену&quot;&quot;&quot;</span>
<span class="n">credentials</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">verify_token</span><span class="p">(</span><span class="n">token</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">credentials</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Invalid or expired token&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Неверный токен&quot;</span><span class="p">))</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">credentials</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span>
<span class="n">db_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_user_by_username</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">db_user</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;User </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Пользователь не найден&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">UserResponse</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">],</span> <span class="n">username</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">],</span> <span class="n">is_admin</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;is_admin&quot;</span><span class="p">])</span></div>
<div class="viewcode-block" id="AuthService.get_user_by_session">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.get_user_by_session">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_user_by_session</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает пользователя и токен по client_id&quot;&quot;&quot;</span>
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_storage</span><span class="o">.</span><span class="n">get_latest_session</span><span class="p">(</span><span class="n">client_id</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">session</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Session for client_id </span><span class="si">{</span><span class="n">client_id</span><span class="si">}</span><span class="s2"> not found or expired&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Сессия недействительна&quot;</span><span class="p">))</span>
<span class="n">username</span> <span class="o">=</span> <span class="n">session</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">]</span>
<span class="n">token</span> <span class="o">=</span> <span class="n">session</span><span class="p">[</span><span class="s2">&quot;token&quot;</span><span class="p">]</span>
<span class="n">db_user</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">get_user_by_username</span><span class="p">(</span><span class="n">username</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">db_user</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;User </span><span class="si">{</span><span class="n">username</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">401</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Пользователь не найден&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;user&quot;</span><span class="p">:</span>
<span class="n">UserResponse</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;id&quot;</span><span class="p">],</span> <span class="n">username</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;username&quot;</span><span class="p">],</span> <span class="n">is_admin</span><span class="o">=</span><span class="n">db_user</span><span class="p">[</span><span class="s2">&quot;is_admin&quot;</span><span class="p">]),</span>
<span class="s2">&quot;access_token&quot;</span><span class="p">:</span> <span class="n">token</span>
<span class="p">}</span></div>
<div class="viewcode-block" id="AuthService.logout">
<a class="viewcode-back" href="../../api/services/auth_service.html#services.auth_service.AuthService.logout">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">logout</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Выполняет выход из системы, удаляя последнюю сессию для client_id&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">session</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">session_storage</span><span class="o">.</span><span class="n">get_latest_session</span><span class="p">(</span><span class="n">client_id</span><span class="p">)</span>
<span class="k">if</span> <span class="n">session</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">session_storage</span><span class="o">.</span><span class="n">delete_session</span><span class="p">(</span><span class="n">session</span><span class="p">[</span><span class="s2">&quot;session_id&quot;</span><span class="p">])</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;User successfully logged out for client_id </span><span class="si">{</span><span class="n">client_id</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Успешный выход из системы&quot;</span><span class="p">)}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Error logging out: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s2"> - </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">HTTPException</span><span class="p">(</span><span class="n">status_code</span><span class="o">=</span><span class="mi">500</span><span class="p">,</span> <span class="n">detail</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка при выходе из системы&quot;</span><span class="p">))</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,507 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.connect_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.connect_service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Сервис управления подключениями Wi‑Fi через `nmcli`.</span>
<span class="sd">Назначение:</span>
<span class="sd">- Предоставляет операции подключения/отключения к точкам доступа и проверки текущего статуса, ориентируясь на системный NetworkManager.</span>
<span class="sd">Поведение:</span>
<span class="sd">- Автоматически определяет активный Wi‑Fi‑интерфейс.</span>
<span class="sd">- Валидирует наличие SSID в листинге перед подключением и интерпретирует частые ошибки `nmcli` (неверный пароль, отсутствующая сеть и т.п.).</span>
<span class="sd">Ограничения:</span>
<span class="sd">- Требуются права для управления сетевыми соединениями в системе.</span>
<span class="sd">- В окружениях без NetworkManager команды `nmcli` будут недоступны.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span><span class="p">,</span> <span class="n">_</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">,</span> <span class="nb">format</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">%(asctime)s</span><span class="s2"> - </span><span class="si">%(name)s</span><span class="s2"> - </span><span class="si">%(levelname)s</span><span class="s2"> - </span><span class="si">%(message)s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<div class="viewcode-block" id="WifiConnectionService">
<a class="viewcode-back" href="../../api/services/connect_service.html#services.connect_service.WifiConnectionService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">WifiConnectionService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис для управления подключением к Wi-Fi сетям с использованием nmcli.</span>
<span class="sd"> Предоставляет методы для подключения, отключения и проверки статуса Wi-Fi соединений.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Инициализирует сервис Wi-Fi.</span>
<span class="sd"> Автоматически определяет доступный Wi-Fi-интерфейс и сохраняет его имя.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interface</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_wifi_interface</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_wifi_interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Автоматически определяет Wi-Fi-интерфейс.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Название Wi-Fi-интерфейса (например, &quot;wlan0&quot;) или пустая строка,</span>
<span class="sd"> если интерфейс не найден или Wi-Fi отключён.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при выполнении команд nmcli.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;radio&quot;</span><span class="p">,</span> <span class="s2">&quot;wifi&quot;</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;enabled&quot;</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;device&quot;</span><span class="p">,</span> <span class="s2">&quot;status&quot;</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">stdout</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span>
<span class="k">if</span> <span class="s2">&quot;wifi&quot;</span> <span class="ow">in</span> <span class="n">line</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="ow">and</span> <span class="s2">&quot;connected&quot;</span> <span class="ow">in</span> <span class="n">line</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
<span class="n">iface</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Using Wi-Fi interface: </span><span class="si">{</span><span class="n">iface</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">iface</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Wi-Fi interface not found or not connected&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;wlan0&quot;</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;Wi-Fi radio is disabled&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error detecting Wi-Fi interface: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="s2">&quot;&quot;</span>
<div class="viewcode-block" id="WifiConnectionService.connect">
<a class="viewcode-back" href="../../api/services/connect_service.html#services.connect_service.WifiConnectionService.connect">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">connect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssid</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">password</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Подключается к Wi-Fi сети по SSID и паролю.</span>
<span class="sd"> Args:</span>
<span class="sd"> ssid (str): Идентификатор сети Wi-Fi.</span>
<span class="sd"> password (str): Пароль для подключения.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Tuple[bool, Optional[str]]: Кортеж (успех, сообщение об ошибке).</span>
<span class="sd"> - Успех: (True, None).</span>
<span class="sd"> - Ошибка: (False, сообщение об ошибке).</span>
<span class="sd"> Raises:</span>
<span class="sd"> subprocess.CalledProcessError: Если команда nmcli завершилась с ошибкой.</span>
<span class="sd"> Exception: Если произошла неизвестная ошибка при выполнении.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Wi-Fi-интерфейс не доступен&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;-f&quot;</span><span class="p">,</span> <span class="s2">&quot;SSID&quot;</span><span class="p">,</span> <span class="s2">&quot;device&quot;</span><span class="p">,</span> <span class="s2">&quot;wifi&quot;</span><span class="p">,</span> <span class="s2">&quot;list&quot;</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Сеть с SSID </span><span class="si">{ssid}</span><span class="s2"> не найдена в списке доступных сетей&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;device&quot;</span><span class="p">,</span> <span class="s2">&quot;wifi&quot;</span><span class="p">,</span> <span class="s2">&quot;connect&quot;</span><span class="p">,</span> <span class="n">ssid</span><span class="p">,</span> <span class="s2">&quot;password&quot;</span><span class="p">,</span> <span class="n">password</span><span class="p">]</span>
<span class="n">process</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">if</span> <span class="n">process</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">error_msg</span> <span class="o">=</span> <span class="n">process</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;secrets were required&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span> <span class="ow">or</span> <span class="s2">&quot;authentication failed&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span> <span class="ow">or</span> <span class="s2">&quot;802-11-wireless-security.psk: недействительное свойство&quot;</span> <span class="ow">in</span> <span class="n">process</span><span class="o">.</span><span class="n">stderr</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: Неверный пароль&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;no network with ssid&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: Сеть с SSID </span><span class="si">{ssid}</span><span class="s2"> недоступна или неверно указана&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="n">process</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Successfully connected to network </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">None</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error connecting to </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">error_msg</span> <span class="o">=</span> <span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;secrets were required&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span> <span class="ow">or</span> <span class="s2">&quot;authentication failed&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span> <span class="ow">or</span> <span class="s2">&quot;802-11-wireless-security.psk: недействительное свойство&quot;</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: Неверный пароль&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;no network with ssid&quot;</span> <span class="ow">in</span> <span class="n">error_msg</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: Сеть с SSID </span><span class="si">{ssid}</span><span class="s2"> недоступна или неверно указана&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown error connecting to </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка подключения к </span><span class="si">{ssid}</span><span class="s2">: Неизвестная ошибка - </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
<div class="viewcode-block" id="WifiConnectionService.disconnect">
<a class="viewcode-back" href="../../api/services/connect_service.html#services.connect_service.WifiConnectionService.disconnect">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">disconnect</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Отключается от Wi-Fi сети по указанному SSID.</span>
<span class="sd"> Args:</span>
<span class="sd"> ssid (str): Идентификатор сети Wi-Fi для отключения.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Tuple[bool, Optional[str]]: Кортеж (успех, сообщение об ошибке).</span>
<span class="sd"> - Успех: (True, None или сообщение, если подключение не найдено).</span>
<span class="sd"> - Ошибка: (False, сообщение об ошибке).</span>
<span class="sd"> Raises:</span>
<span class="sd"> subprocess.CalledProcessError: Если команда nmcli завершилась с ошибкой.</span>
<span class="sd"> Exception: Если произошла неизвестная ошибка при выполнении.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Wi-Fi-интерфейс не доступен&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="s2">&quot;show&quot;</span><span class="p">,</span> <span class="s2">&quot;--active&quot;</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">active_connections</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">active_connections</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No active connections for SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Нет активного подключения для SSID </span><span class="si">{ssid}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">for</span> <span class="n">conn</span> <span class="ow">in</span> <span class="n">active_connections</span><span class="p">:</span>
<span class="n">conn_details</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">split</span><span class="p">()</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">conn_details</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">conn_name</span> <span class="o">=</span> <span class="n">conn_details</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">conn_info</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="s2">&quot;show&quot;</span><span class="p">,</span> <span class="n">conn_name</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span><span class="o">.</span><span class="n">stdout</span>
<span class="k">if</span> <span class="s2">&quot;802-11-wireless.ssid:&quot;</span> <span class="ow">in</span> <span class="n">conn_info</span> <span class="ow">and</span> <span class="n">ssid</span> <span class="ow">in</span> <span class="n">conn_info</span><span class="p">:</span>
<span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="s2">&quot;down&quot;</span><span class="p">,</span> <span class="n">conn_name</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Disconnected from SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">None</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Active connection with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Активное подключение с SSID </span><span class="si">{ssid}</span><span class="s2"> не найдено&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error disconnecting from </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка отключения от </span><span class="si">{ssid}</span><span class="s2">: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Unknown error disconnecting from </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка отключения от </span><span class="si">{ssid}</span><span class="s2">: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span> <span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
<div class="viewcode-block" id="WifiConnectionService.get_status">
<a class="viewcode-back" href="../../api/services/connect_service.html#services.connect_service.WifiConnectionService.get_status">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_status</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Проверяет статус текущего подключения к Wi-Fi.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Tuple[bool, Optional[str]]: Кортеж (успех, SSID или сообщение об ошибке).</span>
<span class="sd"> - Успех: (True, SSID текущей сети).</span>
<span class="sd"> - Ошибка или отсутствие подключения: (False, сообщение об ошибке).</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при выполнении команды nmcli.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Wi-Fi-интерфейс не доступен&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;nmcli&quot;</span><span class="p">,</span> <span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="s2">&quot;show&quot;</span><span class="p">,</span> <span class="s2">&quot;--active&quot;</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
<span class="n">ssid</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()[</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Current network: </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="n">ssid</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Не подключено к Wi-Fi&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error checking status: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка проверки статуса: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,522 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.firewalld_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.firewalld_service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Сервис для управления firewalld через D‑Bus.</span>
<span class="sd">Назначение:</span>
<span class="sd">- Обёртка над интерфейсами `org.fedoraproject.FirewallD1` для выполнения</span>
<span class="sd"> типовых операций по зонам: просмотр/изменение дефолтной зоны, добавление и</span>
<span class="sd"> удаление сервисов, портов, источников, перезагрузка конфигурации.</span>
<span class="sd">Примечания:</span>
<span class="sd">- Используется `pydbus.SystemBus` для доступа к системной шине.</span>
<span class="sd">- Методы генерируют дружелюбные исключения при ошибках, содержащие контекст</span>
<span class="sd"> операции.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">re</span><span class="w"> </span><span class="kn">import</span> <span class="n">DEBUG</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pydbus</span><span class="w"> </span><span class="kn">import</span> <span class="n">SystemBus</span>
<span class="n">DEBUG</span> <span class="o">=</span> <span class="kc">True</span>
<div class="viewcode-block" id="FirewalldService">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">FirewalldService</span><span class="p">:</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bus</span> <span class="o">=</span> <span class="n">SystemBus</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bus</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;org.fedoraproject.FirewallD1&quot;</span><span class="p">,</span>
<span class="s2">&quot;/org/fedoraproject/FirewallD1&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="FirewalldService.get_zones">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_zones">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_zones</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get list of all zones.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">getZones</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to get zones: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.get_default_zone">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_default_zone">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_default_zone</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get the default zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">getDefaultZone</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to get default zone: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.set_default_zone">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.set_default_zone">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">set_default_zone</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Set the default zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">setDefaultZone</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to set default zone to </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.add_service">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.add_service">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">service</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">timeout</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a service to a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">addService</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">service</span><span class="p">,</span> <span class="n">timeout</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to add service </span><span class="si">{</span><span class="n">service</span><span class="si">}</span><span class="s2"> to zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.remove_service">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.remove_service">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">remove_service</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">service</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a service from a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">removeService</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">service</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to remove service </span><span class="si">{</span><span class="n">service</span><span class="si">}</span><span class="s2"> from zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.get_services">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_services">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_services</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get list of services in a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">getServices</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to get services for zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.add_port">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.add_port">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_port</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span>
<span class="n">protocol</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">timeout</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a port to a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Adding port </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">protocol</span><span class="si">}</span><span class="s2"> to zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Timeout: </span><span class="si">{</span><span class="n">timeout</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># Get the zone interface</span>
<span class="n">zone_proxy</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">bus</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;org.fedoraproject.FirewallD1&quot;</span><span class="p">,</span>
<span class="s2">&quot;/org/fedoraproject/FirewallD1&quot;</span><span class="p">)</span>
<span class="n">zone_iface</span> <span class="o">=</span> <span class="n">zone_proxy</span><span class="p">[</span><span class="s2">&quot;org.fedoraproject.FirewallD1.zone&quot;</span><span class="p">]</span>
<span class="c1"># Convert port to string</span>
<span class="n">port_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
<span class="c1"># Convert timeout to integer</span>
<span class="n">timeout_int</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">timeout</span><span class="p">)</span> <span class="k">if</span> <span class="n">timeout</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="mi">0</span>
<span class="c1"># Call addPort with the correct signature (sssi)</span>
<span class="n">zone_iface</span><span class="o">.</span><span class="n">addPort</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">port_str</span><span class="p">,</span> <span class="n">protocol</span><span class="p">,</span> <span class="n">timeout_int</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to add port </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">protocol</span><span class="si">}</span><span class="s2"> to zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.remove_port">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.remove_port">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">remove_port</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">protocol</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a port from a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">port_str</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">protocol</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">removePort</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">port_str</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to remove port </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">protocol</span><span class="si">}</span><span class="s2"> from zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.get_ports">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_ports">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_ports</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get list of ports in a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">ports</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">getPorts</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span>
<span class="c1"># Convert port list items to strings in format &quot;port/protocol&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">port</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2">/</span><span class="si">{</span><span class="n">port</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span> <span class="k">for</span> <span class="n">port</span> <span class="ow">in</span> <span class="n">ports</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to get ports for zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.add_source">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.add_source">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">source</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Add a source to a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">addSource</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to add source </span><span class="si">{</span><span class="n">source</span><span class="si">}</span><span class="s2"> to zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.remove_source">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.remove_source">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">remove_source</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">source</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Remove a source from a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">removeSource</span><span class="p">(</span><span class="n">zone</span><span class="p">,</span> <span class="n">source</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to remove source </span><span class="si">{</span><span class="n">source</span><span class="si">}</span><span class="s2"> from zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.get_sources">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_sources">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_sources</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get list of sources in a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">getSources</span><span class="p">(</span><span class="n">zone</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to get sources for zone </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.reload">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.reload">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">reload</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Reload firewall rules.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">proxy</span><span class="o">.</span><span class="n">reload</span><span class="p">()</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to reload firewall rules: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="FirewalldService.get_zone_settings">
<a class="viewcode-back" href="../../api/services/firewalld_service.html#services.firewalld_service.FirewalldService.get_zone_settings">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_zone_settings</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">zone</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Get all settings for a zone.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;services&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_services</span><span class="p">(</span><span class="n">zone</span><span class="p">),</span>
<span class="s2">&quot;ports&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ports</span><span class="p">(</span><span class="n">zone</span><span class="p">),</span>
<span class="s2">&quot;sources&quot;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_sources</span><span class="p">(</span><span class="n">zone</span><span class="p">),</span>
<span class="p">}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Failed to get zone settings for </span><span class="si">{</span><span class="n">zone</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,468 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.ip_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.ip_service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Сервис проверки и применения IP‑настроек через NetworkManager (D‑Bus).</span>
<span class="sd">Назначение:</span>
<span class="sd">- Перед применением конфигурации проверяет занятость IP адреса, сканируя сегмент</span>
<span class="sd"> сети средствами ARP (через `NetworkScanner`).</span>
<span class="sd">- Применяет изменения профиля подключения через `sdbus_async.networkmanager` и</span>
<span class="sd"> выполняет переподключение интерфейса.</span>
<span class="sd">Требования/ограничения:</span>
<span class="sd">- Доступ к системной шине D‑Bus и права на изменения сетевых профилей.</span>
<span class="sd">- Структура входных данных должна соответствовать схеме `ipv4_updates` для</span>
<span class="sd"> корректного обновления вложенных полей у профиля.</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Any</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">sdbus_async.networkmanager</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">NetworkManager</span><span class="p">,</span>
<span class="n">NetworkManagerSettings</span><span class="p">,</span>
<span class="n">NetworkConnectionSettings</span><span class="p">,</span>
<span class="n">NetworkDeviceGeneric</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">sdbus</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">sdbus_async.networkmanager.settings</span><span class="w"> </span><span class="kn">import</span> <span class="n">ConnectionProfile</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">services.arp_service</span><span class="w"> </span><span class="kn">import</span> <span class="n">NetworkScanner</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<div class="viewcode-block" id="IPService">
<a class="viewcode-back" href="../../api/services/ip_service.html#services.ip_service.IPService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">IPService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис проверки доступности IP-адреса и применения настроек сети.</span>
<span class="sd"> Предоставляет асинхронные методы для проверки занятости IP-адреса с использованием</span>
<span class="sd"> ARP-сканирования и применения настроек через NetworkManager.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Инициализирует сервис IP.</span>
<span class="sd"> Создаёт объект ARP-сканера и устанавливает системную шину D-Bus как</span>
<span class="sd"> по умолчанию.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">arp_scanner</span> <span class="o">=</span> <span class="n">NetworkScanner</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bus</span> <span class="o">=</span> <span class="n">sdbus</span><span class="o">.</span><span class="n">sd_bus_open_system</span><span class="p">()</span>
<span class="n">sdbus</span><span class="o">.</span><span class="n">set_default_bus</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">bus</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_reset_bus</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Перезапускает соединение с системной шиной D-Bus.</span>
<span class="sd"> Закрывает текущее соединение и создаёт новое, устанавливая его как</span>
<span class="sd"> по умолчанию.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">new_bus</span> <span class="o">=</span> <span class="n">sdbus</span><span class="o">.</span><span class="n">sd_bus_open_system</span><span class="p">()</span>
<span class="n">sdbus</span><span class="o">.</span><span class="n">set_default_bus</span><span class="p">(</span><span class="n">new_bus</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;bus&quot;</span><span class="p">)</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">bus</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bus</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">bus</span> <span class="o">=</span> <span class="n">new_bus</span>
<div class="viewcode-block" id="IPService.check_ip_config">
<a class="viewcode-back" href="../../api/services/ip_service.html#services.ip_service.IPService.check_ip_config">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">check_ip_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">()))</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Проверяет доступность IP-адреса перед его применением.</span>
<span class="sd"> Выполняет ARP-сканирование сети для проверки, занят ли указанный IP-адрес.</span>
<span class="sd"> Перезапускает шину D-Bus перед выполнением.</span>
<span class="sd"> Args:</span>
<span class="sd"> args (Dict[str, Any]): Словарь с данными, включая &quot;ipv4_updates&quot;</span>
<span class="sd"> с полем &quot;ipv4.address-data&quot; для нового IP-адреса.</span>
<span class="sd"> translations (Translations): Объект переводов.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Dict[str, Any]: Словарь с ключами:</span>
<span class="sd"> - &quot;available&quot; (bool): Доступен ли IP-адрес.</span>
<span class="sd"> - &quot;message&quot; (str): Сообщение о результате проверки.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при сканировании ARP.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reset_bus</span><span class="p">()</span>
<span class="n">clients</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">arp_scanner</span><span class="o">.</span><span class="n">scan_network</span><span class="p">()</span>
<span class="n">new_ip</span> <span class="o">=</span> <span class="n">args</span><span class="p">[</span><span class="s2">&quot;ipv4_updates&quot;</span><span class="p">][</span><span class="s2">&quot;ipv4.address-data&quot;</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s2">&quot;address&quot;</span><span class="p">]</span>
<span class="k">if</span> <span class="nb">any</span><span class="p">(</span><span class="n">client</span><span class="p">[</span><span class="s2">&quot;ip&quot;</span><span class="p">]</span> <span class="o">==</span> <span class="n">new_ip</span> <span class="k">for</span> <span class="n">client</span> <span class="ow">in</span> <span class="n">clients</span><span class="p">):</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;available&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;IP-адрес </span><span class="si">{ip}</span><span class="s2"> уже занят.&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ip</span><span class="o">=</span><span class="n">new_ip</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;available&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Настройки сетевого профиля доступны для использования.&quot;</span><span class="p">)</span>
<span class="p">}</span></div>
<div class="viewcode-block" id="IPService.apply_ip_config">
<a class="viewcode-back" href="../../api/services/ip_service.html#services.ip_service.IPService.apply_ip_config">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">apply_ip_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">],</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">()))</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Применяет проверенные настройки IP к указанному соединению.</span>
<span class="sd"> Перезапускает шину D-Bus, обновляет настройки соединения через NetworkManager,</span>
<span class="sd"> отключает и переподключает устройство к сети.</span>
<span class="sd"> Args:</span>
<span class="sd"> args (Dict[str, Any]): Словарь с данными, включая:</span>
<span class="sd"> - &quot;connection_id&quot; (str): Идентификатор соединения.</span>
<span class="sd"> - &quot;ipv4_updates&quot; (Dict): Обновления настроек IPv4.</span>
<span class="sd"> translations (Translations): Объект переводов.</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: Если соединение с указанным ID не найдено.</span>
<span class="sd"> RuntimeError: Если устройство для интерфейса не найдено.</span>
<span class="sd"> Note:</span>
<span class="sd"> Требуются права для изменения настроек через NetworkManager.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_reset_bus</span><span class="p">()</span>
<span class="n">nm</span> <span class="o">=</span> <span class="n">NetworkManager</span><span class="p">()</span>
<span class="n">settings</span> <span class="o">=</span> <span class="n">NetworkManagerSettings</span><span class="p">()</span>
<span class="n">connection_paths</span> <span class="o">=</span> <span class="k">await</span> <span class="n">settings</span><span class="o">.</span><span class="n">get_connections_by_id</span><span class="p">(</span>
<span class="n">args</span><span class="p">[</span><span class="s2">&quot;connection_id&quot;</span><span class="p">])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">connection_paths</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Подключение </span><span class="si">{connection_id}</span><span class="s2"> не найдено&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">connection_id</span><span class="o">=</span><span class="n">args</span><span class="p">[</span><span class="s2">&quot;connection_id&quot;</span><span class="p">]))</span>
<span class="n">connection</span> <span class="o">=</span> <span class="n">NetworkConnectionSettings</span><span class="p">(</span><span class="n">connection_paths</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="n">profile</span> <span class="o">=</span> <span class="k">await</span> <span class="n">connection</span><span class="o">.</span><span class="n">get_profile</span><span class="p">()</span>
<span class="n">settings_dict</span> <span class="o">=</span> <span class="n">profile</span><span class="o">.</span><span class="n">to_settings_dict</span><span class="p">()</span>
<span class="k">for</span> <span class="n">key_path</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">args</span><span class="p">[</span><span class="s2">&quot;ipv4_updates&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">section</span><span class="p">,</span> <span class="o">*</span><span class="n">props</span> <span class="o">=</span> <span class="n">key_path</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s2">&quot;.&quot;</span><span class="p">)</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">settings_dict</span><span class="p">[</span><span class="n">section</span><span class="p">]</span>
<span class="k">for</span> <span class="n">prop</span> <span class="ow">in</span> <span class="n">props</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
<span class="n">current</span> <span class="o">=</span> <span class="n">current</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">prop</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">current</span><span class="p">[</span><span class="n">props</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]]</span> <span class="o">=</span> <span class="n">value</span>
<span class="n">new_profile</span> <span class="o">=</span> <span class="n">ConnectionProfile</span><span class="o">.</span><span class="n">from_settings_dict</span><span class="p">(</span><span class="n">settings_dict</span><span class="p">)</span>
<span class="k">await</span> <span class="n">connection</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">new_profile</span><span class="o">.</span><span class="n">to_dbus</span><span class="p">())</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Updated settings for </span><span class="si">{</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;connection_id&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">interface_name</span> <span class="o">=</span> <span class="n">settings_dict</span><span class="p">[</span><span class="s2">&quot;connection&quot;</span><span class="p">][</span><span class="s2">&quot;interface-name&quot;</span><span class="p">]</span>
<span class="n">devices</span> <span class="o">=</span> <span class="k">await</span> <span class="n">nm</span><span class="o">.</span><span class="n">get_devices</span><span class="p">()</span>
<span class="k">for</span> <span class="n">device_path</span> <span class="ow">in</span> <span class="n">devices</span><span class="p">:</span>
<span class="n">device</span> <span class="o">=</span> <span class="n">NetworkDeviceGeneric</span><span class="p">(</span><span class="n">device_path</span><span class="p">)</span>
<span class="k">if</span> <span class="k">await</span> <span class="n">device</span><span class="o">.</span><span class="n">interface</span> <span class="o">==</span> <span class="n">interface_name</span><span class="p">:</span>
<span class="k">await</span> <span class="n">device</span><span class="o">.</span><span class="n">disconnect</span><span class="p">()</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Disconnected from </span><span class="si">{</span><span class="n">interface_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">await</span> <span class="n">nm</span><span class="o">.</span><span class="n">activate_connection</span><span class="p">(</span><span class="n">connection</span><span class="o">=</span><span class="n">connection_paths</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">device</span><span class="o">=</span><span class="n">device_path</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Reconnected to </span><span class="si">{</span><span class="n">args</span><span class="p">[</span><span class="s1">&#39;connection_id&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Устройство для интерфейса </span><span class="si">{interface}</span><span class="s2"> не найдено&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">interface</span><span class="o">=</span><span class="n">interface_name</span><span class="p">))</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,744 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.network_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.network_service</h1><div class="highlight"><pre>
<span></span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd">Сервис чтения сетевого состояния через NetworkManager (D‑Bus).</span>
<span class="sd">Назначение:</span>
<span class="sd">- Предоставляет асинхронные методы для сборки унифицированных моделей</span>
<span class="sd"> сетевых интерфейсов (Ethernet/Wi‑Fi), их IP‑конфигураций, а также получения</span>
<span class="sd"> имени хоста. Используется API‑слоем для визуализации и управления.</span>
<span class="sd">Особенности:</span>
<span class="sd">- Фильтрация loopback и явно неактивных интерфейсов.</span>
<span class="sd">- Адаптация данных D‑Bus в pydantic‑модели (`NetworkInterface`, `WiFiDevice`,</span>
<span class="sd"> `NetworkInterfacesContainer`).</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">,</span> <span class="n">Union</span><span class="p">,</span> <span class="n">Optional</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">sdbus_async.networkmanager</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">NetworkManager</span><span class="p">,</span>
<span class="n">NetworkDeviceGeneric</span><span class="p">,</span>
<span class="n">IPv4Config</span><span class="p">,</span>
<span class="n">IPv6Config</span><span class="p">,</span>
<span class="n">NetworkManagerSettings</span><span class="p">,</span>
<span class="n">NetworkDeviceWireless</span><span class="p">,</span>
<span class="n">AccessPoint</span><span class="p">,</span>
<span class="n">DeviceType</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">sdbus</span><span class="w"> </span><span class="kn">import</span> <span class="n">sd_bus_open_system</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">models.network</span><span class="w"> </span><span class="kn">import</span> <span class="p">(</span>
<span class="n">NetworkInterface</span><span class="p">,</span>
<span class="n">IPv4Route</span><span class="p">,</span>
<span class="n">IPv6Route</span><span class="p">,</span>
<span class="n">IPConfig</span><span class="p">,</span>
<span class="n">IndividualIPConfig</span><span class="p">,</span>
<span class="n">NetworkInterfacesContainer</span><span class="p">,</span>
<span class="n">WiFiDevice</span><span class="p">,</span>
<span class="p">)</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span><span class="p">,</span> <span class="n">_</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<div class="viewcode-block" id="NetworkService">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">NetworkService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис для взаимодействия с NetworkManager через D-Bus.</span>
<span class="sd"> Предоставляет асинхронные методы для получения информации о сетевых интерфейсах,</span>
<span class="sd"> их конфигурациях IP, Wi-Fi и состояниях.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Инициализирует сервис NetworkManager.</span>
<span class="sd"> Устанавливает системный D-Bus и создаёт объекты для взаимодействия с</span>
<span class="sd"> NetworkManager и его настройками.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span> <span class="o">=</span> <span class="n">sd_bus_open_system</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nm</span> <span class="o">=</span> <span class="n">NetworkManager</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nm_settings</span> <span class="o">=</span> <span class="n">NetworkManagerSettings</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<div class="viewcode-block" id="NetworkService.get_ip_method">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_ip_method">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_ip_method</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">device</span><span class="p">:</span> <span class="n">NetworkDeviceGeneric</span><span class="p">,</span> <span class="n">ip_type</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает метод IP (например, &quot;auto&quot;, &quot;manual&quot;) для указанного устройства.</span>
<span class="sd"> Args:</span>
<span class="sd"> device (NetworkDeviceGeneric): Объект устройства NetworkManager.</span>
<span class="sd"> ip_type (str): Тип IP (например, &quot;ipv4&quot; или &quot;ipv6&quot;).</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Метод IP или &quot;unknown&quot; в случае ошибки.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при получении настроек соединения.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">config</span> <span class="o">=</span> <span class="k">await</span> <span class="n">device</span><span class="o">.</span><span class="n">get_applied_connection</span><span class="p">()</span>
<span class="n">settings</span> <span class="o">=</span> <span class="n">config</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ip_type</span><span class="p">,</span> <span class="p">{})</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;method&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;s&quot;</span><span class="p">,</span> <span class="s2">&quot;unknown&quot;</span><span class="p">))[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;unknown&quot;</span></div>
<div class="viewcode-block" id="NetworkService.get_connection_name">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_connection_name">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_connection_name</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">device</span><span class="p">:</span> <span class="n">NetworkDeviceGeneric</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Извлекает имя соединения (GENERAL.CONNECTION) для устройства.</span>
<span class="sd"> Args:</span>
<span class="sd"> device (NetworkDeviceGeneric): Объект устройства NetworkManager.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Имя соединения или &quot;unknown&quot; в случае ошибки.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при получении настроек соединения.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">applied_connection</span> <span class="o">=</span> <span class="k">await</span> <span class="n">device</span><span class="o">.</span><span class="n">get_applied_connection</span><span class="p">()</span>
<span class="n">connection_settings</span> <span class="o">=</span> <span class="n">applied_connection</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">connection_info</span> <span class="o">=</span> <span class="n">connection_settings</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;connection&quot;</span><span class="p">,</span> <span class="p">{})</span>
<span class="k">return</span> <span class="nb">str</span><span class="p">(</span><span class="n">connection_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;id&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;s&quot;</span><span class="p">,</span> <span class="s2">&quot;unknown&quot;</span><span class="p">))[</span><span class="mi">1</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">return</span> <span class="s2">&quot;unknown&quot;</span></div>
<div class="viewcode-block" id="NetworkService.get_ip_config">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_ip_config">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_ip_config</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">device</span><span class="p">:</span> <span class="n">NetworkDeviceGeneric</span><span class="p">,</span> <span class="n">ip_version</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">IndividualIPConfig</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает конфигурацию IP для устройства.</span>
<span class="sd"> Args:</span>
<span class="sd"> device (NetworkDeviceGeneric): Объект устройства NetworkManager.</span>
<span class="sd"> ip_version (str): Версия IP (&quot;4&quot; или &quot;6&quot;).</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[IndividualIPConfig]: Список конфигураций IP, включая адреса и маршруты.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при получении данных IP.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">configs</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">device_ip</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">device</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;ip</span><span class="si">{</span><span class="n">ip_version</span><span class="si">}</span><span class="s2">_config&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">device_ip</span> <span class="o">!=</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
<span class="n">ip_config</span> <span class="o">=</span> <span class="nb">globals</span><span class="p">()[</span><span class="sa">f</span><span class="s2">&quot;IPv</span><span class="si">{</span><span class="n">ip_version</span><span class="si">}</span><span class="s2">Config&quot;</span><span class="p">](</span><span class="n">device_ip</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="n">address_data</span> <span class="o">=</span> <span class="k">await</span> <span class="n">ip_config</span><span class="o">.</span><span class="n">address_data</span>
<span class="k">for</span> <span class="n">address</span> <span class="ow">in</span> <span class="n">address_data</span><span class="p">:</span>
<span class="n">config</span> <span class="o">=</span> <span class="n">IndividualIPConfig</span><span class="p">(</span>
<span class="n">address</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">address</span><span class="p">[</span><span class="s2">&quot;address&quot;</span><span class="p">][</span><span class="mi">1</span><span class="p">]),</span>
<span class="n">routes</span><span class="o">=</span><span class="p">[</span>
<span class="nb">globals</span><span class="p">()[</span><span class="sa">f</span><span class="s2">&quot;IPv</span><span class="si">{</span><span class="n">ip_version</span><span class="si">}</span><span class="s2">Route&quot;</span><span class="p">](</span>
<span class="n">destination</span><span class="o">=</span><span class="n">route</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;dest&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;s&quot;</span><span class="p">,</span> <span class="s2">&quot;0.0.0.0&quot;</span> <span class="k">if</span> <span class="n">ip_version</span> <span class="o">==</span> <span class="s2">&quot;4&quot;</span> <span class="k">else</span> <span class="s2">&quot;::&quot;</span><span class="p">))[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">prefix</span><span class="o">=</span><span class="n">route</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;prefix&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;u&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">))[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">next_hop</span><span class="o">=</span><span class="n">route</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;next-hop&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;s&quot;</span><span class="p">,</span> <span class="s2">&quot;0.0.0.0&quot;</span> <span class="k">if</span> <span class="n">ip_version</span> <span class="o">==</span> <span class="s2">&quot;4&quot;</span> <span class="k">else</span> <span class="s2">&quot;::&quot;</span><span class="p">))[</span><span class="mi">1</span><span class="p">],</span>
<span class="n">metric</span><span class="o">=</span><span class="n">route</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;metric&quot;</span><span class="p">,</span> <span class="p">(</span><span class="s2">&quot;u&quot;</span><span class="p">,</span> <span class="mi">0</span><span class="p">))[</span><span class="mi">1</span><span class="p">],</span>
<span class="p">)</span> <span class="k">for</span> <span class="n">route</span> <span class="ow">in</span> <span class="k">await</span> <span class="n">ip_config</span><span class="o">.</span><span class="n">route_data</span>
<span class="p">],</span>
<span class="n">method</span><span class="o">=</span><span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ip_method</span><span class="p">(</span><span class="n">device</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;ipv</span><span class="si">{</span><span class="n">ip_version</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">),</span>
<span class="n">gateway</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="k">await</span> <span class="n">ip_config</span><span class="o">.</span><span class="n">gateway</span><span class="p">),</span>
<span class="n">dns</span><span class="o">=</span><span class="p">[</span>
<span class="nb">str</span><span class="p">(</span><span class="n">ns</span><span class="p">[</span><span class="s2">&quot;address&quot;</span><span class="p">][</span><span class="mi">1</span><span class="p">])</span> <span class="k">if</span> <span class="n">ip_version</span> <span class="o">==</span> <span class="s2">&quot;4&quot;</span> <span class="k">else</span> <span class="nb">str</span><span class="p">(</span><span class="n">ns</span><span class="p">)</span>
<span class="k">for</span> <span class="n">ns</span> <span class="ow">in</span> <span class="k">await</span> <span class="nb">getattr</span><span class="p">(</span>
<span class="n">ip_config</span><span class="p">,</span>
<span class="s2">&quot;nameserver_data&quot;</span> <span class="k">if</span> <span class="n">ip_version</span> <span class="o">==</span> <span class="s2">&quot;4&quot;</span> <span class="k">else</span> <span class="s2">&quot;nameservers&quot;</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">],</span>
<span class="p">)</span>
<span class="n">configs</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">config</span><span class="p">)</span>
<span class="k">return</span> <span class="n">configs</span></div>
<div class="viewcode-block" id="NetworkService.get_wifi_info">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_wifi_info">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_wifi_info</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">wifi_device</span><span class="p">:</span> <span class="n">NetworkDeviceWireless</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает информацию о Wi-Fi устройстве.</span>
<span class="sd"> Args:</span>
<span class="sd"> wifi_device (NetworkDeviceWireless): Объект Wi-Fi устройства NetworkManager.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Dict[str, Optional[Union[str, int]]]: Словарь с данными Wi-Fi (SSID, BSSID,</span>
<span class="sd"> bitrate, strength, frequency, mode), где значения могут быть None.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при получении данных точки доступа.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">active_ap</span> <span class="o">=</span> <span class="k">await</span> <span class="n">wifi_device</span><span class="o">.</span><span class="n">active_access_point</span>
<span class="n">wifi_info</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;ssid&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;bssid&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;bitrate&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">wifi_device</span><span class="o">.</span><span class="n">bitrate</span><span class="p">,</span>
<span class="s2">&quot;strength&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;frequency&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="s2">&quot;mode&quot;</span><span class="p">:</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">active_ap</span> <span class="o">!=</span> <span class="s2">&quot;/&quot;</span><span class="p">:</span>
<span class="n">ap</span> <span class="o">=</span> <span class="n">AccessPoint</span><span class="p">(</span><span class="n">active_ap</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="n">wifi_info</span><span class="o">.</span><span class="n">update</span><span class="p">({</span>
<span class="s2">&quot;ssid&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span><span class="p">,</span>
<span class="s2">&quot;bssid&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">ap</span><span class="o">.</span><span class="n">hw_address</span><span class="p">,</span>
<span class="s2">&quot;strength&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">ap</span><span class="o">.</span><span class="n">strength</span><span class="p">,</span>
<span class="s2">&quot;frequency&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">ap</span><span class="o">.</span><span class="n">frequency</span><span class="p">,</span>
<span class="s2">&quot;mode&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="n">ap</span><span class="o">.</span><span class="n">mode</span><span class="p">,</span>
<span class="p">})</span>
<span class="k">return</span> <span class="n">wifi_info</span></div>
<div class="viewcode-block" id="NetworkService.get_network_interfaces">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_network_interfaces">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_network_interfaces</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Union</span><span class="p">[</span><span class="n">NetworkInterface</span><span class="p">,</span> <span class="n">WiFiDevice</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает список сетевых интерфейсов.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None (используются (100, 100)).</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[Union[NetworkInterface, WiFiDevice]]: Список объектов интерфейсов,</span>
<span class="sd"> включая Wi-Fi устройства.</span>
<span class="sd"> Исключает интерфейсы типа LOOPBACK и неактивные состояния (state == &quot;10&quot;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">devices_paths</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">nm</span><span class="o">.</span><span class="n">get_devices</span><span class="p">()</span>
<span class="n">network_interfaces</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">initial_positions</span> <span class="o">=</span> <span class="n">initial_positions</span> <span class="ow">or</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">device_path</span> <span class="ow">in</span> <span class="n">devices_paths</span><span class="p">:</span>
<span class="n">generic_device</span> <span class="o">=</span> <span class="n">NetworkDeviceGeneric</span><span class="p">(</span><span class="n">device_path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="n">interface_name</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="k">await</span> <span class="n">generic_device</span><span class="o">.</span><span class="n">interface</span><span class="p">)</span>
<span class="n">device_type</span> <span class="o">=</span> <span class="n">DeviceType</span><span class="p">(</span><span class="k">await</span> <span class="n">generic_device</span><span class="o">.</span><span class="n">device_type</span><span class="p">)</span><span class="o">.</span><span class="n">name</span>
<span class="k">if</span> <span class="n">device_type</span> <span class="o">==</span> <span class="s2">&quot;LOOPBACK&quot;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">device_state</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="k">await</span> <span class="n">generic_device</span><span class="o">.</span><span class="n">state</span><span class="p">)</span>
<span class="k">if</span> <span class="n">device_state</span> <span class="o">==</span> <span class="s2">&quot;10&quot;</span><span class="p">:</span>
<span class="k">continue</span>
<span class="n">common_data</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">&quot;name&quot;</span><span class="p">:</span> <span class="n">interface_name</span><span class="p">,</span>
<span class="s2">&quot;type&quot;</span><span class="p">:</span> <span class="n">device_type</span><span class="p">,</span>
<span class="s2">&quot;device_state&quot;</span><span class="p">:</span> <span class="n">device_state</span><span class="p">,</span>
<span class="s2">&quot;active_connection&quot;</span><span class="p">:</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_connection_name</span><span class="p">(</span><span class="n">generic_device</span><span class="p">),</span>
<span class="s2">&quot;mac_address&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="k">await</span> <span class="n">generic_device</span><span class="o">.</span><span class="n">hw_address</span><span class="p">),</span>
<span class="s2">&quot;device_mtu&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="k">await</span> <span class="n">generic_device</span><span class="o">.</span><span class="n">mtu</span><span class="p">),</span>
<span class="s2">&quot;ipv4&quot;</span><span class="p">:</span> <span class="n">IPConfig</span><span class="p">(</span><span class="n">configurations</span><span class="o">=</span><span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ip_config</span><span class="p">(</span><span class="n">generic_device</span><span class="p">,</span> <span class="s2">&quot;4&quot;</span><span class="p">)),</span>
<span class="s2">&quot;ipv6&quot;</span><span class="p">:</span> <span class="n">IPConfig</span><span class="p">(</span><span class="n">configurations</span><span class="o">=</span><span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_ip_config</span><span class="p">(</span><span class="n">generic_device</span><span class="p">,</span> <span class="s2">&quot;6&quot;</span><span class="p">)),</span>
<span class="s2">&quot;x&quot;</span><span class="p">:</span> <span class="n">initial_positions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">interface_name</span><span class="p">,</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">))[</span><span class="mi">0</span><span class="p">],</span>
<span class="s2">&quot;y&quot;</span><span class="p">:</span> <span class="n">initial_positions</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">interface_name</span><span class="p">,</span> <span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">))[</span><span class="mi">1</span><span class="p">],</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">device_type</span> <span class="o">==</span> <span class="s2">&quot;WIFI&quot;</span><span class="p">:</span>
<span class="n">wifi_device</span> <span class="o">=</span> <span class="n">NetworkDeviceWireless</span><span class="p">(</span><span class="n">device_path</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">system_bus</span><span class="p">)</span>
<span class="n">wifi_info</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_wifi_info</span><span class="p">(</span><span class="n">wifi_device</span><span class="p">)</span>
<span class="n">network_interfaces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">WiFiDevice</span><span class="p">(</span><span class="o">**</span><span class="n">common_data</span><span class="p">,</span> <span class="o">**</span><span class="n">wifi_info</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">network_interfaces</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">NetworkInterface</span><span class="p">(</span><span class="o">**</span><span class="n">common_data</span><span class="p">))</span>
<span class="k">return</span> <span class="n">network_interfaces</span></div>
<div class="viewcode-block" id="NetworkService.get_hostname">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_hostname">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_hostname</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Возвращает имя хоста из команды hostname в формате JSON.</span>
<span class="sd"> Returns:</span>
<span class="sd"> Dict[str, str]: Словарь с ключом &quot;hostname&quot; и значением имени хоста.</span>
<span class="sd"> Raises:</span>
<span class="sd"> RuntimeError: Если произошла ошибка при выполнении команды hostname</span>
<span class="sd"> или обработке вывода.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">([</span><span class="s2">&quot;hostname&quot;</span><span class="p">],</span>
<span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">check</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">hostname</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;hostname&quot;</span><span class="p">:</span> <span class="n">hostname</span><span class="p">}</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Не удалось выполнить команду hostname: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка обработки вывода hostname: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span></div>
<div class="viewcode-block" id="NetworkService.get_interfaces_by_state">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_interfaces_by_state">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_interfaces_by_state</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">state</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">NetworkInterface</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает список интерфейсов по указанному состоянию.</span>
<span class="sd"> Args:</span>
<span class="sd"> state (str): Состояние интерфейса (например, &quot;100&quot; для активных).</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[NetworkInterface]: Список интерфейсов с указанным состоянием.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">all_interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_network_interfaces</span><span class="p">(</span><span class="n">initial_positions</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">interface</span> <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">all_interfaces</span>
<span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">device_state</span> <span class="o">==</span> <span class="n">state</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="NetworkService.get_interfaces_container">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_interfaces_container">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_interfaces_container</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">state</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">container_x</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="n">container_y</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">NetworkInterfacesContainer</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает объект, содержащий список интерфейсов и координаты контейнера.</span>
<span class="sd"> Args:</span>
<span class="sd"> state (Optional[str], optional): Состояние интерфейсов (например, &quot;100&quot;).</span>
<span class="sd"> По умолчанию None (все интерфейсы).</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> container_x (int, optional): Координата X контейнера. По умолчанию 0.</span>
<span class="sd"> container_y (int, optional): Координата Y контейнера. По умолчанию 0.</span>
<span class="sd"> Returns:</span>
<span class="sd"> NetworkInterfacesContainer: Объект с интерфейсами и координатами контейнера.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">state</span><span class="p">:</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_interfaces_by_state</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">initial_positions</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_network_interfaces</span><span class="p">(</span><span class="n">initial_positions</span><span class="p">)</span>
<span class="k">return</span> <span class="n">NetworkInterfacesContainer</span><span class="p">(</span><span class="n">interfaces</span><span class="o">=</span><span class="n">interfaces</span><span class="p">,</span>
<span class="n">container_x</span><span class="o">=</span><span class="n">container_x</span><span class="p">,</span>
<span class="n">container_y</span><span class="o">=</span><span class="n">container_y</span><span class="p">)</span></div>
<div class="viewcode-block" id="NetworkService.get_network_interfaces_container">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_network_interfaces_container">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_network_interfaces_container</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">NetworkInterfacesContainer</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает контейнер с сетевыми интерфейсами и координатами контейнера.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Optional[Dict[str, Tuple[int, int]]], optional):</span>
<span class="sd"> Словарь начальных координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> NetworkInterfacesContainer: Объект с интерфейсами и координатами (0, 0).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_network_interfaces</span><span class="p">(</span><span class="n">initial_positions</span><span class="p">)</span>
<span class="k">return</span> <span class="n">NetworkInterfacesContainer</span><span class="p">(</span><span class="n">interfaces</span><span class="o">=</span><span class="n">interfaces</span><span class="p">,</span>
<span class="n">container_x</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">container_y</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span></div>
<div class="viewcode-block" id="NetworkService.get_activated_interfaces">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_activated_interfaces">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_activated_interfaces</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">NetworkInterface</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает список активных сетевых интерфейсов.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[NetworkInterface]: Список активных интерфейсов (state == &quot;100&quot;).</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_interfaces_by_state</span><span class="p">(</span><span class="s2">&quot;100&quot;</span><span class="p">,</span> <span class="n">initial_positions</span><span class="p">)</span></div>
<div class="viewcode-block" id="NetworkService.get_deactivated_interfaces">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_deactivated_interfaces">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_deactivated_interfaces</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">NetworkInterface</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает список неактивных сетевых интерфейсов.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[NetworkInterface]: Список интерфейсов с state != &quot;100&quot;.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">all_interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_network_interfaces</span><span class="p">(</span><span class="n">initial_positions</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[</span>
<span class="n">interface</span> <span class="k">for</span> <span class="n">interface</span> <span class="ow">in</span> <span class="n">all_interfaces</span>
<span class="k">if</span> <span class="n">interface</span><span class="o">.</span><span class="n">device_state</span> <span class="o">!=</span> <span class="s2">&quot;100&quot;</span>
<span class="p">]</span></div>
<div class="viewcode-block" id="NetworkService.get_activated_interfaces_container">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_activated_interfaces_container">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_activated_interfaces_container</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">container_x</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="n">container_y</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">NetworkInterfacesContainer</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает объект, содержащий список активных интерфейсов и координаты контейнера.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> container_x (int, optional): Координата X контейнера. По умолчанию 0.</span>
<span class="sd"> container_y (int, optional): Координата Y контейнера. По умолчанию 0.</span>
<span class="sd"> Returns:</span>
<span class="sd"> NetworkInterfacesContainer: Объект с активными интерфейсами и координатами.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_interfaces_container</span><span class="p">(</span><span class="s2">&quot;100&quot;</span><span class="p">,</span> <span class="n">initial_positions</span><span class="p">,</span> <span class="n">container_x</span><span class="p">,</span> <span class="n">container_y</span><span class="p">)</span></div>
<div class="viewcode-block" id="NetworkService.get_deactivated_interfaces_container">
<a class="viewcode-back" href="../../api/services/network_service.html#services.network_service.NetworkService.get_deactivated_interfaces_container">[docs]</a>
<span class="k">async</span> <span class="k">def</span><span class="w"> </span><span class="nf">get_deactivated_interfaces_container</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span>
<span class="n">initial_positions</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">int</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">container_x</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="n">container_y</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-&gt;</span> <span class="n">NetworkInterfacesContainer</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает объект, содержащий список неактивных интерфейсов и координаты контейнера.</span>
<span class="sd"> Args:</span>
<span class="sd"> initial_positions (Dict[str, Tuple[int, int]], optional): Словарь начальных</span>
<span class="sd"> координат (x, y) для интерфейсов. По умолчанию None.</span>
<span class="sd"> container_x (int, optional): Координата X контейнера. По умолчанию 0.</span>
<span class="sd"> container_y (int, optional): Координата Y контейнера. По умолчанию 0.</span>
<span class="sd"> Returns:</span>
<span class="sd"> NetworkInterfacesContainer: Объект с неактивными интерфейсами и координатами.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_deactivated_interfaces</span><span class="p">(</span><span class="n">initial_positions</span><span class="p">)</span>
<span class="k">return</span> <span class="n">NetworkInterfacesContainer</span><span class="p">(</span><span class="n">interfaces</span><span class="o">=</span><span class="n">interfaces</span><span class="p">,</span> <span class="n">container_x</span><span class="o">=</span><span class="n">container_x</span><span class="p">,</span> <span class="n">container_y</span><span class="o">=</span><span class="n">container_y</span><span class="p">)</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,431 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.settings_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.settings_service</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Optional</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span><span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">INFO</span><span class="p">)</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<div class="viewcode-block" id="SettingsService">
<a class="viewcode-back" href="../../api/services/settings_service.html#services.settings_service.SettingsService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">SettingsService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис для управления настройками и очистки данных сети.&quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">subnet_base_path</span> <span class="o">=</span> <span class="s2">&quot;storage/subnets&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wifi_file</span> <span class="o">=</span> <span class="s2">&quot;storage/wifi/wifi.json&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<div class="viewcode-block" id="SettingsService.clear_subnet">
<a class="viewcode-back" href="../../api/services/settings_service.html#services.settings_service.SettingsService.clear_subnet">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">clear_subnet</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">subnet</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Очищает данные узлов подсети в указанном файле или во всех файлах.</span>
<span class="sd"> Args:</span>
<span class="sd"> subnet (Optional[str]): Подсеть в формате CIDR (например, &quot;10.1.1.0/24&quot;).</span>
<span class="sd"> Если None, очищает все подсети.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True, если очистка успешна.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при записи в файл.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">subnet</span><span class="p">:</span>
<span class="n">file_path</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">subnet_base_path</span><span class="p">)</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">subnet</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;/&#39;</span><span class="p">,</span><span class="w"> </span><span class="s1">&#39;_&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">.json&quot;</span>
<span class="k">if</span> <span class="n">file_path</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([],</span> <span class="n">f</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Subnet nodes data cleared for </span><span class="si">{</span><span class="n">subnet</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Subnet file not found for </span><span class="si">{</span><span class="n">subnet</span><span class="si">}</span><span class="s2">, clearing considered successful&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">for</span> <span class="n">file_path</span> <span class="ow">in</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">subnet_base_path</span><span class="p">)</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&quot;*.json&quot;</span><span class="p">):</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([],</span> <span class="n">f</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Cleared subnet data in </span><span class="si">{</span><span class="n">file_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;No subnet files found, clearing considered successful&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error clearing subnet nodes: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка очистки узлов подсети: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span></div>
<div class="viewcode-block" id="SettingsService.clear_wifi">
<a class="viewcode-back" href="../../api/services/settings_service.html#services.settings_service.SettingsService.clear_wifi">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">clear_wifi</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Очищает данные точек доступа Wi-Fi в файле wifi.json.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True, если очистка успешна.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при записи в файл.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wifi_file</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([],</span> <span class="n">f</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Wi-Fi access points data successfully cleared&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Wi-Fi file not found, clearing considered successful&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error clearing Wi-Fi access points: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка очистки точек доступа Wi-Fi: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span></div>
<div class="viewcode-block" id="SettingsService.clear_all_data">
<a class="viewcode-back" href="../../api/services/settings_service.html#services.settings_service.SettingsService.clear_all_data">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">clear_all_data</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Очищает данные узлов всех подсетей и точек доступа Wi-Fi.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True, если очистка успешна.</span>
<span class="sd"> Raises:</span>
<span class="sd"> Exception: Если произошла ошибка при записи в один из файлов.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">file_path</span> <span class="ow">in</span> <span class="n">Path</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">subnet_base_path</span><span class="p">)</span><span class="o">.</span><span class="n">glob</span><span class="p">(</span><span class="s2">&quot;*.json&quot;</span><span class="p">):</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">file_path</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([],</span> <span class="n">f</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Cleared subnet data in </span><span class="si">{</span><span class="n">file_path</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;No subnet files found, clearing considered successful&quot;</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">wifi_file</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">([],</span> <span class="n">f</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">FileNotFoundError</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;Wi-Fi file not found, clearing considered successful&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="s2">&quot;All network data successfully cleared&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error clearing all network data: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка очистки всех сетевых данных: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,754 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.ufw_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.ufw_service</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">ipaddress</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Union</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">models.ufw</span><span class="w"> </span><span class="kn">import</span> <span class="n">Direction</span><span class="p">,</span> <span class="n">Protocol</span><span class="p">,</span> <span class="n">UFWRule</span><span class="p">,</span> <span class="n">UFWRulesResponse</span><span class="p">,</span> <span class="n">UFWStatus</span>
<span class="n">DEBUG</span> <span class="o">=</span> <span class="kc">True</span>
<div class="viewcode-block" id="UFWService">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">UFWService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис взаимодействия с UFW (Uncomplicated Firewall).</span>
<span class="sd"> Назначение:</span>
<span class="sd"> - Чтение статуса и списка правил брандмауэра.</span>
<span class="sd"> - Добавление, удаление и массовая обработка правил с поддержкой диапазонов портов,</span>
<span class="sd"> комментариев и выбором протоколов.</span>
<span class="sd"> Детали реализации:</span>
<span class="sd"> - Команды выполняются через `sudo ufw ...`; вывод парсится в модели pydantic.</span>
<span class="sd"> - Для операций удаления соблюдается порядок с конца, чтобы не нарушать нумерацию.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_run_command</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">command</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Выполняет команду в системе и возвращает ее вывод.</span>
<span class="sd"> Args:</span>
<span class="sd"> command (str): Команда для выполнения в системе.</span>
<span class="sd"> Returns:</span>
<span class="sd"> str: Вывод команды.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Running command: </span><span class="si">{</span><span class="n">command</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># Используем shell=True для корректной обработки аргументов с пробелами</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;sudo </span><span class="si">{</span><span class="n">command</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="n">shell</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">stdout</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
<span class="n">stderr</span><span class="o">=</span><span class="n">subprocess</span><span class="o">.</span><span class="n">PIPE</span><span class="p">,</span>
<span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="p">)</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Command output: </span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Command error: </span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">returncode</span><span class="p">,</span> <span class="n">command</span><span class="p">,</span>
<span class="n">result</span><span class="o">.</span><span class="n">stdout</span><span class="p">,</span>
<span class="n">result</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Command failed with return code </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">returncode</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error output: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Command failed: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_port_range_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">port</span><span class="p">:</span> <span class="n">Union</span><span class="p">[</span><span class="nb">int</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Преобразует порт или диапазон портов в аргументы команды UFW.</span>
<span class="sd"> Args:</span>
<span class="sd"> port: Порт (число) или диапазон портов (строка вида &quot;3000:3999&quot;)</span>
<span class="sd"> Returns:</span>
<span class="sd"> List[str]: Список аргументов для UFW</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="nb">str</span><span class="p">(</span><span class="n">port</span><span class="p">)]</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">port</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="s2">&quot;:&quot;</span> <span class="ow">in</span> <span class="n">port</span><span class="p">:</span>
<span class="c1"># Диапазон портов уже в нужном формате</span>
<span class="k">return</span> <span class="p">[</span><span class="n">port</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Некорректный формат порта: </span><span class="si">{</span><span class="n">port</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="UFWService.get_ufw_rules">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.get_ufw_rules">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_ufw_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">UFWRulesResponse</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Получает список правил UFW.</span>
<span class="sd"> Returns:</span>
<span class="sd"> UFWRulesResponse: Объект, содержащий статус UFW и список правил</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># Check UFW status</span>
<span class="n">status_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="s2">&quot;ufw status numbered&quot;</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">status_result</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">lines</span><span class="p">:</span>
<span class="k">return</span> <span class="n">UFWRulesResponse</span><span class="p">(</span><span class="n">enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">rules</span><span class="o">=</span><span class="p">[])</span>
<span class="n">first_line</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">is_enabled</span> <span class="o">=</span> <span class="s2">&quot;Status: active&quot;</span> <span class="ow">in</span> <span class="n">first_line</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_enabled</span><span class="p">:</span>
<span class="k">return</span> <span class="n">UFWRulesResponse</span><span class="p">(</span><span class="n">enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">rules</span><span class="o">=</span><span class="p">[])</span>
<span class="n">rules</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Skip header lines</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">4</span><span class="p">:]:</span> <span class="c1"># Skip Status and header lines</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;[&quot;</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">rule</span> <span class="o">=</span> <span class="n">UFWRule</span><span class="o">.</span><span class="n">from_ufw_output</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
<span class="n">rules</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rule</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ошибка парсинга правила: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">, ошибка: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">return</span> <span class="n">UFWRulesResponse</span><span class="p">(</span><span class="n">enabled</span><span class="o">=</span><span class="n">is_enabled</span><span class="p">,</span> <span class="n">rules</span><span class="o">=</span><span class="n">rules</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWService.get_ufw_status">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.get_ufw_status">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">get_ufw_status</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">UFWStatus</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Проверяет статус UFW.</span>
<span class="sd"> Returns:</span>
<span class="sd"> UFWStatus: Объект с информацией о статусе UFW</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">status_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="s2">&quot;ufw status&quot;</span><span class="p">)</span>
<span class="n">first_line</span> <span class="o">=</span> <span class="p">(</span><span class="n">status_result</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="n">status_result</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">is_enabled</span> <span class="o">=</span> <span class="s2">&quot;Status: active&quot;</span> <span class="ow">in</span> <span class="n">first_line</span>
<span class="n">message</span> <span class="o">=</span> <span class="s2">&quot;UFW активен&quot;</span> <span class="k">if</span> <span class="n">is_enabled</span> <span class="k">else</span> <span class="s2">&quot;UFW неактивен&quot;</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Результат статуса: </span><span class="si">{</span><span class="n">status_result</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Включен: </span><span class="si">{</span><span class="n">is_enabled</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">UFWStatus</span><span class="p">(</span><span class="n">enabled</span><span class="o">=</span><span class="n">is_enabled</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="n">message</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ошибка при проверке статуса UFW: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">UFWStatus</span><span class="p">(</span>
<span class="n">enabled</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">message</span><span class="o">=</span><span class="sa">f</span><span class="s2">&quot;Ошибка при проверке статуса: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="UFWService.enable_ufw">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.enable_ufw">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">enable_ufw</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Включает UFW.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True если успешно включен, False в противном случае</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="s2">&quot;ufw enable&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ошибка при включении UFW: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="UFWService.disable_ufw">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.disable_ufw">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">disable_ufw</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Выключает UFW.</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True если успешно выключен, False в противном случае</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="s2">&quot;ufw disable&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ошибка при выключении UFW: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="UFWService.add_rules_base">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.add_rules_base">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_rules_base</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">rules</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">UFWRule</span><span class="p">],</span>
<span class="n">direction</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;&quot;</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Базовый метод для добавления правил UFW.</span>
<span class="sd"> Args:</span>
<span class="sd"> rules: Список правил для добавления</span>
<span class="sd"> direction: Направление трафика (&quot;in&quot; или &quot;out&quot;)</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True если все правила были успешно добавлены, False в противном случае</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
<span class="c1"># Устанавливаем направление правила</span>
<span class="n">rule</span><span class="o">.</span><span class="n">direction</span> <span class="o">=</span> <span class="n">Direction</span><span class="o">.</span><span class="n">IN</span> <span class="k">if</span> <span class="n">direction</span> <span class="o">==</span> <span class="s2">&quot;in&quot;</span> <span class="k">else</span> <span class="n">Direction</span><span class="o">.</span><span class="n">OUT</span>
<span class="c1"># Формируем базовую команду</span>
<span class="n">command</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;ufw </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">action</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем направление</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем from IP если он указан</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">from_ip</span> <span class="ow">and</span> <span class="n">rule</span><span class="o">.</span><span class="n">from_ip</span> <span class="o">!=</span> <span class="s2">&quot;any&quot;</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; from </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">from_ip</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="s2">&quot; from any&quot;</span>
<span class="c1"># Добавляем to IP если он указан</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">to_ip</span> <span class="ow">and</span> <span class="n">rule</span><span class="o">.</span><span class="n">to_ip</span> <span class="o">!=</span> <span class="s2">&quot;any&quot;</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; to </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">to_ip</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="s2">&quot; to any&quot;</span>
<span class="c1"># Добавляем порт если он указан</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">port</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; port </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">port</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем протокол</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">protocol</span> <span class="o">!=</span> <span class="n">Protocol</span><span class="o">.</span><span class="n">BOTH</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; proto </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем комментарий если он есть</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">comment</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; comment &#39;</span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">comment</span><span class="si">}</span><span class="s2">&#39;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error adding UFW rules: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span></div>
<div class="viewcode-block" id="UFWService.add_ufw_in_rules">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.add_ufw_in_rules">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_ufw_in_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rules</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">UFWRule</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Добавляет входящие (in) правила UFW.</span>
<span class="sd"> Args:</span>
<span class="sd"> rules (List[UFWRule]): Список правил для добавления</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True если все правила были успешно добавлены, False в противном случае</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_rules_base</span><span class="p">(</span><span class="n">rules</span><span class="p">,</span> <span class="s2">&quot;in&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWService.add_ufw_out_rules">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.add_ufw_out_rules">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_ufw_out_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rules</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">UFWRule</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Добавляет исходящие (out) правила UFW.</span>
<span class="sd"> Args:</span>
<span class="sd"> rules (List[UFWRule]): Список правил для добавления</span>
<span class="sd"> Returns:</span>
<span class="sd"> bool: True если все правила были успешно добавлены, False в противном случае</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_rules_base</span><span class="p">(</span><span class="n">rules</span><span class="p">,</span> <span class="s2">&quot;out&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWService.add_rules">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.add_rules">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rules</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="n">UFWRule</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Добавляет правила UFW.</span>
<span class="sd"> Args:</span>
<span class="sd"> rules: Список правил для добавления</span>
<span class="sd"> Returns:</span>
<span class="sd"> dict: Результат добавления правил</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">rule</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Определяем версию IP</span>
<span class="n">from_ip</span> <span class="o">=</span> <span class="n">ipaddress</span><span class="o">.</span><span class="n">ip_network</span><span class="p">(</span><span class="n">rule</span><span class="o">.</span><span class="n">from_ip</span><span class="p">,</span> <span class="n">strict</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">is_ipv6</span> <span class="o">=</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">from_ip</span><span class="p">,</span> <span class="n">ipaddress</span><span class="o">.</span><span class="n">IPv6Network</span><span class="p">)</span>
<span class="c1"># Получаем список протоколов</span>
<span class="n">protocols</span> <span class="o">=</span> <span class="n">rule</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">protocols</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Обработка правила для протоколов: </span><span class="si">{</span><span class="n">protocols</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">proto</span> <span class="ow">in</span> <span class="n">protocols</span><span class="p">:</span>
<span class="c1"># Формируем базовую команду</span>
<span class="n">command</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;ufw </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">action</span><span class="o">.</span><span class="n">value</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем IP адреса</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; from </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">from_ip</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">to_ip</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; to </span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">to_ip</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем порт и протокол</span>
<span class="n">port_args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_port_range_args</span><span class="p">(</span><span class="n">rule</span><span class="o">.</span><span class="n">port</span><span class="p">)</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; port </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">port_args</span><span class="p">)</span><span class="si">}</span><span class="s2"> proto </span><span class="si">{</span><span class="n">proto</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="c1"># Добавляем флаг IPv6 если нужно</span>
<span class="k">if</span> <span class="n">is_ipv6</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="s2">&quot; v6&quot;</span>
<span class="c1"># Добавляем комментарий если есть</span>
<span class="k">if</span> <span class="n">rule</span><span class="o">.</span><span class="n">comment</span><span class="p">:</span>
<span class="n">command</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">&quot; comment &#39;</span><span class="si">{</span><span class="n">rule</span><span class="o">.</span><span class="n">comment</span><span class="si">}</span><span class="s2">&#39;&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Подготовлена команда: </span><span class="si">{</span><span class="n">command</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="c1"># Выполняем команду</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">output</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="n">command</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">output</span><span class="p">})</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">error_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Ошибка выполнения команды: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="n">error_msg</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
<span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">error_msg</span>
<span class="p">})</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">error_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">&quot;Ошибка при добавлении правила: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="n">error_msg</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="n">error_msg</span><span class="p">})</span>
<span class="c1"># Выводим результаты</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">Результаты добавления правил:&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">result</span> <span class="ow">in</span> <span class="n">results</span><span class="p">:</span>
<span class="n">status</span> <span class="o">=</span> <span class="s2">&quot;Успешно&quot;</span> <span class="k">if</span> <span class="n">result</span><span class="p">[</span><span class="s2">&quot;success&quot;</span><span class="p">]</span> <span class="k">else</span> <span class="s2">&quot;Ошибка&quot;</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot; - </span><span class="si">{</span><span class="n">status</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">result</span><span class="p">[</span><span class="s1">&#39;message&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span> <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="n">results</span><span class="p">}</span></div>
<div class="viewcode-block" id="UFWService.delete_rules">
<a class="viewcode-back" href="../../api/services/ufw_service.html#services.ufw_service.UFWService.delete_rules">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">delete_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">rule_numbers</span><span class="p">:</span> <span class="n">List</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="nb">dict</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Удаляет правила UFW по их номерам.</span>
<span class="sd"> Args:</span>
<span class="sd"> rule_numbers (List[int]): Список номеров правил для удаления</span>
<span class="sd"> Returns:</span>
<span class="sd"> dict: Результат операции удаления</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Проверяем существование правил</span>
<span class="n">status_result</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="s2">&quot;ufw status numbered&quot;</span><span class="p">)</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">status_result</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="c1"># Пропускаем заголовок (первые 4 строки)</span>
<span class="n">rules</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">[</span><span class="mi">4</span><span class="p">:]:</span> <span class="c1"># Skip header lines</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">line</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">&quot;[&quot;</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Извлекаем номер правила из строки [N]</span>
<span class="n">rule_num</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="n">line</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s2">&quot;]&quot;</span><span class="p">)])</span>
<span class="n">rules</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rule_num</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">IndexError</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Найдены правила: </span><span class="si">{</span><span class="n">rules</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># Сортируем номера в обратном порядке, чтобы удаление происходило с конца</span>
<span class="c1"># Это предотвратит смещение номеров при удалении</span>
<span class="k">for</span> <span class="n">rule_number</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">rule_numbers</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Проверяем существует ли правило с таким номером</span>
<span class="k">if</span> <span class="n">rule_number</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">rules</span><span class="p">:</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
<span class="s2">&quot;number&quot;</span><span class="p">:</span>
<span class="n">rule_number</span><span class="p">,</span>
<span class="s2">&quot;success&quot;</span><span class="p">:</span>
<span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;error&quot;</span><span class="p">:</span>
<span class="sa">f</span><span class="s2">&quot;Правило с номером </span><span class="si">{</span><span class="n">rule_number</span><span class="si">}</span><span class="s2"> не найдено&quot;</span><span class="p">,</span>
<span class="p">})</span>
<span class="k">continue</span>
<span class="c1"># Удаляем правило</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_run_command</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;ufw --force delete </span><span class="si">{</span><span class="n">rule_number</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
<span class="s2">&quot;number&quot;</span><span class="p">:</span>
<span class="n">rule_number</span><span class="p">,</span>
<span class="s2">&quot;success&quot;</span><span class="p">:</span>
<span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;message&quot;</span><span class="p">:</span>
<span class="sa">f</span><span class="s2">&quot;Правило </span><span class="si">{</span><span class="n">rule_number</span><span class="si">}</span><span class="s2"> успешно удалено&quot;</span><span class="p">,</span>
<span class="p">})</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span>
<span class="sa">f</span><span class="s2">&quot;Ошибка при удалении правила </span><span class="si">{</span><span class="n">rule_number</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
<span class="s2">&quot;number&quot;</span><span class="p">:</span> <span class="n">rule_number</span><span class="p">,</span>
<span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span>
<span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
<span class="p">})</span>
<span class="c1"># Подсчитываем статистику</span>
<span class="n">total</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">rule_numbers</span><span class="p">)</span>
<span class="n">successful</span> <span class="o">=</span> <span class="nb">len</span><span class="p">([</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">results</span> <span class="k">if</span> <span class="n">r</span><span class="p">[</span><span class="s2">&quot;success&quot;</span><span class="p">]])</span>
<span class="k">return</span> <span class="p">{</span>
<span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">True</span><span class="p">,</span>
<span class="s2">&quot;total&quot;</span><span class="p">:</span> <span class="n">total</span><span class="p">,</span>
<span class="s2">&quot;successful&quot;</span><span class="p">:</span> <span class="n">successful</span><span class="p">,</span>
<span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="n">results</span><span class="p">,</span>
<span class="p">}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="k">if</span> <span class="n">DEBUG</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Ошибка при удалении правил: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{</span><span class="s2">&quot;success&quot;</span><span class="p">:</span> <span class="kc">False</span><span class="p">,</span> <span class="s2">&quot;error&quot;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">),</span> <span class="s2">&quot;results&quot;</span><span class="p">:</span> <span class="p">[]}</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>

View file

@ -0,0 +1,718 @@
<!doctype html>
<html class="no-js" lang="en" data-content_root="../../">
<head><meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="light dark"><link rel="index" title="Index" href="../../genindex.html"><link rel="search" title="Search" href="../../search.html">
<!-- Generated with Sphinx 8.2.3 and Furo 2025.09.25 -->
<title>services.wifi_service - GONETS SRV 0.0.3 documentation</title>
<link rel="stylesheet" type="text/css" href="../../_static/pygments.css?v=d111a655" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo.css?v=580074bf" />
<link rel="stylesheet" type="text/css" href="../../_static/styles/furo-extensions.css?v=8dab3a3b" />
<style>
body {
--color-code-background: #f2f2f2;
--color-code-foreground: #1e1e1e;
}
@media not print {
body[data-theme="dark"] {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
@media (prefers-color-scheme: dark) {
body:not([data-theme="light"]) {
--color-code-background: #202020;
--color-code-foreground: #d0d0d0;
}
}
}
</style></head>
<body>
<script>
document.body.dataset.theme = localStorage.getItem("theme") || "auto";
</script>
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
<symbol id="svg-toc" viewBox="0 0 24 24">
<title>Contents</title>
<svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024">
<path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/>
</svg>
</symbol>
<symbol id="svg-menu" viewBox="0 0 24 24">
<title>Menu</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu">
<line x1="3" y1="12" x2="21" y2="12"></line>
<line x1="3" y1="6" x2="21" y2="6"></line>
<line x1="3" y1="18" x2="21" y2="18"></line>
</svg>
</symbol>
<symbol id="svg-arrow-right" viewBox="0 0 24 24">
<title>Expand</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right">
<polyline points="9 18 15 12 9 6"></polyline>
</svg>
</symbol>
<symbol id="svg-sun" viewBox="0 0 24 24">
<title>Light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun">
<circle cx="12" cy="12" r="5"></circle>
<line x1="12" y1="1" x2="12" y2="3"></line>
<line x1="12" y1="21" x2="12" y2="23"></line>
<line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line>
<line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line>
<line x1="1" y1="12" x2="3" y2="12"></line>
<line x1="21" y1="12" x2="23" y2="12"></line>
<line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line>
<line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line>
</svg>
</symbol>
<symbol id="svg-moon" viewBox="0 0 24 24">
<title>Dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" />
</svg>
</symbol>
<symbol id="svg-sun-with-moon" viewBox="0 0 24 24">
<title>Auto light/dark, in light mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/>
<line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/>
<line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/>
<line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/>
<line x1="19" y1="14.05" x2="20.414" y2="15.464"/>
<line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/>
<line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/>
<line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/>
<line x1="19" y1="5.05" x2="20.414" y2="3.636"/>
<circle cx="14.5" cy="9.55" r="3.6"/>
</svg>
</symbol>
<symbol id="svg-moon-with-sun" viewBox="0 0 24 24">
<title>Auto light/dark, in dark mode</title>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round"
class="icon-custom-derived-from-feather-sun-and-tabler-moon">
<path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/>
<line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/>
<line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/>
<line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/>
<line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/>
<line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/>
<line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/>
<line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/>
<line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/>
<circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/>
</svg>
</symbol>
<symbol id="svg-pencil" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code">
<path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" />
<path d="M13.5 6.5l4 4" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
<symbol id="svg-eye" viewBox="0 0 24 24">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor"
stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code">
<path stroke="none" d="M0 0h24v24H0z" fill="none" />
<path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" />
<path
d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" />
<path d="M20 21l2 -2l-2 -2" />
<path d="M17 17l-2 2l2 2" />
</svg>
</symbol>
</svg>
<input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation" aria-label="Toggle site navigation sidebar">
<input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc" aria-label="Toggle table of contents sidebar">
<label class="overlay sidebar-overlay" for="__navigation"></label>
<label class="overlay toc-overlay" for="__toc"></label>
<a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a>
<div class="page">
<header class="mobile-header">
<div class="header-left">
<label class="nav-overlay-icon" for="__navigation">
<span class="icon"><svg><use href="#svg-menu"></use></svg></span>
</label>
</div>
<div class="header-center">
<a href="../../index.html"><div class="brand">GONETS SRV 0.0.3 documentation</div></a>
</div>
<div class="header-right">
<div class="theme-toggle-container theme-toggle-header">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-header-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
</header>
<aside class="sidebar-drawer">
<div class="sidebar-container">
<div class="sidebar-sticky"><a class="sidebar-brand" href="../../index.html">
<span class="sidebar-brand-text">GONETS SRV 0.0.3 documentation</span>
</a><form class="sidebar-search-container" method="get" action="../../search.html" role="search">
<input class="sidebar-search" placeholder="Search" name="q" aria-label="Search">
<input type="hidden" name="check_keywords" value="yes">
<input type="hidden" name="area" value="default">
</form>
<div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree">
<p class="caption" role="heading"><span class="caption-text">Разделы</span></p>
<ul>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/services.html">Сервисы</a><input aria-label="Toggle navigation of Сервисы" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/arp_service.html">ARP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/auth_service.html">Auth Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/connect_service.html">Connect Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/firewalld_service.html">Firewalld Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ip_service.html">IP Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/network_service.html">Network Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/settings_service.html">Settings Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/subnet_service.html">Subnet Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/ufw_service.html">UFW Service</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/services/wifi_service.html">Wifi Service</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/models.html">Модели</a><input aria-label="Toggle navigation of Модели" class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/auth.html">models.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/network.html">models.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/request.html">models.request</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/subnet.html">models.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/ufw.html">models.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/models/wifi.html">models.wifi</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/endpoints.html">API эндпоинты</a><input aria-label="Toggle navigation of API эндпоинты" class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/auth.html">api.v1.auth</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ip.html">api.v1.ip</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/network.html">api.v1.network</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/settings.html">api.v1.settings</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/subnet.html">api.v1.subnet</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/ufw.html">api.v1.ufw</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/endpoints/websocket.html">api.v1.websocket</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/config.html">Конфигурация</a><input aria-label="Toggle navigation of Конфигурация" class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/cors.html">config.cors</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/init_config.html">config.init_config</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/config/ports.html">config.ports</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/core.html">Core</a><input aria-label="Toggle navigation of Core" class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/core/cli_executor.html">core.cli_executor</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/storage.html">Хранилища</a><input aria-label="Toggle navigation of Хранилища" class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/json_storage.html">storage.json_storage</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../api/storage/session_storage.html">storage.session_storage</a></li>
</ul>
</li>
<li class="toctree-l1 has-children"><a class="reference internal" href="../../api/utils.html">Утилиты</a><input aria-label="Toggle navigation of Утилиты" class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><span class="icon"><svg><use href="#svg-arrow-right"></use></svg></span></label><ul>
<li class="toctree-l2"><a class="reference internal" href="../../api/utils/i18n.html">utils.i18n</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
</aside>
<div class="main">
<div class="content">
<div class="article-container">
<a href="#" class="back-to-top muted-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path>
</svg>
<span>Back to top</span>
</a>
<div class="content-icon-container">
<div class="theme-toggle-container theme-toggle-content">
<button class="theme-toggle" aria-label="Toggle Light / Dark / Auto color theme">
<svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg>
<svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg>
<svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg>
<svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg>
</button>
</div>
<label class="toc-overlay-icon toc-content-icon no-toc" for="__toc">
<span class="icon"><svg><use href="#svg-toc"></use></svg></span>
</label>
</div>
<article role="main" id="furo-main-content">
<h1>Source code for services.wifi_service</h1><div class="highlight"><pre>
<span></span><span class="kn">import</span><span class="w"> </span><span class="nn">time</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">logging</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">subprocess</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">functools</span><span class="w"> </span><span class="kn">import</span> <span class="n">lru_cache</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</span><span class="p">,</span> <span class="n">Dict</span><span class="p">,</span> <span class="n">Tuple</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">mac_vendor_lookup</span><span class="w"> </span><span class="kn">import</span> <span class="n">MacLookup</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">pywifi</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">models.wifi</span><span class="w"> </span><span class="kn">import</span> <span class="n">WifiAccessPoint</span><span class="p">,</span> <span class="n">WifiScanResult</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">utils.i18n</span><span class="w"> </span><span class="kn">import</span> <span class="n">get_translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">babel.support</span><span class="w"> </span><span class="kn">import</span> <span class="n">Translations</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">fastapi</span><span class="w"> </span><span class="kn">import</span> <span class="n">Depends</span>
<span class="c1"># Настройка логирования</span>
<span class="n">logging</span><span class="o">.</span><span class="n">basicConfig</span><span class="p">(</span>
<span class="n">level</span><span class="o">=</span><span class="n">logging</span><span class="o">.</span><span class="n">DEBUG</span><span class="p">,</span>
<span class="nb">format</span><span class="o">=</span><span class="s2">&quot;</span><span class="si">%(asctime)s</span><span class="s2"> - </span><span class="si">%(name)s</span><span class="s2"> - </span><span class="si">%(levelname)s</span><span class="s2"> - </span><span class="si">%(message)s</span><span class="s2">&quot;</span>
<span class="p">)</span>
<span class="n">logger</span> <span class="o">=</span> <span class="n">logging</span><span class="o">.</span><span class="n">getLogger</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<div class="viewcode-block" id="WifiStorage">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiStorage">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">WifiStorage</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Класс для хранения данных о Wi‑Fi сетях и их заметках по SSID.</span>
<span class="sd"> Формат:</span>
<span class="sd"> {</span>
<span class="sd"> &quot;networks&quot;: [{&quot;ssid&quot;: str, &quot;note&quot;: Optional[str]}]</span>
<span class="sd"> }</span>
<span class="sd"> Поведение:</span>
<span class="sd"> - Создаёт директорию хранения при инициализации, ведёт логирование путей.</span>
<span class="sd"> - Валидация структуры при чтении, безопасная запись с Unicode и отступами.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">storage_path</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">&quot;storage/wifi/wifi.json&quot;</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">storage_path</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Wi-Fi storage initialized at: </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="o">.</span><span class="n">absolute</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<div class="viewcode-block" id="WifiStorage.load_notes">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiStorage.load_notes">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">load_notes</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Загружает заметки по SSID из файла хранения.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="o">.</span><span class="n">exists</span><span class="p">():</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="p">,</span> <span class="s2">&quot;r&quot;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="n">f</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="nb">dict</span><span class="p">)</span> <span class="ow">or</span> <span class="s2">&quot;networks&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Invalid JSON structure in </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="si">}</span><span class="s2">, expected </span><span class="si">{</span><span class="s1">&#39;networks&#39;</span><span class="si">:</span><span class="s2"> [...]</span><span class="si">}</span><span class="s2">, got </span><span class="si">{</span><span class="n">data</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">return</span> <span class="p">{</span><span class="n">item</span><span class="p">[</span><span class="s2">&quot;ssid&quot;</span><span class="p">]:</span> <span class="n">item</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;note&quot;</span><span class="p">)</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;networks&quot;</span><span class="p">,</span> <span class="p">[])}</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">except</span> <span class="n">json</span><span class="o">.</span><span class="n">JSONDecodeError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;JSON decode error in </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{}</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error loading notes from </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">{}</span></div>
<div class="viewcode-block" id="WifiStorage.save_notes">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiStorage.save_notes">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">save_notes</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">notes</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]])</span> <span class="o">-&gt;</span> <span class="kc">None</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сохраняет заметки по SSID в файл.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">data</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;networks&quot;</span><span class="p">:</span> <span class="p">[{</span><span class="s2">&quot;ssid&quot;</span><span class="p">:</span> <span class="n">ssid</span><span class="p">,</span> <span class="s2">&quot;note&quot;</span><span class="p">:</span> <span class="n">note</span><span class="p">}</span> <span class="k">for</span> <span class="n">ssid</span><span class="p">,</span> <span class="n">note</span> <span class="ow">in</span> <span class="n">notes</span><span class="o">.</span><span class="n">items</span><span class="p">()]}</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="p">,</span> <span class="s2">&quot;w&quot;</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="s2">&quot;utf-8&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
<span class="n">json</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">indent</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span> <span class="n">ensure_ascii</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Saved </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">notes</span><span class="p">)</span><span class="si">}</span><span class="s2"> notes to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="o">.</span><span class="n">absolute</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">PermissionError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Permission denied writing to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error saving notes to </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">storage_file</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Ошибка при сохранении заметок: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)))</span></div>
</div>
<div class="viewcode-block" id="WifiService">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">WifiService</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сервис для сканирования текущих Wi‑Fi точек доступа и заметок.</span>
<span class="sd"> Источники данных:</span>
<span class="sd"> - `pywifi` для базового сканирования и получения списка AP.</span>
<span class="sd"> - `iw dev &lt;iface&gt; scan` для уточнения частоты, сигнала и безопасности.</span>
<span class="sd"> - `MacLookup` для определения вендора по BSSID.</span>
<span class="sd"> Политики:</span>
<span class="sd"> - Выбор лучшего AP по SSID по уровню сигнала.</span>
<span class="sd"> - Кэширование определения вендора.</span>
<span class="sd"> - Сохранение SSID даже без заметок для будущих операций.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">translations</span><span class="p">:</span> <span class="n">Translations</span> <span class="o">=</span> <span class="n">Depends</span><span class="p">(</span><span class="n">get_translations</span><span class="p">())):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">mac_lookup</span> <span class="o">=</span> <span class="n">MacLookup</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">wifi</span> <span class="o">=</span> <span class="n">pywifi</span><span class="o">.</span><span class="n">PyWiFi</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interface</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_wifi_interface</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">translations</span><span class="p">,</span> <span class="s1">&#39;gettext&#39;</span><span class="p">):</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;Translations object does not support gettext, using fallback&quot;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">Translations</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="s2">&quot;utils/locales/en/LC_MESSAGES/services.mo&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">translations</span> <span class="o">=</span> <span class="n">translations</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span> <span class="o">=</span> <span class="n">WifiStorage</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_wifi_interface</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">object</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Автоматически определяет активный Wi-Fi-интерфейс.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">interfaces</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">wifi</span><span class="o">.</span><span class="n">interfaces</span><span class="p">()</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Не найдено сетевых интерфейсов&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Available interfaces: </span><span class="si">{</span><span class="p">[</span><span class="n">iface</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">iface</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">interfaces</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">iface</span> <span class="ow">in</span> <span class="n">interfaces</span><span class="p">:</span>
<span class="n">iface_name</span> <span class="o">=</span> <span class="n">iface</span><span class="o">.</span><span class="n">name</span><span class="p">()</span>
<span class="k">if</span> <span class="s2">&quot;p2p&quot;</span> <span class="ow">in</span> <span class="n">iface_name</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Skipped interface </span><span class="si">{</span><span class="n">iface_name</span><span class="si">}</span><span class="s2"> (P2P)&quot;</span><span class="p">)</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">iface</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="n">results</span> <span class="o">=</span> <span class="n">iface</span><span class="o">.</span><span class="n">scan_results</span><span class="p">()</span>
<span class="k">if</span> <span class="n">results</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Selected Wi-Fi interface: </span><span class="si">{</span><span class="n">iface_name</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">iface</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Interface </span><span class="si">{</span><span class="n">iface_name</span><span class="si">}</span><span class="s2"> returned no scan results&quot;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Interface </span><span class="si">{</span><span class="n">iface_name</span><span class="si">}</span><span class="s2"> inactive: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Не найден активный Wi-Fi-интерфейс&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error determining Wi-Fi interface: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<div class="viewcode-block" id="WifiService.get_vendor">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService.get_vendor">[docs]</a>
<span class="nd">@lru_cache</span><span class="p">(</span><span class="n">maxsize</span><span class="o">=</span><span class="mi">1000</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_vendor</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mac</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Определяет вендора по MAC-адресу с использованием кэширования.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">mac_lookup</span><span class="o">.</span><span class="n">lookup</span><span class="p">(</span><span class="n">mac</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to determine vendor for MAC </span><span class="si">{</span><span class="n">mac</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Неизвестный&quot;</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_encryption_from_iw</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ap_info</span><span class="p">:</span> <span class="n">Dict</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Определяет тип шифрования из данных, полученных через iw.&quot;&quot;&quot;</span>
<span class="n">security</span> <span class="o">=</span> <span class="n">ap_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;security&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Encryption for BSSID </span><span class="si">{</span><span class="n">ap_info</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;bssid&#39;</span><span class="p">)</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">security</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="s2">&quot;WPA3&quot;</span> <span class="ow">in</span> <span class="n">security</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;WPA3&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;WPA2&quot;</span> <span class="ow">in</span> <span class="n">security</span> <span class="ow">or</span> <span class="s2">&quot;RSN&quot;</span> <span class="ow">in</span> <span class="n">security</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;WPA2&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;WPA&quot;</span> <span class="ow">in</span> <span class="n">security</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;WPA&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="s2">&quot;WEP&quot;</span> <span class="ow">in</span> <span class="n">security</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;WEP&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Открытая&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_channel</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frequency</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Преобразует частоту в номер канала.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">frequency</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="mi">2412</span> <span class="o">&lt;=</span> <span class="n">frequency</span> <span class="o">&lt;=</span> <span class="mi">2472</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="n">frequency</span> <span class="o">-</span> <span class="mi">2412</span><span class="p">)</span> <span class="o">//</span> <span class="mi">5</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">elif</span> <span class="mi">5180</span> <span class="o">&lt;=</span> <span class="n">frequency</span> <span class="o">&lt;=</span> <span class="mi">5825</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="n">frequency</span> <span class="o">-</span> <span class="mi">5180</span><span class="p">)</span> <span class="o">//</span> <span class="mi">5</span> <span class="o">+</span> <span class="mi">36</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Frequency </span><span class="si">{</span><span class="n">frequency</span><span class="si">}</span><span class="s2"> outside 2.4/5 GHz range&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error determining channel for frequency </span><span class="si">{</span><span class="n">frequency</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_frequency</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frequency</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">int</span><span class="p">])</span> <span class="o">-&gt;</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Определяет частотный диапазон на основе частоты.&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="n">frequency</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="mi">2412</span> <span class="o">&lt;=</span> <span class="n">frequency</span> <span class="o">&lt;=</span> <span class="mi">2472</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;2.4 ГГц&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="mi">5180</span> <span class="o">&lt;=</span> <span class="n">frequency</span> <span class="o">&lt;=</span> <span class="mi">5825</span><span class="p">:</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;5 ГГц&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Frequency </span><span class="si">{</span><span class="n">frequency</span><span class="si">}</span><span class="s2"> outside 2.4/5 GHz range&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error determining band for frequency </span><span class="si">{</span><span class="n">frequency</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_iw_scan_data</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">List</span><span class="p">[</span><span class="n">Dict</span><span class="p">]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Получает данные сканирования Wi-Fi через команду iw.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Интерфейс не определён&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">cmd</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;sudo&quot;</span><span class="p">,</span> <span class="s2">&quot;iw&quot;</span><span class="p">,</span> <span class="s2">&quot;dev&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">(),</span> <span class="s2">&quot;scan&quot;</span><span class="p">]</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Executing command: </span><span class="si">{</span><span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">cmd</span><span class="p">,</span> <span class="n">capture_output</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">returncode</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;iw scan error: </span><span class="si">{</span><span class="n">result</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">stdout</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;iw scan output (first 500 chars): </span><span class="si">{</span><span class="n">output</span><span class="p">[:</span><span class="mi">500</span><span class="p">]</span><span class="si">}</span><span class="s2">...&quot;</span><span class="p">)</span>
<span class="n">aps</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">current_ap</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">bssid_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;BSS ([0-9a-f:]</span><span class="si">{17}</span><span class="s2">)&quot;</span><span class="p">)</span>
<span class="n">ssid_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;SSID: ?(.*)&quot;</span><span class="p">)</span>
<span class="n">freq_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;freq: (\d+)&quot;</span><span class="p">)</span>
<span class="n">signal_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;signal: ([-\d.]+) dBm&quot;</span><span class="p">)</span>
<span class="n">rsn_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;RSN:&quot;</span><span class="p">)</span>
<span class="n">wpa_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;WPA:&quot;</span><span class="p">)</span>
<span class="n">security_type_pattern</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s2">&quot;\* (WPA3|WPA2|WPA|WEP)&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">output</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span>
<span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">if</span> <span class="n">bssid_match</span> <span class="o">:=</span> <span class="n">bssid_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="k">if</span> <span class="n">current_ap</span><span class="p">:</span>
<span class="n">aps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">current_ap</span><span class="p">)</span>
<span class="n">current_ap</span> <span class="o">=</span> <span class="p">{</span><span class="s2">&quot;bssid&quot;</span><span class="p">:</span> <span class="n">bssid_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">lower</span><span class="p">(),</span> <span class="s2">&quot;security&quot;</span><span class="p">:</span> <span class="s2">&quot;&quot;</span><span class="p">}</span>
<span class="k">elif</span> <span class="n">current_ap</span><span class="p">:</span>
<span class="k">if</span> <span class="n">ssid_match</span> <span class="o">:=</span> <span class="n">ssid_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;ssid&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="n">ssid_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">if</span> <span class="n">ssid_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">else</span> <span class="s2">&quot;&quot;</span>
<span class="k">elif</span> <span class="n">freq_match</span> <span class="o">:=</span> <span class="n">freq_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;frequency&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">freq_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">signal_match</span> <span class="o">:=</span> <span class="n">signal_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;signal&quot;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">signal_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">rsn_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;security&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">&quot;RSN;&quot;</span>
<span class="k">elif</span> <span class="n">wpa_pattern</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;security&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="s2">&quot;WPA;&quot;</span>
<span class="k">elif</span> <span class="n">security_type_match</span> <span class="o">:=</span> <span class="n">security_type_pattern</span><span class="o">.</span><span class="n">search</span><span class="p">(</span><span class="n">line</span><span class="p">):</span>
<span class="n">current_ap</span><span class="p">[</span><span class="s2">&quot;security&quot;</span><span class="p">]</span> <span class="o">+=</span> <span class="n">security_type_match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;;&quot;</span>
<span class="k">if</span> <span class="n">current_ap</span><span class="p">:</span>
<span class="n">aps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">current_ap</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">aps</span><span class="p">)</span><span class="si">}</span><span class="s2"> access points via iw: </span><span class="si">{</span><span class="p">[</span><span class="n">ap</span><span class="p">[</span><span class="s1">&#39;bssid&#39;</span><span class="p">]</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">ap</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">aps</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">aps</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">CalledProcessError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error executing iw scan: </span><span class="si">{</span><span class="n">e</span><span class="o">.</span><span class="n">stderr</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">except</span> <span class="n">subprocess</span><span class="o">.</span><span class="n">TimeoutExpired</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Таймаут при выполнении iw scan&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error parsing iw scan: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="p">[]</span>
<div class="viewcode-block" id="WifiService.scan_wifi">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService.scan_wifi">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">scan_wifi</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">timeout</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">30</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">WifiScanResult</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Сканирует текущие Wi-Fi точки доступа.&quot;&quot;&quot;</span>
<span class="n">start_time</span> <span class="o">=</span> <span class="n">time</span><span class="o">.</span><span class="n">time</span><span class="p">()</span>
<span class="n">aps</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Wi-Fi-интерфейс не доступен&quot;</span><span class="p">))</span>
<span class="k">return</span> <span class="n">WifiScanResult</span><span class="p">(</span><span class="n">access_points</span><span class="o">=</span><span class="n">aps</span><span class="p">)</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Starting Wi-Fi scan on interface </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">name</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">max_attempts</span> <span class="o">=</span> <span class="mi">3</span>
<span class="k">for</span> <span class="n">attempt</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">max_attempts</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">scan</span><span class="p">()</span>
<span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="nb">min</span><span class="p">(</span><span class="n">timeout</span><span class="p">,</span> <span class="mi">5</span><span class="p">))</span>
<span class="n">py_results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">interface</span><span class="o">.</span><span class="n">scan_results</span><span class="p">()</span>
<span class="k">if</span> <span class="n">py_results</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">py_results</span><span class="p">)</span><span class="si">}</span><span class="s2"> access points via pywifi after attempt </span><span class="si">{</span><span class="n">attempt</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">break</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Scan attempt </span><span class="si">{</span><span class="n">attempt</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2"> failed, trying again (FAIL-BUSY?)&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="s2">&quot;All scan attempts failed&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WifiScanResult</span><span class="p">(</span><span class="n">access_points</span><span class="o">=</span><span class="n">aps</span><span class="p">)</span>
<span class="n">iw_results</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_iw_scan_data</span><span class="p">()</span>
<span class="n">iw_by_bssid</span> <span class="o">=</span> <span class="p">{</span><span class="n">ap</span><span class="p">[</span><span class="s2">&quot;bssid&quot;</span><span class="p">]:</span> <span class="n">ap</span> <span class="k">for</span> <span class="n">ap</span> <span class="ow">in</span> <span class="n">iw_results</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;bssid&quot;</span><span class="p">)}</span>
<span class="n">best_aps_by_ssid</span><span class="p">:</span> <span class="n">Dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">WifiAccessPoint</span><span class="p">]</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">saved_notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">load_notes</span><span class="p">()</span>
<span class="k">for</span> <span class="n">ap</span> <span class="ow">in</span> <span class="n">py_results</span><span class="p">:</span>
<span class="n">bssid</span> <span class="o">=</span> <span class="n">ap</span><span class="o">.</span><span class="n">bssid</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">bssid</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">bssid</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="s2">&quot;Skipped access point without BSSID&quot;</span><span class="p">)</span>
<span class="k">continue</span>
<span class="n">ssid</span> <span class="o">=</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span> <span class="k">else</span> <span class="sa">f</span><span class="s2">&quot;Hidden_</span><span class="si">{</span><span class="n">bssid</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="n">hidden</span> <span class="o">=</span> <span class="ow">not</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span>
<span class="n">signal</span> <span class="o">=</span> <span class="n">ap</span><span class="o">.</span><span class="n">signal</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">signal</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">iw_data</span> <span class="o">=</span> <span class="n">iw_by_bssid</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">bssid</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">frequency</span> <span class="o">=</span> <span class="n">iw_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;frequency&quot;</span><span class="p">)</span>
<span class="n">channel</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_channel</span><span class="p">(</span><span class="n">frequency</span><span class="p">)</span>
<span class="n">freq_band</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_frequency</span><span class="p">(</span><span class="n">frequency</span><span class="p">)</span>
<span class="n">encryption</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_encryption_from_iw</span><span class="p">(</span><span class="n">iw_data</span><span class="p">)</span>
<span class="n">vendor</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">get_vendor</span><span class="p">(</span><span class="n">bssid</span><span class="p">)</span>
<span class="n">current_ap</span> <span class="o">=</span> <span class="n">WifiAccessPoint</span><span class="p">(</span>
<span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">,</span>
<span class="n">bssid</span><span class="o">=</span><span class="n">bssid</span><span class="p">,</span>
<span class="n">channel</span><span class="o">=</span><span class="n">channel</span><span class="p">,</span>
<span class="n">signal</span><span class="o">=</span><span class="n">signal</span> <span class="k">if</span> <span class="n">signal</span> <span class="k">else</span> <span class="n">iw_data</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;signal&quot;</span><span class="p">),</span>
<span class="n">encryption</span><span class="o">=</span><span class="n">encryption</span><span class="p">,</span>
<span class="n">frequency</span><span class="o">=</span><span class="n">freq_band</span><span class="p">,</span>
<span class="n">vendor</span><span class="o">=</span><span class="n">vendor</span><span class="p">,</span>
<span class="n">hidden</span><span class="o">=</span><span class="n">hidden</span><span class="p">,</span>
<span class="n">note</span><span class="o">=</span><span class="n">saved_notes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ssid</span><span class="p">)</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">debug</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Processed AP: </span><span class="si">{</span><span class="n">current_ap</span><span class="o">.</span><span class="n">model_dump</span><span class="p">()</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">best_aps_by_ssid</span> <span class="ow">or</span> <span class="p">(</span>
<span class="n">current_ap</span><span class="o">.</span><span class="n">signal</span> <span class="ow">and</span> <span class="n">best_aps_by_ssid</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span><span class="o">.</span><span class="n">signal</span>
<span class="ow">and</span> <span class="n">current_ap</span><span class="o">.</span><span class="n">signal</span> <span class="o">&gt;</span> <span class="n">best_aps_by_ssid</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span><span class="o">.</span><span class="n">signal</span><span class="p">):</span>
<span class="n">current_ap</span><span class="o">.</span><span class="n">note</span> <span class="o">=</span> <span class="n">saved_notes</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">ssid</span><span class="p">)</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span> <span class="k">else</span> <span class="kc">None</span>
<span class="n">best_aps_by_ssid</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="o">=</span> <span class="n">current_ap</span>
<span class="n">aps</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">best_aps_by_ssid</span><span class="o">.</span><span class="n">values</span><span class="p">())</span>
<span class="c1"># Сохраняем хотя бы SSID, если заметок нет</span>
<span class="n">notes_to_save</span> <span class="o">=</span> <span class="p">{</span><span class="n">ap</span><span class="o">.</span><span class="n">ssid</span><span class="p">:</span> <span class="n">ap</span><span class="o">.</span><span class="n">note</span> <span class="k">for</span> <span class="n">ap</span> <span class="ow">in</span> <span class="n">aps</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span><span class="p">}</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">notes_to_save</span> <span class="ow">and</span> <span class="n">aps</span><span class="p">:</span>
<span class="n">notes_to_save</span> <span class="o">=</span> <span class="p">{</span><span class="n">ap</span><span class="o">.</span><span class="n">ssid</span><span class="p">:</span> <span class="kc">None</span> <span class="k">for</span> <span class="n">ap</span> <span class="ow">in</span> <span class="n">aps</span> <span class="k">if</span> <span class="n">ap</span><span class="o">.</span><span class="n">ssid</span><span class="p">}</span> <span class="c1"># Сохраняем SSID без заметок</span>
<span class="k">if</span> <span class="n">notes_to_save</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save_notes</span><span class="p">(</span><span class="n">notes_to_save</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="s2">&quot;No notes or SSIDs to save, skipping file write&quot;</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Wi-Fi scan completed, found </span><span class="si">{</span><span class="nb">len</span><span class="p">(</span><span class="n">aps</span><span class="p">)</span><span class="si">}</span><span class="s2"> unique networks&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WifiScanResult</span><span class="p">(</span><span class="n">access_points</span><span class="o">=</span><span class="n">aps</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error scanning Wi-Fi: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">WifiScanResult</span><span class="p">(</span><span class="n">access_points</span><span class="o">=</span><span class="n">aps</span><span class="p">)</span></div>
<div class="viewcode-block" id="WifiService.add_note">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService.add_note">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_note</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssid</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">note</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Добавляет заметку к сети Wi-Fi по SSID.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">saved_notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">load_notes</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">saved_notes</span> <span class="ow">or</span> <span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Added new note for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Note for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> already exists&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Заметка для сети с SSID </span><span class="si">{ssid}</span><span class="s2"> уже существует&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="o">=</span> <span class="n">note</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save_notes</span><span class="p">(</span><span class="n">saved_notes</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Added note &#39;</span><span class="si">{</span><span class="n">note</span><span class="si">}</span><span class="s2">&#39; for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error adding note for SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Внутренняя ошибка сервера: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
<div class="viewcode-block" id="WifiService.update_note">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService.update_note">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">update_note</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssid</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">note</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Обновляет заметку сети Wi-Fi по SSID.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">saved_notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">load_notes</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">saved_notes</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Сеть с SSID </span><span class="si">{ssid}</span><span class="s2"> не найдена&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">if</span> <span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Note for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> does not exist&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Заметка для сети с SSID </span><span class="si">{ssid}</span><span class="s2"> не существует&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="o">=</span> <span class="n">note</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save_notes</span><span class="p">(</span><span class="n">saved_notes</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Updated note &#39;</span><span class="si">{</span><span class="n">note</span><span class="si">}</span><span class="s2">&#39; for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error updating note for SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Внутренняя ошибка сервера: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
<div class="viewcode-block" id="WifiService.delete_note">
<a class="viewcode-back" href="../../api/services/wifi_service.html#services.wifi_service.WifiService.delete_note">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">delete_note</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">ssid</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="n">Tuple</span><span class="p">[</span><span class="nb">bool</span><span class="p">,</span> <span class="n">Optional</span><span class="p">[</span><span class="nb">str</span><span class="p">]]:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Удаляет заметку сети Wi-Fi по SSID.&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">saved_notes</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">load_notes</span><span class="p">()</span>
<span class="k">if</span> <span class="n">ssid</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">saved_notes</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">warning</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> not found&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Сеть с SSID </span><span class="si">{ssid}</span><span class="s2"> не найдена&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="k">if</span> <span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Note for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2"> does not exist&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Заметка для сети с SSID </span><span class="si">{ssid}</span><span class="s2"> не существует&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ssid</span><span class="o">=</span><span class="n">ssid</span><span class="p">)</span>
<span class="n">saved_notes</span><span class="p">[</span><span class="n">ssid</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="bp">self</span><span class="o">.</span><span class="n">storage</span><span class="o">.</span><span class="n">save_notes</span><span class="p">(</span><span class="n">saved_notes</span><span class="p">)</span>
<span class="n">logger</span><span class="o">.</span><span class="n">info</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Deleted note for network with SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">True</span><span class="p">,</span> <span class="kc">None</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error deleting note for SSID </span><span class="si">{</span><span class="n">ssid</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="kc">False</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">translations</span><span class="o">.</span><span class="n">gettext</span><span class="p">(</span><span class="s2">&quot;Внутренняя ошибка сервера: </span><span class="si">{error}</span><span class="s2">&quot;</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">error</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">e</span><span class="p">))</span></div>
</div>
</pre></div>
</article>
</div>
<footer>
<div class="related-pages">
</div>
<div class="bottom-of-page">
<div class="left-details">
<div class="copyright">
Copyright &#169; 2025, GONETS
</div>
Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s
<a href="https://github.com/pradyunsg/furo">Furo</a>
</div>
<div class="right-details">
</div>
</div>
</footer>
</div>
<aside class="toc-drawer no-toc">
</aside>
</div>
</div><script src="../../_static/documentation_options.js?v=47de8214"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/scripts/furo.js?v=46bd48cc"></script>
</body>
</html>