2012-04-12 22 views
0

我有一个Perl脚本来监视任何启用了SNMP的服务。Perl:SNMP - 通配符OID

它的工作方式是我有一个包含多个服务的配置文件,每个服务都有一个要收集的指标列表。

实施例:

[switch] 
switch_stuff1 = 1.3.6.1.2.1.7.1.0 
switch_stuff2 = 1.3.6.1.2.1.7.4.0 
switch_stuff3 = 1.3.6.1.2.1.6.2.0 
switch_stuff4 = 1.3.6.1.2.1.6.3.0 
switch_stuff5 = 1.3.6.1.2.1.6.5.0 

[router] 
router_stuff1 = 1.3.6.1.2.1.6.8.0 
router_stuff2 = 1.3.6.1.2.1.6.8.0 
router_stuff3 = 1.3.6.1.2.1.6.9.0 

[database] 
db_stuff1 = 1.3.6.1.2.1.6.4.0 
db_stuff2 = 1.3.6.1.2.1.6.5.0 

该脚本将通过配置文件循环,获得该信息对于所有的度量和输出写入到CSV文件。

现在,我需要帮助。

我被要求实现允许在SNMP路径中使用通配符来收集的逻辑。所以,我的配置文件现在需要这个样子:

[switch] 
switch_stuff1 = 1.5.1.6.* 
switch_stuff2 = 1.45.*.12 

所以当收集会发生,它会以某种方式循环是这样的:

 switch_stuff1 

1.5.1.6.0 – found, continue 
1.5.1.6.1 – found, continue 
1.5.1.6.2 – not found, stop 

     switch_stuff2   

1.45.0.12 – found, continue 
1.45.1.12 – found, continue 
1.45.2.12 – found, continue 
1.45.3.12 – not found, stop 

我目前使用Net :: SNMP库:

http://metacpan.org/pod/Net::SNMP

请问这是可能的吗?我想通过get_entries或get_table方法模拟一个“snmpwalk”,但我不太确定这是否可行。

如果任何人都可以帮忙或至少指出我在正确的方向,这将不胜感激。

谢谢。

回答

2

对于像switch_stuff1 = 1.5.1.6.*这样的条目,您只需发送第一个请求,然后通过get_next_request循环,只要您获取数据即可。

但是,像switch_stuff2 = 1.45.*.12这样的配置不再那么简单了。你不能使用get_next_request,你必须自己迭代可能的值。问题在于数字“通常”是连续的,但并非总是如此,在后一种情况下,它使得系统尝试所有可能的数字使得系统非常紧张。至少如果你真的需要这样做,那么我建议以某种方式缓存存在的OID,而不是每次收集数据时都扫描它们。