def return_snmp_data(value,value_type): if value_type is None: if isinstance(value, int): data = Integer(value) elif isinstance(value, float): data = Integer(value) elif isinstance(value, str): if is_ipv4_address(value): data = IpAddress(value) else: data = OctetString(value) else: raise TypeError( "Unable to autodetect type. Please pass one of " "these strings as the value_type keyword arg: " ", ".join(TYPES.keys()) ) else: if not value_type in TYPES: raise ValueError("'{}' is not one of the supported types: {}".format( value_type, ", ".join(TYPES.keys()) )) data = TYPES[value_type](value) return data
def set(self, oid, value, value_type=None): """ Sets a single OID value. If you do not pass value_type hnmp will try to guess the correct type. Autodetection is supported for: * int and float (as Integer, fractional part will be discarded) * IPv4 address (as IpAddress) * str (as OctetString) Unfortunately, pysnmp does not support the SNMP FLOAT type so please use Integer instead. """ snmpsecurity = self._get_snmp_security() if value_type is None: if isinstance(value, int): data = Integer(value) elif isinstance(value, float): data = Integer(value) elif isinstance(value, str): if is_ipv4_address(value): data = IpAddress(value) else: data = OctetString(value) else: raise TypeError( "Unable to autodetect type. Please pass one of " "these strings as the value_type keyword arg: " ", ".join(TYPES.keys()) ) else: if value_type not in TYPES: raise ValueError("'{}' is not one of the supported types: {}".format( value_type, ", ".join(TYPES.keys()) )) data = TYPES[value_type](value) try: engine_error, pdu_error, pdu_error_index, objects = self._cmdgen.setCmd( snmpsecurity, cmdgen.UdpTransportTarget((self.host, self.port), timeout=self.timeout, retries=self.retries), (oid, data), ) if engine_error: raise SNMPError(engine_error) if pdu_error: raise SNMPError(pdu_error.prettyPrint()) except Exception as e: raise SNMPError(e) _, value = objects[0] value = _convert_value_to_native(value) return value
def get_config(self, timeout=10): """ Метод для получения конфигурационного файла целевого оборудования. В методе определены oid'ы используемого оборудования. Метод работает следующим образом - по snmp запрашивается oid_sysname и по нему определяется тип оборудования, по типу оборудования запрашиваются соответствующие oid и на указанный TFTP сервер закачивается конфигурационный файл оборудования, далее он считывается в виде строки и удаляется с сервера. :param timeout: таймаут на получение конфигурационного файла :rtype: строка с конфигурационным файлом оборудования """ try: if not self.eqp_type: self.get_eqp_type() if not self.firmware: self.get_firmware_version() except DlinkInitException as dlink_exc: logger.error(dlink_exc) raise DlinkConfigException( self.ip, 'дальнейшая работа с оборудованием невозможна') cfg_file_name = 'config-%s.cfg' % self.ip # набор oid'ов для конфигурации обрудования DES-3*** на отдачу # конфигурационного файла на TFTP сервер oids_des = (('1.3.6.1.4.1.171.12.1.2.1.1.3.3', IpAddress(self.tftp_server)), ('1.3.6.1.4.1.171.12.1.2.1.1.4.3', Integer(2)), ('1.3.6.1.4.1.171.12.1.2.1.1.5.3', OctetString(cfg_file_name)), ('1.3.6.1.4.1.171.12.1.2.1.1.6.3', Integer(3)), ('1.3.6.1.4.1.171.12.1.2.1.1.7.3', Integer(2)), ('1.3.6.1.4.1.171.12.1.2.1.1.8.3', Integer(3))) # набор oid'ов для конфигурации обрудования DGS-3*** на отдачу # конфигурационного файла на TFTP сервер oids_dgs = (('1.3.6.1.4.1.171.12.1.2.18.1.1.3.3', IpAddress(self.tftp_server)), ('1.3.6.1.4.1.171.12.1.2.18.1.1.5.3', OctetString(cfg_file_name)), ('1.3.6.1.4.1.171.12.1.2.18.1.1.8.3', Integer(2)), ('1.3.6.1.4.1.171.12.1.2.18.1.1.12.3', Integer(3))) # набор oid'ов для конфигурации обрудования DGS-3100 на отдачу # конфигурационного файла на TFTP сервер oids_tg = (('1.3.6.1.4.1.171.10.94.89.89.87.2.1.4.1', IpAddress( self.ip)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.5.1', Integer(1)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.6.1', OctetString('startupConfig')), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.7.1', Integer(3)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.8.1', Integer(3)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.9.1', IpAddress(self.tftp_server)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.10.1', Integer(1)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.11.1', OctetString(cfg_file_name)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.12.1', Integer(3)), ('1.3.6.1.4.1.171.10.94.89.89.87.2.1.17.1', Integer(4))) cfg_file_end = 'End of configuration file' # TG if 'DGS-3100' in self.eqp_type: current_eqp = oids_tg # переопределяем окончание конфигурационного файла для # оборудования DGS-3100 cfg_file_end = '! VOICE VLAN' # DES-3526, DES-3528, DES-3010G, DGS-3200 elif 'DES-3526' in self.eqp_type \ or 'DES-3528' in self.eqp_type \ or 'DES-3010G' in self.eqp_type \ or 'DGS-3200' in self.eqp_type: current_eqp = oids_des # DGS elif 'DGS-3' in self.eqp_type: current_eqp = oids_dgs # DES elif 'DES-3' in self.eqp_type: if self.firmware: if float(self.firmware[:4]) >= 4.00: current_eqp = oids_dgs else: current_eqp = oids_des else: current_eqp = oids_des else: raise DlinkConfigException( self.ip, 'не удалось определить нужный набор oid ' 'для настройки оборудования на отдачу конфигурационного файла') # получаем конфиг, если определить тип оборудование не получилось, # то выводим соответствующее сообщение try: self.snmp.set(*current_eqp) except snmp.SnmpSetTimeoutException as snmp_exc: logger.critical(snmp_exc) raise DlinkConfigException( self.ip, 'не удалось настроить оборудование на отдачу ' 'конфигурационного файла') logger.debug( '%s - оборудование настроено на отдачу конфигурационного файла ' 'успешно' % self.ip) result = None file_path = os.path.join(self.tftp_path, cfg_file_name) if self.config_load_method == 'local': open_func = open rm_func = os.remove conn_close_func = lambda: None elif self.config_load_method == 'ssh': ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.load_system_host_keys() try: ssh.connect(self.tftp_server, username=self.username, password=self.password) except socket.error as exc: logger.error('%s - %s' % (self.ip, exc)) raise DlinkConfigException( self.ip, 'не удалось подключиться к серверу %s' 'по протоколу ssh' % self.tftp_server) sftp = ssh.open_sftp() open_func = sftp.open rm_func = sftp.remove conn_close_func = ssh.close else: raise DlinkConfigException( self.ip, 'неверно указан метод загрузки конфигурационного файла') _c = 0 while 1: time.sleep(1) if _c < timeout: try: _f = open_func(file_path, mode='r') # обработка ситуации когда файл еще не создан except IOError as io_exc: _c += 1 else: cfg_file = _f.read() if cfg_file_end in cfg_file: _f.close() rm_func(file_path) conn_close_func() result = cfg_file.replace('\r\n', '\n') break else: end_not_obtained = True _c += 1 _f.close() else: conn_close_func() if 'io_exc' in locals(): raise DlinkConfigException( self.ip, 'конфигурационного файла %s не существует ' 'на сервере %s' % (file_path, self.tftp_server)) elif 'end_not_obtained' in locals(): raise DlinkConfigException( self.ip, 'конец файла %s не получен за %s секунд' % (file_path, timeout)) else: raise DlinkConfigException( self.ip, 'не удалось получить конфигурационный файл ' '%s с сервера %s по неизвестной причине' % (file_path, self.tftp_server)) logger.info('%s - конфигурационный файла получен успешно' % self.ip) self.chassis.config_file = result return result
Integer, Integer32, IpAddress, ObjectName, OctetString, TimeTicks, Unsigned32, ) data = [] data.append([ObjectName('.1.'), Counter32('100'), 100]) data.append([ObjectName('.1.'), Counter64('100'), 100]) data.append([ObjectName('.1.'), Gauge32('100'), 100]) data.append([ObjectName('.1.'), Integer('100'), 100]) data.append([ObjectName('.1.'), Integer32('100'), 100]) data.append([ObjectName('.1.'), IpAddress('192.168.1.1'), '192.168.1.1']) data.append([ObjectName('.1.'), ObjectIdentifier('1'), '1']) data.append([ObjectName('.1.'), OctetString('my_string'), 'my_string']) data.append([ObjectName('.1.'), Unsigned32('100'), 100]) @pytest.fixture(scope='function', params=data) def query_data(monkeypatch, request): snmp_data = [[request.param[0], request.param[1]]] return GetCmdValues(monkeypatch, return_value=snmp_data, params=request.param) def test_return_value_types(query_data): dev = SnmpHandler(host='1.1.1.1', version='2c', community='public')