Repair docs (html, md). Update docstrings
This commit is contained in:
parent
e264750187
commit
6a4ad48577
125 changed files with 3706 additions and 4913 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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("Ошибка при выходе из системы"))
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue