Протокол SNMP в POSIX-операционных системах.

Вопросы написания собственного программного кода (на любых языках)

Модератор: Olej

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 10:22

Olej писал(а): Шаг 2:
Шаг 3:

Для каждого OID (переменной SNMP), определённой в новых MIB, ... отдельно для каждого - нужно сгенерировать шаблон C-кода обработчика этого OID.
Делается это утилитой (Perl скрипт) mib2c.

Код: Выделить всё

olej@nvidia ~ $ apt contains mib2c
...
libsnmp-dev: /usr/bin/mib2c
...

[olej@dell own.WORK]$ which mib2c
/usr/bin/mib2c

Код: Выделить всё

[olej@dell SNMP]$ env MIBS="+ALEX-MANAGEMENT-MIB" mib2c -c mib2c.scalar.conf procUptime
writing to procUptime.h
writing to procUptime.c
running indent on procUptime.h
running indent on procUptime.c
Так мы должны сделать для каждого OID, определённого в собственных MIB, для которых должны выполняться команды SNMP-менеджеров.

Код: Выделить всё

Это сгенерированные [b]шаблоны кода[/b] для обработчиков OID (в данном случае procUptime):
[olej@dell mibs]$ ls -l procUptime.*
-rw-rw-r--. 1 olej olej 1752 июн 20 10:36 procUptime.c
-rw-rw-r--. 1 olej olej  245 июн 20 10:36 procUptime.h
procUptime.c - это единственный файл кода, который мы обязаны править, чтобы описать как данные из субагента (или целевого проекта) попадают в датаграмму передаваемую по snmpget, или из команды snmpset записываются в данные программы.
Вот то место шаблона, которое подлежит правке (здесь даже прокомментированы параметры и указаны типы данных):

Код: Выделить всё

    switch(reqinfo->mode) {

        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     /* XXX: a pointer to the scalar's data */,
                                     /* XXX: the length of the data in bytes */);
            break;

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 10:46

Olej писал(а): Шаг 3:
Шаг 4:
Править шаблоны *.c сгенерированные mib2c и вписывать туда свой реальный код работы с командами SNMP.
Но отложим этот шаг чуть-чуть на потом... - понятно, что это достаточно элементарный код, но глухо привязанный к целевой задаче (не имеющий отношения к SNMP), будем считать, пока, что мы его написали.
(на этом этапе сюда целесообразно просто вписать синтаксически правильную заглушку, ничего не делающую)

Шаг 5:
Написать вызывающий код SNMP субагента.
Код будет почти всегда подобный, в него только нужно внести правки...

Код: Выделить всё

#include <net-snmp/net-snmp-config.h>
#include <net-snmp/net-snmp-includes.h>
#include <net-snmp/agent/net-snmp-agent-includes.h>
#include <signal.h>
#include "procUptime.h"

volatile sig_atomic_t keep_running = 0;
extern int debug_level;

RETSIGTYPE stop_server( int a ) {
   if( debug_level != 0 )
      snmp_log( LOG_INFO, "\n--------- got signal: %d -------------\n", a );
   keep_running = 0;
}

#define daemon_title "upt_agn" // имя демона и конфиг-файлов!

