您似乎正在使用字符串作为 SNMP 表的索引。表的索引可以被认为是该表的行号或行 ID。通常,表的索引只是一个从 1 开始并随着表的每一行而增加的数字。这样的数字按原样在 OID 中编码,即如果表有 3 列和 2 行,它们将具有以下 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:port 的组合,或者两个 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
and 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 ----...--->|