2012-09-10 59 views
0

我正在將一箇舊的Perl腳本更新爲Ruby,並且在找到一個Perl庫的替代品時遇到問題。Perl Net :: CIDR :: Lite的Ruby版本?

在Perl腳本中,我們使用Net::CIDR::Lite,它採用開始和結束IP地址範圍並輸出一個CIDR字符串。

這是一個Perl的例子,顯示功能:

#!/usr/bin/perl 

use Net::CIDR::Lite; 
$cidrblocks = Net::CIDR::Lite->new; 
$cidrblocks->add_range("109.152.0.0-109.152.7.255"); 

$coveragezone = ""; 

@cidrlist = $cidrblocks->list(); 

$cidrcount=0; 
    while (defined $cidrlist[$cidrcount]) { 
      $coveragezone .= "$cidrlist[$cidrcount]"; 
    } 
    continue { 
      $cidrcount++; 
    } 

print "$coveragezone"; 

此腳本返回一個字符串:

=> 109.152.0.0/21 

有誰知道一個Ruby LIB或寶石,我可以用它來複制功能撥打電話add_range

$cidrblocks = Net::CIDR::Lite->new; 
$cidrblocks->add_range("109.152.0.0-109.152.7.255"); 

回答

0

您可以使用內置的IPAddr class也可以用來處理CIDR網絡,或者你使用它提供了一些額外的傭工ipaddress gem

一個簡單的例子是:

cidrblocks = [] 
cidrblocks << IPAddr.new("109.152.0.0/21") 

included = cidrblocks.find{|net| net.include?("109.152.6.123") } 
0

我喜歡NetAddr寶石,特別是其NetAddr::CIDR類。

這是一個非常豐富的IPv4/IPv6寶石。


通過我所知道的三個模塊來看,Ruby的內置IPADDR,netaddr中和ip地址,通過@holgerjust提到,他們沒有給我們提供一個起始IP和結束IP,並返回結果的能力網絡。它們都採用CIDR形式的網絡,然後嘗試測試各個IP以查看它們是否適合子網,或使用該子網定義來自行生成IP。

+0

看了一眼這一點,並不能找到一種方法來輸入開始和完成日常的IP地址,並得到了CIDR範圍內,任何想法我如何能在Ruby中做到這一點? – user891380

0

無法找到合適的寶石? 做什麼是自然的 - 重新調整Ruby中的Perl模塊。

0

雖然這可能不是你的問題完全相關的,我移植CIDR ::精簡版的一部分,以紅寶石:

https://github.com/noahhaon/cidr-lite-ruby

,我發現它的性能要遠遠高於在現有的紅寶石更好的替代品合併非常大的重疊CIDR集合的時間。

HTH