понедельник, 29 сентября 2014 г.

Web SNMP Traps List (WSTL)

Структура базы SNMPTT, в которой хранятся распознанные трапы и трапы для которых нет конфигурационных файлов до такой степени простая, что написать некий веб-интерфейс для отображения данных и их некой обработке не составляет большого труда. Точнее сводится к обработке SQL запросов о выборке из двух таблиц snmptt и snmptt_unknown (таблицу snmptt_statistics не рассматриваем, т.к. не совсем понятно когда заработает статистика):

SELECT * FROM snmptt;
SELECT * FROM snmptt_unknown;

В интернетах есть много мест, где весьма профессионально описаны связки разнообразных скриптовых языков программирования с SQL. Если планируется использовать PHP, то можно начать с этого.

пятница, 26 сентября 2014 г.

Настройка конфигурационных файлов snmptt

При установке snmptt предлагается некий конфигурационный файл  snmptt.conf.generic в качестве примера.

Рассмотрим фрагмент этого файла:

EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT Link down on interface $1.  Admin state: $2.  Operational state: $3
#EXEC qpage -f TRAP notifygroup1 "Link down on interface $1.  Admin state: $2.  Operational state: $3"
SDESC
A linkDown trap signifies that the SNMP entity, acting in
an agent role, has detected that the ifOperStatus object for
one of its communication links is about to enter the down
state from some other state (but not from the notPresent
state).  This other state is indicated by the included value
of ifOperStatus.
EDESC

В первой строке указывается цифровой OID и его статус.
Вторая строка описывает содержимое сообщения трапа и в большинстве случаев помогает понять, что за переменные оно содержит.
В третьей строке мы должны указать действие которое необходимо выполнить при получении это трапа. 
Между стартовым тегом SDESC и тегом закрытия EDESC содержится некое описание.

Для создания конкретных конфигурационных файлов существует утилита входящая в пакет snmptt: snmpttconvertmib.
Для начальных данных этой утилите нужен MIB файл (или набор файлов) для оборудования от которого планируется получать трапы:
# snmpttconvertmib --in=path-to-mib --out=output-file-name

если установлен модуль perl NET-SNMP (пакет net-snmp-perl), то можно использовать дополнительно опцию -net_snmp_perl и в файле на выходе переменные будут описаны более подробно, например:

# snmpttconvertmib --in=/usr/share/snmp/mibs/UPS-MIB.txt --out=snmptt.conf.apc
# snmpttconvertmib --in=/usr/share/snmp/mibs/UPS-MIB.txt --out=snmptt.conf.apc2 -net_snmp_perl

первое событие в файле snmptt.conf.apc описано так:
EVENT upsTrapOnBattery .1.3.6.1.2.1.33.2.1 "Status Events" Normal
FORMAT The UPS is operating on battery power.  This trap is $*
SDESC
The UPS is operating on battery power.  This trap is
persistent and is resent at one minute intervals until
the UPS either turns off or is no longer running on
battery.
Variables:
  1: upsEstimatedMinutesRemaining
  2: upsSecondsOnBattery
  3: upsConfigLowBattTime
EDESC

в случае использования дополнительной опции -net_snmp_perl первое событие в файле snmptt.conf.apc2 уже описано так:
EVENT upsTrapOnBattery .1.3.6.1.2.1.33.2.1 "Status Events" Normal
FORMAT The UPS is operating on battery power.  This trap is $*
SDESC
The UPS is operating on battery power.  This trap is
persistent and is resent at one minute intervals until
the UPS either turns off or is no longer running on
battery.
Variables:
  1: upsEstimatedMinutesRemaining
     Syntax="INTEGER"
     Descr="An estimate of the time to battery charge depletion
            under the present load conditions if the utility power
            is off and remains off, or if it were to be lost and
            remain off."
  2: upsSecondsOnBattery
     Syntax="INTEGER"
     Descr="If the unit is on battery power, the elapsed time
            since the UPS last switched to battery power, or the
            time since the network management subsystem was last
            restarted, whichever is less.  Zero shall be returned
            if the unit is not on battery power."
  3: upsConfigLowBattTime
     Syntax="INTEGER"
     Descr="The value of upsEstimatedMinutesRemaining at which a
            lowBattery condition is declared.  For agents which
            support only discrete (discontinuous) values, then the
            agent shall round up to the next supported value.  If
            the requested value is larger than the largest
            supported value, then the largest supported value
            shall be selected."
