Repair docs (html, md). Update docstrings

This commit is contained in:
parent e264750187
commit 6a4ad48577
125 changed files with 3706 additions and 4913 deletions

View file

@ -16,14 +16,26 @@
- Для отправки ARP-кадров могут потребоваться повышенные привилегии или capability на сырой сокет.
"""
import os
import logging
from fastapi import Depends
from scapy.layers.l2 import ARP, Ether
from scapy.sendrecv import srp
import netifaces
from netaddr import IPNetwork
from utils.i18n import get_translations, _
from babel.support import Translations
try:
from scapy.layers.l2 import ARP, Ether
from scapy.sendrecv import srp
except Exception as exc: # pragma: no cover - fallback for doc builds
if os.getenv("SPHINX_BUILD"):
ARP = Ether = None # type: ignore
def srp(*args, **kwargs):
raise RuntimeError("scapy is unavailable during documentation build") from exc
else:
raise
class NetworkScanner:
"""Инициализация сетевого сканера.
@ -41,15 +53,34 @@ class NetworkScanner:
Инициализирует интерфейс, информацию об IP-адресах и локальный MAC-адрес.
"""
self.interface = (
interface or netifaces.gateways()["default"][netifaces.AF_INET][1])
self.ip_info = netifaces.ifaddresses(self.interface).get(
netifaces.AF_INET, [])
self.networks = [
IPNetwork(f"{ip['addr']}/{ip['netmask']}") for ip in self.ip_info
]
self.local_mac = netifaces.ifaddresses(
self.interface)[netifaces.AF_LINK][0]["addr"]
try:
if interface:
self.interface = interface
else:
default_gateway = netifaces.gateways().get("default", {}).get(
netifaces.AF_INET)
if default_gateway:
self.interface = default_gateway[1]
else:
raise KeyError("Default gateway not found")
self.ip_info = netifaces.ifaddresses(self.interface).get(
netifaces.AF_INET, [])
self.networks = [
IPNetwork(f"{ip['addr']}/{ip['netmask']}") for ip in self.ip_info
]
self.local_mac = netifaces.ifaddresses(
self.interface)[netifaces.AF_LINK][0]["addr"]
except Exception as exc:
if os.getenv("SPHINX_BUILD"):
self.interface = interface or "eth0"
self.ip_info = []
self.networks = []
self.local_mac = "00:00:00:00:00:00"
logger = logging.getLogger(__name__)
logger.warning("NetworkScanner falling back to mocked interface during documentation build: %s", exc)
else:
raise
self.translations = translations
def _create_arp_packet(self, target_ip):
@ -126,4 +157,4 @@ class NetworkScanner:
if __name__ == "__main__":
scanner = NetworkScanner()
clients = scanner.scan_network()
scanner.print_clients(clients)
scanner.print_clients(clients)

View file

@ -15,12 +15,17 @@ from babel.support import Translations
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
CONFIG_PATH = os.getenv("GONETS_CONFIG_PATH", "/etc/gonets/config.ini")
config = configparser.ConfigParser()
config_path = "/etc/gonets/config.ini"
if not os.path.exists(config_path):
raise RuntimeError(f"Configuration file {config_path} not found")
config.read(config_path)
SECRET_KEY = config["JWT"]["secret_key"]
read_files = config.read(CONFIG_PATH)
if "JWT" in config:
SECRET_KEY = config["JWT"]["secret_key"]
elif os.getenv("SPHINX_BUILD"):
logger.warning("JWT secret not found; using dummy value for documentation build")
SECRET_KEY = "sphinx-placeholder-secret"
else:
raise RuntimeError(f"Configuration file {CONFIG_PATH} not found or missing [JWT] section")
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
@ -145,4 +150,4 @@ class AuthService:
except Exception as e:
logger.error(
f"Error logging out: {type(e).__name__} - {str(e)}")
raise HTTPException(status_code=500, detail=self.translations.gettext("Ошибка при выходе из системы"))
raise HTTPException(status_code=500, detail=self.translations.gettext("Ошибка при выходе из системы"))

View file

@ -23,14 +23,16 @@ logger = logging.getLogger(__name__)
class WifiStorage:
"""Класс для хранения данных о Wi-Fi сетях и их заметках по SSID.
Формат:
Формат::
{
"networks": [{"ssid": str, "note": Optional[str]}]
}
Поведение:
- Создаёт директорию хранения при инициализации, ведёт логирование путей.
- Валидация структуры при чтении, безопасная запись с Unicode и отступами.
- Создаёт директорию хранения при инициализации, ведёт логирование путей.
- Валидирует структуру при чтении и безопасно записывает JSON с Unicode и отступами.
"""
def __init__(self, storage_path: str = "storage/wifi/wifi.json", translations: Translations = Depends(get_translations())):
self.storage_file = Path(storage_path)
@ -373,4 +375,4 @@ class WifiService:
return True, None
except Exception as e:
logger.error(f"Error deleting note for SSID {ssid}: {str(e)}")
return False, self.translations.gettext("Внутренняя ошибка сервера: {error}").format(error=str(e))
return False, self.translations.gettext("Внутренняя ошибка сервера: {error}").format(error=str(e))