int main ( int argc, char **argv ) {
   int c,
       agentx_subagent = 0;  // 0 - SNMP master agent : 1 - AgentX subagent
   while( -1 != ( c = getopt( argc, argv, "xv" ) ) )
      switch( c ) {
         case 'x': agentx_subagent = 1; break;
         case 'v': debug_level++; break;
         default : 
            exit( EXIT_FAILURE );
      }

   init_snmp_logging();
   snmp_enable_syslog();

// snmp_enable_calllog();
   snmp_enable_stderrlog();      // print log errors to stderr 
// if( background && netsnmp_daemonize( 1, !syslog ) ) exit( 1 );
   if( debug_level > 1 )snmp_set_do_debugging( 1 );
   if( agentx_subagent )         // we're an agentx subagent? 
      netsnmp_ds_set_boolean( NETSNMP_DS_APPLICATION_ID, NETSNMP_DS_AGENT_ROLE, 1 );
   SOCK_STARTUP;                 // initialize tcpip, if necessary
   init_agent( daemon_title );   // initialize the agent library
//   init_currentValue();          // initialize mib code here...
//   init_nextStep();
   init_procUptime();            // initialize mib code here...
   init_snmp( daemon_title );    // имя конфиг-файла
   if( !agentx_subagent )        // If we're going to be a snmp master agent, initial the ports 
      init_master_agent();       // open the port to listen on (defaults to udp:161) 
   signal( SIGTERM, stop_server );
   signal( SIGINT, stop_server );
   if( debug_level != 0 ) snmp_log( LOG_INFO, "%s is up and running.\n", daemon_title );
   keep_running = 1;
   while( keep_running ) {       // you're main loop here... 
      // if you use select(), see snmp_select_info() in snmp_api(3) 
      //     --- OR ---  
      agent_check_and_process( 1 ); // 0 == don't block 
   }
   snmp_shutdown( daemon_title );   // завершение работы
   SOCK_CLEANUP;
   if( debug_level != 0 ) snmp_log( LOG_INFO, "%s was finished.\n", daemon_title );
   return EXIT_SUCCESS;
}
Что здесь поправлено? (основу можно найти в примерах проекта net-snmp)
1. включены все сгенерированные mib2c заголовки:

Код: Выделить всё

#include "procUptime.h"
2. определено как будет называться программ-демон и её конфиг файл:

Код: Выделить всё

#define daemon_title "upt_agn" // имя демона и конфиг-файлов!
(при желании можно сделать разные имена ... но кому это нужно?)
... вот, собственно, и всё :-o
Вложения
subagent.c
(2.32 КБ) 215 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 10:58

Olej писал(а): Шаг 5:
Шаг 6:

Пробуем всё это компилировать в готовое приложение...
Пишем Makefile:

Код: Выделить всё

CC = gcc
CFLAGS = `net-snmp-config --cflags`
BUILDAGENTLIBS = `net-snmp-config --agent-libs`
OBJS2 = subagent.o procUptime.o

PROGLIST = upt_agn

all: prog

prog:  $(PROGLIST)

upt_agn: $(OBJS2)
        $(CC) $(OBJS2) -o $@ $(BUILDAGENTLIBS)
        rm -f *.o

subagent.o: subagent.c
        $(CC) $(CFLAGS) -c $< -o $@

procUptime.o: procUptime.c
        $(CC) $(CFLAGS) -c $< -o $@

clean:
        @rm -f *.o $(PROGLIST)
Mint 17.1 :

Код: Выделить всё

olej@nvidia ~/2016_WORK/own.BOOK/SNMP/snmp.7 $ make
gcc `net-snmp-config --cflags` -c subagent.c -o subagent.o
gcc subagent.o procUptime.o -o upt_agn `net-snmp-config --agent-libs`
rm -f *.o
Ура! ;-)

Fedora 23 :
Здесь всё хуже ... и неожиданно :-o :

Код: Выделить всё

[olej@dell snmp.7]$ make
gcc `net-snmp-config --cflags` -c subagent.c -o subagent.o
gcc: ошибка: /usr/lib/rpm/redhat/redhat-hardened-cc1: Нет такого файла или каталога
Makefile:18: ошибка выполнения рецепта для цели «subagent.o»
make: *** [subagent.o] Ошибка 1
Но это дело легко поправить:

Код: Выделить всё

[olej@dell snmp.7]$ dnf provides '*/redhat-hardened-cc1'
Последняя проверка окончания срока действия метаданных: 4 days, 3:04:11 назад, Wed Jun 15 20:53:30 2016.
redhat-rpm-config-36-1.fc23.noarch : Red Hat specific rpm configuration files
Источник: fedora

Код: Выделить всё

[olej@dell snmp.7]$ sudo dnf install redhat-rpm-config
...
Зависимости разрешены.
========================================================================================================================================
 Package                                Архитектура                Версия                             Репозиторий                 Размер
