Похоже, вы используете строку в качестве индекса для таблицы SNMP. Индекс таблицы можно рассматривать как номер строки или идентификатор строки для этой таблицы. Часто индекс таблицы представляет собой просто число, начинающееся с 1 и увеличивающееся с каждой строкой в таблице. Такое число закодировано в OID как есть, т.е. если в таблице 3 столбца и две строки, то они будут иметь такие OID:
$base.1 # table
$base.1.1 # table entry
$base.1.1.1.1 # col1, row1
$base.1.1.1.2 # col1, row2
$base.1.1.2.1 # col2, row1
$base.1.1.2.2 # col2, row2
$base.1.1.3.1 # col3, row1
$base.1.1.3.2 # col3, row2
^---index
Иногда индекс представляет собой IP-адрес, комбинацию IP:порт или комбинацию двух IP-адресов, особенно для таблиц, связанных с IP. IP-адрес в качестве индекса будет выглядеть так:
$base.1 # table
$base.1.1 # table entry
$base.1.1.1.1.0.0.127 # col1, row "127.0.0.1"
$base.1.1.1.0.0.0.0 # col1, row "0.0.0.0"
$base.1.1.2.1.0.0.127 # col2, row "127.0.0.1"
$base.1.1.2.0.0.0.0 # col2, row "0.0.0.0"
$base.1.1.3.1.0.0.127 # col3, row "127.0.0.1"
$base.1.1.3.0.0.0.0 # col3, row "0.0.0.0"
^^^^^^^---- index
Как видите, длина индекса зависит от его типа данных (существует специальный тип данных IPV4).
Иногда индекс представляет собой строку (как в вашем случае). Когда используется строка, она также должна быть каким-то образом закодирована, чтобы составить «номер строки» для таблицы. Строки в качестве индексов кодируются посимвольно и им предшествует их длина, т.е.:
$base.1 # table
$base.1.1 # table entry
$base.1.1.1.2.65.66 # col1, row "AB"
$base.1.1.1.3.120.121.122 # col1, row "xyz"
$base.1.1.2.2.65.66 # col2, row "AB"
$base.1.1.2.3.120.121.122 # col2, row "xyz"
$base.1.1.3.2.65.66 # col3, row "AB"
$base.1.1.3.3.120.121.122 # col3, row "xyz"
^^^^^^^^^^^^^---- index
Итак, «AB» становится «2.65.66», потому что length('AB')==2
и ord('A')==65
, ord('B')==66
. Точно так же «xyz» становится «3.120.121.122».
Ваша функция to_oid
делает именно это, хотя я бы упростил ее следующим образом:
#!/usr/bin/env perl
use strict;
use warnings;
sub to_oid
{
my $string = shift;
return sprintf('%d.%s', length($string), join('.', unpack('C*', $string)));
}
my $rootOIDPoolStatus = '1.3.6.1.4.1.3375.2.2.5.5.2.1.2';
my $PoolName = '/Common/Atlassian';
my $poolname_oid = to_oid($PoolName);
my $complete_oid = "$rootOIDPoolStatus.$poolname_oid";
print $complete_oid, "\n";
Выход:
1.3.6.1.4.1.3375.2.2.5.5.2.1.2.17.47.67.111.109.109.111.110.47.65.116.108.97.115.115.105.97.110
|<------- rootOID ----------->|<------------ poolname_oid ----...--->|
person
PerlDuck
schedule
26.10.2017
unpack 'C',$
. Вы имели в видуunpack 'C',$_
? Кроме того,unpack 'C',$_
можно заменить наord($_)
, а иногда просто наord
). - person mob   schedule 25.10.2017sub to_oid($)
должно быть простоsub to_oid
. Это не вредит здесь, но это признак того, что вы смотрите на код, написанный кем-то, кто знает не лучше, чем вы! Вы уверены, что вам нужны точки.
через каждый второй символ? Вполне может быть, что строка должна быть закодирована в UTF-16, а дисплей преобразовал нулевые байты в точки. У вас есть ссылка на соответствующую часть спецификации Nagios? - person Borodin   schedule 26.10.2017