tools 0.0.7 → 0.3.9

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.
@@ -2,6 +2,21 @@ require 'singleton'
2
2
  class ToolsNet
3
3
  include Singleton
4
4
 
5
+ def self.ping? host
6
+ return Net::Ping::External.new(host || '0.0.0.1000', timeout=1).ping?
7
+ end
8
+
9
+ def self.get_current_ip
10
+ # begin
11
+ # ip = Socket::getaddrinfo(Socket.gethostname, "echo", Socket::AF_INET)[0][3]
12
+ # return ip if IPAddress.valid?(ip)
13
+ # rescue Exception => e
14
+ # end
15
+ ip = `ifconfig | grep -E '10\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | awk '{print $2}'`
16
+ ip = ip.split("\n").first if ip.include? "\n"
17
+ return ip if IPAddress.valid?(ip)
18
+ end
19
+
5
20
 
6
21
  # Resolv a ip to a dns.
7
22
  #
@@ -13,7 +28,12 @@ class ToolsNet
13
28
  ret = Resolv.new.getname(ip)
14
29
  return ret.instance_variable_get('@labels').join('.')
15
30
  rescue Exception => e
16
- s = 'edi error: ' + e.message
31
+ case e.message
32
+ when "Dnsruby::NXDomain"
33
+ return nil
34
+ else
35
+ return e.message
36
+ end
17
37
  end
18
38
  return s.strip
19
39
  end
@@ -30,9 +50,9 @@ class ToolsNet
30
50
  rescue Exception => e
31
51
  case e.message
32
52
  when "Dnsruby::NXDomain"
33
- ret = nil
53
+ return nil
34
54
  else
35
- ret = e.message
55
+ return e.message
36
56
  end
37
57
  end
38
58
  return ret
@@ -52,12 +72,11 @@ class ToolsNet
52
72
  # @param restclient_obj Rest Object
53
73
  # @param path path
54
74
  # @param method method
55
- # @param caller caller
56
75
  # @param method_opts method opts
57
76
  # @param validate_opts validate opts
58
77
  # @param retry_opts retry opts
59
78
  # @param show_progress default false
60
- def self.doreq( restclient_obj, path, method, caller, method_opts: {},validate_opts: {}, retry_opts: {}, show_progress: false)
79
+ def self.doreq( restclient_obj, path, method, method_opts: {},validate_opts: {}, retry_opts: {}, show_progress: false)
61
80
  res = nil
62
81
  code = nil
63
82
  data = method_opts.fetch(:data, nil)
@@ -76,7 +95,6 @@ class ToolsNet
76
95
  code = result.code.to_i
77
96
  end
78
97
  rescue Exception => error
79
- ap error
80
98
  flag_error = true
81
99
  end
82
100
  # Other conditionals to retry
@@ -102,7 +120,6 @@ class ToolsNet
102
120
  end
103
121
  end
104
122
 
105
-
106
123
  # Return a valid decode response.
107
124
  #
108
125
  # @param response
@@ -138,4 +155,103 @@ class ToolsNet
138
155
  end
139
156
 
140
157
 
158
+ # Validate.: port number between valid range?.
159
+ #
160
+ # @param port number to be validate.
161
+ # @return [Boolean]
162
+ def self.valid_port? port
163
+ if port.to_s.strip.match(/^\d{1,5}(?!\d)$/).nil?
164
+ return false
165
+ end
166
+ unless port.to_i.between?(1, 65535)
167
+ return false
168
+ end
169
+ return true
170
+ end
171
+
172
+
173
+
174
+ # Validate.: ip number or mask are valids?.
175
+ #
176
+ # @param that number or mask to be validate.
177
+ # @return [Hash] result info ip or ask or error
178
+ def self.validate_ipaddress that
179
+ result = {}
180
+ result[:status] = false
181
+ result[:type] = ''
182
+ result[:msg] = ''
183
+ result[:address] = that
184
+ result[:resolv] = ''
185
+
186
+ if IPAddress::valid_ipv4? that
187
+ begin
188
+ ip = IPAddress::valid_ipv4? that
189
+ result[:status] = true
190
+ result[:type] = 'ip'
191
+ result[:oct1] = that.split('.')[0]
192
+ result[:oct2] = that.split('.')[1]
193
+ result[:oct3] = that.split('.')[2]
194
+ result[:oct4] = that.split('.')[3]
195
+ rescue Exception => e
196
+ result[:msg] = e.to_s
197
+ return
198
+ end
199
+ else
200
+ begin
201
+ net = NetAddr::CIDR.create that
202
+ result[:type] = 'mask'
203
+ result[:status] = true
204
+ rescue Exception => e
205
+ ip = resolv_dns that
206
+ if IPAddress::valid_ipv4? ip
207
+ result[:status] = true
208
+ result[:type] = 'ip'
209
+ result[:oct1] = ip.split('.')[0]
210
+ result[:oct2] = ip.split('.')[1]
211
+ result[:oct3] = ip.split('.')[2]
212
+ result[:oct4] = ip.split('.')[3]
213
+ else
214
+ result[:msg] = e.to_s
215
+ end
216
+ end
217
+ end
218
+ return result
219
+ end
220
+
221
+
222
+ # Validate.: ip number is a backend?.
223
+ #
224
+ # @param original_addr number to be validate.
225
+ # @return [Boolean]
226
+ def self.is_backend? original_addr
227
+ glbbackend = NetAddr::CIDR.create('10.0.0.0/8')
228
+ return glbbackend.contains? original_addr
229
+ end
230
+
231
+ def self.valid_ip? original_addr
232
+ status = false
233
+ begin
234
+ status = IPAddress.valid?(original_addr)
235
+ rescue
236
+ end
237
+ return status
238
+ end
239
+
240
+ # Validate.: ip number is avalid network.
241
+ #
242
+ # @param original_addr network number to be validate.
243
+ # @return [Boolean]
244
+ def self.valid_network? original_addr
245
+ status = false
246
+ begin
247
+ ip = IPAddress original_addr
248
+ status = true if ip.network?
249
+ rescue
250
+ end
251
+ return status
252
+ end
253
+
254
+
255
+
256
+
141
257
  end
