Docstring документация моделей сервера

This commit is contained in:
parent d80adfb2e0
commit 1b0d18b681
7 changed files with 184 additions and 13 deletions

View file

@ -1,16 +1,13 @@
from fastapi import APIRouter, HTTPException from fastapi import APIRouter, HTTPException
from typing import List from typing import List, Dict
from pydantic import BaseModel
from models.subnet import SubnetScanResult from models.subnet import SubnetScanResult
from models.wifi import WifiScanResult from models.wifi import WifiScanResult
from models.request import NoteRequest
from services.subnet_service import SubnetService from services.subnet_service import SubnetService
from services.wifi_service import WifiService from services.wifi_service import WifiService
router = APIRouter() router = APIRouter()
class NoteRequest(BaseModel):
note: str
@router.get("/scan", response_model=SubnetScanResult) @router.get("/scan", response_model=SubnetScanResult)
def scan_subnet(subnet: str = "192.168.1.0/24", ports: List[int] = None): def scan_subnet(subnet: str = "192.168.1.0/24", ports: List[int] = None):
"""Сканирует локальную подсеть и возвращает данные об устройствах""" """Сканирует локальную подсеть и возвращает данные об устройствах"""

View file

@ -2,20 +2,52 @@ from pydantic import BaseModel
from typing import Optional from typing import Optional
class UserCreate(BaseModel): class UserCreate(BaseModel):
"""
Модель созданного пользователя
Атрибуты:
username (str): Имя пользователя
password (str): Пароль пользователя
is_admin (bool): Административный доступ
"""
username: str username: str
password: str password: str
is_admin: bool = False is_admin: bool = False
class UserLogin(BaseModel): class UserLogin(BaseModel):
"""
Модель авторизации пользователя
Атрибуты:
username (str): Имя пользователя
password (str): Пароль пользователя
"""
username: str username: str
password: str password: str
class UserResponse(BaseModel): class UserResponse(BaseModel):
"""
Модель проверки наличия пользователя
Атрибуты:
id (int): Идентификатор
username (str): Имя пользователя
is_admin (bool): Административный доступ
"""
id: int id: int
username: str username: str
is_admin: bool is_admin: bool
class Token(BaseModel): class Token(BaseModel):
"""
Токен пользователя
Атрибуты:
access_token (str): Токен пользователя (захэширован)
token_type (str): Тип токена
session_id (Optional[str]): Идентификатор сессии
user (Optional[UserResponse]): Пользователь на основе проверки наличия пользователя
"""
access_token: str access_token: str
token_type: str token_type: str
session_id: Optional[str] = None session_id: Optional[str] = None

View file