========================================================================================================================================
Установка:
 dwz                                    x86_64                     0.12-1.fc23                        fedora                      106 k
 ghc-srpm-macros                        noarch                     1.4.2-2.fc23                       fedora                      8.2 k
 gnat-srpm-macros                       noarch                     2-1.fc23                           fedora                      8.4 k
 ocaml-srpm-macros                      noarch                     2-3.fc23                           fedora                      8.1 k
 perl-srpm-macros                       noarch                     1-17.fc23                          fedora                      9.7 k
 python-srpm-macros                     noarch                     3-7.fc23                           updates                     8.1 k
 redhat-rpm-config                      noarch                     36-1.fc23.1                        updates                      59 k
...
Установлено:
  dwz.x86_64 0.12-1.fc23                        ghc-srpm-macros.noarch 1.4.2-2.fc23          gnat-srpm-macros.noarch 2-1.fc23
  ocaml-srpm-macros.noarch 2-3.fc23             perl-srpm-macros.noarch 1-17.fc23            python-srpm-macros.noarch 3-7.fc23
  redhat-rpm-config.noarch 36-1.fc23.1
Выполнено!

Код: Выделить всё

[olej@dell snmp.7]$ make
gcc `net-snmp-config --cflags` -c subagent.c -o subagent.o
gcc `net-snmp-config --cflags` -c procUptime.c -o procUptime.o
gcc subagent.o procUptime.o -o upt_agn `net-snmp-config --agent-libs`
rm -f *.o
Ура! :lol:

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 11:37

Olej писал(а): Шаг 6:
Шаг 7:
Написать конфигурационные файлы ... возможно, для стандартного snmpd (править) и для своего собственного (мы обозвали этот файл upt_agn.conf).
Здесь бесконечный простор для творчества, экспериментирования ... и ошибок :-( (тут придётся пободаться).
1. Берётся стандартный конф-файл snmpd:

Код: Выделить всё

[olej@dell snmp]$ ls /etc/snmp/
snmpd.conf  snmptrapd.conf
2. Туда нужно, как минимум, разрешить для просмотра своё поддерево:

Код: Выделить всё

view    systemview    included   .1.3.6.1.4.1.8765.13 #19.06.2016
3. Для своего upt_agn.conf просто копируем snmpd.conf и затем правим ... что хотим :lol:
4. Эти конф-файлы нужно разместить в /etc/snmp

С великим множеством конфигурационных параметров разбираемся здесь:

Код: Выделить всё

[olej@dell 17]$ sudo snmpd -H
[sudo] пароль для olej:
Configuration directives understood:
  In snmpd.conf and snmpd.local.conf:
    authtrapenable           1 | 2              (1 = enable, 2 = disable)
    trapsink                 host [community] [port]
    trap2sink                host [community] [port]
    informsink               host [community] [port]
...
    agentxsocket             AgentX bind address
    master                   specify 'agentx' for AgentX support
    agentxperms              AgentX socket permissions: socket_perms [directory_perms [username|userid [groupname|groupid]]]
    agentxRetries            AgentX Retries
    agentxTimeout            AgentX Timeout (seconds)
...
  In agentx.conf and agentx.local.conf:
    agentxsocket             AgentX bind address
    agentxperms              AgentX socket permissions: socket_perms [directory_perms [username|userid [groupname|groupid]]]
    agentxRetries            AgentX Retries
    agentxTimeout            AgentX Timeout (seconds)
Вложения
upt_agn.conf
(18.61 КБ) 198 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 12:20

Olej писал(а): Шаг 4:
Править шаблоны *.c сгенерированные mib2c и вписывать туда свой реальный код работы с командами SNMP.
Но отложим этот шаг чуть-чуть на потом... - понятно, что это достаточно элементарный код, но глухо привязанный к целевой задаче (не имеющий отношения к SNMP), будем считать, пока, что мы его написали.
(на этом этапе сюда целесообразно просто вписать синтаксически правильную заглушку, ничего не делающую)
А дальше правим реальный код обработчика...
Было сгенерировано mib2c:

Код: Выделить всё

        case MODE_GET:
            snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                                     /* XXX: a pointer to the scalar's data */,
                                     /* XXX: the length of the data in bytes */);
            break;
