e$B$$$^$$$G$9!#e(B
#1877 e$B$O$"$j$,$H$&$4$6$$$^$7$?!#e(B
IPAddr
e$B$N%$%s%9%?%s%9$,%O%C%7%e$N%-!<$K=PMh$k$h$&$K$J$C$?$N$G!"4JC1$Je(B
Access Control List e$B$r=q$$$F$_$?$N$G$9$,!"e(B
RUBY_DESCRIPTION
=> “ruby 1.9.2dev (2009-08-07 trunk 24440) [i686-linux]”
acl = {
?> IPAddr.new(“192.168.2.0/29”) => :admin,
?> IPAddr.new(“192.168.2.0/24”) => :user,
?> }
=> {#<IPAddr: IPv4:192.168.2.0/255.255.255.248>=>:admin, #<IPAddr:
IPv4:192.168.2.0/255.255.255.0>=>:user}
acl.select{|r, | r === “192.168.2.56”}.max.last
=> :user
acl.select{|r, | r === “192.168.2.1”}.max.last
=> :user
e$B$H!“$A$g$C$H;DG0$J46$8$G$9!#e(B<=> e$B$G!“e(B@addr e$B$,F1$8>l9g$Oe(B
@mask_addr e$B$NBge(B
e$B$-$$J}$,e(B IPAddr
e$B$H$7$FBg$-$$$H$9$k$H!”%M%C%H%^%9%/$ND9$$J}$,:NMQ$5$l$ke(B
e$B$h$&$J%$%a!<%8$G$&$l$7$$5$$,$9$k$N$G$9$,!”$I$&$G$7$g$&$+!)e(B
e$B$^$?!"$3$l$Ge(B(e$B$H$$$&$+85$+$i!)e(B) IPAddr#==
e$B$OITMW$J5$$,$9$k$N$G$9$,!"2?e(B
e$B$+8+Mn$H$7$F$k$G$7$g$&$+!)e(B
IPAddr.new(“192.168.2.0/24”) == IPAddr.new(“192.168.2.0/32”)
e$B$,e(B true e$B$+$ie(B false
e$B$KJQ$o$k$H$$$&;EMMJQ99$J$N$G$9$,!"$I$&$G$7$g$&$+!)e(B
Nobuhiro IMAI [email protected]
Key fingerprint = F39E D552 545D 7C64 D690 F644 5A15 746C BD8E 7106
Index: lib/ipaddr.rb
— lib/ipaddr.rb (revision 24440)
+++ lib/ipaddr.rb (working copy)
@@ -133,16 +133,10 @@ class IPAddr
Returns a new ipaddr built by bitwise negation.
def ~
return self.clone.set(addr_mask(~@addr))
end
-
Returns true if two ipaddrs are equal.
-
def ==(other)
-
other = coerce_other(other)
-
return @family == other.family && @addr == other.to_i
-
end
-
Returns a new ipaddr built by masking IP address with the given
prefixlen/netmask. (e.g. 8, 64, “255.255.255.0”, etc.)
def mask(prefixlen)
return self.clone.mask!(prefixlen)
end
@@ -325,11 +319,11 @@ class IPAddr
def <=>(other)
other = coerce_other(other)
return nil if other.family != @family
-
return @addr <=> other.to_i
- return [@addr, @mask_addr] <=> [other.to_i, other.mask_addr]
end
include Comparable
Checks equality used by Hash.
def eql?(other)
@@ -372,10 +366,12 @@ class IPAddr
af, _to_string(@addr), _to_string(@mask_addr))
end
protected
- attr_reader :mask_addr
- def set(addr, *family)
case family[0] ? family[0] : @family
when Socket::AF_INET
if addr < 0 || addr > IN4MASK
raise ArgumentError, “invalid address”
@@ -789,15 +785,24 @@ class TC_Operator < Test::Unit::TestCase
a = ~@in6_addr_any
assert_equal(IN6MASK128, a.to_s)
assert_equal(“::”, @in6_addr_any.to_s)
end
- def test_equal
- assert_equal(true, @a == IPAddr.new(“3ffe:505:2::”))
- def test_compare
- assert_equal(true, @a == IPAddr.new(“3ffe:505:2::/48”))
- assert_equal(false, @a == IPAddr.new(“3ffe:505:2::”))
assert_equal(false, @a == IPAddr.new(“3ffe:505:3::”))
assert_equal(true, @a != IPAddr.new(“3ffe:505:3::”))
- assert_equal(false, @a != IPAddr.new(“3ffe:505:2::”))
- assert_equal(false, @a != IPAddr.new(“3ffe:505:2::/48”))
- x = IPAddr.new(“3ffe:505:3::/48”)
- y = IPAddr.new(“3ffe:505:2::/64”)
- assert_equal(true, @a < x)
- assert_equal(true, @a < y)
- assert_equal(false, x < y)
- min, max = [y, x, @a].minmax
- assert_equal(@a, min)
- assert_equal(x, max)
end
def test_mask
a = @a.mask(32)
assert_equal(“3ffe:505::”, a.to_s)
e$B$$$^$$$G$9!#e(B
From: Nobuhiro IMAI <nov_at_yo.rim.or.jp>
Date: Fri, 7 Aug 2009 18:31:36 +0900
e$B$H!"$A$g$C$H;DG0$J46$8$G$9!#e(B<=> e$B$G!“e(B@addr e$B$,F1$8>l9g$Oe(B @mask_addr e$B$NBge(B
e$B$-$$J}$,e(B IPAddr e$B$H$7$FBg$-$$$H$9$k$H!”%M%C%H%^%9%/$ND9$$J}$,:NMQ$5$l$ke(B
e$B$h$&$J%$%a!<%8$G$&$l$7$$5$$,$9$k$N$G$9$,!"$I$&$G$7$g$&$+!)e(B
e$B$^$?!"$3$l$Ge(B(e$B$H$$$&$+85$+$i!)e(B) IPAddr#== e$B$OITMW$J5$$,$9$k$N$G$9$,!"2?e(B
e$B$+8+Mn$H$7$F$k$G$7$g$&$+!)e(B
IPAddr.new(“192.168.2.0/24”) == IPAddr.new(“192.168.2.0/32”)
e$B$,e(B true e$B$+$ie(B false e$B$KJQ$o$k$H$$$&;EMMJQ99$J$N$G$9$,!"$I$&$G$7$g$&$+!)e(B
e$B>/$7;~4V$,3+$$$F$7$^$$$^$7$?$,!"e(B
- e$B%"%I%l%9$,F1$8>l9g!"%M%C%H%^%9%/D9$,D9$$J}$,e(B IPAddr
e$B$H$7$FBg$-$$$H$_e(B
e$B$J$9e(B(IPAddr#<=> e$B$Ge(B @mask_addr e$B$r9MN8$9$ke(B)
- <=> e$B$He(B Comparable e$B$K$h$je(B ==
e$B$ODj5A$5$l$k$N$G!"e(BIPAddr#== e$B$OGQ;_$9$ke(B
e$B$H$$$&e(B [ruby-dev:39038] e$B$N%Q%C%A$O$I$&$G$7$g$&$+!)e(B
e$B$$$^$$$G$9!#e(B
From: Nobuhiro IMAI <nov_at_yo.rim.or.jp>
Date: Fri, 14 Aug 2009 21:19:42 +0900
e$B>/$7;~4V$,3+$$$F$7$^$$$^$7$?$,!"e(B
- e$B%"%I%l%9$,F1$8>l9g!"%M%C%H%^%9%/D9$,D9$$J}$,e(B IPAddr e$B$H$7$FBg$-$$$H$_e(B
e$B$J$9e(B(IPAddr#<=> e$B$Ge(B @mask_addr e$B$r9MN8$9$ke(B)
- <=> e$B$He(B Comparable e$B$K$h$je(B == e$B$ODj5A$5$l$k$N$G!"e(BIPAddr#== e$B$OGQ;_$9$ke(B
e$B$H$$$&e(B [ruby-dev:39038] e$B$N%Q%C%A$O$I$&$G$7$g$&$+!)e(B
e$B$5$i$K;~4V$,3+$$$F$7$^$$$^$7$?$,!"$I$A$i$b<u$1F~$l$i$l$J$$$G$7$g$&$+!)e(B
IPAddr.new(“192.168.2.0/24”) == IPAddr.new(“192.168.2.0/32”)
e$B$,e(B true e$B$+$ie(B false e$B$KJQ$o$k$H$$$&;EMMJQ99$J$N$G$9$,!"$I$&$G$7$g$&$+!)e(B
e$B$H$$$&$N$,$^$:$$$G$7$g$&$+!#e(B
 ã“ã“数ヶ月ç§ç”Ÿæ´»ã§å¿™ã—ãã€è¿”事ãŒé…ã‚Œã¦ã—ã¾ã„ã™ã¿ã¾ã›ã‚“。
At Sat, 12 Sep 2009 21:18:13 +0900,
Nobuhiro IMAI wrote:
ã•ã‚‰ã«æ™‚é–“ãŒé–‹ã„ã¦ã—ã¾ã„ã¾ã—ãŸãŒã€ã©ã¡ã‚‰ã‚‚å—ã‘入れられãªã„ã§ã—ょã†ã‹ï¼Ÿ
IPAddr.new(“192.168.2.0/24”) == IPAddr.new(“192.168.2.0/32”)
㌠true ã‹ã‚‰ false ã«å¤‰ã‚ã‚‹ã¨ã„ã†ä»•æ§˜å¤‰æ›´ãªã®ã§ã™ãŒã€ã©ã†ã§ã—ょã†ã‹ï¼Ÿ
ã¨ã„ã†ã®ãŒã¾ãšã„ã§ã—ょã†ã‹ã€‚
 ã“ã‚Œã¯å—ã‘入れられã¾ã›ã‚“。IPAddrã¯ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚‚ä¿æŒã™ã‚‹ãŸã‚
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚‚表ç¾ã§ãã¾ã™ãŒã€ç¬¬ä¸€ç¾©ã¯IPアドレスãªã®ã§ã€ãƒãƒƒãƒˆ
マスクã®é•ã„ã§ç‰ã—ããªããªã‚‹ã®ã¯ã¾ãšã„ã§ã™ã€‚
 ãã®ä¸Šã§ã€ã‚½ãƒ¼ãƒˆã®ä¾¿å®œã‚’考ãˆã¦ <=> ã«ã¤ã„ã¦ã¯ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’
見㦠a1 == a2 && (a1 <=> a2) != 0 ã¨ã„ã†ã‚±ãƒ¼ã‚¹ã‚’許ã™ã¨ã„ã†ã®ã‚‚
ãªãã¯ãªã„ã¨æ€ã„ã¾ã™ãŒã€ãƒ¦ãƒ¼ã‚¹ã‚±ãƒ¼ã‚¹ã«è¦‹ã‚‰ã‚Œã‚‹ãƒ‹ãƒ¼ã‚ºã‚’満ãŸã™
よりよã„方法ã¯ã»ã‹ã«ã‚ã‚‹ã¨æ€ã„ã¾ã™ã€‚
 ã¾ãšã€æ”¹ã‚ã¦APIを見るã¨ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’å–る手段ãŒãªã„ã®ã§ã€
#mask_addr ã‚„ #prefixlen ã®ã‚ˆã†ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’用æ„ã—ã¦
sort_by/max_by {|i| [i, i.mask_addr] } ã§ãるよã†ã«ã™ã‚‹ã®ãŒ
ã²ã¨ã¤ã€‚(ã“ã‚Œã¯æœ¬ä»¶ã«é–¢ä¿‚ãªã)
 もã†ä¸€ã¤ã¯ class NetAddr < IPAddr ã®ã‚ˆã†ãªã‚µãƒ–クラスを作りã€
ãã¡ã‚‰ã§ == ã‚„ <=> をオーãƒãƒ¼ãƒ©ã‚¤ãƒ‰ã™ã‚‹æ–¹æ³•ã€‚
 両方やã£ã¦ã‚‚ã„ã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“ã。ã©ã†ã§ã—ょã†ã‹ã€‚
At Mon, 28 Sep 2009 10:26:18 +0900,
Kazuhiro NISHIYAMA wrote:
IPAddr.new(“192.168.0.2/24”) #=> #<IPAddr: IPv4:192.168.0.0/255.255.255.0>
ã®ã‚ˆã†ã«ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ãŒã‚ã‚‹ã¨newã®å¼•æ•°ã®æ–‡å—åˆ—ã‚ˆã‚Šã‚‚æƒ…å ±ãŒæ¸›ã£ã¦ã—ã¾ã£ã¦
別途元ã®IPアドレスをæŒã£ã¦ãŠã‹ãªã„ã¨ã„ã‘ãªã„ã®ãŒä¸ä¾¿ã§ã™ã€‚
 ã“ã‚Œã¯ã©å¿˜ã‚Œã—ã¦ã„ã¾ã—ãŸã€‚ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’指定ã™ã‚‹ã¨ mask! ã•ã‚Œã¦
ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãªã‚‹ã‚“ã§ã™ã。(ã¨ã„ã†ã‹ã™ã¹ã¦ãŒãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯
アドレスã§ã€ãƒ•ãƒ«ãƒ“ットマスクã«ã‚ˆã£ã¦å˜ä¸€ã®IPアドレスを表ã™ï¼‰
 ã¨ã™ã‚Œã° == ã®å¤‰æ›´ã¯ãƒªãƒ¼ã‚ºãƒŠãƒ–ルã¨ã‚‚言ãˆã¾ã™ãŒã€äº’æ›æ€§ã‚’失ã†ã“ã¨
ã«ã¯ã‚„ã¯ã‚ŠæŠµæŠ—を覚ãˆã¾ã™ã€‚
 次ã®ã‚ˆã†ãªAPIã®æ”¹ä¿®æ–¹é‡ã¯ã©ã†ã§ã—ょã†ã‹ã€‚
IPAddr.new(addr_with_netmask) # / ã‚’å«ã‚€æ–‡å—列
ã§ç”Ÿæˆã•ã‚ŒãŸã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ã«ã¤ã„ã¦ã¯å†…部ã§ãƒ•ãƒ©ã‚°ã‚’ç«‹ã¦ã€ netmask ã«
ä¾ã‚‰ãªã„比較をå«ã‚従æ¥é€šã‚Šã«æŒ¯ã‚‹èˆžã†ã‚ˆã†ã«ã—ã¾ã™ã€‚
 ãã®ä¸Šã§ã“ã®ç”¨æ³•ã¯æ®µéšŽçš„ã«è¦å‘Šã€œå»ƒæ¢ã—ã€æ–°è¨ã™ã‚‹
IPAddr.parse(addr_with_netmask) # / ã‚’å«ã‚€æ–‡å—列
IPAddr.new(addr, netmask) # ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã¯ç¬¬2引数ã§æŒ‡å®š
ã¸ã®ç§»è¡Œã‚’促ã—ã¾ã™ã€‚
 ã“ã†ã™ã‚‹ã¨ã€æ–°ãŸã«ã€Œãƒ•ãƒ«ãƒ“ットã§ãªã„ãƒãƒƒãƒˆãƒžã‚¹ã‚¯ã‚’指定ã•ã‚ŒãŸ
IPアドレスã€ã¨ã„ã†æ–°ç¨®ã®ã‚¤ãƒ³ã‚¹ã‚¿ãƒ³ã‚¹ãŒåŠ ã‚ã‚‹ã“ã¨ã«ãªã‚‹ã®ã§ã€
ç‰ä¾¡æ€§ã‚„大å°é–¢ä¿‚ã‚’å«ã‚€ä»»æ„ã®æ¼”ç®—ã«ã¤ã„ã¦æ–°ã—ã„定義を導入ã§ãã‚‹
よã†ã«ãªã‚Šã¾ã™ã€‚
 ãŸã ã®æ€ã„ã¤ãã§ã™ãŒã€ã²ã¨ã¤ã®ææ–™ã¨ã—ã¦ã„ãŸã ã‘ã‚Œã°ã€‚
e$B$$$^$$$G$9!#e(B
From: “Akinori MUSHA” <knu_at_iDaemons.org>
Date: Sun, 27 Sep 2009 12:00:48 +0900
- e$B%"%I%l%9$,F1$8>l9g!"%M%C%H%^%9%/D9$,D9$$J}$,e(B IPAddr e$B$H$7$FBg$-$$$H$_e(B
e$B$J$9e(B(IPAddr#<=> e$B$Ge(B @mask_addr e$B$r9MN8$9$ke(B)
- <=> e$B$He(B Comparable e$B$K$h$je(B == e$B$ODj5A$5$l$k$N$G!"e(BIPAddr#== e$B$OGQ;_$9$ke(B
e$B$H$$$&e(B [ruby-dev:39038] e$B$N%Q%C%A$O$I$&$G$7$g$&$+!)e(B
IPAddr.new(“192.168.2.0/24”) == IPAddr.new(“192.168.2.0/32”)
e$B$,e(B true e$B$+$ie(B false e$B$KJQ$o$k$H$$$&;EMMJQ99$J$N$G$9$,!"$I$&$G$7$g$&$+!)e(B
e$B$H$$$&$N$,$^$:$$$G$7$g$&$+!#e(B
e$B!!$3$l$O<u$1F~$l$i$l$^$;$s!#e(BIPAddre$B$O%M%C%H%^%9%/$bJ];}$9$k$?$ae(B
e$B%M%C%H%o!<%/$bI=8=$G$-$^$9$,!“Bh0l5A$Oe(BIPe$B%”%I%l%9$J$N$G!"%M%C%He(B
e$B%^%9%/$N0c$$$GEy$7$/$J$/$J$k$N$O$^$:$$$G$9!#e(B
e$B$=$&$G$9$+!"J,$+$j$^$7$?!#e(B<=> e$B$NJQ99$O<h$j2<$2$^$9!#e(B
e$B$=$l$O$=$l$H$7$F!“e(B<=> e$B$He(B include Comparable e$B$,$”$l$Pe(B
== e$B$NDj5A$OITMW$Ke(B
e$B;W$($k$N$G$9$,!“e(B==
e$B$rL@<(E*$KDj5A$9$kM}M3$,$”$l$P65$($F$/$@$5$$!#8=>ue(B
e$B$G$Oe(B == e$B$NDj5A$rA4It>C$7$F$b!"F0:n$OF1$8$@$H;W$$$^$9!#e(B
e$B!!$b$&0l$D$Oe(B class NetAddr < IPAddr e$B$N$h$&$J%5%V%/%i%9$r:n$j!"e(B
e$B$=$A$i$Ge(B == e$B$de(B <=> e$B$r%*!<%P!<%i%$%I$9$kJ}K!!#e(B
e$B!!N>J}$d$C$F$b$$$$$+$b$7$l$^$;$s$M!#$I$&$G$7$g$&$+!#e(B
e$B$3$A$i$O;~4V$r8+$D$1$F%Q%C%A$r=q$1$l$P$$$$$J$H;W$$$^$9!#e(B
At Sun, 27 Sep 2009 12:00:48 +0900,
Akinori MUSHA wrote:
e$B!!$3$l$O<u$1F~$l$i$l$^$;$s!#e(BIPAddre$B$O%M%C%H%^%9%/$bJ];}$9$k$?$ae(B
e$B%M%C%H%o!<%/$bI=8=$G$-$^$9$,!“Bh0l5A$Oe(BIPe$B%”%I%l%9$J$N$G!"%M%C%He(B
e$B%^%9%/$N0c$$$GEy$7$/$J$/$J$k$N$O$^$:$$$G$9!#e(B
e$B%M%C%H%^%9%/$G;W$$=P$7$?$N$G$9$,!"e(B
IPAddr.new(“192.168.0.1/24”) #=> #<IPAddr:
IPv4:192.168.0.0/255.255.255.0>
IPAddr.new(“192.168.0.2/24”) #=> #<IPAddr:
IPv4:192.168.0.0/255.255.255.0>
e$B$N$h$&$K%M%C%H%^%9%/$,$"$k$He(Bnewe$B$N0z?t$NJ8;zNs$h$j$b>pJs$,8:$C$F$7$^$C$Fe(B
e$BJLES85$Ne(BIPe$B%"%I%l%9$r;}$C$F$*$+$J$$$H$$$1$J$$$N$,ITJX$G$9!#e(B