EDESC

Второй вариант даёт более ясное представление о переменных, их содержании и взаимосвязях.

Утилита snmpttconvertmib умеет формировать и добавлять строку с определением EXEC, в которой указывается действие, выполняемое при получении этого трапа. Для этого используется опция --exec=command, где command строка заключенная в одиночные кавычки. К строке указаной в качестве command добавляется содержимое строки с опрелением FORMAT, заключённое в двойные ковычки:
# snmptt_1.4/snmpttconvertmib --in=/usr/share/snmp/mibs/UPS-MIB.txt --out=snmptt.conf.apc -net_snmp_perl --exec='/usr/local/icinga/libexec/eventhandlers/submit_check_result $r TRAP 1'

событие сформируется следующим образом:
EVENT upsTrapOnBattery .1.3.6.1.2.1.33.2.1 "Status Events" Normal
FORMAT The UPS is operating on battery power.  This trap is $*
EXEC /usr/local/icinga/libexec/eventhandlers/submit_check_result $r TRAP 1 "The UPS is operating on battery power.  This trap is $*"

в большинстве случаев это очень удобно. В случае возникновения необходимости всегда можно откорректировать содержимое строки выполнения.

Также никто не мешает написать конфигурационный файл самостоятельно. Рассмотрим, например, файл в котором описаны действия, выполняемые в случае получения трапа о изменении статуса порта от оборудования Cisco:
EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal
FORMAT Port name: $2 Status: $4
EXEC /usr/local/icinga/libexec/eventhandlers/submit_check_result $r "Port $2" 2 "Аварийный режим"

EVENT linkUp .1.3.6.1.6.3.1.1.5.4 "Status Events" Normal
FORMAT Port name: $2 Status: $4
EXEC /usr/local/icinga/libexec/eventhandlers/submit_check_result $r "Port $2" 0 "В работе"

Разберём первое событие построчно.
Первая строка:
EVENT linkDown .1.3.6.1.6.3.1.1.5.3 "Status Events" Normal 

начинается с определения EVENT, далее следуют:
- наименование события, в данном случае linkDown, уникальная текстовая метка (алиас) не должна содержать пробелы;
- OID события, в данном случае .1.3.6.1.6.3.1.1.5.3, в цифровом виде, можно использовать и символьный вариант. Допустимо использование шаблонов поиска, например, .1.3.6.1.6.3.1.1.5.*, но при этом необходимо учитывать, что OID'ы будут обрабатываться в порядке их перечисления;
- категория, в данном случае "Status Events", символьная строка заключенная в двойные кавычки, используется для логирования. Если указать категорию "IGNORE", то никаких действий по выполнению определений EXEC и FORMAT не будет выполнено. Также существует категория "LOGONLY", которая отключает выполнение определения EXEC, но логирование осуществляется;
- уровень статуса, в данном случае Normal, символьная строка указывающая статус, например, Minor, Major, Normal, Critical, Warning, используется для логирования. Можно связать с уровнями syslog'а (см. snmptt.ini, опции syslog_level_*).

Вторая строка:
FORMAT Port name: $2 Status: $4

начинается с определения FORMAT за которым следует строка генерирующая текст при логировании. У каждого события может быть только одна строка с определением FORMAT.
Для генерации возможно использование следующих переменных:

