nicinfo 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/bin/nicinfo +22 -0
- data/lib/autnum.rb +90 -0
- data/lib/bootstrap.rb +198 -0
- data/lib/bsfiles/asn.json +2326 -0
- data/lib/bsfiles/dns.json +25 -0
- data/lib/bsfiles/entity.json +52 -0
- data/lib/bsfiles/ipv4.json +244 -0
- data/lib/bsfiles/ipv6.json +97 -0
- data/lib/cache.rb +141 -0
- data/lib/common_json.rb +263 -0
- data/lib/common_names.rb +49 -0
- data/lib/config.rb +260 -0
- data/lib/constants.rb +113 -0
- data/lib/data_tree.rb +205 -0
- data/lib/demo/autnum.json +228 -0
- data/lib/demo/domain-dnr.json +695 -0
- data/lib/demo/domain-rir.json +569 -0
- data/lib/demo/domains.json +625 -0
- data/lib/demo/entities.json +545 -0
- data/lib/demo/entity-dnr.json +143 -0
- data/lib/demo/entity-rir.json +394 -0
- data/lib/demo/error-code.json +31 -0
- data/lib/demo/help.json +58 -0
- data/lib/demo/ip.json +306 -0
- data/lib/demo/nameservers.json +434 -0
- data/lib/demo/ns-simple.json +210 -0
- data/lib/demo/ns-very-simple.json +41 -0
- data/lib/demo/ns.json +63 -0
- data/lib/demo/simple-ip.json +41 -0
- data/lib/demo/simple.json +13 -0
- data/lib/domain.rb +203 -0
- data/lib/ds_data.rb +70 -0
- data/lib/entity.rb +372 -0
- data/lib/enum.rb +47 -0
- data/lib/error_code.rb +56 -0
- data/lib/female-first-names.txt +4275 -0
- data/lib/ip.rb +86 -0
- data/lib/key_data.rb +70 -0
- data/lib/last-names.txt +88799 -0
- data/lib/male-first-names.txt +1219 -0
- data/lib/nicinfo_logger.rb +370 -0
- data/lib/nicinfo_main.rb +1013 -0
- data/lib/notices.rb +110 -0
- data/lib/ns.rb +108 -0
- data/lib/utils.rb +189 -0
- metadata +90 -0
@@ -0,0 +1,370 @@
|
|
1
|
+
# Copyright (C) 2011,2012,2013,2014 American Registry for Internet Numbers
|
2
|
+
#
|
3
|
+
# Permission to use, copy, modify, and/or distribute this software for any
|
4
|
+
# purpose with or without fee is hereby granted, provided that the above
|
5
|
+
# copyright notice and this permission notice appear in all copies.
|
6
|
+
#
|
7
|
+
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
8
|
+
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
9
|
+
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
10
|
+
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
11
|
+
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
12
|
+
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
|
13
|
+
# IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
14
|
+
|
15
|
+
# The run_pager code came from http://nex-3.com/posts/73-git-style-automatic-paging-in-ruby
|
16
|
+
# and is credited to Nathan Weizenbaum
|
17
|
+
|
18
|
+
require 'enum'
|
19
|
+
|
20
|
+
module NicInfo
|
21
|
+
|
22
|
+
# Controls the type of informational messages that are about the function of the application.
|
23
|
+
class MessageLevel < NicInfo::Enum
|
24
|
+
|
25
|
+
# no messages
|
26
|
+
MessageLevel.add_item(:NO_MESSAGES, "NONE")
|
27
|
+
|
28
|
+
# some messages
|
29
|
+
MessageLevel.add_item(:SOME_MESSAGES, "SOME")
|
30
|
+
|
31
|
+
# all messages
|
32
|
+
MessageLevel.add_item(:ALL_MESSAGES, "ALL")
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
# Controls the amount of data
|
37
|
+
class DataAmount < NicInfo::Enum
|
38
|
+
|
39
|
+
# a terse amount of data
|
40
|
+
DataAmount.add_item(:TERSE_DATA, "TERSE")
|
41
|
+
|
42
|
+
# a normal amount of data
|
43
|
+
DataAmount.add_item(:NORMAL_DATA, "NORMAL")
|
44
|
+
|
45
|
+
# an extra amount of data
|
46
|
+
DataAmount.add_item(:EXTRA_DATA, "EXTRA")
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
# A logger for this application.
|
51
|
+
class Logger
|
52
|
+
|
53
|
+
attr_accessor :message_level, :data_amount, :message_out, :data_out, :item_name_length, :item_name_rjust, :pager
|
54
|
+
attr_accessor :auto_wrap, :detect_width, :default_width, :prose_name_rjust, :prose_name_length
|
55
|
+
|
56
|
+
def initialize
|
57
|
+
|
58
|
+
@message_level = MessageLevel::SOME_MESSAGES
|
59
|
+
@data_amount = DataAmount::NORMAL_DATA
|
60
|
+
@message_out = $stdout
|
61
|
+
@data_out = $stdout
|
62
|
+
@item_name_length = 25
|
63
|
+
@item_name_rjust = true
|
64
|
+
@prose_name_length = 10
|
65
|
+
@prose_name_rjust = true
|
66
|
+
|
67
|
+
@message_last_written_to = false
|
68
|
+
@data_last_written_to = false
|
69
|
+
|
70
|
+
return if RUBY_PLATFORM =~ /win32/
|
71
|
+
#else
|
72
|
+
@columns = get_terminal_columns( `stty -a`, @default_width )
|
73
|
+
end
|
74
|
+
|
75
|
+
def get_width
|
76
|
+
return @default_width if !@detect_width
|
77
|
+
return @columns if @columns != nil
|
78
|
+
return @default_width
|
79
|
+
end
|
80
|
+
|
81
|
+
def validate_message_level
|
82
|
+
raise ArgumentError, "Message log level not defined" if @message_level == nil
|
83
|
+
raise ArgumentError, "Unknown message log level '" + @message_level.to_s + "'" if !MessageLevel.has_value?(@message_level.to_s)
|
84
|
+
end
|
85
|
+
|
86
|
+
def validate_data_amount
|
87
|
+
raise ArgumentError, "Data log level not defined" if @data_amount == nil
|
88
|
+
raise ArgumentError, "Unknown data log level '" + @data_amount.to_s + "'" if !DataAmount.has_value?(@data_amount.to_s)
|
89
|
+
end
|
90
|
+
|
91
|
+
def start_data_item
|
92
|
+
if (@data_last_written_to)
|
93
|
+
@data_out.puts
|
94
|
+
elsif (@data_out == $stdout && @message_out == $stderr && @message_last_written_to)
|
95
|
+
@data_out.puts
|
96
|
+
elsif (@data_out == @message_out && @message_last_written_to)
|
97
|
+
@data_out.puts
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def end_data_item
|
102
|
+
#do nothing for now
|
103
|
+
end
|
104
|
+
|
105
|
+
def end_run
|
106
|
+
start_data_item
|
107
|
+
end
|
108
|
+
|
109
|
+
# Outputs at the :SOME_MESSAGES level
|
110
|
+
def mesg message
|
111
|
+
validate_message_level()
|
112
|
+
if (@message_level != MessageLevel::NO_MESSAGES)
|
113
|
+
log_info("# " + message.to_s)
|
114
|
+
return true
|
115
|
+
end
|
116
|
+
return false
|
117
|
+
end
|
118
|
+
|
119
|
+
# Outputs at the :ALL_MESSAGES level
|
120
|
+
def trace message
|
121
|
+
validate_message_level()
|
122
|
+
if (@message_level != MessageLevel::NO_MESSAGES && @message_level != MessageLevel::SOME_MESSAGES)
|
123
|
+
log_info("## " + message.to_s)
|
124
|
+
return true
|
125
|
+
end
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
|
129
|
+
# Outputs a datum at :TERSE_DATA level
|
130
|
+
def terse item_name, item_value
|
131
|
+
validate_data_amount()
|
132
|
+
log_data(item_name, item_value)
|
133
|
+
return true
|
134
|
+
end
|
135
|
+
|
136
|
+
# Outputs a data at :NORMAL_DATA level
|
137
|
+
def datum item_name, item_value
|
138
|
+
validate_data_amount()
|
139
|
+
if (@data_amount != DataAmount::TERSE_DATA)
|
140
|
+
log_data(item_name, item_value)
|
141
|
+
return true
|
142
|
+
end
|
143
|
+
return false
|
144
|
+
end
|
145
|
+
|
146
|
+
def extra item_name, item_value
|
147
|
+
validate_data_amount()
|
148
|
+
if (@data_amount != DataAmount::TERSE_DATA && @data_amount != DataAmount::NORMAL_DATA)
|
149
|
+
log_data(item_name, item_value)
|
150
|
+
return true
|
151
|
+
end
|
152
|
+
return false
|
153
|
+
end
|
154
|
+
|
155
|
+
def data_title title
|
156
|
+
validate_data_amount()
|
157
|
+
log_just title, " ", @item_name_length, @item_name_rjust, ""
|
158
|
+
return true
|
159
|
+
end
|
160
|
+
|
161
|
+
def info data_amount, item_name, item_value
|
162
|
+
retval = false
|
163
|
+
validate_data_amount()
|
164
|
+
case data_amount
|
165
|
+
when DataAmount::TERSE_DATA
|
166
|
+
log_data(item_name, item_value)
|
167
|
+
retval = true
|
168
|
+
when DataAmount::NORMAL_DATA
|
169
|
+
if (@data_amount != DataAmount::TERSE_DATA)
|
170
|
+
log_data( item_name, item_value)
|
171
|
+
retval = true
|
172
|
+
end
|
173
|
+
when DataAmount::EXTRA_DATA
|
174
|
+
if (@data_amount != DataAmount::TERSE_DATA && @data_amount != DataAmount::NORMAL_DATA)
|
175
|
+
log_data( item_name, item_value )
|
176
|
+
retval = true
|
177
|
+
end
|
178
|
+
end
|
179
|
+
return retval
|
180
|
+
end
|
181
|
+
|
182
|
+
def raw data_amount, raw_data, wrap = true
|
183
|
+
retval = false
|
184
|
+
validate_data_amount()
|
185
|
+
case data_amount
|
186
|
+
when DataAmount::TERSE_DATA
|
187
|
+
log_raw(raw_data, wrap)
|
188
|
+
retval = true
|
189
|
+
when DataAmount::NORMAL_DATA
|
190
|
+
if (@data_amount != DataAmount::TERSE_DATA)
|
191
|
+
log_raw(raw_data, wrap)
|
192
|
+
retval = true
|
193
|
+
end
|
194
|
+
when DataAmount::EXTRA_DATA
|
195
|
+
if (@data_amount != DataAmount::TERSE_DATA && @data_amount != DataAmount::NORMAL_DATA)
|
196
|
+
log_raw(raw_data, wrap)
|
197
|
+
retval = true
|
198
|
+
end
|
199
|
+
end
|
200
|
+
return retval
|
201
|
+
end
|
202
|
+
|
203
|
+
def prose data_amount, prose_name, prose_value
|
204
|
+
retval = false
|
205
|
+
validate_data_amount()
|
206
|
+
case data_amount
|
207
|
+
when DataAmount::TERSE_DATA
|
208
|
+
log_prose prose_name, prose_value
|
209
|
+
retval = true
|
210
|
+
when DataAmount::NORMAL_DATA
|
211
|
+
if (@data_amount != DataAmount::TERSE_DATA)
|
212
|
+
log_prose prose_name, prose_value
|
213
|
+
retval = true
|
214
|
+
end
|
215
|
+
when DataAmount::EXTRA_DATA
|
216
|
+
if (@data_amount != DataAmount::TERSE_DATA && @data_amount != DataAmount::NORMAL_DATA)
|
217
|
+
log_prose prose_name, prose_value
|
218
|
+
retval = true
|
219
|
+
end
|
220
|
+
end
|
221
|
+
return retval
|
222
|
+
end
|
223
|
+
|
224
|
+
def log_tree_item data_amount, tree_item
|
225
|
+
retval = false
|
226
|
+
validate_data_amount()
|
227
|
+
case data_amount
|
228
|
+
when DataAmount::TERSE_DATA
|
229
|
+
log_raw(tree_item, true)
|
230
|
+
retval = true
|
231
|
+
when DataAmount::NORMAL_DATA
|
232
|
+
if (@data_amount != DataAmount::TERSE_DATA)
|
233
|
+
log_raw(tree_item, true)
|
234
|
+
retval = true
|
235
|
+
end
|
236
|
+
when DataAmount::EXTRA_DATA
|
237
|
+
if (@data_amount != DataAmount::TERSE_DATA && @data_amount != DataAmount::NORMAL_DATA)
|
238
|
+
log_raw(tree_item, true)
|
239
|
+
retval = true
|
240
|
+
end
|
241
|
+
end
|
242
|
+
return retval
|
243
|
+
end
|
244
|
+
|
245
|
+
# This code came from http://nex-3.com/posts/73-git-style-automatic-paging-in-ruby
|
246
|
+
def run_pager
|
247
|
+
return unless @pager
|
248
|
+
return if RUBY_PLATFORM =~ /win32/
|
249
|
+
return unless STDOUT.tty?
|
250
|
+
|
251
|
+
read, write = IO.pipe
|
252
|
+
|
253
|
+
unless Kernel.fork # Child process
|
254
|
+
STDOUT.reopen(write)
|
255
|
+
STDERR.reopen(write) if STDERR.tty?
|
256
|
+
read.close
|
257
|
+
write.close
|
258
|
+
return
|
259
|
+
end
|
260
|
+
|
261
|
+
# Parent process, become pager
|
262
|
+
STDIN.reopen(read)
|
263
|
+
read.close
|
264
|
+
write.close
|
265
|
+
|
266
|
+
ENV['LESS'] = 'FSRX' # Don't page if the input is short enough
|
267
|
+
|
268
|
+
Kernel.select [STDIN] # Wait until we have input before we start the pager
|
269
|
+
pager = ENV['PAGER'] || 'less'
|
270
|
+
exec pager rescue exec "/bin/sh", "-c", pager
|
271
|
+
end
|
272
|
+
|
273
|
+
def get_terminal_columns stty_output, default_columns
|
274
|
+
rx1 = /\s*columns\s*=\s*(\d*);/
|
275
|
+
m = rx1.match( stty_output )
|
276
|
+
return m[ 1 ].to_i if m
|
277
|
+
#else
|
278
|
+
rx2 = /\s*(\d*)\s*columns;/
|
279
|
+
m = rx2.match( stty_output )
|
280
|
+
return m[ 1 ].to_i if m
|
281
|
+
rx3 = /\s*columns\s*(\d*);/
|
282
|
+
m = rx3.match( stty_output )
|
283
|
+
return m[ 1 ].to_i if m
|
284
|
+
return default_columns
|
285
|
+
end
|
286
|
+
|
287
|
+
def break_up_line line, width
|
288
|
+
retval = Array.new
|
289
|
+
i = line.rindex( /\s/, width )
|
290
|
+
if i == nil
|
291
|
+
i = line.rindex( /\s/ )
|
292
|
+
end
|
293
|
+
while i != nil do
|
294
|
+
retval << line[ 0, i ]
|
295
|
+
line = line[ i+1..-1 ]
|
296
|
+
i = line.rindex( /\s/, width )
|
297
|
+
if i == nil
|
298
|
+
i = line.rindex( /\s/ )
|
299
|
+
end
|
300
|
+
end
|
301
|
+
if line != nil
|
302
|
+
if retval.length > 0 && retval.last.length + line.length + 1 <= width
|
303
|
+
retval.last << " " + line
|
304
|
+
else
|
305
|
+
retval << line
|
306
|
+
end
|
307
|
+
end
|
308
|
+
return retval
|
309
|
+
end
|
310
|
+
|
311
|
+
private
|
312
|
+
|
313
|
+
def log_info message
|
314
|
+
if @data_last_written_to && @message_out == @data_out
|
315
|
+
@data_out.puts
|
316
|
+
end
|
317
|
+
@message_out.puts(message)
|
318
|
+
@message_last_written_to = true
|
319
|
+
@data_last_written_to = false
|
320
|
+
end
|
321
|
+
|
322
|
+
def log_data item_name, item_value
|
323
|
+
log_just item_name, item_value, @item_name_length, @item_name_rjust, ": "
|
324
|
+
end
|
325
|
+
|
326
|
+
def log_prose item_name, item_value
|
327
|
+
log_just item_name, item_value, @prose_name_length, @prose_name_rjust, " "
|
328
|
+
end
|
329
|
+
|
330
|
+
def log_just item_name, item_value, name_length, name_rjust, separator
|
331
|
+
if (item_value != nil && !item_value.to_s.empty?)
|
332
|
+
format_string = "%" + name_length.to_s + "s%s%s"
|
333
|
+
if (!name_rjust)
|
334
|
+
format_string = "%-" + name_length.to_s + "s%s%s"
|
335
|
+
end
|
336
|
+
if @auto_wrap
|
337
|
+
lines = break_up_line item_value.to_s, get_width - ( name_length + separator.length )
|
338
|
+
i = 0
|
339
|
+
lines.each do |line|
|
340
|
+
if i == 0
|
341
|
+
@data_out.puts(format(format_string, item_name, separator, line))
|
342
|
+
else
|
343
|
+
@data_out.puts(format(format_string, " ", separator, line))
|
344
|
+
end
|
345
|
+
i = i + 1
|
346
|
+
end
|
347
|
+
else
|
348
|
+
@data_out.puts(format(format_string, item_name, separator, item_value))
|
349
|
+
end
|
350
|
+
@data_last_written_to = true
|
351
|
+
@message_last_written_to = false
|
352
|
+
end
|
353
|
+
end
|
354
|
+
|
355
|
+
def log_raw item_value, wrap
|
356
|
+
if @auto_wrap and wrap
|
357
|
+
lines = break_up_line item_value, get_width
|
358
|
+
lines.each do |line|
|
359
|
+
@data_out.puts(line)
|
360
|
+
end
|
361
|
+
else
|
362
|
+
@data_out.puts(item_value)
|
363
|
+
end
|
364
|
+
@data_last_written_to = true
|
365
|
+
@message_last_written_to = false
|
366
|
+
end
|
367
|
+
|
368
|
+
end
|
369
|
+
|
370
|
+
end
|