@@ -0,0 +1,54 @@
1
+ require 'singleton'
2
+ class ToolsPrompt
3
+ include Singleton
4
+
5
+ def initialize(options = {})
6
+ end
7
+
8
+ def self.yes? *args
9
+ prompt = TTY::Prompt.new
10
+ prompt.yes? *args
11
+ end
12
+
13
+ def self.no? *args
14
+ prompt = TTY::Prompt.new
15
+ prompt.no? *args
16
+ end
17
+
18
+ def self.ask *args
19
+ prompt = TTY::Prompt.new
20
+ result = prompt.ask *args
21
+ return result
22
+ end
23
+
24
+ def self.mask *args
25
+ prompt = TTY::Prompt.new
26
+ result = prompt.mask *args
27
+ return result
28
+ end
29
+
30
+ def self.select *args
31
+ prompt = TTY::Prompt.new
32
+ result = prompt.select *args
33
+ return result
34
+ end
35
+
36
+ def self.multi_select *args
37
+ prompt = TTY::Prompt.new
38
+ result = prompt.multi_select *args
39
+ return result
40
+ end
41
+
42
+ def self.enum_select *args
43
+ prompt = TTY::Prompt.new
44
+ result = prompt.multi_select *args
45
+ return result
46
+ end
47
+
48
+ def self.expand *args
49
+ prompt = TTY::Prompt.new
50
+ result = prompt.expand *args
51
+ return result
52
+ end
53
+
54
+ end
@@ -9,13 +9,50 @@ class ToolsUtil
9
9
  ToolsFiles.instance
10
10
  ToolsConfig.instance
11
11
  ToolsLog.instance
12
+ ToolsPrompt.instance
13
+ unless File.exists? Tools.home+'/.tools'
14
+ FileUtils.mkdir_p(Tools.home+'/.tools')
15
+ end
12
16
  tools_logfile = Tools.home+'/.tools/tools.log'
13
17
  ToolsLog.create_log_file 'tools', tools_logfile
14
18
  end
15
19
 
20
+ # Synbolize all keys in hash.
21
+ #
22
+ # @param hash
23
+ # return hash symbolized
24
+ def self.symbolize_keys(hash)
25
+ hash.inject({}){|result, (key, value)|
26
+ new_key = case key
27
+ when String then key.to_sym
28
+ else key
29
+ end
30
+ new_value = case value
31
+ when Hash then symbolize_keys(value)
32
+ else value
33
+ end
34
+ result[new_key] = new_value
35
+ result
36
+ }
37
+ end
38
+
39
+
40
+ # Capture string from a prompt.
41
+ #
42
+ # @param prompt
43
+ # @param hidden option
44
+ # @return String
45
+ def self.ask_prompt(prompt = '', hidden = true)
46
+ if hidden
47
+ a = ask("#{prompt}") { |q| q.echo = "*"; } #q.case = :downcase }
48
+ else
49
+ a = ask("#{prompt}") #{ |q| q.case = :downcase }
50
+ end
51
+ end
52
+
16
53
  # Test a valid json string.
17
54
  #
18
- # @param Json string to be tested
55
+ # @param source Json string to be tested
19
56
  # @return boolean
20
57
  def self.valid_json? source
21
58
  begin
@@ -27,7 +64,7 @@ class ToolsUtil
27
64
 
28
65
  # Test a valid yaml string.
29
66
  #
