Добавление заметок к устройствам. Возможность добавить, удалить, изменить заметку. Синхронизируется с нынешней и старой картой

This commit is contained in:
parent 82a91c0e88
commit 090cbcd477
3 changed files with 92 additions and 25 deletions

View file

@ -22,10 +22,7 @@ from scapy.sendrecv import srp, sr1
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
class NetworkScanner:
"""Класс для сканирования сети с помощью ARP-запросов."""
def __init__(self, interface: str):
self.interface = interface
conf.iface = interface
@ -41,10 +38,7 @@ class NetworkScanner:
logger.error(f"Ошибка ARP-сканирования подсети {subnet}: {str(e)}")
return []
class PortScanner:
"""Класс для сканирования портов на устройстве."""
def __init__(self, interface: str):
self.interface = interface
@ -67,7 +61,7 @@ class PortScanner:
return None
try:
max_workers = min(len(port_config.get_ports()), 15) # Снижено с 100
max_workers = min(len(port_config.get_ports()), 15)
with ThreadPoolExecutor(max_workers=max_workers) as executor:
results = executor.map(check_port, port_config.get_ports())
open_ports = [port for port in results if port is not None]
@ -77,10 +71,7 @@ class PortScanner:
logger.warning(f"Ошибка при сканировании портов для IP {ip}: {str(e)}")
return []
class DeviceInfoCollector:
"""Класс для сбора информации об устройстве."""
def __init__(self):
self.mac_lookup = MacLookup()
@ -98,10 +89,7 @@ class DeviceInfoCollector:
except:
return None
class DeviceStorage:
"""Класс для хранения и управления картой устройств в JSON."""
def __init__(self, storage_path: str = "storage/devices/devices.json"):
self.storage_file = Path(storage_path)
self.storage_file.parent.mkdir(parents=True, exist_ok=True)
@ -149,10 +137,7 @@ class DeviceStorage:
except Exception as e:
logger.error(f"Ошибка при сохранении устройств: {str(e)}")
class SubnetService:
"""Сервис для сканирования подсети и управления картой устройств."""
def __init__(self):
self.interface = self._get_default_interface()
self.network_scanner = NetworkScanner(self.interface)
@ -206,7 +191,8 @@ class SubnetService:
vendor=self.device_info.get_vendor(mac),
open_ports=self.port_scanner.scan(ip) or existing_device.open_ports,
status="online",
last_seen=now
last_seen=now,
note=existing_device.note
)
vendor = self.device_info.get_vendor(mac)
hostname = self.device_info.get_hostname(ip)
@ -218,14 +204,14 @@ class SubnetService:
vendor=vendor,
open_ports=open_ports,
status="online",
last_seen=now
last_seen=now,
note=None
)
with ThreadPoolExecutor(max_workers=10) as executor:
device_results = executor.map(process_device, discovered_devices)
devices.extend([d for d in device_results if d is not None])
# Добавляет устройства со старой карты, в нынешнюю при отсутствии со статусом offline
active_macs = {d.mac for d in devices if d.mac}
for mac, device in saved_devices.items():
if mac not in active_macs:
@ -273,10 +259,53 @@ class SubnetService:
vendor=vendor,
open_ports=open_ports,
status="online",
last_seen=now
last_seen=now,
note=None
)
logger.warning(f"Локальное устройство не найдено в подсети {subnet}")
return None
except Exception as e:
logger.warning(f"Не удалось получить локальное устройство: {str(e)}")
return None
return None
def add_note(self, mac: str, note: str) -> bool:
try:
saved_devices = self.storage.load_devices()
if mac not in saved_devices:
logger.warning(f"Устройство с MAC {mac} не найдено")
return False
saved_devices[mac].note = note
self.storage.save_devices(list(saved_devices.values()))
logger.info(f"Добавлена заметка '{note}' для устройства с MAC {mac}")
return True
except Exception as e:
logger.error(f"Ошибка при добавлении заметки для MAC {mac}: {str(e)}")
return False
def update_note(self, mac: str, note: str) -> bool:
try:
saved_devices = self.storage.load_devices()
if mac not in saved_devices:
logger.warning(f"Устройство с MAC {mac} не найдено")
return False
saved_devices[mac].note = note
self.storage.save_devices(list(saved_devices.values()))
logger.info(f"Обновлена заметка '{note}' для устройства с MAC {mac}")
return True
except Exception as e:
logger.error(f"Ошибка при обновлении заметки для MAC {mac}: {str(e)}")
return False
def delete_note(self, mac: str) -> bool:
try:
saved_devices = self.storage.load_devices()
if mac not in saved_devices:
logger.warning(f"Устройство с MAC {mac} не найдено")
return False
saved_devices[mac].note = None
self.storage.save_devices(list(saved_devices.values()))
logger.info(f"Удалена заметка для устройства с MAC {mac}")
return True
except Exception as e:
logger.error(f"Ошибка при удалении заметки для MAC {mac}: {str(e)}")
return False