2

Ruby の NetAddr::Tree クラスを使用して多数の CIDR オブジェクトを保持していますが、CIDR オブジェクトをより大きなサブネットに圧縮する方法が必要です。

次のような IP を取得する方法が必要です。

12.26.8.0/21
12.26.16.0/21
12.26.24.0/21
12.26.32.0/21
12.26.40.0/21
12.27.152.0/21

ツリー内の関連するアドレス範囲をマージして、出力が次のようになるようにします。

12.26.8.0/21
12.26.16.0/20
12.26.32.0/20
12.27.152.0/21

ドキュメントを調べましたが、これを行う方法が見つかりません。必要に応じて NEtAddr::Tree を使用しないようにしています。重要なのは、IP/ネットマスク文字列のリストを取得し、それらをマージして、1 行ずつ出力することだけです。

4

1 に答える 1

4

NetAddr::mergeを見ましたか?

ドキュメントから:

CIDR アドレスまたは NetAddr::CIDR オブジェクトのリストを指定して、可能な限り最も効率的な方法でそれらをマージ (要約) します。要約は、新しく作成されたスーパーネットによって新しい IP 空間が「作成」されない場合にのみ発生します。たとえば、次のブロック (192.168.0.0/24、192.168.1.0/24、および 192.168.2.0/24) は、192.168.0.0/22 ではなく、192.168.0.0/23 および 192.168.2.0/24 に要約されます。

require 'netaddr'
require 'pp'

pp NetAddr.merge(
  %w[
    12.26.8.0/21
    12.26.16.0/21
    12.26.24.0/21
    12.26.32.0/21
    12.26.40.0/21
    12.27.152.0/21
  ].map{ |ip| NetAddr::CIDR.create(ip) }
)

=> ["12.26.8.0/21", "12.26.16.0/20", "12.26.32.0/20", "12.27.152.0/21"]
于 2012-10-03T14:20:28.087 に答える