$A - имя узла агента;
$aA - IP адрес агента;
$Be - securityEngineID (snmpEngineID) (доступно только при использовании встроенного обработчика);
$Bu - securityName (snmpCommunitySecurityName) (доступно только при использовании встроенного обработчика);
$BE - contextEngineID (snmpCommunityContextEngineID) (доступно только при использовании встроенного обработчика);
$Bn - contextName (snmpCommunityContextName) (доступно только при использовании встроенного обработчика);
$c - категория;
$C - общая строка (community string);
$D - текстовое описание их snmptt.conf или MIB файла (см. опцию description_mode в snmptt.ini);
$E - OID трапа в символьном виде;
$e - OID трапа в числовом виде;
$Fa - звуковой сигнал (bell) (BEL);
$Ff - прогон страницы, новая страница (FF);
$Fn -  перевод строки (LF, NL);
$Fr - перевод каретки (CR);
$Ft - символ горизонтальной табуляции (HT, TAB);
$Fz - транслированная строка FROMAT (работает только в опредлении EXEC);
$G - номер общего трапа (generic trap, 0 в случае enterprise trap);
$H - имя узла на котором запущен snmptt;
$S - номер особого трапа (specific trap, 0 в случае enterprise trap);
$N - имя события, которое определено в .conf файле
$i - OID события (может быть шаблонным);
$O - OID трапа в символьном формате (необходимо включить опцию translate_trap_oid_format в snmptt.ini, также требуются установленный модуль Perl Net-SNMP и его включённая поддержка - опция net_snmp_perl_enable в snmptt.ini);
$o - OID трапа в числовом формате;
$R, $r - имя узла отправившего трап;
$aR, $ar - IP адрес узла отправившего трап;
$s - уровень статуса (указанный определение EVENT);
$T - Uptime: время прошедшее после инициализации сетевого объекта;
$X -  время попадания трапа в очередь обработки (в случае режима daemon) или текущее время (в случае режима standalone);
$x - дата попадания трапа в очередь обработки (в случае режима daemon) или текущее время (в случае режима standalone);
$# - количество переменных, которые передаются в трапе;
$$ - печатает символ $;
$@ - количество секунд прошедших от начала времён (01.01.1970 г.) до момента попадания трапа в очередь обработки (в случае режима daemon) или текущее время (в случае режима standalone);
$n - выводит значение переменной n;
$+n - выполняет подстановку переменной n в виде:  имя переменной:значение;
$-n -  выполняет подстановку переменной n в виде:  имя переменной (тип переменной):значение;
$vn - выводит имя переменной n;
$* - выводит значение всех переменных n;
$+* - тоже самое, что и $+n только делает подстановку для всех переменных;
$-* - тоже самое, что и $-n только делает подстановку для всех переменных.

Для работы с переменными которые выполняют подстановку n-перемененных, необходимо учитывать, что нумерация начинается с 1 и требуется настройка следующих опций в snmptt.ini:
  • net_snmp_perl_enable (и конечно же установленный модуль Perl Net-SNMP);
  • translate_* (по умолчанию все необходимые опции включены);
  • mibs_enviroment = ALL (или настройка файла snmp.conf).
Таким образом рассматриваемая строка будет генерировать собщение:

Port name: $2 Status: $4

в котором будет выполнена соответствующая подстановка переменных $2 и $4 их значениями, именем порта и его статусом.

Третья строка:
EXEC /usr/local/icinga/libexec/eventhandlers/submit_check_result $r "Port $2" 2 "Аварийный режим"

начинается с определения  EXEC за которым следует комадная строка. В данном случае текст "Аварийный режим" заключенный в двойные кавычки, передаётся обработчику событий системы мониторинга Icinga, которому также необходимо передать имя узла, имя сервиса и код статуса.
У каждого события может быть несколько строк с определением EXEC, соответственно можно можно выполнить несколько действий при получении одного трапа. В командной строке можно использовать те же переменные, что и в строке определения FORMAT.

Также в конфигурации трансляции трапа можно использовать определения: PREEXEC, NODES, MATCH, REGEX и конечно же SDESC и EDESC. Пара последних опрледелений используется для открытия возможного описания и его закрытия. Описание остальных определений можно найти в официальной документации.

В рассматриваемом примере используется обработчик событий поставляемый системой мониторинга Icinga, но можно использовать любой обработчик, в некоторых случаях возможно и придётся написать его самостоятельно.

Итак, достаточная настройка конфигурации обработки трапов для её применения в связке с системой мониторинга Icinga рассмотрена. Получено представление о наборе скриптов SNMPTT, о его огромных возможностях, в принципе, если оборудования подлежащее мониторингу удастся настроить на необходимое качество трапов, то на базе SNMPTT можно создать полноценную систему мониторинга, дополнив её своими или сторонними обработчиками событий.

среда, 24 сентября 2014 г.