Перепишем (в 1-м приближении) так:

Код: Выделить всё

        case MODE_GET: {
             FILE* updf = popen( "cat /proc/uptime", "r" );
             if( NULL == updf ) {
                snmp_log( LOG_ERR, "popen error: 'cat /proc/uptime'\n" );
                return SNMP_ERR_GENERR;
             }
             if( NULL == fgets( sUptime, sizeof( sUptime ), updf ) ) {
                snmp_log( LOG_ERR, "/proc/uptime read error\n" );
                return SNMP_ERR_GENERR;

             };
             pclose( updf );
             snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                       sUptime
                                     /* XXX: a pointer to the scalar's data */,
                       sizeof( sUptime )
                                     /* XXX: the length of the data in bytes */
                                     );
        }
            break;

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 14:04

Olej писал(а): Ура! :lol:
А дальше: отладка, отладка, отладка ... до опупения (тех, кто займётся SNMP, я вас уверяю, что на запуск простейшего описываемого проекта вы убьёте не один час вот начиная с этого места).
Это потому, что работоспособность всего этого кина в комплексе зависит от:
- кода обработчика .c, естественно
- режима запуска (субагент AgentX / автономный агент SNMP)
- местоположения конф-файлов
- местоположения MIB-файлов (для утилит-менеджеров)
- прав доступа/видимости отдельных поддеревьев OID, прописанная в конф-файлах
- прав (имени root) с которыми вы выполняете своего агента
И только когда все компоненты будут созданы-прописаны-размещены-... правильно - только тогда это заработает!

В конечном итоге код обработчика пришлось переписать так:

Код: Выделить всё

        case MODE_GET: {
             FILE* updf = popen( "cat /proc/uptime", "r" );
             if( NULL == updf ) {
                snmp_log( LOG_ERR, "popen error: 'cat /proc/uptime'\n" );
                return SNMP_ERR_GENERR;
             }
             if( NULL == fgets( sUptime, sizeof( sUptime ), updf ) ) {
                snmp_log( LOG_ERR, "/proc/uptime read error\n" );
                return SNMP_ERR_GENERR;

             };
             *strrchr( sUptime, '\n') = '\0';
             pclose( updf );
             snmp_set_var_typed_value(requests->requestvb, ASN_OCTET_STR,
                       sUptime
                                     /* XXX: a pointer to the scalar's data */,
                       strlen( sUptime )
                                     /* XXX: the length of the data in bytes */
                                     );
        }
            break;
И это всё работает примерно так (после 5-й пересборки, когда я делаю подобное далеко не 1-й раз :-o )...
Автономная работа SNMP агента (остановка по ^C после сеанса работы):

Код: Выделить всё

[olej@dell snmp.7]$ sudo ./upt_agn -v
[sudo] пароль для olej: 
upt_agn is up and running.
^C
--------- got signal: 2 -------------
upt_agn was finished.
Обращения от менеджеров:

Код: Выделить всё

[olej@dell conf]$ snmpget -v 2c -c public 127.0.0.1 .1.3.6.1.4.1.8765.13.5.0
SNMPv2-SMI::enterprises.8765.13.5.0 = STRING: "326970.64 1194945.82"

[olej@dell conf]$ snmpget -v 1 -c public 127.0.0.1 .1.3.6.1.4.1.8765.13.5.0
SNMPv2-SMI::enterprises.8765.13.5.0 = STRING: "327016.21 1195297.52"

Код: Выделить всё

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime
ALEX-MANAGEMENT-MIB::procUptime = No Such Instance currently exists at this OID

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 327272.52 1197276.26

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 327347.03 1197851.61

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 327352.14 1197890.37

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 327356.30 1197923.51

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 327360.40 1197955.17
Видите как меняются времена Uptime, получаемые по SNMP?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 15:39

Попалась под руку хорошая публикация по SNMP, я ней раньше пользовался:
NetSNMP subagent development manual
Konrad Rzeszutek
Copyright © 2004 IBM Corporation


Table of Contents
1. Introduction

1.1. The Basics

