Beispiel #1
0
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
Beispiel #2
0
    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
Beispiel #3
0
    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
Beispiel #4
0
    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')