Обработка и хранения snmp трапов

Обработка трапов будет заключаться в сборе трапов, с последующей их трансляцией. Для предоставления возможности некоторым лицам доступа к полученным трапам через веб-интерфейс, организуем их хранение в базе данных.

1. Сбор трапов

Этой задачей будет заниматься snmptrapd. Устанавливается он из пакета net-snmp.
После установки необходимо проверить, скомпилирован ли snmptrapd со встроенной поддержкой Perl:
[root@hostname]#snmptrapd -H 2>&1 | grep perl
    perl                     PERLCODE
    perlInitFile             string

наличие первой строки сообщает, что требуемая поддержка имеется и возможно использование встроенного обработчика помимо стандартного обработчика трапов.
Если же эта строка отсутствует, то придётся компилировать net-snmp из исходников с опцией --enable-embedded-perl или использовать только стандартный обработчик трапов, у которого есть существенный недостаток -- snmptthandler запускается и считывает snmptt.ini при каждом получении трапа, возможно из-за этого иногда происходит зависания процесса в случае использования стандартного обработчика в связке с PostgreSQL.

Конфигурация:
# grep -v ^# /etc/snmp/snmptrapd.conf
disableAuthorization yes
perl do "/usr/sbin/snmptthandler-embedded"
;

В первой строке отключаем авторизацию, чтобы получать все сообщения.
Вторая строка собственно и включает встроенный обработчик транслирующий трапы.

Чтобы не возникали проблемы с переводом символьных OID'ов в числовые, добавим опцию к сервису snmptrapd:
# grep -v ^# /etc/sysconfig/snmptrapd
OPTIONS="-On"

Для перехода к следующему этапу необходимо найти и скачать MIB файлы  для оборудование которое подлежит мониторингу посредством snmp трапов и скопировать их в каталог /usr/share/snmp/mibs/.

2. Трансляция трапов

Для этой задачи существует набор скриптов под названием SNMPTT (SNMP Trap Translator). В большинстве случаев возможностей snmptt будет хватать, но также существует  возможность парсить содержимое трапов своими скриптами, формировать сообщение по требуемым правилам, этот вариант будет описан позже (уже после установки и настройки системы мониторинга icinga).

Установка скриптов snmptt возможна двумя способами:
- установка через менеджер пакетов;
- установка из исходников (для дистрибутивов у которых пакетный менеджер не знает этот пакет и также для тех кто хочет установить самую свежую версию набора скриптов).

Установка во втором варианте заключается в том, что необходимо скачать исходники с www.snmptt.org и скопировать исполняемые и конфигурационные файлы, этот процесс описан в официальной документации и выглядит примерно так:

# tar zxvf snmptt_1.4.tgz
# cd snmptt_1.4
# cp snmptt /usr/sbin/
# cp snmptthandler-embedded /usr/sbin/
# chmod +x /usr/sbin/snmptthandler-embedded
# ls -la /usr/sbin/ | grep snmptt
-rwxr-xr-x.  1 root root      177455 Sep 25 15:04 snmptt
-rwxr-xr-x.  1 root root        9227 Sep 25 15:04 snmptthandler-embedded
# cp snmptt.ini /etc/snmp/
# cp snmptt.logrotate /etc/logrotate.d/snmptt

копировать файл примера конфигурации snmptt.conf.generic нет необходимости, достаточно просто заглянут в него для понимания того, как должна примерно выглядеть структура файла конфигурации трапов, которые требуется транслировать.

Рассмотрим основные моменты настройки snmptt.ini.

mode = daemon
Используем режим daemon, т.к. используется встроенный обработчик трапов и он поддерживает только этот режим. Режим standalone можно использовать только со стандартным обработчиком.

net_snmp_perl_enable = 1
Включаем поддержку модуля Perl и получаем возможность использовать подстановку переменных в конфигурационных ini файлах.

spool_directory = /var/spool/snmptt/
Вполне понятная опция, только необходимо создать данный каталог.

log_system_enable = 1
unknown_trap_log_enable = 1
Включаем логирование системных ошибок и неизвестных трапов. Файлы логов и их расположение используем стандартные, но необходимо создать каталог /var/log/snmptt/.