1.1.1. Purpose of this Document
1.1.2. Document Scope
1.1.3. Terminology

2. Getting the pieces

2.1. Pre-requisities

2.1.1. Generation of skeleton code
2.1.2. mib2c
2.1.3. How should the sub-agent be generated ?

3. Understanding the sub-agent

3.1. The minimum

3.1.1. Makefile
3.1.2. Sub-agent daemon code

4. Header file

4.1. Header files

4.1.1. Context structure
4.1.2. Functions
4.1.3. Object IDentifier of the table
4.1.4. Textual names for leaf nodes
4.1.5. Enabling and disabling operations

5. C code

5.1. Initializiation process of sub-agent

5.1.1. Handler
5.1.2. Notify the helper function
5.1.3. Register the GET operation
5.1.4. Register compare function
5.1.5. Alternation and creation of row support
5.1.6. Miscellaneous
5.1.7. Registering handler with container
5.1.8. Generic compare function
5.1.9. Tree searching function

5.2. Creating and Writing (SNMP SET or user) to rows (and columns)

5.2.1. Row copy
5.2.2. Extracting index
5.2.3. Row deletion checking
5.2.4. Duplicating rows
5.2.5. Deleting rows
5.2.6. Creating rows
5.2.7. Writing to a row
5.2.8. RESERVE1 function
5.2.9. RESERVE2 function
5.2.10. ACTION
5.2.11. COMMIT function
5.2.12. FREE and UNDO function

5.3. Getting values

6. Appendix

6.1. NET-SNMP-EXAMPLES-MIB.txt
6.2. netSnmpIETFWGTable.h
6.3. netSnmpIETFWGTable.c

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 23:10

Olej писал(а): И это всё работает примерно так (после 5-й пересборки, когда я делаю подобное далеко не 1-й раз :-o )...
Автономная работа SNMP агента (остановка по ^C после сеанса работы):
Это автономная работа нашего собственного SNMP-агента: обслуживает OID со своих MIB-файлов, но стандартный snmpd не работает, новый SNMP-агент прослушивает тот же порт UDP 161.

Для того, чтобы собственный SNMP-агент не замещал snmpd, а дополнял его OID-ы, этот агент должен запускаться как субагент к snmpd, которому snmpd будет передавать не свои запросы по локальному протоколу AgentX.

С субагентом у меня возник некоторый затык ... забыл за ушедшее время. Для того, чтобы стандартный snmpd работал с протоколом AgentX, в конфиг-файл snmpd (/etc/snmp/snmpd.conf) должно быть дописано как минимум (там есть ещё детальные параметры):

Код: Выделить всё

master agentx
agentXSocket /var/agentx/master
Каталоги, где snmpd станет искать свои конфиги, проверяем так:

Код: Выделить всё

[olej@dell Yandex]$ net-snmp-config --snmpconfpath
/etc/snmp:/usr/share/snmp:/usr/lib64/snmp:/home/olej/.snmp:/var/lib/net-snmp

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 23:17

Olej писал(а):

Код: Выделить всё

master agentx
agentXSocket /var/agentx/master
После этого уже собранное приложение может запускаться в режиме AgentX, как дополнение к snmpd:

Код: Выделить всё

[olej@dell snmp.7]sudo service snmpd restart
[sudo] пароль для olej:
Redirecting to /bin/systemctl restart  snmpd.service

