gonets/SRV/docs/_build/html/_modules/models/ufw.html
2025-10-14 12:17:13 +05:00

635 lines
No EOL
53 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>models.ufw - 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 models.ufw</h1><div class="highlight"><pre>
<span></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">Annotated</span><span class="p">,</span> <span class="n">Union</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">enum</span><span class="w"> </span><span class="kn">import</span> <span class="n">Enum</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pydantic</span><span class="w"> </span><span class="kn">import</span> <span class="n">BaseModel</span><span class="p">,</span> <span class="n">Field</span><span class="p">,</span> <span class="n">validator</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">ipaddress</span>
<div class="viewcode-block" id="Protocol">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.Protocol">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Protocol</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enum для сетевых протоколов UFW.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">TCP</span> <span class="o">=</span> <span class="s2">&quot;tcp&quot;</span>
<span class="n">UDP</span> <span class="o">=</span> <span class="s2">&quot;udp&quot;</span>
<span class="n">BOTH</span> <span class="o">=</span> <span class="s2">&quot;both&quot;</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">protocols</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;Возвращает список протоколов для использования в команде UFW.&quot;&quot;&quot;</span>
<span class="k">return</span> <span class="p">[</span><span class="s2">&quot;tcp&quot;</span><span class="p">,</span> <span class="s2">&quot;udp&quot;</span><span class="p">]</span> <span class="k">if</span> <span class="bp">self</span> <span class="o">==</span> <span class="n">Protocol</span><span class="o">.</span><span class="n">BOTH</span> <span class="k">else</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">value</span><span class="p">]</span></div>
<div class="viewcode-block" id="Action">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.Action">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Action</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enum для действий UFW.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> ALLOW: Разрешить трафик</span>
<span class="sd"> DENY: Запретить трафик без уведомления</span>
<span class="sd"> REJECT: Запретить трафик с уведомлением отправителю</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">ALLOW</span> <span class="o">=</span> <span class="s2">&quot;allow&quot;</span>
<span class="n">DENY</span> <span class="o">=</span> <span class="s2">&quot;deny&quot;</span>
<span class="n">REJECT</span> <span class="o">=</span> <span class="s2">&quot;reject&quot;</span></div>
<div class="viewcode-block" id="Direction">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.Direction">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">Direction</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">Enum</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Enum для направления трафика UFW.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> IN: Входящий трафик</span>
<span class="sd"> OUT: Исходящий трафик</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">IN</span> <span class="o">=</span> <span class="s2">&quot;in&quot;</span>
<span class="n">OUT</span> <span class="o">=</span> <span class="s2">&quot;out&quot;</span></div>
<div class="viewcode-block" id="UFWRule">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">UFWRule</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Модель правила UFW&quot;&quot;&quot;</span>
<span class="n">action</span><span class="p">:</span> <span class="n">Action</span>
<span class="n">direction</span><span class="p">:</span> <span class="n">Direction</span>
<span class="n">from_ip</span><span class="p">:</span> <span class="nb">str</span>
<span class="n">to_ip</span><span class="p">:</span> <span class="nb">str</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="n">protocol</span><span class="p">:</span> <span class="n">Protocol</span>
<span class="n">comment</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>
<div class="viewcode-block" id="UFWRule.validate_port">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.validate_port">[docs]</a>
<span class="nd">@validator</span><span class="p">(</span><span class="s2">&quot;port&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_port</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">v</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"> v: Порт (число) или диапазон портов (строка вида &quot;3000:3999&quot;)</span>
<span class="sd"> Returns:</span>
<span class="sd"> Union[int, str]: Валидированное значение порта</span>
<span class="sd"> Raises:</span>
<span class="sd"> ValueError: Если порт или диапазон портов некорректен</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">v</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">v</span> <span class="o">&lt;=</span> <span class="mi">65535</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;Порт должен быть в диапазоне 1-65535, получено: </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">v</span>
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="o">=</span> <span class="nb">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">v</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="k">if</span> <span class="ow">not</span> <span class="p">(</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="n">start</span> <span class="o">&lt;=</span> <span class="n">end</span> <span class="o">&lt;=</span> <span class="mi">65535</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span>
<span class="k">return</span> <span class="n">v</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">ValueError</span><span class="p">,</span> <span class="ne">TypeError</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">v</span><span class="si">}</span><span class="s2">. Формат: start:end, где 1 &lt;= start &lt;= end &lt;= 65535&quot;</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="nb">type</span><span class="p">(</span><span class="n">v</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="p">)</span></div>
<div class="viewcode-block" id="UFWRule.validate_ip">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.validate_ip">[docs]</a>
<span class="nd">@validator</span><span class="p">(</span><span class="s2">&quot;from_ip&quot;</span><span class="p">,</span> <span class="s2">&quot;to_ip&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_ip</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Проверяет корректность IP адреса&quot;&quot;&quot;</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># Пробуем создать объект IP-сети, что автоматически проверит корректность адреса</span>
<span class="n">ipaddress</span><span class="o">.</span><span class="n">ip_network</span><span class="p">(</span><span class="n">v</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="k">return</span> <span class="n">v</span>
<span class="k">except</span> <span class="ne">ValueError</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;Некорректный IP адрес или подсеть: </span><span class="si">{</span><span class="n">v</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWRule.validate_ip_version_compatibility">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.validate_ip_version_compatibility">[docs]</a>
<span class="nd">@validator</span><span class="p">(</span><span class="s2">&quot;to_ip&quot;</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_ip_version_compatibility</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">values</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Проверяет совместимость версий IP адресов&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="s2">&quot;from_ip&quot;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
<span class="k">return</span> <span class="n">v</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">values</span><span class="p">[</span><span class="s2">&quot;from_ip&quot;</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">to_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">v</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="k">if</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="o">!=</span> <span class="nb">isinstance</span><span class="p">(</span>
<span class="n">to_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="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span>
<span class="s2">&quot;Несовместимые версии IP: нельзя смешивать IPv4 и IPv6 в одном правиле&quot;</span>
<span class="p">)</span>
<span class="k">return</span> <span class="n">v</span></div>
<div class="viewcode-block" id="UFWRule.validate_action">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.validate_action">[docs]</a>
<span class="nd">@validator</span><span class="p">(</span><span class="s2">&quot;action&quot;</span><span class="p">,</span> <span class="n">pre</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_action</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Приводит значение action к нижнему регистру перед валидацией&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="n">v</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">return</span> <span class="n">v</span></div>
<div class="viewcode-block" id="UFWRule.validate_protocol">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.validate_protocol">[docs]</a>
<span class="nd">@validator</span><span class="p">(</span><span class="s2">&quot;protocol&quot;</span><span class="p">,</span> <span class="n">pre</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">validate_protocol</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">v</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Приводит значение protocol к нижнему регистру перед валидацией&quot;&quot;&quot;</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="k">return</span> <span class="n">v</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="k">return</span> <span class="n">v</span></div>
<div class="viewcode-block" id="UFWRule.to_ufw_command">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.to_ufw_command">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">to_ufw_command</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;Преобразует правило в команду UFW.&quot;&quot;&quot;</span>
<span class="n">cmd_parts</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;ufw&quot;</span><span class="p">]</span>
<span class="c1"># Добавляем действие</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">action</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="c1"># Добавляем направление</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">direction</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
<span class="c1"># Добавляем from с IP</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">&quot;from&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">from_ip</span><span class="p">])</span>
<span class="c1"># Добавляем to с IP</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">&quot;to&quot;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">to_ip</span><span class="p">])</span>
<span class="c1"># Добавляем порт и протокол</span>
<span class="n">port_str</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span>
<span class="bp">self</span><span class="o">.</span><span class="n">port</span><span class="p">)</span> <span class="c1"># Работает как с числами, так и с диапазонами</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">&quot;port&quot;</span><span class="p">,</span> <span class="n">port_str</span><span class="p">])</span>
<span class="c1"># Добавляем протокол</span>
<span class="n">proto</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">protocol</span><span class="o">.</span><span class="n">value</span>
<span class="k">if</span> <span class="n">proto</span> <span class="o">==</span> <span class="s2">&quot;both&quot;</span><span class="p">:</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">&quot;proto tcp/udp&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">&quot;proto&quot;</span><span class="p">,</span> <span class="n">proto</span><span class="p">])</span>
<span class="c1"># Добавляем комментарий если есть</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="p">:</span>
<span class="n">cmd_parts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="s2">&quot;comment&quot;</span><span class="p">,</span> <span class="sa">f</span><span class="s2">&quot;&#39;</span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">comment</span><span class="si">}</span><span class="s2">&#39;&quot;</span><span class="p">])</span>
<span class="k">return</span> <span class="s2">&quot; &quot;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">cmd_parts</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWRule.from_ufw_output">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRule.from_ufw_output">[docs]</a>
<span class="nd">@classmethod</span>
<span class="k">def</span><span class="w"> </span><span class="nf">from_ufw_output</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">line</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="s2">&quot;UFWRule&quot;</span><span class="p">:</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Создает экземпляр UFWRule из строки вывода команды &#39;ufw status numbered&#39;.</span>
<span class="sd"> Args:</span>
<span class="sd"> line: Строка вывода UFW (например, &quot;[1] 80/tcp ALLOW IN 192.168.1.0/24 # Web Server&quot;)</span>
<span class="sd"> Returns:</span>
<span class="sd"> UFWRule: Новый экземпляр правила</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span>
<span class="c1"># Регулярное выражение для разбора строки правила UFW</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="s2">&quot;&quot;&quot;^\s*</span>
<span class="s2"> \[\s*(?P&lt;number&gt;\d+)\s*\]\s*</span>
<span class="s2"> (?P&lt;port&gt;\d+(?::\d+)?)/(?P&lt;protocol&gt;tcp(?:/udp)?|udp)\s+</span>
<span class="s2"> (?P&lt;action&gt;ALLOW|DENY|REJECT)\s+(?P&lt;direction&gt;IN|OUT)\s+</span>
<span class="s2"> (?P&lt;from_ip&gt;[\w\d\./]+|\bAnywhere\b)</span>
<span class="s2"> (?:\s+\(v6\))?</span>
<span class="s2"> (?:\s+\((?:out|in)\))?</span>
<span class="s2"> \s*</span>
<span class="s2"> (?:\#\s*(?P&lt;comment&gt;.*?))?</span>
<span class="s2"> \s*$</span>
<span class="s2"> &quot;&quot;&quot;</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">line</span><span class="p">,</span> <span class="n">re</span><span class="o">.</span><span class="n">VERBOSE</span> <span class="o">|</span> <span class="n">re</span><span class="o">.</span><span class="n">IGNORECASE</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">match</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;Невозможно разобрать строку правила UFW: </span><span class="si">{</span><span class="n">line</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="n">groups</span> <span class="o">=</span> <span class="n">match</span><span class="o">.</span><span class="n">groupdict</span><span class="p">()</span>
<span class="c1"># Преобразуем протокол в enum</span>
<span class="n">proto_str</span> <span class="o">=</span> <span class="n">groups</span><span class="p">[</span><span class="s2">&quot;protocol&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">protocol</span> <span class="o">=</span> <span class="p">(</span><span class="n">Protocol</span><span class="o">.</span><span class="n">BOTH</span> <span class="k">if</span> <span class="n">proto_str</span> <span class="o">==</span> <span class="s2">&quot;tcp/udp&quot;</span> <span class="k">else</span>
<span class="n">Protocol</span><span class="o">.</span><span class="n">UDP</span> <span class="k">if</span> <span class="n">proto_str</span> <span class="o">==</span> <span class="s2">&quot;udp&quot;</span> <span class="k">else</span> <span class="n">Protocol</span><span class="o">.</span><span class="n">TCP</span><span class="p">)</span>
<span class="c1"># Преобразуем действие в enum (игнорируем регистр)</span>
<span class="n">action_str</span> <span class="o">=</span> <span class="n">groups</span><span class="p">[</span><span class="s2">&quot;action&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span>
<span class="n">action</span> <span class="o">=</span> <span class="p">(</span><span class="n">Action</span><span class="o">.</span><span class="n">ALLOW</span> <span class="k">if</span> <span class="n">action_str</span> <span class="o">==</span> <span class="s2">&quot;allow&quot;</span> <span class="k">else</span>
<span class="n">Action</span><span class="o">.</span><span class="n">DENY</span> <span class="k">if</span> <span class="n">action_str</span> <span class="o">==</span> <span class="s2">&quot;deny&quot;</span> <span class="k">else</span> <span class="n">Action</span><span class="o">.</span><span class="n">REJECT</span><span class="p">)</span>
<span class="c1"># Преобразуем направление в enum</span>
<span class="n">direction_str</span> <span class="o">=</span> <span class="n">groups</span><span class="p">[</span><span class="s2">&quot;direction&quot;</span><span class="p">]</span><span class="o">.</span><span class="n">lower</span><span class="p">()</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_str</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"># Обрабатываем IP адреса</span>
<span class="n">from_ip</span> <span class="o">=</span> <span class="n">groups</span><span class="p">[</span><span class="s2">&quot;from_ip&quot;</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">from_ip</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="s2">&quot;anywhere&quot;</span><span class="p">:</span>
<span class="n">from_ip</span> <span class="o">=</span> <span class="s2">&quot;0.0.0.0/0&quot;</span>
<span class="c1"># Для исходящих правил меняем местами from и to</span>
<span class="n">to_ip</span> <span class="o">=</span> <span class="s2">&quot;0.0.0.0/0&quot;</span> <span class="c1"># По умолчанию anywhere</span>
<span class="c1"># Обрабатываем порт</span>
<span class="n">port</span> <span class="o">=</span> <span class="n">groups</span><span class="p">[</span><span class="s2">&quot;port&quot;</span><span class="p">]</span>
<span class="k">if</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="n">port</span> <span class="o">=</span> <span class="n">port</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Преобразуем в число для одиночного порта</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">port</span><span class="p">)</span>
<span class="c1"># Обрабатываем комментарий</span>
<span class="n">comment</span> <span class="o">=</span> <span class="n">groups</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;comment&quot;</span><span class="p">,</span>
<span class="s2">&quot;&quot;</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">groups</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">&quot;comment&quot;</span><span class="p">)</span> <span class="k">else</span> <span class="kc">None</span>
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span>
<span class="n">action</span><span class="o">=</span><span class="n">action</span><span class="p">,</span>
<span class="n">direction</span><span class="o">=</span><span class="n">direction</span><span class="p">,</span>
<span class="n">from_ip</span><span class="o">=</span><span class="n">from_ip</span><span class="p">,</span>
<span class="n">to_ip</span><span class="o">=</span><span class="n">to_ip</span><span class="p">,</span>
<span class="n">port</span><span class="o">=</span><span class="n">port</span><span class="p">,</span>
<span class="n">protocol</span><span class="o">=</span><span class="n">protocol</span><span class="p">,</span>
<span class="n">comment</span><span class="o">=</span><span class="n">comment</span><span class="p">,</span>
<span class="p">)</span></div>
</div>
<div class="viewcode-block" id="UFWRulesResponse">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWRulesResponse">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">UFWRulesResponse</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Модель для представления списка правил UFW.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> enabled: Включен ли UFW</span>
<span class="sd"> rules: Список правил UFW</span>
<span class="sd"> total_rules: Общее количество правил</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Включен ли UFW&quot;</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">=</span> <span class="n">Field</span><span class="p">(</span><span class="n">default_factory</span><span class="o">=</span><span class="nb">list</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="s2">&quot;Список правил UFW&quot;</span><span class="p">)</span>
<span class="nd">@property</span>
<span class="k">def</span><span class="w"> </span><span class="nf">total_rules</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">-&gt;</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">return</span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">rules</span><span class="p">)</span></div>
<div class="viewcode-block" id="UFWStatus">
<a class="viewcode-back" href="../../api/models/ufw.html#models.ufw.UFWStatus">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">UFWStatus</span><span class="p">(</span><span class="n">BaseModel</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> Модель для представления статуса UFW.</span>
<span class="sd"> Attributes:</span>
<span class="sd"> enabled: Включен ли UFW</span>
<span class="sd"> message: Сообщение о статусе</span>
<span class="sd"> last_checked: Время последней проверки статуса</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="n">enabled</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Включен ли UFW&quot;</span><span class="p">)</span>
<span class="n">message</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="n">Field</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="s2">&quot;Сообщение о статусе&quot;</span><span class="p">)</span></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>