statistics_interval = 5184000
Опция связанная с какой то статистикой, посмотрим может в этот раз это сработает)

syslog_level = debug
Включаем самый подробный уровень логирования.

postgresql_dbi_enable = 1
postgresql_dbi_module = 1
postgresql_dbi_hostport_enable = 1
Использовать в качестве базы данных будем PostgreSQL.

postgresql_dbi_host = localhost
postgresql_dbi_port = 5432
postgresql_dbi_database = snmptt
Стандартные настройки

postgresql_dbi_table_statistics = snmptt_statistics
Оптимистично укажем таблицу для статистики)

postgresql_dbi_username = snmpttuser
postgresql_dbi_password = password
Параметры аторизации.

DEBUGGING = 2
DEBUGGING_FILE = /var/log/snmptt/snmptt.debug
DEBUGGING_FILE_HANDLER = /var/log/snmptt/snmptthandler.debug
Выставляем везде максимально возможный уровень логирования

snmptt_conf_files = <<END
/etc/snmp/snmptt.conf.apc
/etc/snmp/snmptt.conf.cisco
/etc/snmp/snmptt.conf.cisco_port_status
/etc/snmp/snmptt.conf.rad
/etc/snmp/snmptt.conf.mq
END
Секция в которой перечисляются все конфигурационные файлы. (см. Настройка конфигурационных файлов snmptt)

Установим и настроим PostgreSQL:
# yum install postgresql-server postgresql
# systemctl enable postgresql.service
# postgresql-setup initdb 

Настроим аутентификацию:
# grep -v ^# /var/lib/pgsql/data/pg_hba.conf
local   snmptt          snmptt                                  md5
local   all             all                                     md5
host    all             all             127.0.0.1/32            md5
host    all             all             ::1/128                 md5
# systemctl restart postgresql

Создадим базу и необходимые таблицы:
# su - postgres
$ createuser -P snmptt
Enter password for new role:
Enter it again:
$ createdb -O snmptt snmptt
$ psql snmptt
psql (9.2.7)
Type "help" for help.