[olej@dell snmp.7]$ service snmpd status
Redirecting to /bin/systemctl status  snmpd.service
● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
   Loaded: loaded (/usr/lib/systemd/system/snmpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Пн 2016-06-20 21:03:53 EEST; 7s ago
 Main PID: 22564 (snmpd)
   CGroup: /system.slice/snmpd.service
           └─22564 /usr/sbin/snmpd -LS0-6d -f

июн 20 21:03:53 dell.localdomain systemd[1]: Starting Simple Network Management Protocol (SNMP) Daemon....
июн 20 21:03:53 dell.localdomain snmpd[22564]: Turning on AgentX master support.
июн 20 21:03:53 dell.localdomain snmpd[22564]: Created directory: /var/agentx
июн 20 21:03:53 dell.localdomain snmpd[22564]: NET-SNMP version 5.7.3n
июн 20 21:03:53 dell.localdomain systemd[1]: Started Simple Network Management Protocol (SNMP) Daemon..

Запущен стандартный сервис snmpd...

Код: Выделить всё

[olej@dell snmp.7]$ sudo ./upt_agn -x -v
/etc/snmp/upt_agn.conf: line 47: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 48: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 55: Warning: Unknown token: view.
/etc/snmp/upt_agn.conf: line 56: Warning: Unknown token: view.
/etc/snmp/upt_agn.conf: line 58: Warning: Unknown token: view.
/etc/snmp/upt_agn.conf: line 65: Warning: Unknown token: access.
/etc/snmp/upt_agn.conf: line 80: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 81: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 82: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 83: Warning: Unknown token: group.
/etc/snmp/upt_agn.conf: line 91: Warning: Unknown token: view.
/etc/snmp/upt_agn.conf: line 98: Warning: Unknown token: access.
/etc/snmp/upt_agn.conf: line 99: Warning: Unknown token: access.
/etc/snmp/upt_agn.conf: line 127: Warning: Unknown token: view.
NET-SNMP version 5.7.3 AgentX subagent connected
upt_agn is up and running.
Запущено всё то же наше приложение в режиме субагента (ключ -x)...
Делаем SNMP запросы:

Код: Выделить всё

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 353743.42 1395406.35

[olej@dell conf]$ snmpget -v1 localhost -c public SNMPv2-MIB::sysName.0
SNMPv2-MIB::sysName.0 = STRING: dell.localdomain
Как легко видеть, на 1-й запрос отвечает субсервер AgentX (snmpd передал ему запрос), а на второй запрос ответил snmpd.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Протокол SNMP в POSIX-операционных системах.

Непрочитанное сообщение Olej » 20 июн 2016, 23:28

Olej писал(а): Запущено всё то же наше приложение в режиме субагента (ключ -x)...
В документации описан другой способ построения субсервера AgentX.
Для этого используем в точности тот же код обработчика запросов:

Код: Выделить всё

[olej@dell snmp.7]$ net-snmp-config --compile-subagent upt_snmp_sub procUptime.c 
generating the temporary code file: netsnmptmp.22233.c
void init_procUptime(void);
checking for init_procUptime in procUptime.c
init_procUptime(void)
checking for shutdown_procUptime in procUptime.c
running: gcc  -DNETSNMP_ENABLE_IPV6 -fno-strict-aliasing -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic -D_RPM_4_4_COMPAT -Wformat -Ulinux -Dlinux=linux  -D_REENTRANT -D_GNU_SOURCE -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fwrapv -fno-strict-aliasing -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64  -I/usr/lib64/perl5/CORE   -I. -I/usr/include -o upt_snmp_sub netsnmptmp.22233.c  procUptime.c -Wl,-z,relro -Wl,-z,now -L/usr/lib64 -lnetsnmpmibs -lnetsnmpagent -lnetsnmp -lnetsnmpmibs -lsensors -ldl -lrpm -lrpmio   -lnetsnmpagent  -lwrap -Wl,--enable-new-dtags -Wl,-z,relro  -lnetsnmp   -lssl  -lssl -lcrypto 
removing the temporary code file: netsnmptmp.22233.c
subagent program upt_snmp_sub created

[olej@dell snmp.7]$ file upt_snmp_sub 
upt_snmp_sub: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=ef9b9268cbe79fb997fe8ef2d85290bd528dd258, not stripped
Вот так мы простейшим способом получаем приложение, но это только субагент, он может работать только в этом режиме.
Но такое решение наследует все опции запуска snmpd:

Код: Выделить всё

[olej@dell snmp.7]$ ./upt_snmp_sub -f -Lo -d
Warning: Failed to connect to the agentx master agent ([NIL]): 
^Cread_config_store open failure on /var/lib/net-snmp/upt_snmp_sub.conf
read_config_store open failure on /var/lib/net-snmp/upt_snmp_sub.conf
read_config_store open failure on /var/lib/net-snmp/upt_snmp_sub.conf
Ошибка потому, что у нас для этого имени приложения нет конфиг-файла в /etc:

Код: Выделить всё

[root@dell snmp]# pwd
/etc/snmp
[root@dell snmp]# cp upt_agn.conf upt_snmp_sub.conf
И всё путём ;-) :

