def RebootOutlet(self, command): if "Option" in command: #isinstance(command["Option"],( int, long )): if command["Option"].isdigit(): id = int(command["Option"]) #get number of outputs snmpDevice = lib_SNMP.SNMPv2(self.ipaddr) outletCount = snmpDevice.readSNMP( self.getDataDict['OutletCount']) if outletCount is not None: outletCount = int(outletCount) if id > 0 and id <= outletCount: self.log.printInfo("Rebooting outlet %s" % id) #outletControlAction 1.3.6.1.4.1.1718.3.2.3.1.11.1.1.1-8 # readWrite ! - 0 none, 1 on, 2 off, 3 reboot oid = netsnmp.Varbind( '.1.3.6.1.4.1.13742.6.4.1.2.1.2.1.' + str(id), '', '2', 'INTEGER') netsnmp.snmpset(oid, Version=2, DestHost=self.ipaddr, Community='RadioHolland') return False else: self.log.printWarning("Given outlet was not a number") return True else: self.log.printWarning("No outlet-number was given") return True
def down_iff(self, id_iff): sw.down_iff(self, id_iff) var = netsnmp.Varbind('.1.3.6.1.4.1', '8691.7.19.1.9.1.1.3.%s' % id_iff, '0', 'INTEGER') netsnmp.snmpset(var, Version=2, Community=self.snmp_rw_pass, DestHost=self.ip)
def power_cycle_port(self, port): """ Issues a power_cycle via SNMPSET to a specified PORT. """ if not self.hostname: raise PduHostnameError("A hostname does not exist for the entity: %s in Jinx..." % self.name) port_oid = '318.1.1.4.4.2.1.3.%s' % port oid = netsnmp.Varbind('.1.3.6.1.4.1', port_oid, '3', 'INTEGER') netsnmp.snmpset(oid, Version = 1, DestHost=self.hostname, Community='private') return "port: %s power cycled..." % port
def power_cycle_port(self, port): """ Issues a power_cycle via SNMPSET to a specified PORT. """ if not self.hostname: raise PduHostnameError( "A hostname does not exist for the entity: %s in Jinx..." % self.name) port_oid = '318.1.1.4.4.2.1.3.%s' % port oid = netsnmp.Varbind('.1.3.6.1.4.1', port_oid, '3', 'INTEGER') netsnmp.snmpset(oid, Version=1, DestHost=self.hostname, Community='private') return "port: %s power cycled..." % port
def run(self): for id_ in self.ids4thr: devline = self.devices[id_] ip = devline['ip'] snmp_comm_this_device = snmp_wcomm # Если community для устройства задано явно - переопределяем переменную if devline['wcomm'] != '': snmp_comm_this_device = devline['wcomm'] device_model = devline['mname'] if device_model in oids_set: query = 'skipped' for paramname in sorted(oids_set[device_model].keys()): start_time = time.time() if paramname in self.WorkMetricsListS: current_snmp_retries = snmp_retries if paramname in no_retries: current_snmp_retries = 0 varlist = netsnmp.VarList(*[netsnmp.Varbind(*VarBindItem) for VarBindItem in oids_set[device_model][paramname]]) query = netsnmp.snmpset(*varlist, Version = 2, DestHost = ip, Community = snmp_comm_this_device, Timeout = snmp_timeout, Retries = current_snmp_retries, UseNumeric = 1) time.sleep(set_iter_delay) # Время, затраченное на опрос query_time = int((time.time()-start_time)*1000) devline['time'] += query_time devline['set_res'][paramname] = query devline['set_timestamp'] = int(time.time()) self.devices[id_] = devline
def set_snmp(self, host_address, values): values = [values] if type(values) == netsnmp.Varbind else values result = netsnmp.snmpset(*values, Version=SNMP_VERSION, DestHost=host_address, Community=SNMP_SET_COMMUNITY) return bool(result)
def SnmpSet(ip, model, info): # TODO:继续完善 if info == "reboot" and model.find("S") == 0: oid = S2700_reboot elif info == "reboot" and model.find("E") == 0: oid = H3C_reboot else: oid = S2700_reboot if SNMP_MODE == "lib": netsnmp.snmpset( ['.' + oid, 0, 1], DestHost=ip, Version=2, Community=SNMP_WRITE_COMMUNITY, Timeout=500000) # 此句有BUG:TypeError: expected string or buffer elif SNMP_MODE == "bin": type = 'i' value = "3" try: a = subprocess.Popen([ SNMP_SET_BIN_PATH, "-O", "qv", "-t", "1", "-r", "3", "-v", "2c", "-c", SNMP_WRITE_COMMUNITY, ip, oid, type, value ], bufsize=0, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) b = a.stdout.read().decode('utf-8').strip('\n') # 下面清空流,防止爆内存,参考http://blog.csdn.net/pugongying1988/article/details/54616797 似乎没用,TODO:没问题就注释掉 if a.stdin: a.stdin.close() if a.stdout: a.stdout.close() if a.stderr: a.stderr.close() try: a.kill() except OSError: pass # 下面返回数据 if b == "": return "获取失败" if b.find("No Such Object") >= 0: return "设备不支持" b = list(map(lambda x: x.strip("\""), b.split("\n"))) return b except: return "设置失败"
def testFunc(self): """HexStringSet""" session = setup_v2() varlist = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.6.3.10.2.1.1.0')) session.get(varlist) print("varlist length =", len(varlist)) for var in varlist: print(var) self.assertEqual(varlist[0].iid, '0') res = netsnmp.snmpset(var, **snmp_dest()) print("first SNMP set result:", res) self.assertEqual(res, 0) var.val = "" res = netsnmp.snmpset(var, **snmp_dest()) print("second SNMP set result:", res) self.assertEqual(res, 0)
def _perform_cmd(self, action, outlet): cmd = netsnmp.Varbind(PDU.CMD % (outlet), val=action, type="INTEGER") result = netsnmp.snmpset(cmd, Version=1, DestHost=self._ip, Community="private") if (PDU.SUCCESS_CODE != result): raise DeviceError(self.id)
def testsnmpsetfrucontrol(self): '''snmp set frucontrol''' var = netsnmp.Varbind('.1.3.6.1.4.1.2011.2.235.1.1.7.50.1.2', '1', '1') res = netsnmp.snmpset(var, Version=self.snmpver, DestHost=self.ipstr, Community=self.community) print res self.assertEqual(0, res)
def testsnmpsetbootsequence(self): '''snmp set bootsequence''' var = netsnmp.Varbind('.1.3.6.1.4.1.2011.2.235.1.1.1.2.0', '1') res = netsnmp.snmpset(var, Version=self.snmpver, DestHost=self.ipstr, Community=self.community) print res self.assertEqual(0, res)
def testsnmpset(self): '''snmp set test''' var = netsnmp.Varbind('.1.3.6.1.2.1.1.6', '0', 'zenoss') res = netsnmp.snmpset(var, Version=self.snmpver, DestHost=self.ipstr, Community=self.community) print res self.assertEqual(0, res)
def SnmpSet(ip, model, info): # TODO:继续完善 if info == "reboot" and model.find("S") == 0: oid = S2700_reboot elif info == "reboot" and model.find("E") == 0: oid = H3C_reboot else: oid = S2700_reboot if SNMP_MODE == "lib": netsnmp.snmpset(['.' + oid, 0, 1], DestHost=ip, Version=2, Community=SNMP_WRITE_COMMUNITY, Timeout=500000) # 此句有BUG:TypeError: expected string or buffer elif SNMP_MODE == "bin": type = 'i' value = "3" try: a = subprocess.Popen( [SNMP_SET_BIN_PATH, "-O", "qv", "-t", "1", "-r", "3", "-v", "2c", "-c", SNMP_WRITE_COMMUNITY, ip, oid, type, value], bufsize=0, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE) b = a.stdout.read().decode('utf-8').strip('\n') # 下面清空流,防止爆内存,参考http://blog.csdn.net/pugongying1988/article/details/54616797 似乎没用,TODO:没问题就注释掉 if a.stdin: a.stdin.close() if a.stdout: a.stdout.close() if a.stderr: a.stderr.close() try: a.kill() except OSError: pass # 下面返回数据 if b == "": return "获取失败" if b.find("No Such Object") >= 0: return "设备不支持" b = list(map(lambda x: x.strip("\""), b.split("\n"))) return b except: return "设置失败"
def test_v1_set(self): print "\n" print "---v1 SET tests-------------------------------------\n" var = netsnmp.Varbind('sysLocation', '0', 'my new location') res = netsnmp.snmpset(var, **snmp_dest()) print "v1 snmpset result: ", res, "\n" self.assertEqual(res, 1) print "v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')' self.assertEqual(var.tag, 'sysLocation') self.assertEqual(var.iid, '0') self.assertEqual(var.val, 'my new location') self.assertTrue(var.type is None)
def _set_oid(self,snmp_agent,oid): try: return netsnmp.snmpset(oid,DestHost=snmp_agent, Version=3, Retries=int(self.ops['retries']), SecLevel=self.ops['seclevel'], AuthProto=self.ops['authproto'], AuthPass=self.ops['authpass'], PrivProto=self.ops['privproto'], PrivPass=self.ops['privpass'], SecName=self.ops['secname']) except Exception as e : print e raise e
def test_v1_set(self): print("\n") print("---v1 SET tests-------------------------------------\n") # snmpset fails for the 'sysLocation' variable, # as the syslocation token is configured in the # snmpd.conf file, which disables write access # to the variable. # Hence using the 'sysName' variable for the set tests. var = netsnmp.Varbind('sysName', '0', 'my new name') res = netsnmp.snmpset(var, **snmp_dest()) print("v1 snmpset result: ", res, "\n") self.assertEqual(res, 1) print("v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')') self.assertEqual(var.tag, 'sysName') self.assertEqual(var.iid, '0') self.assertEqual(var.val, 'my new name') self.assertTrue(var.type is None)
def SetPower(self, unit, outlet, state): """ @brief: This function changes the state of the specified outlet. @param outlet: The ID-number of the outlet which will be switched on/off. @param state: The state to which to outlet will be switched. """ if unit == "nasmyth": dest_host = pdu_config.DestHost_nasmyth elif unit == "container": dest_host = pdu_config.DestHost_container elif unit == "side_ports": dest_host = pdu_config.DestHost_side_ports elif unit == "nasmyth_2": dest_host = pdu_config.DestHost_nasmyth_2 else: print "Error, wrong unit provided!" clock = song_timeclass.TimeClass() OID = ".1.3.6.1.4.1.318.1.1.4.4.2.1.3.%i" % int( outlet ) # .1.3.6.1.4.1.318 defines that the connection is to a APC device. # the .1.1.4.4.2.1.3 is defining that changes is made to the power outlet. # %i % int(outlet) is the outlet number which will be chanced. var = netsnmp.Varbind(".1.3.6.1.4.1.318.1.1.4.4.2.1.3.%i" % int(outlet)) res = netsnmp.snmpget(var, Version=1, DestHost=dest_host, Community=pdu_config.Community) var.tag = OID var.val = int( state) # The value of the outlet is set to the given state. setpower = "" try: setpower = netsnmp.snmpset( var, Version=1, DestHost=dest_host, Community=pdu_config.Community ) # Here the outlet, number int(outlet), is chanced to int(state except Exception, e: sys.exit("ERROR, connection to PDU could not be made!")
def button_release_event(widget, event): global wire_prop, trace_l2, node_tr, o, n fin = near((event.x, event.y)) w = widget.allocation.width h = widget.allocation.height nv = int((w - 201) / 100) nh = int((h - 99) / 100) if fin[0] <100*10 and fin[0] > 50 and fin[1] < h-49 and fin[1] > 50: if event.button == 1 and cr is not None: if inicio == fin: if not nodolist.run and not any(x.pos == inicio for x in nodolist): nodolist.append(NodoClass(inicio)) nodolist.set_cur_pos(inicio) elif any(x.pos == inicio for x in nodolist) and any(x.pos == fin for x in nodolist): if nodolist.run and trace_l2: for x in nodolist: if x.pos == fin: trace_fin_mac = str(x.bat0.mac) if x.pos == inicio: trace_nicio_ip = str(x.eth0.ip) pos_ini = str(x) l = [] mibr = netsnmp.Varbind('iso', '3.6.1.4.1.32.1.4', trace_fin_mac, 'OCTETSTR') orig = netsnmp.snmpset(mibr, Version=2, DestHost=trace_nicio_ip, Community='private', Timeout=10000000, Retries=1) mibr = netsnmp.Varbind('iso.3.6.1.4.1.32.1.4') orig = netsnmp.snmpget(mibr, Version=2, DestHost=trace_nicio_ip, Community='private', Timeout=1000000, Retries=1) for i in str(orig[0]).split(): l.append(i.split(':')[-1:]) node_tr = reduce(lambda x, y: x + y, l) node_tr.insert(0, pos_ini) else: link_color24.current_wire = [(inicio, fin), (fin, inicio)] link_color50.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['ch'] == '24GHz': if (not any(x.sd in link_color24.current_wire for x in link_color24)): link_color24.append(WireClass(inicio, fin, wire_prop)) if nodolist.run: link_color24.start() link_color50.start() if wire_prop['ch'] == '50GHz': if (not any(x.sd in link_color50.current_wire for x in link_color50)): link_color50.append(WireClass(inicio, fin, wire_prop)) if nodolist.run: link_color24.start() link_color50.start() if event.button == 2 and cr is not None: if inicio == fin: if any(x.pos == inicio for x in nodolist): nodolist.set_cur_pos(inicio) if nodolist.run: for x in nodolist: if x.pos == fin: o, n = x.get_originators_nexthop() else: link_color24.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['ch'] == '24GHz': if any(x.pos in [inicio, fin] for x in nodolist): if any(x.sd in link_color24.current_wire for x in link_color24): for x in link_color24: if x.ds in link_color24.current_wire: wire_prop = x.prop link_color50.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['ch'] == '50GHz': if any(x.pos in [inicio, fin] for x in nodolist): if any(x.sd in link_color50.current_wire for x in link_color50): for x in link_color50: if x.ds in link_color50.current_wire: wire_prop = x.prop elif event.button == 3 and cr is not None: if inicio == fin: if not nodolist.run: if any(x.pos == inicio for x in nodolist): for x in nodolist: if x.pos == inicio: nid = nodolist.index(x) i = nodolist.pop(nid) elif any(x.pos == inicio for x in nodolist) and any(x.pos == fin for x in nodolist): if wire_prop['ch'] == '24GHz': for x in link_color24: if x.sd in [(inicio, fin), (fin, inicio)]: lid = link_color24.index(x) i = link_color24.pop(lid) if wire_prop['ch'] == '50GHz': for x in link_color50: if x.sd in [(inicio, fin), (fin, inicio)]: lid = link_color50.index(x) i = link_color50.pop(lid) dibujar(widget) return True
def worker(cablediag_queue, result_queue): for host in iter(cablediag_queue.get, 'STOP'): # print 'Start check ', host['ip_addr'] if_oper_status = netsnmp.snmpgetbulk(0, 24, netsnmp.Varbind(IF_TABLE_OID, 8), Version=2, Community=COMMUNITY, DestHost=host['ip_addr']) if len(if_oper_status) != 24: result_queue.put(host) continue # run cablediag on 'down' ports for port in range(24): if if_oper_status[port] == '2' or int(host['pair1len'][port]) == 0: netsnmp.snmpset( netsnmp.Varbind(CABLEDIAG_OID, '12.%d' % (port + 1), 1, 'INTEGER'), Version=2, Community=COMMUNITY, DestHost=host['ip_addr']) # 1 - Port UP # 2 - Port DOWN pair1status = netsnmp.snmpgetbulk(0, 24, netsnmp.Varbind(CABLEDIAG_OID, 4), Version=2, Community=COMMUNITY, DestHost=host['ip_addr']) # 0 - Pair OPEN # 1 - Pair OK pair1len = netsnmp.snmpgetbulk(0, 24, netsnmp.Varbind(CABLEDIAG_OID, 8), Version=2, Community=COMMUNITY, DestHost=host['ip_addr']) if len(pair1status) != 24 or len(pair1len) != 24: result_queue.put(host) continue # check if cable length is changed cable_deltas = {} for port in range(24): if (if_oper_status[port] == '2' and pair1status[port] in ['1', '2', '3']): cable_delta = int(host['pair1len'][port]) - int(pair1len[port]) if cable_delta > LEN_DELTA and int(pair1len[port]) > 0: cable_deltas[port + 1] = cable_delta if len(cable_deltas) >= MIN_PORTS: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect("192.168.0.1", username="******", password="******") stdin, stdout, stderr = ssh.exec_command( "/usr/local/bin/call.py %s" % host['ip_addr']) notify(host['ip_addr'], cable_deltas)' # put new data host['pair1status'] = pair1status host['pair1len'] = pair1len result_queue.put(host)
def testsnmpsetbladebiosoption(self): '''snmp set bladebiosoption''' var = netsnmp.Varbind('.1.3.6.1.4.1.2011.2.82.1.82.4.32.32', '0', '1') res = netsnmp.snmpset(var) print res self.assertEqual(0, res)
def set_plug(index, status): message = netsnmp.Varbind('.1.3.6.1.4.1.318.1.1.12.3.3.1.1.4.{0}'.format(index), val = 1 if status else 2, type = 'int') netsnmp.snmpset(message, Version = 1, Community = pdu_community, DestHost = pdu_hostname)
def run(self): # Задаем структуру словаря, который будет добавляться в общий словарь ответов json_resp = { 'target': '', 'sys_descr': '', 'sys_uptime': '', 'sys_name': '', 'sys_location': '', 'model': '', 'query_time': '', 'data': {} } # Получаем IP адрес устройства target_ip = self.requests[self.client_ip][self.client_port]['target'] # Получаем список параметров (данные) для устройства data_params = self.requests[self.client_ip][self.client_port]['data'] # Получаем SNMP-Community для устройства snmp_comm = self.users[self.requests[self.client_ip][self.client_port] ['user']][self.requests[self.client_ip][ self.client_port]['comm_index']] # Формируем структуру varlist/varbind из параметров, перечисленных в default_info snmp_var = netsnmp.VarList(*[ netsnmp.Varbind(default_info[def_param]) for def_param in default_info ]) # Фиксируем текущее время start_time = time.time() # Выполняем опрос устройства snmp_query = netsnmp.snmpget(*snmp_var, Version=2, DestHost=target_ip, Community=snmp_comm, Timeout=snmp_timeout, Retries=snmp_retries, UseNumeric=1) # Время, затраченное на опрос snmp_query_time = str(int((time.time() - start_time) * 1000)) # Заполняем словарь данными json_resp['target'] = self.requests[self.client_ip][ self.client_port]['target'] # Помещаем в словарь результаты опроса параметров из default_info for def_param_index, def_param in enumerate(default_info): json_resp[def_param] = snmp_query[def_param_index] # Определяем модель по вхождению подстроки в значения sysDescr и sysName # Проверка идет до первого соответствия. Сначала проверяется sysName model = 'None' for item in models_by_desc: for desc_model in item: if json_resp['sys_name'] is not None: if desc_model in json_resp['sys_name']: model = item[desc_model] if json_resp['sys_descr'] is not None: if desc_model in json_resp['sys_descr']: model = item[desc_model] if model != 'None': break json_resp['model'] = model json_resp['query_time'] = snmp_query_time # Если в списке команд (методов) есть зарезервированная команда (метод), то выполняем опрос оборудования даже если оно недоступно forced = False for data_param in data_params: if len(set(data_param.values()) & set(forced_mtd)) > 0: forced = True # Работаем, если устройство доступно (определили модель) или выставлен флаг 'forced' if model != 'None' or forced: # Пробуем импортировать модуль, описывающий методы для данной модели try: device = __import__(model) reload(device) except: logging.info("WARNING: Can't import module '%s' for '%s'!", model, target_ip) else: # Пробуем получить из модуля множитель 'timeout_mf' и применить его. При неудаче используем таймаут из файла конфигурации сервиса try: timeout_mf = getattr(device, 'timeout_mf') current_snmp_timeout = int(snmp_timeout * timeout_mf) except: current_snmp_timeout = snmp_timeout # data_params - все, что содержится в ключе 'data' из запроса ('request'). Представлен в виде списка # data_param - конкретный элемент списка, содержащий параметры конкретного запроса. Представлен в виде словаря. В debug-лог пишется как 'URL Params'. # "data": [{"1": "2", "0": "swL2PortCtrlAdminState"}, {"0": ""}] # dataset - словарь вида {'Metric':'OID'}, список списков вида [['tag', 'iid', 'value', 'type']] или-> # ->кортеж со словарем внутри ({'2':'enable'},) из файла с таким же именем, как имя модели устройства (model) for data_param in data_params: if '0' in data_param: # Пробуем извлечь параметр (метод) из файла модуля try: dataset = getattr(device, data_param['0']) except: if data_param['0'] == 'list': # logging.info("INFO: Requested 'list' command from client %s:%s.", self.client_ip, self.client_port) json_resp['data']['list'] = [ str(d) for d in dir(device) if d[0] != '_' ] else: logging.info( "WARNING: Can't find param '%s' from module '%s'!", data_param['0'], model) else: # Для режима отладки пишем в лог кто и что у нас запросил if debug_mode: logging.info( "DEBUG: Request from %s:%s. Dataset: '%s', URL Params: %s", self.client_ip, self.client_port, str(dataset), str(data_param)) current_snmp_retries = snmp_retries # Если параметр находится в списке 'no_retries', сбрасываем для него число дополнительных попыток в 0 if data_param['0'] in no_retries: current_snmp_retries = 0 # dataset может быть как словарем (для get/walk) так и списком (для set) и кортежем (для неизменяемых пользовательских данных). Обрабатываем эти случаи отдельно if isinstance(dataset, dict): get_notwalk = False for paramname in dataset.keys(): if '.' in paramname: get_notwalk = True big_bada_boom = False snmp_var = netsnmp.VarList(*[ netsnmp.Varbind( prepare_oid(data_param.copy(), dataset[paramname])) for paramname in dataset.keys() ]) # Формируем структуру varlist/varbind в зависимости о метода запроса (get или walk) if get_notwalk: snmp_query = netsnmp.snmpget( *snmp_var, Version=2, DestHost=target_ip, Community=snmp_comm, Timeout=current_snmp_timeout, Retries=current_snmp_retries, UseNumeric=1) else: snmp_query = netsnmp.snmpwalk( snmp_var, Version=2, DestHost=target_ip, Community=snmp_comm, Timeout=current_snmp_timeout, Retries=current_snmp_retries, UseNumeric=1) # ВНИМАНИЕ! Это обход бага. _Если в конфиге (модуле) задать OID задать без точки в самом начале_, то при формировании varlist/varbind может возникнуть проблема # Заключается она в том, что нельзя перебрать snmp_var, хотя по формальным признакам для этого нет препятствий # Плюс попутно возникают другие странности, например logging.info выбрасывает исключение # Отладка результатов не дала, похоже что это именно БАГ # Если задавать все OID, начинающиеся с точки, то все работает хорошо try: for var_ in snmp_var: pass except: big_bada_boom = True if not big_bada_boom: for var_ in snmp_var: # Убеждаемся, что ответ распознан, т.е. не None if ((var_.tag is not None) & (var_.iid is not None)): # Получаем полный OID. В ответе он разбит на части, находящиеся в tag и iid, которые мы склеиваем вместе full_oid = var_.tag + '.' + var_.iid # Здесь k - имя параметра, по которому получим значение, а prep_k - имя ключа в 'data' # В случае walk-запроса значения k и prep_k равны, а в случае get имя prep_k обрезается до первой точки, не включая ее for k in dataset: # Если используем метод get, то получаем имя ключа из параметра k с начала до первой точки, не включая ее, и задаем трейлер # Для метода опроса walk имя ключа будет равно параметру k, а трейлер должен быть пустым if get_notwalk: prep_k = k[0:k.find('.')] trailer = '*' else: prep_k = k trailer = '.' # Значение trailer прибавляем для избежания ложного срабатывания при сравнении OID, например ...1.2.3.2 и ....1.2.3.20 # При Get-запросе full_oid всегда является "конечным", поскольку это "прицельный" запрос. Поэтому здесь используем "жесткий" трейлер = '*' # Теперь будут сравниваться .1.2.3.2* и .1.2.3.20*. Первое значение уже не входит во второе, как было бы в предыдущем случае # При Walk-запросе full_oid заранее неизвестен, поэтому используем "мягкий" трейлер = '.' (символ точки является частью OID) # Также при Walk-запросе у нас есть отдельное требование - ветки должны быть одной длины # Если оно выполнено, значит сравниваемые ветки разные и точку использовать допустимо. Ниже пример tmp_oid, которые "пересеклись" бы без трейлера # full_oid: .1.3.6.1.2.1.31.1.1.1.18.1, tmp_oid: .1.3.6.1.2.1.31.1.1.1.18 (вместе с трейлером '.' входит в full_oid) # full_oid: .1.3.6.1.2.1.31.1.1.1.1.1, tmp_oid: .1.3.6.1.2.1.31.1.1.1.1 (вместе с трейлером '.' входит в full_oid) # Временный OID, полученный из конфигурационного файла, и в который уже подставлены пользовательские параметры tmp_oid = prepare_oid( data_param.copy(), dataset[k]) # Проверяем, есть ли значение временного OID в полном OID if (tmp_oid + trailer in full_oid + trailer): # Получаем оставшуюся часть от OID remainder = full_oid.replace( tmp_oid + '.', '') # Если используем метод get, оставшаяся часть будет равна iid if get_notwalk: remainder = var_.iid # Альтернативный вариант для использования нескольких последних чисел OID в имени подраздела, например '7.100' if k.count('.') > 1: remainder = ".".join( full_oid.split( ".") [-k.count('.' ):]) # Например в конфиге указан OID 1.2.3.2.1, tag будет 1.2.3.2.1.X, iid - Y (может быть пустым). Полный OID (full_oid) будет 1.2.3.2.1.X.Y # Имя раздела (словаря) будет k, а подраздела (ключа метрики) - remainder if (prep_k not in json_resp['data']): json_resp['data'][ prep_k] = {} # Выполняем проверку на наличие непечатаемых символов. Если таких нет, возвращаем исходную строку, а иначе возвращаем hex-string if var_.val == filter( lambda x: x in string.printable, var_.val): json_resp['data'][prep_k][ remainder] = var_.val.replace( '\"', '') else: json_resp['data'][prep_k][ remainder] = var_.val.encode( "hex") # Если dataset является списком, выполняем для него set-операции if isinstance(dataset, list): query = 'skipped' varlist = netsnmp.VarList(*[ netsnmp.Varbind(*prepare_oid( data_param.copy(), VarBindItem[:])) for VarBindItem in dataset ]) query = netsnmp.snmpset( *varlist, Version=2, DestHost=target_ip, Community=snmp_comm, Timeout=current_snmp_timeout, Retries=current_snmp_retries, UseNumeric=1) time.sleep(set_iter_delay) json_resp['data'][data_param['0']] = query # Если dataset является кортежем, просто возвращаем его первый элемент. Это нужно для хранения пользовательских словарей в конфиге swtoolz-core if isinstance(dataset, tuple): json_resp['data'][data_param['0']] = dataset[0] # --- Если для данного IP уже был получен ответ, обновляем словарь, а если нет - создаем if self.client_ip in self.responses.keys(): self.responses[self.client_ip].update( {self.client_port: json_resp}) else: self.responses[self.client_ip] = {self.client_port: json_resp}
def testFuncs(self): """Test code""" print("\n-------------- SET Test Start ----------------------------\n") var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, **snmp_dest()) print("uptime = ", res[0]) self.assertEqual(len(res), 1) var = netsnmp.Varbind('versionRestartAgent', '0', 1) res = netsnmp.snmpset(var, **snmp_dest()) self.assertEqual(res, 1) var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, **snmp_dest()) print("uptime = ", res[0]) self.assertEqual(len(res), 1) var = netsnmp.Varbind('nsCacheEntry') res = netsnmp.snmpgetnext(var, **snmp_dest()) print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')') self.assertEqual(len(res), 1) var.val = 65 res = netsnmp.snmpset(var, **snmp_dest()) self.assertEqual(res, 1) res = netsnmp.snmpget(var, **snmp_dest()) print("var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')') self.assertEqual(len(res), 1) self.assertEqual(res[0], '65') sess = setup_v1() varlist = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.2.116.101.115.116', '', '.1.3.6.1.6.1.1'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.3.116.101.115.116', '', '1234'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4)) res = sess.set(varlist) print("res = ", res) self.assertEqual(res, 1) varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(varlist) self.assertEqual(len(res), 3) self.assertEqual(varlist[0].tag, 'snmpTargetAddrTDomain') self.assertEqual(varlist[0].iid, '116.101.115.116') self.assertEqual(varlist[0].val, '.1.3.6.1.6.1.1') self.assertEqual(varlist[1].tag, 'snmpTargetAddrTAddress') self.assertEqual(varlist[1].iid, '116.101.115.116') self.assertEqual(varlist[1].val, '1234') self.assertEqual(varlist[2].tag, 'snmpTargetAddrRowStatus') self.assertEqual(varlist[2].iid, '116.101.115.116') self.assertEqual(varlist[2].val, '3') for var in varlist: print(var.tag, var.iid, "=", var.val, '(', var.type, ')') print("\n") varlist = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6)) res = sess.set(varlist) print("res = ", res) self.assertEqual(res, 1) varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(varlist) self.assertEqual(len(res), 3) self.assertNotEqual(varlist[0].tag, 'snmpTargetAddrTDomain') self.assertNotEqual(varlist[1].tag, 'snmpTargetAddrTAddress') self.assertNotEqual(varlist[2].tag, 'snmpTargetAddrRowStatus') for var in varlist: print(var.tag, var.iid, "=", var.val, '(', var.type, ')') print("\n") print("\n-------------- SET Test End ----------------------------\n")
def button_release_event(widget, event): global wire_prop, trace_l2, node_tr, o, n fin = near((event.x, event.y)) if fin[0] < 950 and fin[0] > 50 and fin[1] < 950 and fin[1] > 50: if event.button == 1 and cr != None: if inicio == fin: if not nodolist.run and not any(x.pos == inicio for x in nodolist): nodolist.append(nodoClass(inicio)) nodolist.set_cur_pos(inicio) elif any(x.pos == inicio for x in nodolist) and any(x.pos == fin for x in nodolist): if nodolist.run and trace_l2: for x in nodolist: if x.pos == fin: trace_fin_mac = str(x.bat0.mac) if x.pos == inicio: trace_nicio_ip = str(x.eth0.ip) pos_ini = str(x) l = [] mibr = netsnmp.Varbind('iso', '3.6.1.4.1.32.1.4', trace_fin_mac, 'OCTETSTR') orig = netsnmp.snmpset(mibr, Version=2, DestHost=trace_nicio_ip, Community='private', Timeout=10000000, Retries=1) mibr = netsnmp.Varbind('iso.3.6.1.4.1.32.1.4') orig = netsnmp.snmpget(mibr, Version=2, DestHost=trace_nicio_ip, Community='private', Timeout=1000000, Retries=1) for i in str(orig[0]).split(): l.append(i.split(':')[-1:]) node_tr = reduce(lambda x, y: x + y, l) node_tr.insert(0, pos_ini) else: link_color24.current_wire = [(inicio, fin), (fin, inicio)] link_color50.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['channel'] == 'c24GHz': if (not any(x.sd in link_color24.current_wire for x in link_color24)): link_color24.append( wireClass(inicio, fin, wire_prop)) if nodolist.run: link_color24.start() link_color50.start() if wire_prop['channel'] == 'c50GHz': if (not any(x.sd in link_color50.current_wire for x in link_color50)): link_color50.append( wireClass(inicio, fin, wire_prop)) if nodolist.run: link_color24.start() link_color50.start() if event.button == 2 and cr != None: if inicio == fin: if any(x.pos == inicio for x in nodolist): nodolist.set_cur_pos(inicio) if nodolist.run: for x in nodolist: if x.pos == fin: o, n = x.get_originators_nexthop() else: link_color24.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['channel'] == 'c24GHz': if any(x.pos in [inicio, fin] for x in nodolist): if any(x.sd in link_color24.current_wire for x in link_color24): for x in link_color24: if x.ds in link_color24.current_wire: wire_prop = x.prop link_color50.current_wire = [(inicio, fin), (fin, inicio)] if wire_prop['channel'] == 'c50GHz': if any(x.pos in [inicio, fin] for x in nodolist): if any(x.sd in link_color50.current_wire for x in link_color50): for x in link_color50: if x.ds in link_color50.current_wire: wire_prop = x.prop elif event.button == 3 and cr != None: if inicio == fin: if not nodolist.run: if any(x.pos == inicio for x in nodolist): for x in nodolist: if x.pos == inicio: nid = nodolist.index(x) i = nodolist.pop(nid) elif any(x.pos == inicio for x in nodolist) and any(x.pos == fin for x in nodolist): if wire_prop['channel'] == 'c24GHz': for x in link_color24: if x.sd in [(inicio, fin), (fin, inicio)]: lid = link_color24.index(x) i = link_color24.pop(lid) if wire_prop['channel'] == 'c50GHz': for x in link_color50: if x.sd in [(inicio, fin), (fin, inicio)]: lid = link_color50.index(x) i = link_color50.pop(lid) dibujar(widget) return True
def testFuncs(self): print "\n-------------- SET Test Start ----------------------------\n" var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, Version=1, DestHost='localhost', Community='public') print "uptime = ", res[0] var = netsnmp.Varbind('versionRestartAgent', '0', 1) res = netsnmp.snmpset(var, Version=1, DestHost='localhost', Community='public') var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, Version=1, DestHost='localhost', Community='public') print "uptime = ", res[0] var = netsnmp.Varbind('nsCacheEntry') res = netsnmp.snmpgetnext(var, Version=1, DestHost='localhost', Community='public') print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')' var.val = 65 res = netsnmp.snmpset(var, Version=1, DestHost='localhost', Community='public') res = netsnmp.snmpget(var, Version=1, DestHost='localhost', Community='public') print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')' sess = netsnmp.Session(Version=1, DestHost='localhost', Community='public') vars = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.2.116.101.115.116', '', '.1.3.6.1.6.1.1'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.3.116.101.115.116', '', '1234'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4)) res = sess.set(vars) print "res = ", res vars = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(vars) for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" vars = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6)) res = sess.set(vars) print "res = ", res vars = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(vars) for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "\n-------------- SET Test End ----------------------------\n"
def testFuncs(self): print "" var = netsnmp.Varbind('sysDescr.0') var = netsnmp.Varbind('sysDescr', '0') var = netsnmp.Varbind( '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr', '0') var = netsnmp.Varbind( '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0') var = netsnmp.Varbind('.1.3.6.1.2.1.1.1.0') var = netsnmp.Varbind('.1.3.6.1.2.1.1.1', '0') print "----------------------------------------\n" res = netsnmp.snmpget(var, Version=1, DestHost='localhost', Community='public') print "v1 snmpget result: ", res, "\n" print "v1 get var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" res = netsnmp.snmpgetnext(var, Version=1, DestHost='localhost', Community='public') print "v1 snmpgetnext result: ", res, "\n" print "v1 getnext var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" var = netsnmp.Varbind('sysLocation', '0', 'my new location') res = netsnmp.snmpset(var, Version=1, DestHost='localhost', Community='public') print "v1 snmpset result: ", res, "\n" print "v1 set var: ", var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) print "v1 varlist walk in: " for var in vars: print " ", var.tag, var.iid, "=", var.val, '(', var.type, ')' res = netsnmp.snmpwalk(vars, Version=1, DestHost='localhost', Community='public') print "v1 snmpwalk result: ", res, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" print "v1 varbind walk in: " var = netsnmp.Varbind('system') res = netsnmp.snmpwalk(var, Version=1, DestHost='localhost', Community='public') print "v1 snmpwalk result (should be = orig): ", res, "\n" print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" sess = netsnmp.Session(Version=1, DestHost='localhost', Community='public') vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) vals = sess.get(vars) print "v1 sess.get result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' vals = sess.getnext(vars) print "v1 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v1 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation', '0', 'my newer location')) res = sess.set(vars) print "v1 sess.set result: ", res, "\n" print "----------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v1 sess.walk result: ", vals, "\n" for var in vars: print " ", var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" sess = netsnmp.Session(Version=2, DestHost='localhost', Community='public') sess.UseEnums = 1 sess.UseLongNames = 1 vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) vals = sess.get(vars) print "v2 sess.get result: ", vals, "\n" print "----------------------------------------\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" vals = sess.getnext(vars) print "v2 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "----------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v2 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "----------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation', '0', 'my even newer location')) res = sess.set(vars) print "v2 sess.set result: ", res, "\n" print "----------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v2 sess.walk result: ", vals, "\n" for var in vars: print " ", var.tag, var.iid, "=", var.val, '(', var.type, ')' print "----------------------------------------\n" sess = netsnmp.Session(Version=3, DestHost='localhost', SecLevel='authPriv', SecName='initial', PrivPass='******', AuthPass='******') sess.UseSprintValue = 1 vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) print "----------------------------------------\n" vals = sess.get(vars) print "v3 sess.get result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "----------------------------------------\n" vals = sess.getnext(vars) print "v3 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v3 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "----------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation', '0', 'my final destination')) res = sess.set(vars) print "v3 sess.set result: ", res, "\n" print "----------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v3 sess.walk result: ", vals, "\n" for var in vars: print " ", var.tag, var.iid, "=", var.val, '(', var.type, ')'
#!/usr/bin/env python #uploads new router config import netsnmp vars = netsnmp.Varbind(netsnmp.VarList(netsnmp.Varbind(".1.2.6.1.4.1.9.2.10.6.0", "1"), (netsnmp.Varbind("cisco.example.com.1.3.6.1.4.1.9.2.10.12.172.25.1.1", "iso-config.bin") result = netsnmp.snmpset(vars, Version = 1, DestHost='cisco.example.com', Community='readWrite')
def testFuncs(self): """Test code""" print "\n-------------- SET Test Start ----------------------------\n" var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, **snmp_dest()) print "uptime = ", res[0] self.assertEqual(len(res), 1) var = netsnmp.Varbind('versionRestartAgent', '0', 1) res = netsnmp.snmpset(var, **snmp_dest()) self.assertEqual(res, 1) var = netsnmp.Varbind('sysUpTime', '0') res = netsnmp.snmpget(var, **snmp_dest()) print "uptime = ", res[0] self.assertEqual(len(res), 1) var = netsnmp.Varbind('nsCacheEntry') res = netsnmp.snmpgetnext(var, **snmp_dest()) print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')' self.assertEqual(len(res), 1) var.val = 65 res = netsnmp.snmpset(var, **snmp_dest()) self.assertEqual(res, 1) res = netsnmp.snmpget(var, **snmp_dest()) print "var = ", var.tag, var.iid, "=", var.val, '(', var.type, ')' self.assertEqual(len(res), 1) self.assertEqual(res[0], '65'); sess = setup_v1() varlist = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.2.116.101.115.116', '', '.1.3.6.1.6.1.1'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.3.116.101.115.116', '', '1234'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 4)) res = sess.set(varlist) print "res = ", res self.assertEqual(res, 1) varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(varlist) self.assertEqual(len(res), 3) self.assertEqual(varlist[0].tag, 'snmpTargetAddrTDomain') self.assertEqual(varlist[0].iid, '116.101.115.116') self.assertEqual(varlist[0].val, '.1.3.6.1.6.1.1') self.assertEqual(varlist[1].tag, 'snmpTargetAddrTAddress') self.assertEqual(varlist[1].iid, '116.101.115.116') self.assertEqual(varlist[1].val, '1234') self.assertEqual(varlist[2].tag, 'snmpTargetAddrRowStatus') self.assertEqual(varlist[2].iid, '116.101.115.116') self.assertEqual(varlist[2].val, '3') for var in varlist: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" varlist = netsnmp.VarList( netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116', '', 6)) res = sess.set(varlist) print "res = ", res self.assertEqual(res, 1) varlist = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(varlist) self.assertEqual(len(res), 3) self.assertNotEqual(varlist[0].tag, 'snmpTargetAddrTDomain') self.assertNotEqual(varlist[1].tag, 'snmpTargetAddrTAddress') self.assertNotEqual(varlist[2].tag, 'snmpTargetAddrRowStatus') for var in varlist: print var.tag, var.iid, "=", var.val, '(', var.type, ')' print "\n" print "\n-------------- SET Test End ----------------------------\n"
def testFuncs(self): print "" var = netsnmp.Varbind('sysDescr.0') var = netsnmp.Varbind('sysDescr','0') var = netsnmp.Varbind( '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr','0') var = netsnmp.Varbind( '.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0') var = netsnmp.Varbind('.1.3.6.1.2.1.1.1.0') var = netsnmp.Varbind('.1.3.6.1.2.1.1.1','0') print "---v1 GET tests -------------------------------------\n" res = netsnmp.snmpget(var, Version = 1, DestHost='localhost', Community='public') print "v1 snmpget result: ", res, "\n" print "v1 get var: ", var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 GETNEXT tests-------------------------------------\n" res = netsnmp.snmpgetnext(var, Version = 1, DestHost='localhost', Community='public') print "v1 snmpgetnext result: ", res, "\n" print "v1 getnext var: ", var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 SET tests-------------------------------------\n" var = netsnmp.Varbind('sysLocation','0', 'my new location') res = netsnmp.snmpset(var, Version = 1, DestHost='localhost', Community='public') print "v1 snmpset result: ", res, "\n" print "v1 set var: ", var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 walk tests-------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) print "v1 varlist walk in: " for var in vars: print " ",var.tag, var.iid, "=", var.val, '(',var.type,')' res = netsnmp.snmpwalk(vars, Version = 1, DestHost='localhost', Community='public') print "v1 snmpwalk result: ", res, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 walk 2-------------------------------------\n" print "v1 varbind walk in: " var = netsnmp.Varbind('system') res = netsnmp.snmpwalk(var, Version = 1, DestHost='localhost', Community='public') print "v1 snmpwalk result (should be = orig): ", res, "\n" print var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 multi-varbind test-------------------------------------\n" sess = netsnmp.Session(Version=1, DestHost='localhost', Community='public') vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) vals = sess.get(vars) print "v1 sess.get result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' vals = sess.getnext(vars) print "v1 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v1 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v1 set2-------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation', '0', 'my newer location')) res = sess.set(vars) print "v1 sess.set result: ", res, "\n" print "---v1 walk3-------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v1 sess.walk result: ", vals, "\n" for var in vars: print " ",var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v2c get-------------------------------------\n" sess = netsnmp.Session(Version=2, DestHost='localhost', Community='public') sess.UseEnums = 1 sess.UseLongNames = 1 vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) vals = sess.get(vars) print "v2 sess.get result: ", vals, "\n" print "---v2c getnext-------------------------------------\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" vals = sess.getnext(vars) print "v2 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" print "---v2c getbulk-------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v2 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" print "---v2c set-------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation','0','my even newer location')) res = sess.set(vars) print "v2 sess.set result: ", res, "\n" print "---v2c walk-------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v2 sess.walk result: ", vals, "\n" for var in vars: print " ",var.tag, var.iid, "=", var.val, '(',var.type,')' print "---v3 setup-------------------------------------\n" sess = netsnmp.Session(Version=3, DestHost='localhost', SecLevel='authPriv', SecName='initial', PrivPass='******', AuthPass='******') sess.UseSprintValue = 1 vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime', 0), netsnmp.Varbind('sysContact', 0), netsnmp.Varbind('sysLocation', 0)) print "---v3 get-------------------------------------\n" vals = sess.get(vars) print "v3 sess.get result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" print "---v3 getnext-------------------------------------\n" vals = sess.getnext(vars) print "v3 sess.getnext result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" vars = netsnmp.VarList(netsnmp.Varbind('sysUpTime'), netsnmp.Varbind('sysORLastChange'), netsnmp.Varbind('sysORID'), netsnmp.Varbind('sysORDescr'), netsnmp.Varbind('sysORUpTime')) vals = sess.getbulk(2, 8, vars) print "v3 sess.getbulk result: ", vals, "\n" for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" print "---v3 set-------------------------------------\n" vars = netsnmp.VarList( netsnmp.Varbind('sysLocation','0', 'my final destination')) res = sess.set(vars) print "v3 sess.set result: ", res, "\n" print "---v3 walk-------------------------------------\n" vars = netsnmp.VarList(netsnmp.Varbind('system')) vals = sess.walk(vars) print "v3 sess.walk result: ", vals, "\n" for var in vars: print " ",var.tag, var.iid, "=", var.val, '(',var.type,')'
def testFuncs(self): print "\n-------------- SET Test Start ----------------------------\n" var = netsnmp.Varbind('sysUpTime','0') res = netsnmp.snmpget(var, Version = 1, DestHost='localhost', Community='public') print "uptime = ", res[0] var = netsnmp.Varbind('versionRestartAgent','0', 1) res = netsnmp.snmpset(var, Version = 1, DestHost='localhost', Community='public') var = netsnmp.Varbind('sysUpTime','0') res = netsnmp.snmpget(var, Version = 1, DestHost='localhost', Community='public') print "uptime = ", res[0] var = netsnmp.Varbind('nsCacheEntry') res = netsnmp.snmpgetnext(var, Version = 1, DestHost='localhost', Community='public') print "var = ", var.tag, var.iid, "=", var.val, '(',var.type,')' var.val = 65 res = netsnmp.snmpset(var, Version = 1, DestHost='localhost', Community='public') res = netsnmp.snmpget(var, Version = 1, DestHost='localhost', Community='public') print "var = ", var.tag, var.iid, "=", var.val, '(',var.type,')' sess = netsnmp.Session(Version = 1, DestHost='localhost', Community='public') vars = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.2.116.101.115.116','','.1.3.6.1.6.1.1'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.3.116.101.115.116','','1234'), netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116','', 4)) res = sess.set(vars) print "res = ", res vars = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(vars) for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" vars = netsnmp.VarList(netsnmp.Varbind('.1.3.6.1.6.3.12.1.2.1.9.116.101.115.116','', 6)) res = sess.set(vars) print "res = ", res vars = netsnmp.VarList(netsnmp.Varbind('snmpTargetAddrTDomain'), netsnmp.Varbind('snmpTargetAddrTAddress'), netsnmp.Varbind('snmpTargetAddrRowStatus')) res = sess.getnext(vars) for var in vars: print var.tag, var.iid, "=", var.val, '(',var.type,')' print "\n" print "\n-------------- SET Test End ----------------------------\n"
def run(self): # Задаем структуру словаря, который будет добавляться в общий словарь ответов json_resp = {'target':'', 'sys_descr':'', 'sys_uptime':'', 'sys_name':'', 'sys_location':'', 'model':'', 'query_time':'', 'data':{}} # Получаем IP адрес устройства target_ip = self.requests[self.client_ip][self.client_port]['target'] # Получаем список параметров (данные) для устройства data_params = self.requests[self.client_ip][self.client_port]['data'] # Получаем SNMP-Community для устройства snmp_comm = self.users[self.requests[self.client_ip][self.client_port]['user']][self.requests[self.client_ip][self.client_port]['comm_index']] # Формируем структуру varlist/varbind из параметров, перечисленных в default_info snmp_var = netsnmp.VarList(*[ netsnmp.Varbind(default_info[def_param]) for def_param in default_info ]) # Фиксируем текущее время start_time = time.time() # Выполняем опрос устройства snmp_query = netsnmp.snmpget(*snmp_var, Version = 2, DestHost = target_ip, Community = snmp_comm, Timeout = snmp_timeout, Retries = snmp_retries, UseNumeric = 1) # Время, затраченное на опрос snmp_query_time = str(int((time.time()-start_time)*1000)) # Заполняем словарь данными json_resp['target'] = self.requests[self.client_ip][self.client_port]['target'] # Помещаем в словарь результаты опроса параметров из default_info for def_param_index, def_param in enumerate(default_info): json_resp[def_param] = snmp_query[def_param_index] # Определяем модель по вхождению подстроки в значения sysDescr и sysName # Проверка идет до первого соответствия. Сначала проверяется sysName model = 'None' for item in models_by_desc: for desc_model in item: if json_resp['sys_name'] is not None: if desc_model in json_resp['sys_name']: model = item[desc_model] if json_resp['sys_descr'] is not None: if desc_model in json_resp['sys_descr']: model = item[desc_model] if model != 'None': break json_resp['model'] = model json_resp['query_time'] = snmp_query_time # Если в списке команд (методов) есть зарезервированная команда (метод), то выполняем опрос оборудования даже если оно недоступно forced = False for data_param in data_params: if len( set(data_param.values()) & set(forced_mtd) ) > 0: forced = True # Работаем, если устройство доступно (определили модель) или выставлен флаг 'forced' if model != 'None' or forced: # Пробуем импортировать модуль, описывающий методы для данной модели try: device = __import__(model) reload(device) except: logging.info("WARNING: Can't import module '%s' for '%s'!", model, target_ip) else: # Пробуем получить из модуля множитель 'timeout_mf' и применить его. При неудаче используем таймаут из файла конфигурации сервиса try: timeout_mf = getattr(device, 'timeout_mf') current_snmp_timeout = int(snmp_timeout * timeout_mf) except: current_snmp_timeout = snmp_timeout # data_params - все, что содержится в ключе 'data' из запроса ('request'). Представлен в виде списка # data_param - конкретный элемент списка, содержащий параметры конкретного запроса. Представлен в виде словаря. В debug-лог пишется как 'URL Params'. # "data": [{"1": "2", "0": "swL2PortCtrlAdminState"}, {"0": ""}] # dataset - словарь вида {'Metric':'OID'}, список списков вида [['tag', 'iid', 'value', 'type']] или-> # ->кортеж со словарем внутри ({'2':'enable'},) из файла с таким же именем, как имя модели устройства (model) for data_param in data_params: if '0' in data_param: # Пробуем извлечь параметр (метод) из файла модуля try: dataset = getattr(device, data_param['0']) except: if data_param['0'] == 'list': # logging.info("INFO: Requested 'list' command from client %s:%s.", self.client_ip, self.client_port) json_resp['data']['list'] = [str(d) for d in dir(device) if d[0]!='_'] else: logging.info("WARNING: Can't find param '%s' from module '%s'!", data_param['0'], model) else: # Для режима отладки пишем в лог кто и что у нас запросил if debug_mode: logging.info("DEBUG: Request from %s:%s. Dataset: '%s', URL Params: %s", self.client_ip, self.client_port, str(dataset), str(data_param)) current_snmp_retries = snmp_retries # Если параметр находится в списке 'no_retries', сбрасываем для него число дополнительных попыток в 0 if data_param['0'] in no_retries: current_snmp_retries = 0 # dataset может быть как словарем (для get/walk) так и списком (для set) и кортежем (для неизменяемых пользовательских данных). Обрабатываем эти случаи отдельно if isinstance(dataset, dict): get_notwalk = False for paramname in dataset.keys(): if '.' in paramname: get_notwalk = True big_bada_boom = False snmp_var = netsnmp.VarList(*[ netsnmp.Varbind(prepare_oid(data_param.copy(), dataset[paramname])) for paramname in dataset.keys() ]) # Формируем структуру varlist/varbind в зависимости о метода запроса (get или walk) if get_notwalk: snmp_query = netsnmp.snmpget(*snmp_var,Version = 2, DestHost = target_ip, Community = snmp_comm, Timeout = current_snmp_timeout, Retries = current_snmp_retries, UseNumeric = 1) else: snmp_query = netsnmp.snmpwalk(snmp_var,Version = 2, DestHost = target_ip, Community = snmp_comm, Timeout = current_snmp_timeout, Retries = current_snmp_retries, UseNumeric = 1) # ВНИМАНИЕ! Это обход бага. _Если в конфиге (модуле) задать OID задать без точки в самом начале_, то при формировании varlist/varbind может возникнуть проблема # Заключается она в том, что нельзя перебрать snmp_var, хотя по формальным признакам для этого нет препятствий # Плюс попутно возникают другие странности, например logging.info выбрасывает исключение # Отладка результатов не дала, похоже что это именно БАГ # Если задавать все OID, начинающиеся с точки, то все работает хорошо try: for var_ in snmp_var: pass except: big_bada_boom = True if not big_bada_boom: for var_ in snmp_var: # Убеждаемся, что ответ распознан, т.е. не None if ( (var_.tag is not None) & (var_.iid is not None) ): # Получаем полный OID. В ответе он разбит на части, находящиеся в tag и iid, которые мы склеиваем вместе full_oid = var_.tag+'.'+var_.iid # Здесь k - имя параметра, по которому получим значение, а prep_k - имя ключа в 'data' # В случае walk-запроса значения k и prep_k равны, а в случае get имя prep_k обрезается до первой точки, не включая ее for k in dataset: # Если используем метод get, то получаем имя ключа из параметра k с начала до первой точки, не включая ее, и задаем трейлер # Для метода опроса walk имя ключа будет равно параметру k, а трейлер должен быть пустым if get_notwalk: prep_k = k[0:k.find('.')] trailer = '*' else: prep_k = k trailer = '.' # Значение trailer прибавляем для избежания ложного срабатывания при сравнении OID, например ...1.2.3.2 и ....1.2.3.20 # При Get-запросе full_oid всегда является "конечным", поскольку это "прицельный" запрос. Поэтому здесь используем "жесткий" трейлер = '*' # Теперь будут сравниваться .1.2.3.2* и .1.2.3.20*. Первое значение уже не входит во второе, как было бы в предыдущем случае # При Walk-запросе full_oid заранее неизвестен, поэтому используем "мягкий" трейлер = '.' (символ точки является частью OID) # Также при Walk-запросе у нас есть отдельное требование - ветки должны быть одной длины # Если оно выполнено, значит сравниваемые ветки разные и точку использовать допустимо. Ниже пример tmp_oid, которые "пересеклись" бы без трейлера # full_oid: .1.3.6.1.2.1.31.1.1.1.18.1, tmp_oid: .1.3.6.1.2.1.31.1.1.1.18 (вместе с трейлером '.' входит в full_oid) # full_oid: .1.3.6.1.2.1.31.1.1.1.1.1, tmp_oid: .1.3.6.1.2.1.31.1.1.1.1 (вместе с трейлером '.' входит в full_oid) # Временный OID, полученный из конфигурационного файла, и в который уже подставлены пользовательские параметры tmp_oid = prepare_oid(data_param.copy(),dataset[k]) # Проверяем, есть ли значение временного OID в полном OID if (tmp_oid+trailer in full_oid+trailer): # Получаем оставшуюся часть от OID remainder = full_oid.replace(tmp_oid+'.','') # Если используем метод get, оставшаяся часть будет равна iid if get_notwalk: remainder = var_.iid # Альтернативный вариант для использования нескольких последних чисел OID в имени подраздела, например '7.100' if k.count('.')>1: remainder = ".".join(full_oid.split(".")[-k.count('.'):]) # Например в конфиге указан OID 1.2.3.2.1, tag будет 1.2.3.2.1.X, iid - Y (может быть пустым). Полный OID (full_oid) будет 1.2.3.2.1.X.Y # Имя раздела (словаря) будет k, а подраздела (ключа метрики) - remainder if (prep_k not in json_resp['data']): json_resp['data'][prep_k]={} # Выполняем проверку на наличие непечатаемых символов. Если таких нет, возвращаем исходную строку, а иначе возвращаем hex-string if var_.val == filter(lambda x: x in string.printable, var_.val): json_resp['data'][prep_k][remainder] = var_.val.replace('\"','') else: json_resp['data'][prep_k][remainder] = var_.val.encode("hex") # Если dataset является списком, выполняем для него set-операции if isinstance(dataset, list): query = 'skipped' varlist = netsnmp.VarList(*[netsnmp.Varbind(*prepare_oid(data_param.copy(), VarBindItem[:])) for VarBindItem in dataset]) query = netsnmp.snmpset(*varlist, Version = 2, DestHost = target_ip, Community = snmp_comm, Timeout = current_snmp_timeout, Retries = current_snmp_retries, UseNumeric = 1) time.sleep(set_iter_delay) json_resp['data'][data_param['0']] = query # Если dataset является кортежем, просто возвращаем его первый элемент. Это нужно для хранения пользовательских словарей в конфиге swtoolz-core if isinstance(dataset, tuple): json_resp['data'][data_param['0']] = dataset[0] # --- Если для данного IP уже был получен ответ, обновляем словарь, а если нет - создаем if self.client_ip in self.responses.keys(): self.responses[self.client_ip].update({self.client_port:json_resp}) else: self.responses[self.client_ip] = {self.client_port:json_resp}