snmptt=# CREATE TABLE snmptt (
snmptt(# eventname VARCHAR(50),
snmptt(# eventid VARCHAR(50),
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip  VARCHAR(16),
snmptt(# category VARCHAR(20),
snmptt(# severity VARCHAR(20),
snmptt(# uptime  VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt TO snmptt;
GRANT
snmptt=# CREATE TABLE snmptt_unknown (
snmptt(# trapoid VARCHAR(100),
snmptt(# enterprise VARCHAR(100),
snmptt(# community VARCHAR(20),
snmptt(# hostname VARCHAR(100),
snmptt(# agentip  VARCHAR(16),
snmptt(# uptime  VARCHAR(20),
snmptt(# traptime VARCHAR(30),
snmptt(# formatline VARCHAR(255));
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_unknown TO snmptt;
GRANT
snmptt=# CREATE TABLE snmptt_statistics (
snmptt(# stat_time VARCHAR(30),
snmptt(# total_received BIGINT,
snmptt(# total_translated BIGINT,
snmptt(# total_ignored BIGINT,
snmptt(# total_unknown BIGINT);
CREATE TABLE
snmptt=# GRANT ALL ON snmptt_statistics TO snmptt;
GRANT
snmptt=# \q

Добавим пользователя, изменим владельца созданных выше каталогов и настроим запуск демона snmptt:
# useradd snmptt
# id snmptt
# uid=1001(snmptt) gid=1001(snmptt) groups=1001(snmptt)
# cp snmptt-init.d /etc/init.d/snmptt
# ls -la /etc/init.d/ | grep snmp
-rwxr-xr-x.  1 root root  1702 Sep 25 15:56 snmptt
# chkconfig --add snmptt
# chkconfig snmptt on
# systemctl --system daemon-reload
# chown snmptt.snmptt /var/spool/snmptt
# chown snmptt.snmptt /var/log/snmptt
# systemctl start snmptt

при запуске получаем ошибку:

snmptt: Starting snmptt: Can't locate Config/IniFiles.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/sbin/snmptt line 4023.

Исправить эту проблему можно многими путями, например, установить пакет perl-Config-IniFiles, но в репозитариях CentOS 7 этот пакет отсутствует, поэтому найдем в интернетах rpm-пакет perl-Config-IniFiles и установим его:
[root@hostname]# rpm -i perl-Config-IniFiles-2.68-1.5.noarch.rpm
(в Fedora 21 этот пакет есть: # yum install perl-Config-IniFiles)

Чтобы соблюсти все зависимости и избавиться при запуске snmptt от следующих ошибок:
snmptt: Starting snmptt: Can't locate Sys/Syslog.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 5) line 1.
snmptt: Starting snmptt: Can't locate SNMP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 7) line 1.
snmptt: Starting snmptt: Can't locate SNMP.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 7) line 1.
snmptt: Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 9) line 1.
snmptt: Can't locate DBD/Pg.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at (eval 12) line 1.

установим необходимые пакеты:
# yum install perl-Sys-Syslog net-snmp-perl perl-DBD-Pg

Также потребуется пакет perl-Time-HiRes, при использовании встроенного обработчика ошибка о необходимости этого пакета не возникает, но без него и не будет работать передача трапов от snmptrapd в snmptt:
# yum install perl-Time-HiRes

и запустим снова демон snmptt:
# systemctl start snmptt

На этом этапе у нас работаю сервисы PostgreSQL и SNMPTT, теперь запустим snmptrapd:
# systemctl start snmptrapd

и начнём получать, транслировать и складывать в базу трапы.

Сейчас самое время заняться отладкой, для этого заглянем логи, например, в /var/log/snmptt/snmptt.debug обнаружилась следующая ошибка:
Postgres error: Unable to perform INSERT INTO (EXECUTE): ERROR:  value too long for type character varying(20)

Находим в логах PostgreSQL:
ERROR:  value too long for type character varying(20)
STATEMENT:  INSERT INTO snmptt_unknown (trapoid,enterprise,community,hostname,agentip,uptime,traptime,formatline) VALUES ($1,$2,$3,$4,$5,$6,$7,$8)

Получается, что проблема возникает с трапами которые не знает snmptt, определяем в /var/log/snmptt/snmpttunknown.log параметр, который не влазит в размеры указанные при создании базы и правим его (например, через phpPgAdmin), возможно с некоторым запасом.
И подобным образом добиваемся устранения всех ошибок.

3. Веб-интерфейс к полученным трапам

Данный этап необязателен и не оказывает влияние на работоспособность системы мониторинга.
Сперва установим веб-сервер и для удобства установим phpPgAdmin:
# yum install httpd
# systemctl enable httpd
# systemctl start httpd

Yum в CentOS 7 не знает пакет phpPgAdmin (в Fedora 21 пакет есть в репозиториях: # yum install phpPgAdmin), скачиваем дистрибутив с phppgadmin.sourceforge.net, распаковываем, например, в /usr/share/ и настраиваем веб-сервер:

# grep -v ^# /etc/httpd/conf.d/phppgadmin.conf
Alias /phppgadmin /usr/share/phppgadmin

<Directory /usr/share/phppgadmin>
  DirectoryIndex index.php
  AllowOverride None
  Require all granted
<IfModule mod_php5.c>
  php_flag magic_quotes_gpc Off
  php_flag track_vars On
  php_value include_path .
</IfModule>
<IfModule !mod_php5.c>
  <IfModule mod_actions.c>
    <IfModule mod_cgi.c>
      AddType application/x-httpd-php .php
      Action application/x-httpd-php /cgi-bin/php
    </IfModule>
    <IfModule mod_cgid.c>
      AddType application/x-httpd-php .php
      Action application/x-httpd-php /cgi-bin/php
    </IfModule>
  </IfModule>
</IfModule>

</Directory>


В Fedora 21 правим /etc/httpd/conf.d/phpPgAdmin.conf.
# grep Require /etc/httpd/conf.d/phpPgAdmin.conf
        #Require local
        Require all granted
        #Require host example.com


И перечитываем конфиги веб сервера:
# systemctl restart httpd

Простецкий веб-интерфейс WSTL:


Итак, основные вопросы со сбором, трансляцией и хранением трапов рассмотрены можно двигаться дальше к созданию системы мониторинга.