Опытный
Профиль
Группа: Участник
Сообщений: 358
Регистрация: 28.4.2010
Где: Москва
Репутация: нет Всего: нет
|
Решили, что нужно допиливать скрипт на python Нашёл скрипт, который формирует таблицу Код | import sys,os from dbusclient import Dbusclient import yaml import json
if __name__ == '__main__': sys.exit(0)
config = yaml.safe_load(open('/etc/roschat-snmp/conf.d/default.yml'))['snmp']
class Params: def __init__(self, agent): self.agent = agent self.dbus = Dbusclient(config['object'], config['path'], config['iface']) self.state = None
def register(self): mib = "ROSCHAT-M0-MIB::roschat-m0." self.publicNetwork = self.agent.Integer32( oidstr = mib+"publicNetwork", # BoolType (1 - no, 2 - yes) initval = 1 ) self.domainCertificate = self.agent.Integer32( oidstr = mib+"domainCertificate", initval = 1 ) self.domainCertificateTime = self.agent.TimeTicks( oidstr = mib+"domainCertificateTime" ) self.userLicense = self.agent.Integer32( oidstr = mib+"userLicense", initval = 1 ) self.userLicenseLimit = self.agent.Integer32( oidstr = mib+"userLicenseLimit", initval = 0 ) self.userLicenseUsed = self.agent.Integer32( oidstr = mib+"userLicenseUsed", initval = 0 ) self.userLicenseTime = self.agent.TimeTicks( oidstr = mib+"userLicenseTime" ) self.pushService = self.agent.Integer32( oidstr = mib+"pushService", initval = 1 ) self.pushServiceApple = self.agent.Integer32( oidstr = mib+"pushServiceApple", initval = 1 ) self.pushServiceGoogle = self.agent.Integer32( oidstr = mib+"pushServiceGoogle", initval = 1 ) self.finishElement = self.agent.Integer32( oidstr = mib+"finishElement", initval = 0 ) #здесь формируются столбцы таблицы self.serviceTable = self.agent.Table( oidstr = mib+"serviceTable", indexes = [ self.agent.Integer32() ], columns = [ (1, self.agent.Integer32(), True), (2, self.agent.DisplayString(""), True), (3, self.agent.Integer32(), True), (4, self.agent.TimeTicks(), True) ], counterobj = self.agent.Unsigned32( #oidstr = "ROSCHAT-M0-MIB::serviceTable.serviceEntry" oidstr = "ROSCHAT-M0-MIB::serviceEntry" ), extendable = True ) # TODO: add serviceTable def updateServiceTable(self, prev_services_state = [{"name": "", "running": False}]): print('UPDate service table') serviceState = 0 serviceStateTime = 0 self.serviceTable.clear() for i, service in enumerate(self.state['services']): serviceName = service['name'].replace('.service', '') if service['running']: serviceState = 3 serviceStateTime = service['uptime'] else: serviceState = 1 serviceStateTime = service['downtime'] for prevservice in prev_services_state: if service['name'] == prevservice['name'] and not service['running'] == prevservice['running']: print('Change service state') if service['running']: self.sendTrap(14, "serviceTable", "s", serviceName) else: self.sendTrap(13, "serviceTable", "s", serviceName) #Здесь формируются строки таблицы row = self.serviceTable.addRow([self.agent.Integer32(i)]) row.setRowCell(1, self.agent.Integer32(i)) row.setRowCell(2, self.agent.DisplayString(serviceName)) row.setRowCell(3, self.agent.Integer32(serviceState)) row.setRowCell(4, self.agent.TimeTicks(serviceStateTime)) #return self.agent.serviceTable.value()
def valueServiceTable(self): return self.agent.serviceTable.value()
def sendTrap(self, trapcode=0, oid="", valuetype="s", value=""): config = json.loads(open("/opt/roschat-ms/settings/snmp/snmpConfig.json", "r").read()) os.system("snmptrap -v 1 -c public "+config['snmp_trap_host']+":"+config['snmp_trap_port']+" ROSCHAT-M0-MIB::roschat-m0 '' 6 "+str(trapcode)+" '0' ROSCHAT-M0-MIB::roschat-m0."+oid+" "+valuetype+" "+str(value)) def update(self, data=None): # TODO: оптимизировать, убрать лишние if, etc prev_state = self.state if prev_state == None: prev_state = { "network": {"ok": False}, "pushStatus": {"status": False}, "certs": {"errors": []}, "services": [{"name": "", "running": False}] } self.state = self.dbus.GetState() self.updateServiceTable(prev_state['services']).value() if self.state['network']['ok']: publicNetwork = 2 # True if not self.state['network']['ok'] == prev_state['network']['ok']: self.sendTrap(2, "publicNetwork", "i", publicNetwork) else: publicNetwork = 1 # False if not self.state['network']['ok'] == prev_state['network']['ok']: self.sendTrap(1, "publicNetwork", "i", publicNetwork) self.publicNetwork.update(publicNetwork)
if 'certs' in self.state: domainCertificate = 2 # True if 'errors' in self.state['certs']: if len(self.state['certs']['errors']) > 0: domainCertificate = 1 #False if not self.state['certs']['errors'] == prev_state['certs']['errors']: self.sendTrap(3, "domainCertificate", "i", domainCertificate) else: if not self.state['certs']['errors'] == prev_state['certs']['errors']: self.sendTrap(4, "domainCertificate", "i", domainCertificate) self.domainCertificate.update(domainCertificate)
if 'pushStatus' in self.state and 'status' in self.state['pushStatus']: pushService = 2 # True if not self.state['pushStatus']['status'] == prev_state['pushStatus']['status']: self.sendTrap(8, "pushService", "i", pushService) else: pushService = 1 # False if self.state['pushStatus'] and not self.state['pushStatus']['status'] == prev_state['pushStatus']['status']: self.sendTrap(7, "pushService", "i", pushService) self.pushService.update(pushService) self.domainCertificateTime.update(2) # TODO: разобраться с типом данных self.userLicense.update(2) # TODO: Что это? self.userLicenseLimit.update(203) # TODO: И это тоже что?
|
Получаю деревл таблицы Код | snmpwalk -v 2c -c public localhost ROSCHAT-M0-MIB::serviceTable ROSCHAT-M0-MIB::serviceEntry.0 = Gauge32: 8 ROSCHAT-M0-MIB::serviceNum.0 = INTEGER: 0 ROSCHAT-M0-MIB::serviceNum.1 = INTEGER: 1 ROSCHAT-M0-MIB::serviceNum.2 = INTEGER: 2 ROSCHAT-M0-MIB::serviceNum.3 = INTEGER: 3 ROSCHAT-M0-MIB::serviceNum.4 = INTEGER: 4 ROSCHAT-M0-MIB::serviceNum.5 = INTEGER: 5 ROSCHAT-M0-MIB::serviceNum.6 = INTEGER: 6 ROSCHAT-M0-MIB::serviceNum.7 = INTEGER: 7 ROSCHAT-M0-MIB::serviceName.0 = STRING: "kamailio" ROSCHAT-M0-MIB::serviceName.1 = STRING: "rtpengine" ROSCHAT-M0-MIB::serviceName.2 = STRING: "roschat-ms" ROSCHAT-M0-MIB::serviceName.3 = STRING: "wlan" ROSCHAT-M0-MIB::serviceName.4 = STRING: "turnserver" ROSCHAT-M0-MIB::serviceName.5 = STRING: "roschat-db" ROSCHAT-M0-MIB::serviceName.6 = STRING: "roschat-snmp" ROSCHAT-M0-MIB::serviceName.7 = STRING: "gw-booster" ROSCHAT-M0-MIB::serviceState.0 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.1 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.2 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.3 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.4 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.5 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.6 = INTEGER: ok(3) ROSCHAT-M0-MIB::serviceState.7 = INTEGER: crush(1) ROSCHAT-M0-MIB::serviceStateTime.0 = Timeticks: (257848363) 29 days, 20:14:43.63 ROSCHAT-M0-MIB::serviceStateTime.1 = Timeticks: (281140496) 32 days, 12:56:44.96 ROSCHAT-M0-MIB::serviceStateTime.2 = Timeticks: (1125171516) 130 days, 5:28:35.16 ROSCHAT-M0-MIB::serviceStateTime.3 = Timeticks: (82103817) 9 days, 12:03:58.17 ROSCHAT-M0-MIB::serviceStateTime.4 = Timeticks: (2450021046) 283 days, 13:36:50.46 ROSCHAT-M0-MIB::serviceStateTime.5 = Timeticks: (2449991029) 283 days, 13:31:50.29 ROSCHAT-M0-MIB::serviceStateTime.6 = Timeticks: (59773) 0:09:57.73 ROSCHAT-M0-MIB::serviceStateTime.7 = Timeticks: (451436378) 52 days, 5:59:23.78
|
Но при обращении к определённой строке таблицы, получаю ошибку Код | snmpget -v 1 -c public localhost ROSCHAT-M0-MIB::serviceState.2 Error in packet Reason: (noSuchName) There is no such variable name in this MIB. Failed object: ROSCHAT-M0-MIB::serviceState.2
|
Не понимаю пока, как достучаться до строк таблицы. Смотрел в исходниках библиотеки netsnpagent, но понятнее не стало( Это сообщение отредактировал(а) NZero - 6.2.2020, 17:43
|