Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
zaum-kurs-2013.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
654.85 Кб
Скачать

4.3.2Написання коду

Припустимо, що у нас вже є прив'язки Python, і в даний момент IPython у нас працює. Іншими словами, ми готові почати роботу з IPython. У деяких випадках нам все-таки доведеться звернутися до документації IPython.

Давайте створимо простий запит з метою ідентифікації комп'ютера за значенням його ідентифікатора об'єкта (object identifier, OID) sysDescr. Запустимо IPython, ввівши команду ipython, після чого в інтерактивному режимі, виконаємо наступну послідовність команд:

Приклад коду на IPython

In [1]: import netsnmp

In [2]: oid = netsnmp.Varbind ('sysDescr')

In [3]: result = netsnmp.snmpwalk (oid,

...: Version = 2,

...: DestHost = "localhost",

...: Community = "public")

In [4]: ​​result = netsnmp.snmpwalk (oid,

Version = 2,

DestHost = "localhost",

Community = "public")

In [16]: result

Out [16]: ('Linux localhost 2.6.18-8.1.14.el5 # 1 SMP Thu Sep 27

18:58:54 EDT 2007 i686 ',)

        

Зверніть увагу на те, що отримані вами значення будуть відрізнятися від тих, що показані в цьому прикладі.

Однією з чудових особливостей використання IPython при тестуванні фрагментів SNMP-коду є те, що IPython працює як звичайний командний процесор, і при цьому більшість основних інтерактивних можливостей командного процесора в ньому дійсно працюють, але особливим чином. Написання коду для роботи з SNMP може бути вельми нудним заняттям, але використання бібліотеки Net-SNMP з IPython перетворює цей процес на розвагу.

Як ви могли помітити, отримати результуючі дані у форматі Python досить просто. Ось чому IPython і Net-SNMP так добре використовувати разом. Для отримання необхідної інформації тепер залишилося тільки інтерактивно підставляти необхідні комбінації OID у цей користувальницький сценарій. В ідеальному світі, необхідний досить громіздкий сценарій, призначений для простої настройки NMS, за допомогою якого новий комп'ютер автоматично б додавався в мережу.

Припустимо ситуацію, при якій ви щойно перетворили високошвидкісне пристрій DDR в 2 ТБ RAID 0 на сервері, що працює під ОС Ubuntu Linux, оскільки це єдине, що ви змогли зробити за той час, який вам дали для вирішення виниклої проблеми.

При цьому у вас є всього кілька хвилин, щоб розібратися в ситуації, що склалася. Давайте скористаємося функцією редагування в IPython для написання файлу сценарію, після чого запустимо його в цій же сесії, не виходячи з IPython: ed snmpinput.py

Створення модуля IPython

import netsnmp

class snmpSessionBaseClass (object):

    "" "A Base Class For a SNMP Session" ""

    def __ init__ (self,

                oid = "sysDescr",

                Version = 2,

                DestHost = "localhost",

                Community = "public"):

        self.oid = oid

        self.Version = Version

        self.DestHost = DestHost

        self.Community = Community

    def query (self):

        "" "Creates SNMP query session" ""

        try:

            result = netsnmp.snmpwalk (self.oid,

                                    Version = self.Version,

                                    DestHost = self.DestHost,

                                    Community = self.Community)

        except:

            import sys

            print sys.exc_info ()

            result = None

        return result

Ітеративне кодування в IPython                

In [1]: run snmpinput

In [2]: who

netsnmp snmpSessionBaseClass

In [3]: s = snmpSessionBaseClass ()

In [4]: ​​s.query ()

Out [4]: ​​('Linux localhost 2.6.18-8.1.14.el5 # 1 SMP Thu Sep 27 18:58:54 EDT 2007 i686',)

In [5]: result = s.query ()

In [6]: len (result)

Out [6]: 1

За допомогою даного модуля дуже легко отримати результати, але оскільки ви тільки що виконали жорстко закодований сценарій, змініть значення OID об'єкта, щоб перейти до піддерева системи:

Зміна значення OID об'єкта

          

In [7]: s.oid

Out [7]: 'sysDescr'

In [8]: s.oid = ".1.3.6.1.2.1.1"

In [9]: result = s.query ()

In [10]: print result

('Linux localhost 2.6.18-8.1.14.el5 # 1 SMP Thu Sep 27 18:58:54 EDT 2007 i686',

            '.1.3.6.1.4.1.8072.3.2.10', '121219 ',' Me@localhost.com ',

            'Localhost', '"My Local

Machine "', '0', '.1.3.6.1.6.3.10.3.1.1', '.1.3.6.1.6.3.11.3.1.1',

'.1.3.6.1.6.3.15.2.1.1',

'.1.3.6.1.6.3.1', '.1.3.6.1.2.1.49', '.1.3.6.1.2.1.4', '.1.3.6.1.2.1.50',

 '.1.3.6.1.6.3.16.2.2.1',

'The SNMP Management Architecture MIB.', 'The MIB for Message Processing and

 Dispatching. ',' The management information definitions for the SNMP

User-based Security Model. ',' The MIB module for SNMPv2 entities ',' The

MIB module for managing TCP implementations ',' The MIB module for

managing IP and ICMP implementations ',' The MIB module for managing

UDP implementations ',' View-based Access

Control Model for SNMP. ', '0', '0 ', '0', '0 ', '0', '0 ', '0', '0 ')

Як бачите, досить просто взяти цей модуль і почати досліджувати всю мережу, один комп'ютер за раз. Заслуговує на увагу також інша цікава можливість IPython. IPython дозволяє вам запускати фрагменти Python-коду у фоновому режимі.

Приклад виконання фрагмента ітеративного коду у фоновому режимі

In [11]: bg s.query ()

Starting job # 0 in a separate thread.

In [12]: jobs [0]. Status

Out [12]: 'Completed'

In [16]: jobs [0]. Result

Out [16]:

('Linux localhost 2.6.18-8.1.14.el5 # 1 SMP Thu Sep 27 18:58:54 EDT 2007 i686',

 '.1.3.6.1.4.1.8072.3.2.10', '121219 ',' Me@localhost.com ',' localhost ',' "My Local

 Machine "', '0', '.1.3.6.1.6.3.10.3.1.1', '.1.3.6.1.6.3.11.3.1.1',

'.1.3.6.1.6.3.15.2.1.1', '.1.3.6.1.6.3.1', '.1.3.6.1.2.1.49',

'.1.3.6.1.2.1.4', '.1.3.6.1.2.1.50', '.1.3.6.1.6.3.16.2.2.1',

 'The SNMP Management Architecture MIB.', 'The MIB for Message Processing and

 Dispatching. ',' The management information definitions for the SNMP User-based

 Security Model. ',' The MIB module for SNMPv2 entities ',' The MIB module for

 managing TCP implementations ',' The MIB module for managing IP and ICMP

 implementations ',' The MIB module for managing UDP implementations ',

 'View-based Access Control Model for SNMP.', '0 ', '0', '0 ', '0', '0 ', '0', '0 ', '0')

Хотілося б відзначити, що потокова обробка у фоновому режимі працює в IPython відмінно, але тільки з тими бібліотеками, які підтримують асинхронну обробку. На жаль, Net-SNMP є синхронний.

Звичайно, є й інше рішення. Ви можете скористатися однією з численних бібліотек обробки, доступних в Python, щоб відгалузилося цей блокується процес. Кілька бібліотек сторонніх розробників ви можете знайти в репозитарії Python (Python cheese shop). Якщо ви використовуєте просту установку easy_install, то установка пакета, такого як Parallel Python, і випробування вроботі цієї бібліотеки разом з Net-SNMP стане для вас простим завданням.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]