Хочу предупредить, чтоб не тратили своё время! Это продолжение размышлений на тему сопровождения L2 сети уровня города. Стоит прочесть эту статью, чтоб понять нужно оно Вам или нет.
Администратор сети:
Моя работа начинается если, мне прилетел отчёт об отказе узла связи.
Чтобы понять какие действия от меня требуются, мне необходимо разобраться в том с чем предстоит работать.
Для физической организации сети связи за нас давно придуман стандарт TIA/EIA-606 «Стандарт на администрирование телекоммуникационной инфраструктуры коммерческих зданий(ГОСТ Р 53246-2008, аналог Американского стандарта). Архитектурная инфраструктура сети включает в себя три подсистемы кабельного хозяйства.
import datetime
import json
import re
from netaddr import IPNetwork, IPAddress, EUI
from netaddr.core import AddrFormatError
import subprocess
class AliveHost:
"""
Средствами операционной системы, а именно ping ip и arp -n ip заполняем поля этого класса
"""
def __init__(self, address, mac):
self.ip = IPAddress(address)
self.mac = EUI(mac)
self.current_time = datetime.datetime.now()
def __repr__(self):
return "{} - {}".format(self.ip, self.mac)
def __hash__(self):
# TODO: Какова вероятность совпадения hash-значений сочетания ip+mac???
return hash((self.ip, self.mac))
@staticmethod
def _str_class(o):
# TODO: Сократить и перенести в метод to_json
result = {}
for attr in o.__dict__:
result.update({attr: str(o.__dict__.get(attr))})
return result
def to_json(self):
return json.dumps(self, default=self._str_class,
sort_keys=True, indent=4)
def ping(host):
"""PEP 324 – PEP proposing the subprocess module"""
h = str(host)
result = []
with subprocess.Popen(["ping", "-c 1", h], stdout=subprocess.PIPE) as s_ping:
if '1 received, 0% packet loss' in str(s_ping.stdout.read()):
result.append(h)
if not len(result):
return None, None
with subprocess.Popen(["arp", "-n", h], stdout=subprocess.PIPE) as s_ping:
mac = re.compile(r'(([0-9A-Fa-f]){2}?:){5}([0-9A-Fa-f]){2}')
result.append(re.search(mac, str(s_ping.stdout.read().decode('utf-8')))[0])
return result
if __name__ == '__main__':
alive = []
for ip in IPNetwork('10.0.0.0/22').iter_hosts():
try:
alive.append(AliveHost(*ping(ip)))
except AddrFormatError:
continue
except TypeError:
continue
К сожалению, не доступен сервер mySQL