@ -2,34 +2,82 @@ from typing import List, Optional, Union
from pydantic import BaseModel from pydantic import BaseModel
# Класс для маршрутов IPv4
class IPv4Route(BaseModel): class IPv4Route(BaseModel):
"""
Модель маршрута IPv4
Атрибуты:
destination (str): IP-адрес назначения
prefix (int): Префикс подсети в формате CIDR
next_hop (str): Адрес следующего узла (маршрутизатор)
metric (int): Метрика маршрута
"""
destination: str destination: str
prefix: int prefix: int
next_hop: str next_hop: str
metric: int metric: int
# Класс для маршрутов IPv6
class IPv6Route(BaseModel): class IPv6Route(BaseModel):
"""
Модель маршрута IPv6
Атрибуты:
destination (str): IP-адрес назначения
prefix (int): Префикс подсети (CIDR)
next_hop (str): Адрес следующего узла (маршрутизатор)
metric (int): Метрика маршрута
"""
destination: str destination: str
prefix: int prefix: int
next_hop: str next_hop: str
metric: int metric: int
# Класс для индивидуальной конфигурации IP
class IndividualIPConfig(BaseModel): class IndividualIPConfig(BaseModel):
"""
Модель индивидуальной конфигурации IP-адреса
Атрибуты:
address (str): IP-адрес интерфейса
routes (List[Union[IPv4Route, IPv6Route]]): Список маршрутов (IPv4/IPv6)
method (Optional[str]): Метод назначения IP
gateway (str): Основной шлюз по умолчанию
dns (List[str]): Список DNS-серверов
"""
address: str address: str
routes: List[Union[IPv4Route, IPv6Route]] routes: List[Union[IPv4Route, IPv6Route]]
method: Optional[str] method: Optional[str]
gateway: str gateway: str
dns: List[str] dns: List[str]
# Класс для конфигурации IP
class IPConfig(BaseModel): class IPConfig(BaseModel):
"""
Модель конфигурации IP (IPv4/IPv6)
Атрибуты:
configurations (List[IndividualIPConfig]): Список индивидуальных IP-конфигураций
"""
configurations: List[IndividualIPConfig] configurations: List[IndividualIPConfig]
# Класс для сетевого интерфейса
class NetworkInterface(BaseModel): class NetworkInterface(BaseModel):
"""
Модель базового сетевого интерфейса
Атрибуты:
name (str): Название интерфейса
type (str): Тип интерфейса
mac_address (str): MAC-адрес устройства
device_state (str): Состояние устройства
active_connection (str): Название активного соединения
device_mtu (str): MTU устройства
ipv4 (IPConfig): Конфигурация IPv4
ipv6 (IPConfig): Конфигурация IPv6
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
"""
name: str name: str
type: str type: str
mac_address: str mac_address: str
@ -41,8 +89,19 @@ class NetworkInterface(BaseModel):
container_x: int = 0 container_x: int = 0
container_y: int = 0 container_y: int = 0
# Класс для WiFi устройства
class WiFiDevice(NetworkInterface): class WiFiDevice(NetworkInterface):
"""
Модель Wi-Fi устройства (наследуется от NetworkInterface)
Атрибуты:
ssid (Optional[str]): Название Wi-Fi сети
bssid (Optional[str]): MAC-адрес точки доступа
bitrate (Optional[int]): Скорость соединения
strength (Optional[int]): Уровень сигнала
frequency (Optional[float]): Частота
mode (Union[str, int]): Режим работы
"""
ssid: Optional[str] = None ssid: Optional[str] = None
bssid: Optional[str] = None bssid: Optional[str] = None
bitrate: Optional[int] = None bitrate: Optional[int] = None
@ -50,19 +109,50 @@ class WiFiDevice(NetworkInterface):
frequency: Optional[float] = None frequency: Optional[float] = None
mode: Union[str, int] = None mode: Union[str, int] = None
class NetworkInterfacesContainer(BaseModel): class NetworkInterfacesContainer(BaseModel):
"""
Контейнер для группы сетевых интерфейсов с координатами
Атрибуты:
interfaces (List[Union[NetworkInterface, WiFiDevice]]): Список интерфейсов
container_x (int): Положение по оси X
container_y (int): Положение по оси Y
"""
interfaces: List[Union[NetworkInterface, WiFiDevice]] interfaces: List[Union[NetworkInterface, WiFiDevice]]
container_x: int container_x: int
container_y: int container_y: int
class Activation(BaseModel): class Activation(BaseModel):
"""
Модель активированных интерфейсов
Атрибуты:
id (int): Идентификатор ноды активированных интерфейсов
interfaces (List[Union[NetworkInterface, WiFiDevice]]): Активированные интерфейсы
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
isOpen (bool): Флаг скрытия ноды на холсте
"""
id: int id: int
interfaces: List[Union[NetworkInterface, WiFiDevice]] interfaces: List[Union[NetworkInterface, WiFiDevice]]
container_x: int container_x: int
container_y: int container_y: int
isOpen: bool = True isOpen: bool = True
class Deactivation(BaseModel): class Deactivation(BaseModel):
"""
Модель отключенных интерфейсов
Атрибуты:
id (int): Идентификатор ноды отключенных интерфейсов
interfaces (List[Union[NetworkInterface, WiFiDevice]]): Отключенные интерфейсы
container_x (int): Положение по X на холсте
container_y (int): Положение по Y на холсте
isOpen (bool): Флаг скрытия ноды на холсте
"""
id: int id: int
interfaces: List[Union[NetworkInterface, WiFiDevice]] interfaces: List[Union[NetworkInterface, WiFiDevice]]
container_x: int container_x: int

11
SRV/models/request.py Normal file
View file

