YkLib 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (125) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +11 -0
  3. data/.rspec +3 -0
  4. data/.travis.yml +6 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +7 -0
  7. data/Gemfile.lock +34 -0
  8. data/LICENSE.txt +21 -0
  9. data/README.md +44 -0
  10. data/Rakefile +6 -0
  11. data/YkLib.gemspec +29 -0
  12. data/bin/console +14 -0
  13. data/bin/setup +8 -0
  14. data/lib/YkLib/Yk/__advance__.rb +151 -0
  15. data/lib/YkLib/Yk/__defun__.rb +44 -0
  16. data/lib/YkLib/Yk/__hook__.rb +244 -0
  17. data/lib/YkLib/Yk/__minmax__.rb +123 -0
  18. data/lib/YkLib/Yk/__stdlog.rb +329 -0
  19. data/lib/YkLib/Yk/adhocLiterals/email.rb +119 -0
  20. data/lib/YkLib/Yk/adhocLiterals/path.rb +402 -0
  21. data/lib/YkLib/Yk/adhocLiterals/tag.rb +19 -0
  22. data/lib/YkLib/Yk/adhocLiterals/url.rb +36 -0
  23. data/lib/YkLib/Yk/adhocLiterals.rb +199 -0
  24. data/lib/YkLib/Yk/auto_escseq.rb +5 -0
  25. data/lib/YkLib/Yk/auto_pstore.rb +179 -0
  26. data/lib/YkLib/Yk/bsearch.rb +120 -0
  27. data/lib/YkLib/Yk/clambda.rb +309 -0
  28. data/lib/YkLib/Yk/confLine.rb +423 -0
  29. data/lib/YkLib/Yk/create_tty_width_available.rb +24 -0
  30. data/lib/YkLib/Yk/crypt.rb +26 -0
  31. data/lib/YkLib/Yk/debug2 +1 -0
  32. data/lib/YkLib/Yk/debug2.rb +473 -0
  33. data/lib/YkLib/Yk/debugout.rb +139 -0
  34. data/lib/YkLib/Yk/email_tz.rb +533 -0
  35. data/lib/YkLib/Yk/enum_expect.rb +170 -0
  36. data/lib/YkLib/Yk/errlog.rb +5 -0
  37. data/lib/YkLib/Yk/escseq.rb +59 -0
  38. data/lib/YkLib/Yk/eval_alt.rb +281 -0
  39. data/lib/YkLib/Yk/expector.rb +93 -0
  40. data/lib/YkLib/Yk/fetch.rb +556 -0
  41. data/lib/YkLib/Yk/fetch_old.rb +290 -0
  42. data/lib/YkLib/Yk/fib.rb +158 -0
  43. data/lib/YkLib/Yk/file_aux.rb +843 -0
  44. data/lib/YkLib/Yk/file_aux2.rb +919 -0
  45. data/lib/YkLib/Yk/file_aux_old.rb +160 -0
  46. data/lib/YkLib/Yk/filemod.rb +19 -0
  47. data/lib/YkLib/Yk/force_escseq.rb +3 -0
  48. data/lib/YkLib/Yk/generator__.rb +144 -0
  49. data/lib/YkLib/Yk/generator__.rb.org +139 -0
  50. data/lib/YkLib/Yk/indenter/argless_case.rb +46 -0
  51. data/lib/YkLib/Yk/indenter/each_token.rb +671 -0
  52. data/lib/YkLib/Yk/indenter/free_case.rb +313 -0
  53. data/lib/YkLib/Yk/indenter/if_less.rb +53 -0
  54. data/lib/YkLib/Yk/indenter/independent_ensure.rb +23 -0
  55. data/lib/YkLib/Yk/indenter/independent_rescue.rb +23 -0
  56. data/lib/YkLib/Yk/indenter/operand_circumflex.rb +0 -0
  57. data/lib/YkLib/Yk/indenter/operand_period.rb +16 -0
  58. data/lib/YkLib/Yk/indenter/parenless_and.rb +37 -0
  59. data/lib/YkLib/Yk/indenter/post_test.rb +48 -0
  60. data/lib/YkLib/Yk/indenter/token.rb +1525 -0
  61. data/lib/YkLib/Yk/indenter.rb +1382 -0
  62. data/lib/YkLib/Yk/inot.rb +265 -0
  63. data/lib/YkLib/Yk/intf.rb +815 -0
  64. data/lib/YkLib/Yk/io_aux.rb +1332 -0
  65. data/lib/YkLib/Yk/ioctl.rb +60 -0
  66. data/lib/YkLib/Yk/ipcc.rb +87 -0
  67. data/lib/YkLib/Yk/ipcountry.rb +207 -0
  68. data/lib/YkLib/Yk/ipv4adr.rb +318 -0
  69. data/lib/YkLib/Yk/localmail.rb +276 -0
  70. data/lib/YkLib/Yk/method_chain.rb +359 -0
  71. data/lib/YkLib/Yk/misc_tz.rb +1716 -0
  72. data/lib/YkLib/Yk/missing_method.rb +50 -0
  73. data/lib/YkLib/Yk/mojiConv.rb +257 -0
  74. data/lib/YkLib/Yk/nostdlog.rb +4 -0
  75. data/lib/YkLib/Yk/on_marshal.rb +20 -0
  76. data/lib/YkLib/Yk/overrider.rb +47 -0
  77. data/lib/YkLib/Yk/path.rb +293 -0
  78. data/lib/YkLib/Yk/path_aux.rb +883 -0
  79. data/lib/YkLib/Yk/path_aux_alt.rb +0 -0
  80. data/lib/YkLib/Yk/path_rep.rb +1267 -0
  81. data/lib/YkLib/Yk/pg_setup.rb +917 -0
  82. data/lib/YkLib/Yk/procinfo.rb +314 -0
  83. data/lib/YkLib/Yk/proclist.rb +492 -0
  84. data/lib/YkLib/Yk/property.rb +863 -0
  85. data/lib/YkLib/Yk/ranger.rb +606 -0
  86. data/lib/YkLib/Yk/resolv_tz.rb +88 -0
  87. data/lib/YkLib/Yk/rlprompt.rb +73 -0
  88. data/lib/YkLib/Yk/rootexec.rb +48 -0
  89. data/lib/YkLib/Yk/rpm-packageproxy.rb +784 -0
  90. data/lib/YkLib/Yk/rpm-packageproxy2.rb +1430 -0
  91. data/lib/YkLib/Yk/rwhen.rb +21 -0
  92. data/lib/YkLib/Yk/selector.rb +124 -0
  93. data/lib/YkLib/Yk/set.rb +170 -0
  94. data/lib/YkLib/Yk/shellquote.rb +300 -0
  95. data/lib/YkLib/Yk/sio.rb +1001 -0
  96. data/lib/YkLib/Yk/sio0.rb +835 -0
  97. data/lib/YkLib/Yk/sio_aux.rb +1524 -0
  98. data/lib/YkLib/Yk/sio_inot.rb +86 -0
  99. data/lib/YkLib/Yk/sock_aux.rb +42 -0
  100. data/lib/YkLib/Yk/spipe.rb +843 -0
  101. data/lib/YkLib/Yk/sql_table.rb +565 -0
  102. data/lib/YkLib/Yk/stdlog.rb +4 -0
  103. data/lib/YkLib/Yk/syscommand.rb +173 -0
  104. data/lib/YkLib/Yk/sysinit.rb +75 -0
  105. data/lib/YkLib/Yk/ttyFontWidth.rb +46113 -0
  106. data/lib/YkLib/Yk/tty_char.dump +0 -0
  107. data/lib/YkLib/Yk/tty_char.rb +47 -0
  108. data/lib/YkLib/Yk/tty_char_create.rb +437031 -0
  109. data/lib/YkLib/Yk/tty_char_static.rb +437016 -0
  110. data/lib/YkLib/Yk/tty_rewrite.rb +142 -0
  111. data/lib/YkLib/Yk/tty_str.rb +461 -0
  112. data/lib/YkLib/Yk/tty_width.dat.rb +114 -0
  113. data/lib/YkLib/Yk/tty_width.rb +180 -0
  114. data/lib/YkLib/Yk/tty_width_available +569 -0
  115. data/lib/YkLib/Yk/tty_width_list +0 -0
  116. data/lib/YkLib/Yk/tty_width_list.linux +280 -0
  117. data/lib/YkLib/Yk/tty_width_list.windows +324 -0
  118. data/lib/YkLib/Yk/tz_tty +0 -0
  119. data/lib/YkLib/Yk/tz_tty.rb +0 -0
  120. data/lib/YkLib/Yk/uprepos.rb +94 -0
  121. data/lib/YkLib/Yk/userinfo.rb +91 -0
  122. data/lib/YkLib/Yk/with.rb +109 -0
  123. data/lib/YkLib/version.rb +3 -0
  124. data/lib/YkLib.rb +6 -0
  125. metadata +170 -0