30
- # @param Yaml string to be tested
67
+ # @param source Yaml string to be tested
31
68
  # @return boolean
32
69
  def self.valid_yaml? source
33
70
  begin
@@ -93,12 +130,17 @@ class ToolsUtil
93
130
  # @param variable variable name to retrive
94
131
  # @return boolean
95
132
  def self.instance_variable? variable
96
- ap self.instance_variables
97
- exit
98
- return self.instance_variable_get("@#{variable}")
133
+ # ap self.instance_variables.include? variable.to_sym
134
+ # exit
135
+ return self.instance_variable_get(":@#{variable}")
99
136
  end
100
137
 
101
-
138
+ # Get all existent class variablea.
139
+ #
140
+ # @return variables
141
+ def self.get_variables
142
+ return self.instance_variables
143
+ end
102
144
 
103
145
  # Return a plain text for content of String or Hash or Array.
104
146
  #
@@ -199,6 +241,36 @@ class Hash
199
241
  end
200
242
 
201
243
 
244
+ class Hash
245
+
246
+ # ensures nested hash from keys, and sets final key to value
247
+ # keys: Array of Symbol|String
248
+ # value: any
249
+ def nested_set(keys, value)
250
+ raise "DEBUG: nested_set keys must be an Array" unless keys.is_a?(Array)
251
+
252
+ final_key = keys.pop
253
+ return unless valid_key?(final_key)
254
+ position = self
255
+ for key in keys
256
+ return unless valid_key?(key)
257
+ position[key] = {} unless position[key].is_a?(Hash)
258
+ position = position[key]
259
+ end
260
+ position[final_key] = value
261
+ end
262
+
263
+ private
264
+
265
+ # returns true if key is valid
266
+ def valid_key?(key)
267
+ return true if key.is_a?(Symbol) || key.is_a?(String)
268
+ raise "DEBUG: nested_set invalid key: #{key} (#{key.class})"
269
+ end
270
+
271
+ end
272
+
273
+
202
274
  class String
203
275
 
204
276
  # Self test nil String class.
@@ -250,6 +322,20 @@ class String
250
322
  Encrypt.load self, key
251
323
  end
252
324
 
325
+ # Self test numeric String class.
326
+ #
327
+ # @return boolean
328
+ def numeric?
329
+ Float(aux) != nil rescue false
330
+ end
331
+
332
+ # Self test digits String class.
333
+ #
334
+ # @return boolean
335
+ def num?
336
+ !!match(/^[[:digit:]]+$/)
337
+ end
338
+
253
339
  # Self test alphanum String class.
254
340
  #
255
341
  # @return boolean
@@ -264,6 +350,17 @@ class String
264
350
  !!match(/^[[:alpha:]]+$/)
265
351
  end
266
352
 
353
+ def help?
354
+ if self.eql? '?' or
355
+ self.eql? '-h' or
356
+ self.eql? '--help' or
357
+ self.eql? 'help'
358
+ return true
359
+ else
360
+ return false
361
+ end
362
+ end
363
+
267
364
  end
268
365
 
269
366
 
@@ -300,6 +397,14 @@ class Object
300
397
  def string?
301
398
  self.is_a?(String)
302
399
  end
400
+
401
+ # Self test nil Object class.
402
+ #
403
+ # @return boolean
404
+ # def nil?
405
+ # return '' if self == nil
406
+ # end
407
+
303
408
  end
304
409
 
305
410
  class Array
@@ -396,20 +501,40 @@ class Array
396
501
  return result
397
502
  end
398
503
 
399
- def extract_option_value option
400
- result = false
401
- value = nil
402
- if self.include? option
403
- index = self.index(option)
404
- self.delete_at(index)
405
- result = true
406
- value = self.at(index)
407
- self.delete_at(index)
408
- end
409
- return [result, value]
410
- end
504
+ def extract_option_value option, args={}
411
505
 
506
+ if args[:multiple].nil?
507
+ args[:multiple] = false
508
+ end
412
509
 
510
+ if args[:separator].nil?
511
+ args[:separator] = '='
512
+ end
413
513
 
514
+ result = false
515
+ if args[:multiple]
516
+ multiple_value = []
517
+ while self.include? option
518
+ index = self.index(option)
519
+ self.delete_at(index)
520
+ result = true
521
+ value = self.at(index)
522
+ multiple_value << self.at(index).split(args[:separator]).first
523
+ multiple_value << self.at(index).split(args[:separator]).last
524
+ self.delete_at(index)
525
+ end
526
+ return [result, multiple_value]
527
+ else
528
+ value = nil
529
+ while self.include? option
530
+ index = self.index(option)
531
+ self.delete_at(index)
532
+ result = true
533
+ value = self.at(index)
534
+ self.delete_at(index)
535
+ end
536
+ return [result, value]
537
+ end
538
+ end
414
539
 
415
540
  end