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.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/bin/nicinfo +22 -0
  3. data/lib/autnum.rb +90 -0
  4. data/lib/bootstrap.rb +198 -0
  5. data/lib/bsfiles/asn.json +2326 -0
  6. data/lib/bsfiles/dns.json +25 -0
  7. data/lib/bsfiles/entity.json +52 -0
  8. data/lib/bsfiles/ipv4.json +244 -0
  9. data/lib/bsfiles/ipv6.json +97 -0
  10. data/lib/cache.rb +141 -0
  11. data/lib/common_json.rb +263 -0
  12. data/lib/common_names.rb +49 -0
  13. data/lib/config.rb +260 -0
  14. data/lib/constants.rb +113 -0
  15. data/lib/data_tree.rb +205 -0
  16. data/lib/demo/autnum.json +228 -0
  17. data/lib/demo/domain-dnr.json +695 -0
  18. data/lib/demo/domain-rir.json +569 -0
  19. data/lib/demo/domains.json +625 -0
  20. data/lib/demo/entities.json +545 -0
  21. data/lib/demo/entity-dnr.json +143 -0
  22. data/lib/demo/entity-rir.json +394 -0
  23. data/lib/demo/error-code.json +31 -0
  24. data/lib/demo/help.json +58 -0
  25. data/lib/demo/ip.json +306 -0
  26. data/lib/demo/nameservers.json +434 -0
  27. data/lib/demo/ns-simple.json +210 -0
  28. data/lib/demo/ns-very-simple.json +41 -0
  29. data/lib/demo/ns.json +63 -0
  30. data/lib/demo/simple-ip.json +41 -0
  31. data/lib/demo/simple.json +13 -0
  32. data/lib/domain.rb +203 -0
  33. data/lib/ds_data.rb +70 -0
  34. data/lib/entity.rb +372 -0
  35. data/lib/enum.rb +47 -0
  36. data/lib/error_code.rb +56 -0
  37. data/lib/female-first-names.txt +4275 -0
  38. data/lib/ip.rb +86 -0
  39. data/lib/key_data.rb +70 -0
  40. data/lib/last-names.txt +88799 -0
  41. data/lib/male-first-names.txt +1219 -0
  42. data/lib/nicinfo_logger.rb +370 -0
  43. data/lib/nicinfo_main.rb +1013 -0
  44. data/lib/notices.rb +110 -0
  45. data/lib/ns.rb +108 -0
  46. data/lib/utils.rb +189 -0
  47. 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