@@ -0,0 +1,60 @@
1
+ # generated by 'ruby-ioctl-0.1.4-0tz1.src.rpm' on Thu Feb 11 19:33:56 +0800 2010
2
+
3
+ module Ioctl
4
+ FIOSETOWN = 0x8901
5
+ SIOCSPGRP = 0x8902
6
+ FIOGETOWN = 0x8903
7
+ SIOCGPGRP = 0x8904
8
+ SIOCGSTAMP = 0x8906
9
+ TCGETS = 0x5401
10
+ TCSETS = 0x5402
11
+ TCSETSW = 0x5403
12
+ TCSETSF = 0x5404
13
+ TCGETA = 0x5405
14
+ TCSETA = 0x5406
15
+ TCSETAW = 0x5407
16
+ TCSETAF = 0x5408
17
+ TCSBRK = 0x5409
18
+ TCXONC = 0x540a
19
+ TCFLSH = 0x540b
20
+ TIOCEXCL = 0x540c
21
+ TIOCNXCL = 0x540d
22
+ TIOCSCTTY = 0x540e
23
+ TIOCGPGRP = 0x540f
24
+ TIOCSPGRP = 0x5410
25
+ TIOCOUTQ = 0x5411
26
+ TIOCSTI = 0x5412
27
+ TIOCGWINSZ = 0x5413
28
+ TIOCSWINSZ = 0x5414
29
+ TIOCMGET = 0x5415
30
+ TIOCMBIS = 0x5416
31
+ TIOCMBIC = 0x5417
32
+ TIOCMSET = 0x5418
33
+ TIOCGSOFTCAR = 0x5419
34
+ TIOCSSOFTCAR = 0x541a
35
+ FIONREAD = 0x541b
36
+ TIOCINQ = 0x541b
37
+ TIOCLINUX = 0x541c
38
+ TIOCCONS = 0x541d
39
+ TIOCGSERIAL = 0x541e
40
+ TIOCSSERIAL = 0x541f
41
+ TIOCPKT = 0x5420
42
+ FIONBIO = 0x5421
43
+ TIOCNOTTY = 0x5422
44
+ TIOCSETD = 0x5423
45
+ TIOCGETD = 0x5424
46
+ TCSBRKP = 0x5425
47
+ FIONCLEX = 0x5450
48
+ FIOCLEX = 0x5451
49
+ FIOASYNC = 0x5452
50
+ TIOCSERCONFIG = 0x5453
51
+ TIOCSERGWILD = 0x5454
52
+ TIOCSERSWILD = 0x5455
53
+ TIOCGLCKTRMIOS = 0x5456
54
+ TIOCSLCKTRMIOS = 0x5457
55
+ TIOCSERGSTRUCT = 0x5458
56
+ TIOCSERGETLSR = 0x5459
57
+ TIOCSERGETMULTI = 0x545a
58
+ TIOCSERSETMULTI = 0x545b
59
+ end
60
+
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'Yk/path_aux'
5
+ require 'Yk/ipv4adr'
6
+ #require 'path_aux'
7
+ #require 'socket'
8
+
9
+
10
+ class String
11
+ ICONF = "/etc/ipcc.conf"
12
+ RCONF = "/etc/resolv.conf"
13
+ port = 53535
14
+ srv = nil
15
+ if ICONF.readable_file?
16
+ ICONF.read_each_line do |ln|
17
+ if((srv = ln.strip_comment) != "")
18
+ cfile = ICONF
19
+ if(srv =~ /:/)
20
+ port = $'
21
+ srv = $`
22
+ end
23
+ break;
24
+ end
25
+ end
26
+ end
27
+ if !srv && RCONF.readable_file?
28
+ RCONF.read_each_line do |ln|
29
+ arr = ln.strip_comment.split
30
+ if(arr && arr[0] == "nameserver" && arr[1])
31
+ cfile = ICONF
32
+ srv = arr[1]
33
+ break
34
+ end
35
+ end
36
+ end
37
+ if !srv
38
+ cfile = "default setting"
39
+ srv = "127.0.0.1"
40
+ end
41
+ sockaddr = nil
42
+ begin
43
+ sockaddr = Socket.sockaddr_in(port, srv)
44
+ rescue SocketError
45
+ STDERR.write "cannot create socket for #{srv}:#{port} (from #{ICONF})\n"
46
+ end
47
+ S = Socket.open(Socket::AF_INET, Socket::SOCK_DGRAM, 0) rescue nil
48
+ S.connect(sockaddr) if S
49
+ def to_ipcc
50
+ ipadr = nil
51
+ if self =~ /^(\d|[1-9]\d|[12]\d\d)\.(\d|[1-9]\d|[12]\d\d)\.(\d|[1-9]\d|[12]\d\d)\.(\d|[1-9]\d|[12]\d\d)$/
52
+ if $1.to_i <= 255 && $2.to_i <= 255 && $3.to_i <= 255 && $4.to_i <= 255
53
+ ipadr = self
54
+ end
55
+ end
56
+ if !ipadr
57
+ ipadr = to_ipadr
58
+ end
59
+ if !ipadr
60
+ STDERR.write "cannot get ip address for #{self}\n"
61
+ nil
62
+ else
63
+ sin_addr = ipadr.split(/\./).map{|e| e.to_i}.pack("CCCC")
64
+ 10.times do
65
+ S.write sin_addr
66
+ sret = IO.select [S], [], [], 0.1
67
+ if sret && sret[0][0] == S
68
+ buff = S.recv(6) rescue nil
69
+ if buff && buff.size == 6 && buff[0..3] == sin_addr
70
+ if buff[4] == 0 || buff[5] == 0
71
+ return ""
72
+ else
73
+ return buff[4..5]
74
+ end
75
+ end
76
+ end
77
+ end
78
+ nil
79
+ end
80
+ end
81
+ end
82
+
83
+
84
+ if __FILE__.normalize_path == $0.normalize_path
85
+ print ARGV[0].to_ipcc, "\n" if ARGV[0]
86
+ end
87
+
@@ -0,0 +1,207 @@
1
+ #!/usr/bin/env ruby
2
+
3
+
4
+ require 'Yk/path_aux'
5
+ require 'Yk/auto_pstore'
6
+ require 'Yk/bsearch'
7
+ require 'Yk/ipv4adr'
8
+ require 'timeout'
9
+
10
+ module IPCountry
11
+
12
+ IPListURLs = %w{
13
+ ftp://ftp.ripe.net/pub/stats/apnic/delegated-apnic-latest
14
+ ftp://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest
15
+ ftp://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-latest
16
+ ftp://ftp.ripe.net/ripe/stats/delegated-ripencc-latest
17
+ ftp://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
18
+ }
19
+
20
+
21
+ class IPInfo
22
+ attr :country, true
23
+ attr :start, true
24
+ attr :ed, true
25
+ attr :nxt, true
26
+ def initialize c, s, e, n = nil
27
+ @country = c
28
+ if c == ""
29
+ @country = " "
30
+ end
31
+ @start = s
32
+ @ed = e
33
+ @nxt = n
34
+ end
35
+ def inspect
36
+ [@country, @start.to_ipadr, @start].inspect
37
+ end
38
+ end
39
+
40
+
41
+ class AllocList < Array
42
+ attr :date
43
+ def refresh
44
+ tmp = []
45
+ IPListURLs.each do |u|
46
+ u.timeout = 3600 * 12
47
+ end
48
+ IPListURLs.each do |u|
49
+ u.read_each_line do |ln|
50
+ arr = ln.split /\|/
51
+ if arr[2] == "ipv4" && arr[1] != "*" && arr[1] != ""
52
+ tmp.push IPInfo.new(arr[1], arr[3].to_i, arr[3].to_i + arr[4].to_i)
53
+ end
54
+ end
55
+ end
56
+ tmp = tmp.sort_by do |a|
57
+ a.start
58
+ end
59
+ tmp2 = []
60
+ (0..tmp.size - 2).each do |i|
61
+ if tmp[i].country == tmp[i + 1].country && tmp[i].ed == tmp[i + 1].start
62
+ tmp[i + 1].start = tmp[i].start
63
+ next
64
+ end
65
+ tmp[i].nxt = tmp[i + 1].start
66
+ tmp2.push tmp[i]
67
+ end
68
+ tmp = tmp2
69
+ tmp[-1].nxt = tmp[-1].ed
70
+ clear
71
+ tmp.each do |e|
72
+ push e
73
+ end
74
+ ("/var/data".check_dir / "ipcountry").open "w" do |fw|
75
+ (0..tmp.size - 2).each do |i|
76
+ if tmp[i].start >= tmp[i].ed
77
+ next
78
+ end
79
+ if i == 0 && tmp[i].start != 0
80
+ fw.write([0, 0, 0, 0, 0].pack("ICCCC"))
81
+ end
82
+ fw.write([tmp[i].start, tmp[i].country[0..0], tmp[i].country[1..1], 0, 0].pack("IAACC"))
83
+ if tmp[i].ed < tmp[i + 1].start
84
+ fw.write([tmp[i].ed, 0, 0, 0, 0].pack("ICCCC"))
85
+ elsif tmp[i].ed > tmp[i + 1].start
86
+ tmp[i + 1].start = tmp[i].ed
87
+ STDERR.write "error #{tmp[i].country}:#{tmp[i].start.to_ipadr}-#{tmp[i].ed.to_ipadr}, #{tmp[i + 1].country}:#{tmp[i + 1].start.to_ipadr}-#{tmp[i + 1].ed.to_ipadr}\n"
88
+ end
89
+ if i == tmp.size - 2
90
+ fw.write([tmp[i + 1].start, tmp[i + 1].country[0..0], tmp[i + 1].country[1..1], 0, 0].pack("IAACC"))
91
+ if tmp[i + 1].ed != 0
92
+ fw.write([tmp[i + 1].ed, 0, 0, 0, 0].pack("ICCCC"))
93
+ end
94
+ end
95
+ end
96
+ end
97
+ @date = Time.now
98
+ end
99
+ def initialize
100
+ refresh
101
+ end
102
+ def getCountry ipi
103
+ if ipi < self[0].start || self[-1].ed < ipi
104
+ return nil
105
+ end
106
+ fst = bsearch_first do |e|
107
+ if ipi < e.start
108
+ 1
109
+ elsif ipi < e.nxt
110
+ 0
111
+ else
112
+ -1
113
+ end
114
+ end
115
+ if fst
116
+ fst = self[fst]
117
+ if ipi < fst.ed
118
+ return fst.country
119
+ else
120
+ return nil
121
+ end
122
+ else
123
+ return nil
124
+ end
125
+ end
126
+ end
127
+
128
+ end #module IPCountry
129
+
130
+
131
+ if $0 == __FILE__
132
+
133
+ if ARGV.delete "--refreshdb"
134
+ AList = AutoPstore.allocList = IPCountry::AllocList.new
135
+ exit 0
136
+ else
137
+ AList = AutoPstore.setReadOnly.allocList || (AutoPstore.allocList = IPCountry::AllocList.new)
138
+ end
139
+
140
+
141
+ longFormat = ARGV.delete "-l"
142
+
143
+
144
+ if ARGV[0]
145
+ if a = ARGV[0].to_ipadr
146
+ if ret = AList.getCountry(a.to_i)
147
+ if longFormat
148
+ println "#{ret} : " + "ccode #{ret}".read_p
149
+ else
150
+ println ret
151
+ end
152
+ exit 0
153
+ else
154
+ STDERR.println "'#{ARGV[0]}' is not allocated"
155
+ if STDIN.tty?
156
+ print "\n"
157
+ end
158
+ exit 1
159
+ end
160
+ end
161
+ else
162
+ STDERR.write "usage : ipcountry HOST\n ipcountry --refreshdb (for refreshing its database)\n"
163
+ exit 1
164
+ end
165
+
166
+ else
167
+ require 'thread'
168
+ module IPCountry
169
+ @@mutex = Mutex.new
170
+ def refresh
171
+ @@mutex.synchronize do
172
+ @@list = AutoPstore.readTemp.allocList
173
+ end
174
+ end
175
+ def getCountry ip
176
+ @@mutex.synchronize do
177
+ @@list ||= AutoPstore.readTemp.allocList
178
+ @@list.getCountry(ip.to_i)
179
+ end
180
+ end
181
+ module_function :refresh, :getCountry
182
+ end
183
+ AutoPstore.setFileName "ipcountry"
184
+ IPCountry::List = AutoPstore.readTemp.allocList
185
+ class String
186
+ def ipcountry is_cc = false
187
+ TopLevelMethod.timeout 5 do
188
+ if ip = to_ipadr
189
+ if cc = IPCountry::getCountry(ip)
190
+ if is_cc
191
+ if cc == is_cc
192
+ return cc
193
+ end
194
+ else
195
+ return cc
196
+ end
197
+ else
198
+ return nil
199
+ end
200
+ else
201
+ return nil
202
+ end
203
+ end
204
+ end
205
+ end
206
+ end
207
+
@@ -0,0 +1,318 @@
1
+
2
+
3
+ require "resolv"
4
+ require "Yk/ranger"
5
+
6
+
7
+ class Integer
8
+ def to_ipadr
9
+ d1 = (0xff000000 & self) >> 24
10
+ d2 = (0x00ff0000 & self) >> 16
11
+ d3 = (0x0000ff00 & self) >> 8
12
+ d4 = 0x000000ff & self
13
+ "#{d1}.#{d2}.#{d3}.#{d4}"
14
+ end
15
+ def to_mask
16
+ if 0 <= self && self <= 32
17
+ String::IPMaskList[self]
18
+ else
19
+ nil
20
+ end
21
+ end
22
+ end
23
+
24
+
25
+ class String
26
+ IPMaskList = []
27
+ 33.times do |i|
28
+ IPMaskList.unshift(((1 << 32) - (1 << i)).to_ipadr)
29
+ end
30
+ def __getMaskInfo
31
+ adr = self
32
+ if adr =~ /^\d|[1-9]\d$/ && adr.to_i <= 32
33
+ [IPMaskList[adr.to_i], adr.to_i]
34
+ elsif i = IPMaskList.index(adr)
35
+ [adr, i]
36
+ else
37
+ nil
38
+ end
39
+ end
40
+ def ipmask?
41
+ if self =~ /^(\d|[1-9]\d)$/ && self.__org__to_i___ <= 32
42
+ return true
43
+ elsif IPMaskList.include? self
44
+ return true
45
+ end
46
+ return false
47
+ end
48
+ def to_mask
49
+ if ipmask?
50
+ if self =~ /\./
51
+ self.clone
52
+ else
53
+ IPMaskList[self.__org__to_i___]
54
+ end
55
+ elsif self =~ /\// && $`.ipadr? && $'.ipmask?
56
+ $` + "/" + $'.to_mask
57
+ else
58
+ nil
59
+ end
60
+ end
61
+ def to_maskbit
62
+ if ipmask?
63
+ if self =~ /\./
64
+ IPMaskList.index self
65
+ else
66
+ self.__org__to_i___
67
+ end
68
+ elsif self =~ /\//
69
+ if $`.ipadr? && $'.ipmask?
70
+ $` + "/" + $'.to_maskbit.to_s
71
+ else
72
+ nil
73
+ end
74
+ else
75
+ nil
76
+ end
77
+ end
78
+ def ipadr?
79
+ if self =~ /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/
80
+ (1..4).each do |i|
81
+ a = $~[i].to_i
82
+ a > 255 and return(false)
83
+ end
84
+ true
85
+ else
86
+ false
87
+ end
88
+ end
89
+ def ipexpr?
90
+ if !ipadr?
91
+ if self !~ /\-/ || !$`.ipadr? || !$'.ipadr?
92
+ if self !~ /\// || !$`.ipadr? || !$'.ipmask?
93
+ return false
94
+ end
95
+ end
96
+ end
97
+ return true
98
+ end
99
+ def to_nets
100
+ if !ipexpr?
101
+ return nil
102
+ end
103
+ ipexpr = self
104
+ if ipexpr !~ /\-/
105
+ [ipexpr]
106
+ else
107
+ possibleMask = Proc.new do |i|
108
+ j2 = nil
109
+ 32.times do |j|
110
+ if i & (1 << j) != 0
111
+ j2 = j
112
+ break
113
+ end
114
+ end
115
+ j2
116
+ end
117
+ ret = []
118
+ arr = ipexpr.split /\-/
119
+ bg = ip2int(arr[0].strip)
120
+ ed = ip2int(arr[1].strip)
121
+ while bg <= ed
122
+ bgNext = nil
123
+ possibleMask.call(bg).downto 0 do |m|
124
+ if (bgNext = bg + (1 << m) - 1) <= ed
125
+ bgNext += 1
126
+ if m != 0
127
+ ret.push "#{int2ip bg}/#{32 - m}"
128
+ else
129
+ ret.push int2ip(bg)
130
+ end
131
+ break
132
+ end
133
+ end
134
+ bg = bgNext
135
+ end
136
+ ret
137
+ end
138
+ end
139
+ def to_djbs
140
+ ret = []
141
+ expr = self
142
+ if expr !~ /\//
143
+ if expr =~ /\-/
144
+ to_nets.each do |expr|
145
+ ret.push *expr.to_djbs
146
+ end
147
+ end
148
+ end
149
+ net = $`
150
+ if net.ipaddr?
151
+
152
+ end
153
+ mask = $'.to_i
154
+ case mask
155
+ when 25..32
156
+ base = (ip2int(net) >> (32 - mask)) << (32 - mask)
157
+ (0 ... 1 << (32 -mask)).each do |i|
158
+ ret.push int2ip(base + i)
159
+ end
160
+ when 24
161
+ net =~ /^(\d{1,3}\.\d{1,3}\.\d{1,3})\./
162
+ ret.push $1
163
+ when 17..23
164
+ base = (ip2int(net) >> (32 - mask)) << (24 - mask)
165
+ (0 ... 1 << (24 -mask)).each do |i|
166
+ ret.push int2ip((base + i) << 8)[/^(\d{1,3}\.\d{1,3}.\d{1,3})\./, 1]
167
+ end
168
+ when 16
169
+ net =~ /^(\d{1,3}\.\d{1,3})\./
170
+ ret.push $1
171
+ when 9..15
172
+ base = (ip2int(net) >> (32 - mask)) << (16 - mask)
173
+ (0 ... 1 << (16 -mask)).each do |i|
174
+ ret.push int2ip((base + i) << 16)[/^(\d{1,3}\.\d{1,3})\./, 1]
175
+ end
176
+ when 8
177
+ net =~ /^(\d{1,3})\./
178
+ ret.push $1
179
+ when 0..7
180
+ base = (ip2int(net) >> (32 - mask)) << (8 - mask)
181
+ (0 ... 1 << (8 -mask)).each do |i|
182
+ ret.push((base + i).to_s)
183
+ end
184
+ end
185
+ ret
186
+ end
187
+ def to_range
188
+ if ipadr?
189
+ a = __ip2int
190
+ return a .. a
191
+ elsif self =~ /\-/ && $`.ipadr? && $'.ipadr?
192
+ a = $'.__ip2int
193
+ b = $`.__ip2int
194
+ if a < b
195
+ return a .. b
196
+ elsif a > b
197
+ return b .. a
198
+ else
199
+ return a .. a
200
+ end
201
+ elsif self =~ /\// && $`.ipadr? && m = $'.__getMaskInfo
202
+ st = $`.__ip2int & m[0].__ip2int
203
+ ed = st + (1 << (32 - m[1])) - 1
204
+ return st .. ed
205
+ else
206
+ nil
207
+ end
208
+ end
209
+ def __ip2int
210
+ ret = 0
211
+ self.split(".").each do |e|
212
+ ret = ret * 256 + e.to_i
213
+ end
214
+ ret
215
+ end
216
+ alias_method :__org__to_i___, :to_i
217
+ def to_i base = 10
218
+ if ipadr?
219
+ __ip2int
220
+ else
221
+ __org__to_i___ base
222
+ end
223
+ end
224
+ RESOLVERS = Hash.new{|h, k| h[k] = Resolv::DNS.new(:nameserver => [k])}
225
+ HOST_RESOLVER = Resolv::Hosts.new
226
+ def to_ipadr server = nil
227
+ if !ipexpr?
228
+ ip2 = nil
229
+ resolver = nil
230
+ if server && (server = server.to_ipadr)
231
+ resolver = RESOLVERS[server]
232
+ else
233
+ resolver = Resolv
234
+ end
235
+ [HOST_RESOLVER, resolver].each do |r|
236
+ r.each_address(self) do |adr|
237
+ adr = adr.to_s
238
+ if !ip2
239
+ ip2 = adr.to_i
240
+ elsif ip2 < (ip3 = adr.to_i)
241
+ ip2 = ip3
242
+ end
243
+ end
244
+ break if ip2
245
+ end
246
+ ip2.to_ipadr
247
+ else
248
+ self
249
+ end
250
+ end
251
+ def to_ranger
252
+ IPRanger.new self
253
+ end
254
+ def each_ip
255
+ r = to_range
256
+ r.each do |i|
257
+ yield i.to_ipadr
258
+ end
259
+ end
260
+ end
261
+
262
+
263
+ class IPRanger < Ranger
264
+ def initialize (*args)
265
+ super()
266
+ add *args
267
+ end
268
+ def inspect
269
+ ns = []
270
+ eachNetRange do |n|
271
+ ns.push n
272
+ end
273
+ "[" + ns.join(",") + "]"
274
+ end
275
+ def modargs (*args)
276
+ nargs = []
277
+ args.each do |a|
278
+ if a.is_a? String
279
+ if tmp = a.to_range
280
+ nargs.push tmp
281
+ else
282
+ nargs.push a.to_ipadr.to_range rescue next
283
+ end
284
+ elsif a.is_a? Ranger
285
+ a.eachRange do |e|
286
+ nargs.push e
287
+ end
288
+ else
289
+ nargs.push a
290
+ end
291
+ end
292
+ nargs
293
+ end
294
+ def add (*args)
295
+ super *modargs(*args)
296
+ end
297
+ def del (*args)
298
+ super *modargs(*args)
299
+ end
300
+ def include? (*args)
301
+ super *modargs(*args)
302
+ end
303
+ def eachNetRange
304
+ each do |e|
305
+ if e.is_a? Range
306
+ if e.exclude_end?
307
+ yield e.first.to_ipadr + "-" + (e.last - 1).to_ipadr
308
+ else
309
+ yield e.first.to_ipadr + "-" + e.last.to_ipadr
310
+ end
311
+ else
312
+ yield e.to_ipadr
313
+ end
314
+ end
315
+ end
316
+ end
317
+
318
+