Код: Выделить всё

[olej@dell snmp.7]$ sudo ./upt_snmp_sub -f -Lo -d
/etc/snmp/upt_snmp_sub.conf: line 47: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 48: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 55: Warning: Unknown token: view.
/etc/snmp/upt_snmp_sub.conf: line 56: Warning: Unknown token: view.
/etc/snmp/upt_snmp_sub.conf: line 58: Warning: Unknown token: view.
/etc/snmp/upt_snmp_sub.conf: line 65: Warning: Unknown token: access.
/etc/snmp/upt_snmp_sub.conf: line 80: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 81: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 82: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 83: Warning: Unknown token: group.
/etc/snmp/upt_snmp_sub.conf: line 91: Warning: Unknown token: view.
/etc/snmp/upt_snmp_sub.conf: line 98: Warning: Unknown token: access.
/etc/snmp/upt_snmp_sub.conf: line 99: Warning: Unknown token: access.
/etc/snmp/upt_snmp_sub.conf: line 127: Warning: Unknown token: view.

Sending 80 bytes to Local IPC: /var/agentx/master
0000: 01 01 00 00  00 00 00 00  00 00 00 00  D4 FB 9D 0C    ................
0016: 3C 00 00 00  00 00 00 00  05 04 00 00  01 00 00 00    <...............
0032: 88 1F 00 00  03 00 00 00  02 00 00 00  0A 00 00 00    ................
0048: 19 00 00 00  4E 65 74 2D  53 4E 4D 50  20 41 67 65    ....Net-SNMP Age
0064: 6E 74 58 20  73 75 62 2D  61 67 65 6E  74 00 00 00    ntX sub-agent...

Received 88 byte packet from Local IPC: abstract
0000: 01 12 00 00  05 00 00 00  00 00 00 00  D4 FB 9D 0C    ................
0016: 44 00 00 00  E5 15 00 00  00 00 00 00  04 00 00 00    D...............
0032: 05 04 00 00  01 00 00 00  88 1F 00 00  03 00 00 00    ................
0048: 02 00 00 00  0A 00 00 00  19 00 00 00  4E 65 74 2D    ............Net-
0064: 53 4E 4D 50  20 41 67 65  6E 74 58 20  73 75 62 2D    SNMP AgentX sub-
0080: 61 67 65 6E  74 00 00 00                              agent...

NET-SNMP version 5.7.3 AgentX subagent connected

Sending 44 bytes to Local IPC: /var/agentx/master
0000: 01 03 00 00  05 00 00 00  00 00 00 00  D5 FB 9D 0C    ................
0016: 18 00 00 00  00 7F 00 00  04 04 00 00  01 00 00 00    ................
0032: 3D 22 00 00  0D 00 00 00  05 00 00 00                 ="..........

Received 52 byte packet from Local IPC: abstract
0000: 01 12 00 00  05 00 00 00  00 00 00 00  D5 FB 9D 0C    ................
0016: 20 00 00 00  E5 15 00 00  00 00 00 00  05 00 00 00     ...............
0032: 04 04 00 00  01 00 00 00  3D 22 00 00  0D 00 00 00    ........="......
0048: 05 00 00 00                                           ....
...
И пошли запросы:

Код: Выделить всё

[olej@dell conf]$ snmpget -v1 localhost -c public SNMPv2-MIB::sysName.0
SNMPv2-MIB::sysName.0 = STRING: dell.localdomain

[olej@dell conf]$ snmpget -v2c -c public 127.0.0.1 -m +ALEX-MANAGEMENT-MIB procUptime.0
ALEX-MANAGEMENT-MIB::procUptime.0 = STRING: 353674.79 1394899.30
Опять же, видно, что разные запросы обрабатываются разными агентами.

Ответить

Вернуться в «Программирование»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 6 гостей