Хотелось бы узнать Ваше мнение по поводу читаемости кода
Прошлый вариант
( читать дальше... )
Новый вариант
import netsnmp
import json
from pysmi.reader import HttpReader
from pysmi.writer import CallbackWriter
from pysmi.parser.smi import SmiV2Parser
from pysmi.codegen.jsondoc import JsonCodeGen
from pysmi.compiler import MibCompiler
from snmp.models import MIBList, MIBObject, Hosts, SupportedOid
import logging
logger = logging.getLogger(__name__)
class MIBBaseClass(object):
def __init__(self):
self.ListMIBModel = MIBList #Модель со всеми MIBами
self.ObjectMIBModel = MIBObject #Модель со всеми MIB объектами
self.HostModel = Hosts #Модель с параметрами подключения к хостам
self.SupportedOidModel = SupportedOid #Модель с поддерживаемыми oid для конкретного хоста
self.results = {}
self.status = ""
class OidSupportedClass(MIBBaseClass):
def get(self):
bulk = []
for host in self.HostModel.objects.all():
conn = {"DestHost": host.host, "Community": host.community, "Version": host.version}
for oiditem in self.ObjectMIBModel.objects.all():
if netsnmp.snmpwalk(oiditem.name, **conn):
bulk.append(self.SupportedOidModel(host=host, oid=oiditem))
self.results = bulk
def save(self):
def exists_indb(item):
return self.SupportedOidModel.objects.filter(
host__id=item.host.id,
oid__id=item.oid.id
).exists()
bulk = [item for item in self.results if not exists_indb(item)]
self.SupportedOidModel.objects.bulk_create(bulk)
class MIBParserClass(MIBBaseClass):
"""
Парсинг MIB файлов с сайта mibs.snmplabs.com/asn1/
TODO: Вынести куданибудь self.http_sources
"""
def __init__(self):
super(MIBParserClass, self).__init__()
self.http_sources = [('mibs.snmplabs.com', 80, '/asn1/@mib@')]
def get(self):
def _get_result(mib_name, mib_objects, cbCtx):
self.results[mib_name] = json.loads(mib_objects)
mib_parser = MibCompiler(SmiV2Parser(), JsonCodeGen(), CallbackWriter(_get_result))
mib_parser.addSources(*[HttpReader(*item) for item in self.http_sources])
self.status = mib_parser.compile(
*{item.name for item in self.ListMIBModel.objects.filter(compiled=False)}
)
def save(self):
def exists_in_miblist(mib_name):
return self.ListMIBModel.objects.filter(name=mib_name).exists()
def exists_in_mibobjects(item):
return self.ObjectMIBModel.objects.filter(name=item.name).exists()
bulk_listmib = [self.ListMIBModel(name=item) for item in self.results.keys() if not exists_in_miblist(item)]
self.ListMIBModel.objects.bulk_create(bulk_listmib)
bulk_mibobjects = []
for mib_name, mib_objects in self.results.items():
self.ListMIBModel.objects.filter(name=mib_name).update(compiled=True)
for item in mib_objects.values():
values = {"mib": self.ListMIBModel.objects.get(name=mib_name),
"typeclass": item.get("class"),
"maxaccess": item.get("maxaccess"),
"name": item.get("name"),
"nodetype": item.get("nodetype"),
"oid": item.get("oid"),
"status": item.get("status"),
"syntax": item.get("syntax"),
}
if item.get("oid") and item.get("syntax"):
bulk_mibobjects.append(self.ObjectMIBModel(**values))
bulk_mibobjects = [item for item in bulk_mibobjects if not exists_in_mibobjects(item)]
self.ObjectMIBModel.objects.bulk_create(bulk_mibobjects)