@ -0,0 +1,11 @@
from pydantic import BaseModel
class NoteRequest(BaseModel):
"""
Модель добавления заметки к просканированному устройству
Атрибуты:
note (str): Заметка устройства
"""
note: str

View file

@ -2,6 +2,19 @@ from pydantic import BaseModel
from typing import Optional, List from typing import Optional, List
class Device(BaseModel): class Device(BaseModel):
"""
Сканируемое устройство в подсети
Атрибуты:
ip (str): IP-адрес устройства
mac (Optional[str]): MAC-адрес устройства
hostname (Optional[str]): Имя хоста
vendor (Optional[str]): Название производителя устройства (По MAC-адресу)
open_ports (List[str]): Открытые порты устройства
status (str): Статус устройства (онлайн/оффлайн)
last_seen (Optional[str]): Последняя активность устройства
note (Optional[str]): Заметка устройства
"""
ip: str ip: str
mac: Optional[str] = None mac: Optional[str] = None
hostname: Optional[str] = None hostname: Optional[str] = None
@ -12,4 +25,10 @@ class Device(BaseModel):
note: Optional[str] = None note: Optional[str] = None
class SubnetScanResult(BaseModel): class SubnetScanResult(BaseModel):
"""
Результат сканирования устройств в подсети
Атрибуты:
devices (List[Device]): Список просканированных устройств
"""
devices: List[Device] = [] devices: List[Device] = []

View file

@ -1,7 +1,21 @@
from pydantic import BaseModel from pydantic import BaseModel
from typing import Optional, List from typing import Optional, List
class WifiAccessPoint(BaseModel): class WifiAccessPoint(BaseModel):
"""
Модель точки доступа Wi-Fi
Атрибуты:
ssid (Optional[str]): Название точки доступа. Может быть скрытым
bssid (str): Уникальный идентификатор точки доступа (по типу MAC-адреса)
channel (Optional[int]): Канал, на котором работает точка доступа
signal (Optional[int]): Уровень сигнала (dBm)
encryption (Optional[str]): Тип шифрования (WPA2, WPA3, открытая и т.д.)
frequency (Optional[str]): Частота вещания (2.4GHz/5GHz)
vendor (Optional[str]): Производитель точки доступа (определяется по MAC-адресу)
hidden (bool): Флаг скрытия названия точки доступа (ssid)
"""
ssid: Optional[str] = None ssid: Optional[str] = None
bssid: str bssid: str
channel: Optional[int] = None channel: Optional[int] = None
@ -11,5 +25,12 @@ class WifiAccessPoint(BaseModel):
vendor: Optional[str] = None vendor: Optional[str] = None
hidden: bool = False hidden: bool = False
class WifiScanResult(BaseModel): class WifiScanResult(BaseModel):
"""
Результат сканирования Wi-Fi
Атрибуты:
access_points (List[WifiAccessPoint]): Список найденных Wi-Fi точек доступа
"""
access_points: List[WifiAccessPoint] access_points: List[WifiAccessPoint]

View file

@ -6,6 +6,7 @@ from functools import lru_cache
from typing import List, Optional, Dict from typing import List, Optional, Dict
from mac_vendor_lookup import MacLookup from mac_vendor_lookup import MacLookup
import pywifi import pywifi
from pywifi import Profile
from models.wifi import WifiAccessPoint, WifiScanResult from models.wifi import WifiAccessPoint, WifiScanResult
logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
@ -184,7 +185,7 @@ class WifiService:
iw_results = self._get_iw_scan_data() iw_results = self._get_iw_scan_data()
iw_by_bssid = {ap['bssid']: ap for ap in iw_results if ap.get('bssid')} iw_by_bssid = {ap['bssid']: ap for ap in iw_results if ap.get('bssid')}
best_aps_by_ssid: Dict[str, WifiAccessPoint] = {} # Сделал словарь чтобы агрегировать точки доступа у сетей для выявления лучшего best_aps_by_ssid: Dict[str, WifiAccessPoint] = {} # Сделал словарь, чтобы агрегировать точки доступа у сетей для выявления лучшего
for ap in py_results: for ap in py_results:
bssid = ap.bssid.lower() if ap.bssid else None bssid = ap.bssid.lower() if ap.bssid else None
if not bssid: if not bssid: