Рефакторинг. docstring
This commit is contained in:
parent
060f4de175
commit
37f9e3abfb
14 changed files with 1234 additions and 243 deletions
|
|
@ -5,10 +5,21 @@ from netaddr import IPNetwork
|
|||
|
||||
|
||||
class NetworkScanner:
|
||||
"""Иницилазицая сетевого сканера"""
|
||||
"""Инициализация сетевого сканера.
|
||||
|
||||
Предоставляет методы для сканирования сети с использованием ARP-запросов и
|
||||
вывода информации о клиентах.
|
||||
"""
|
||||
|
||||
def __init__(self, interface=None):
|
||||
"""Инициализация параметров интерфейсов"""
|
||||
"""Инициализация параметров сетевого сканера.
|
||||
|
||||
Args:
|
||||
interface (str, optional): Название сетевого интерфейса. По умолчанию
|
||||
используется интерфейс по умолчанию из netifaces.gateways().
|
||||
|
||||
Инициализирует интерфейс, информацию об IP-адресах и локальный MAC-адрес.
|
||||
"""
|
||||
self.interface = (
|
||||
interface or netifaces.gateways()["default"][netifaces.AF_INET][1])
|
||||
self.ip_info = netifaces.ifaddresses(self.interface).get(
|
||||
|
|
@ -20,13 +31,34 @@ class NetworkScanner:
|
|||
self.interface)[netifaces.AF_LINK][0]["addr"]
|
||||
|
||||
def _create_arp_packet(self, target_ip):
|
||||
"""Создание пакета ARP для отправки"""
|
||||
"""Создаёт ARP-пакет для отправки на указанный IP-адрес.
|
||||
|
||||
Args:
|
||||
target_ip (str): Целевой IP-адрес или подсеть для сканирования.
|
||||
|
||||
Returns:
|
||||
scapy.packet.Packet: Сформированный ARP-пакет с Ethernet-заголовком.
|
||||
"""
|
||||
arp = ARP(pdst=target_ip)
|
||||
ether = Ether(dst="ff:ff:ff:ff:ff:ff")
|
||||
return ether / arp
|
||||
|
||||
def scan_network(self, attempts=3, timeout=2):
|
||||
"""Подготовка к сканированию сети"""
|
||||
"""Сканирует сеть для обнаружения активных клиентов.
|
||||
|
||||
Args:
|
||||
attempts (int, optional): Количество попыток отправки ARP-запросов.
|
||||
По умолчанию 3.
|
||||
timeout (int, optional): Таймаут ожидания ответа в секундах.
|
||||
По умолчанию 2.
|
||||
|
||||
Returns:
|
||||
List[dict]: Список словарей с ключами "ip" и "mac", представляющих
|
||||
обнаруженных клиентов, включая локальные IP-адреса.
|
||||
|
||||
Note:
|
||||
Учитывает локальные IP-адреса интерфейса и удаляет дубликаты.
|
||||
"""
|
||||
all_clients = []
|
||||
|
||||
for network in self.networks:
|
||||
|
|
@ -41,30 +73,35 @@ class NetworkScanner:
|
|||
verbose=0)[0]
|
||||
for _, received in result:
|
||||
client = {"ip": received.psrc, "mac": received.hwsrc}
|
||||
if client not in clients: # Избегаем дублирования клиентов
|
||||
if client not in clients:
|
||||
clients.append(client)
|
||||
|
||||
all_clients.extend(clients)
|
||||
|
||||
# Добавляет все локальные IP-адреса интерфейса как клиенты
|
||||
for ip_info in self.ip_info:
|
||||
local_client = {"ip": ip_info["addr"], "mac": self.local_mac}
|
||||
if local_client not in all_clients:
|
||||
all_clients.append(local_client)
|
||||
|
||||
# Удаление дубликатов
|
||||
unique_clients = {tuple(client.items()) for client in all_clients}
|
||||
return [dict(client) for client in unique_clients]
|
||||
|
||||
def print_clients(self, clients):
|
||||
"""Лист адресов клиентов"""
|
||||
"""Выводит список адресов клиентов в формате таблицы.
|
||||
|
||||
Args:
|
||||
clients (List[dict]): Список словарей с ключами "ip" и "mac",
|
||||
представляющих клиентов.
|
||||
|
||||
Выводит IP-адреса и MAC-адреса в отсортированном по IP порядке.
|
||||
"""
|
||||
print("Доступные устройства в сети:")
|
||||
print("IP" + " " * 18 + "MAC")
|
||||
for client in sorted(clients, key=lambda x: x["ip"]):
|
||||
print(f"{client['ip']:<16} {client['mac']}")
|
||||
|
||||
|
||||
# Оставил нативный запуск сервиса для тестов
|
||||
if __name__ == "__main__":
|
||||
scanner = NetworkScanner()
|
||||
clients = scanner.scan_network()
|
||||
scanner.print_clients(clients)
|
||||
scanner.print_clients(clients)
|
||||
Loading…
Add table
Add a link
Reference in a new issue