forj 0.0.43 → 0.0.44
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 +4 -4
- data/Rakefile +1 -1
- data/bin/forj +49 -120
- data/lib/appinit.rb +50 -0
- data/lib/boot.rb +30 -43
- data/lib/connection.rb +28 -5
- data/lib/defaults.yaml +115 -61
- data/lib/forj-account.rb +168 -50
- data/lib/forj-config.rb +204 -148
- data/lib/forj-settings.rb +209 -0
- data/lib/helpers.rb +1 -5
- data/lib/log.rb +1 -25
- data/lib/repositories.rb +5 -4
- data/spec/connection_spec.rb +9 -10
- data/spec/forj-config_spec.rb +21 -20
- metadata +4 -2
data/lib/forj-config.rb
CHANGED
@@ -24,40 +24,180 @@ require 'yaml'
|
|
24
24
|
#require_relative 'log.rb'
|
25
25
|
#include Logging
|
26
26
|
|
27
|
+
def rhExist?(yVal, *p)
|
28
|
+
|
29
|
+
if p.length() == 0
|
30
|
+
return 0
|
31
|
+
end
|
32
|
+
return 0 if yVal.class != Hash
|
33
|
+
p=p.flatten
|
34
|
+
if p.length() == 1
|
35
|
+
return 1 if yVal.key?(p[0])
|
36
|
+
return 0
|
37
|
+
end
|
38
|
+
return 0 if yVal.nil? or not yVal.key?(p[0])
|
39
|
+
ret = 0
|
40
|
+
ret = rhExist?(yVal[p[0]], p.drop(1)) if yVal[p[0]].class == Hash
|
41
|
+
return 1 + ret
|
42
|
+
end
|
43
|
+
|
44
|
+
def rhGet(yVal, *p)
|
45
|
+
|
46
|
+
return nil if yVal.class != Hash
|
47
|
+
p=p.flatten
|
48
|
+
if p.length() == 0 or not yVal
|
49
|
+
return yVal
|
50
|
+
end
|
51
|
+
if p.length() == 1
|
52
|
+
return yVal[p[0]] if yVal.key?(p[0])
|
53
|
+
return nil
|
54
|
+
end
|
55
|
+
return nil if not yVal
|
56
|
+
return rhGet(yVal[p[0]], p.drop(1)) if yVal.key?(p[0])
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
60
|
+
def rhSet(yVal, value, *p)
|
61
|
+
if p.length() == 0
|
62
|
+
return yVal
|
63
|
+
end
|
64
|
+
p=p.flatten
|
65
|
+
if p.length() == 1
|
66
|
+
if not yVal.nil?
|
67
|
+
if value
|
68
|
+
yVal[p[0]] = value
|
69
|
+
else
|
70
|
+
yVal.delete(p[0])
|
71
|
+
end
|
72
|
+
return yVal
|
73
|
+
end
|
74
|
+
if value
|
75
|
+
ret = { p[0] => value }
|
76
|
+
else
|
77
|
+
ret = {}
|
78
|
+
end
|
79
|
+
return ret
|
80
|
+
end
|
81
|
+
if not yVal.nil?
|
82
|
+
yVal[p[0]] = {} if not yVal[p[0]] or yVal[p[0]].class != Hash
|
83
|
+
ret=rhSet(yVal[p[0]], value, p.drop(1))
|
84
|
+
return yVal
|
85
|
+
else
|
86
|
+
ret = rhSet(nil, value, p.drop(1))
|
87
|
+
return { p[0] => ret }
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def rhKeyToSymbol(yVal, levels = 1)
|
92
|
+
return nil if yVal.nil? or yVal.class != Hash
|
93
|
+
yRes = {}
|
94
|
+
yVal.each { | key, value |
|
95
|
+
if key.class == String
|
96
|
+
if levels <= 1
|
97
|
+
yRes[key.to_sym] = value
|
98
|
+
else
|
99
|
+
yRes[key.to_sym] = rhKeyToSymbol(value, levels - 1)
|
100
|
+
end
|
101
|
+
else
|
102
|
+
if levels <= 1
|
103
|
+
yRes[key] = value
|
104
|
+
else
|
105
|
+
yRes[key] = rhKeyToSymbol(value, levels - 1)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
}
|
109
|
+
yRes
|
110
|
+
end
|
111
|
+
|
112
|
+
def rhKeyToSymbol?(yVal, levels = 1)
|
113
|
+
return false if yVal.nil? or yVal.class != Hash
|
114
|
+
yVal.each { | key, value |
|
115
|
+
if key.class == String
|
116
|
+
return true
|
117
|
+
end
|
118
|
+
if levels >1
|
119
|
+
res = rhKeyToSymbol?(value, levels - 1)
|
120
|
+
return true if res
|
121
|
+
end
|
122
|
+
}
|
123
|
+
false
|
124
|
+
end
|
125
|
+
|
27
126
|
class ForjDefault
|
28
127
|
|
29
128
|
# @sDefaultsName='defaults.yaml'
|
30
129
|
# @yDefaults = defaults.yaml file data hash
|
31
130
|
|
32
|
-
|
33
|
-
|
34
|
-
|
131
|
+
# Load yaml documents (defaults)
|
132
|
+
# If config doesn't exist, it will be created, empty with 'defaults:' only
|
133
|
+
|
35
134
|
|
36
|
-
|
37
|
-
|
38
|
-
|
135
|
+
def self.exist?(key, section = :default)
|
136
|
+
key = key.to_sym if key.class == String
|
137
|
+
(rhExist?(@@yDefaults, section, key) == 2)
|
138
|
+
end
|
139
|
+
|
140
|
+
def self.get(key, section = :default)
|
141
|
+
key = key.to_sym if key.class == String
|
142
|
+
return(rhGet(@@yDefaults, section, key)) if key
|
143
|
+
rhGet(@@yDefaults, section) if not key
|
144
|
+
end
|
39
145
|
|
40
|
-
|
146
|
+
def self.dump()
|
147
|
+
@@yDefaults
|
148
|
+
end
|
149
|
+
# Loop on Config metadata
|
150
|
+
def self.meta_each
|
151
|
+
rhGet(@@yDefaults, :sections).each { | section, hValue |
|
152
|
+
hValue.each { | key, value |
|
153
|
+
yield section, key, value
|
154
|
+
}
|
155
|
+
}
|
156
|
+
end
|
41
157
|
|
42
|
-
|
158
|
+
def self.meta_exist?(key)
|
159
|
+
return nil if not key
|
43
160
|
|
44
|
-
|
161
|
+
key = key.to_sym if key.class == String
|
162
|
+
section = rhGet(@@account_section_mapping, key)
|
163
|
+
rhExist?(@@yDefaults, :sections, section, key) == 3
|
45
164
|
end
|
46
165
|
|
47
|
-
def
|
166
|
+
def self.get_meta(key)
|
167
|
+
return nil if not key
|
168
|
+
|
48
169
|
key = key.to_sym if key.class == String
|
49
|
-
(
|
170
|
+
section = rhGet(@@account_section_mapping, key)
|
171
|
+
rhGet(@@yDefaults, :sections, section, key)
|
172
|
+
end
|
173
|
+
|
174
|
+
def self.build_section_mapping
|
175
|
+
@@account_section_mapping = {}
|
176
|
+
rhGet(@@yDefaults, :sections).each { | section, hValue |
|
177
|
+
next if section == :default
|
178
|
+
hValue.each_key { | map_key |
|
179
|
+
Logging.fatal(1, "defaults.yaml: Duplicate entry between sections. '%s' defined in section '%s' already exists in section '%s'" % [map_key, section, rhGet(@account_section_mapping, map_key) ])if rhExist?(@account_section_mapping, map_key) != 0
|
180
|
+
rhSet(@@account_section_mapping, section, map_key)
|
181
|
+
}
|
182
|
+
}
|
50
183
|
end
|
51
184
|
|
52
|
-
def
|
185
|
+
def self.get_meta_section(key)
|
53
186
|
key = key.to_sym if key.class == String
|
54
|
-
|
55
|
-
rhGet(@yDefaults, section) if not key
|
187
|
+
rhGet(@@account_section_mapping, key)
|
56
188
|
end
|
57
189
|
|
58
|
-
|
59
|
-
|
190
|
+
if not $LIB_PATH
|
191
|
+
Logging.fatal(1, 'Internal $LIB_PATH was not set.')
|
60
192
|
end
|
193
|
+
|
194
|
+
Logging.info('Reading default configuration...')
|
195
|
+
|
196
|
+
@@sDefaultsName=File.join($LIB_PATH,'defaults.yaml')
|
197
|
+
|
198
|
+
@@yDefaults=YAML.load_file(@@sDefaultsName)
|
199
|
+
|
200
|
+
self.build_section_mapping
|
61
201
|
end
|
62
202
|
|
63
203
|
class ForjConfig
|
@@ -67,7 +207,7 @@ class ForjConfig
|
|
67
207
|
# @yRuntime = data in memory.
|
68
208
|
# @yLocal = config.yaml file data hash.
|
69
209
|
# @yObjConfig = Extra loaded data
|
70
|
-
#
|
210
|
+
# ForjDefault = Application defaults class
|
71
211
|
|
72
212
|
attr_reader :sConfigName
|
73
213
|
|
@@ -78,7 +218,7 @@ class ForjConfig
|
|
78
218
|
# Build a config hash.
|
79
219
|
|
80
220
|
res = {}
|
81
|
-
|
221
|
+
ForjDefault.dump[:default].each_key { |key|
|
82
222
|
dump_key = exist?(key)
|
83
223
|
rhSet(res, get(key), dump_key, key)
|
84
224
|
}
|
@@ -134,12 +274,10 @@ class ForjConfig
|
|
134
274
|
@sConfigName = File.join($FORJ_DATA_PATH,sConfigDefaultName)
|
135
275
|
end
|
136
276
|
|
137
|
-
@oDefaults = ForjDefault.new
|
138
|
-
|
139
277
|
if File.exists?(@sConfigName)
|
140
278
|
@yLocal = YAML.load_file(@sConfigName)
|
141
279
|
if rhKeyToSymbol?(@yLocal, 2)
|
142
|
-
@yLocal = rhKeyToSymbol(@yLocal, 2)
|
280
|
+
@yLocal = rhKeyToSymbol(@yLocal, 2)
|
143
281
|
self.SaveConfig()
|
144
282
|
end
|
145
283
|
|
@@ -222,7 +360,7 @@ class ForjConfig
|
|
222
360
|
# Function to set a runtime key/value, but remove it if value is nil.
|
223
361
|
# To set in config.yaml, use LocalSet
|
224
362
|
# To set on extra data, like account information, use ExtraSet
|
225
|
-
|
363
|
+
|
226
364
|
key = key.to_sym if key.class == String
|
227
365
|
return false if key.class != Symbol
|
228
366
|
|
@@ -234,42 +372,49 @@ class ForjConfig
|
|
234
372
|
true
|
235
373
|
end
|
236
374
|
|
237
|
-
def
|
238
|
-
|
375
|
+
def runtimeExist?(key)
|
376
|
+
(rhExist?(@yRuntime, key) == 1)
|
377
|
+
end
|
378
|
+
|
379
|
+
def runtimeGet(key)
|
380
|
+
rhGet(@yRuntime, key) if runtimeExist?(key)
|
381
|
+
end
|
382
|
+
|
383
|
+
def get(key, default = nil)
|
239
384
|
key = key.to_sym if key.class == String
|
240
385
|
return nil if key.class != Symbol
|
241
386
|
# If key is in runtime
|
242
|
-
return
|
243
|
-
# Check data in intermediate hashes or array of hash. (like account data - key have to be identical)
|
244
|
-
if interms
|
245
|
-
if interms.instance_of? Hash
|
246
|
-
return rhGet(interms, key) if rhExist?(interms, key) == 1
|
247
|
-
elsif interms.instance_of? Array # Array of hashes
|
248
|
-
iCount=0
|
249
|
-
oVal = nil
|
250
|
-
interms.each { | elem |
|
251
|
-
if elem.class == Hash
|
252
|
-
elem.each { | hashkey, value |
|
253
|
-
if value.class == Hash and rhExist?(elem, hashkey, key) == 2 # hash of hash
|
254
|
-
oVal = rhGet(elem, hashkey, key)
|
255
|
-
break
|
256
|
-
elsif value.class != Hash and rhExist?(elem, hashkey) == 1 # single hash: key = value.
|
257
|
-
oVal = rhGet(elem, hashkey)
|
258
|
-
break
|
259
|
-
|
260
|
-
end
|
261
|
-
}
|
262
|
-
break if oVal
|
263
|
-
end
|
264
|
-
iCount += 1
|
265
|
-
}
|
266
|
-
return oVal
|
267
|
-
end
|
268
|
-
end
|
387
|
+
return runtimeGet(key) if runtimeExist?(key)
|
388
|
+
#~ # Check data in intermediate hashes or array of hash. (like account data - key have to be identical)
|
389
|
+
#~ if interms
|
390
|
+
#~ if interms.instance_of? Hash
|
391
|
+
#~ return rhGet(interms, key) if rhExist?(interms, key) == 1
|
392
|
+
#~ elsif interms.instance_of? Array # Array of hashes
|
393
|
+
#~ iCount=0
|
394
|
+
#~ oVal = nil
|
395
|
+
#~ interms.each { | elem |
|
396
|
+
#~ if elem.class == Hash
|
397
|
+
#~ elem.each { | hashkey, value |
|
398
|
+
#~ if value.class == Hash and rhExist?(elem, hashkey, key) == 2 # hash of hash
|
399
|
+
#~ oVal = rhGet(elem, hashkey, key)
|
400
|
+
#~ break
|
401
|
+
#~ elsif value.class != Hash and rhExist?(elem, hashkey) == 1 # single hash: key = value.
|
402
|
+
#~ oVal = rhGet(elem, hashkey)
|
403
|
+
#~ break
|
404
|
+
#~
|
405
|
+
#~ end
|
406
|
+
#~ }
|
407
|
+
#~ break if oVal
|
408
|
+
#~ end
|
409
|
+
#~ iCount += 1
|
410
|
+
#~ }
|
411
|
+
#~ return oVal
|
412
|
+
#~ end
|
413
|
+
#~ end
|
269
414
|
# else key in local default config of default section.
|
270
415
|
return LocalGet(key) if LocalDefaultExist?(key)
|
271
416
|
# else key in application defaults
|
272
|
-
return
|
417
|
+
return ForjDefault.get(key) if ForjDefault.exist?(key)
|
273
418
|
# else default
|
274
419
|
default
|
275
420
|
end
|
@@ -278,7 +423,7 @@ class ForjConfig
|
|
278
423
|
|
279
424
|
key = key.to_sym if key.class == String
|
280
425
|
|
281
|
-
|
426
|
+
ForjDefault.get(key, section)
|
282
427
|
end
|
283
428
|
|
284
429
|
def exist?(key, interms = nil)
|
@@ -304,7 +449,7 @@ class ForjConfig
|
|
304
449
|
end
|
305
450
|
return 'local' if LocalDefaultExist?(key)
|
306
451
|
# else key in application defaults
|
307
|
-
return 'default' if
|
452
|
+
return 'default' if ForjDefault.exist?(key)
|
308
453
|
false
|
309
454
|
end
|
310
455
|
|
@@ -358,101 +503,12 @@ class ForjConfig
|
|
358
503
|
def fatal_if_inexistent(key)
|
359
504
|
Logging.fatal(1, "Internal error - %s: '%s' is missing" % [caller(), key]) if not self.get(key)
|
360
505
|
end
|
361
|
-
end
|
362
506
|
|
363
|
-
def
|
364
|
-
|
365
|
-
|
366
|
-
|
507
|
+
def meta_each
|
508
|
+
ForjDefault.meta_each { |section, key, value|
|
509
|
+
next if rhGet(value, :account_exclusive)
|
510
|
+
yield section, key, value
|
511
|
+
}
|
367
512
|
end
|
368
|
-
return 0 if yVal.class != Hash
|
369
|
-
p=p.flatten
|
370
|
-
if p.length() == 1
|
371
|
-
return 1 if yVal[p[0]]
|
372
|
-
return 0
|
373
|
-
end
|
374
|
-
return 0 if not yVal or not yVal[p[0]]
|
375
|
-
ret = rhExist?(yVal[p[0]], p.drop(1)) if yVal[p[0]]
|
376
|
-
return 1 + ret
|
377
|
-
end
|
378
|
-
|
379
|
-
def rhGet(yVal, *p)
|
380
|
-
|
381
|
-
if p.length() == 0 or not yVal
|
382
|
-
return nil
|
383
|
-
end
|
384
|
-
p=p.flatten
|
385
|
-
if p.length() == 1
|
386
|
-
return yVal[p[0]] if yVal[p[0]]
|
387
|
-
return nil
|
388
|
-
end
|
389
|
-
return nil if not yVal
|
390
|
-
return rhGet(yVal[p[0]], p.drop(1)) if yVal[p[0]]
|
391
|
-
nil
|
392
|
-
end
|
393
513
|
|
394
|
-
def rhSet(yVal, value, *p)
|
395
|
-
if p.length() == 0
|
396
|
-
return yVal
|
397
|
-
end
|
398
|
-
p=p.flatten
|
399
|
-
if p.length() == 1
|
400
|
-
if yVal
|
401
|
-
if value
|
402
|
-
yVal[p[0]] = value
|
403
|
-
else
|
404
|
-
yVal.delete(p[0])
|
405
|
-
end
|
406
|
-
return yVal
|
407
|
-
end
|
408
|
-
if value
|
409
|
-
ret = { p[0] => value }
|
410
|
-
else
|
411
|
-
ret = {}
|
412
|
-
end
|
413
|
-
return ret
|
414
|
-
end
|
415
|
-
if yVal
|
416
|
-
yVal[p[0]] = {} if not yVal[p[0]] or yVal[p[0]].class != Hash
|
417
|
-
ret=rhSet(yVal[p[0]], value, p.drop(1))
|
418
|
-
return yVal
|
419
|
-
else
|
420
|
-
ret = rhSet(nil, value, p.drop(1))
|
421
|
-
return { p[0] => ret }
|
422
|
-
end
|
423
|
-
end
|
424
|
-
|
425
|
-
def rhKeyToSymbol(yVal, levels = 1)
|
426
|
-
return nil if not yVal
|
427
|
-
yRes = {}
|
428
|
-
yVal.each { | key, value |
|
429
|
-
if key.class == String
|
430
|
-
if levels <= 1
|
431
|
-
yRes[key.to_sym] = value
|
432
|
-
else
|
433
|
-
yRes[key.to_sym] = rhKeyToSymbol(value, levels - 1)
|
434
|
-
end
|
435
|
-
else
|
436
|
-
if levels <= 1
|
437
|
-
yRes[key] = value
|
438
|
-
else
|
439
|
-
yRes[key] = rhKeyToSymbol(value, levels - 1)
|
440
|
-
end
|
441
|
-
end
|
442
|
-
}
|
443
|
-
yRes
|
444
|
-
end
|
445
|
-
|
446
|
-
def rhKeyToSymbol?(yVal, levels = 1)
|
447
|
-
return false if not yVal
|
448
|
-
yVal.each { | key, value |
|
449
|
-
if key.class == String
|
450
|
-
return true
|
451
|
-
end
|
452
|
-
if levels >1
|
453
|
-
res = rhKeyToSymbol?(value, levels - 1)
|
454
|
-
return true if res
|
455
|
-
end
|
456
|
-
}
|
457
|
-
false
|
458
514
|
end
|
@@ -0,0 +1,209 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
|
4
|
+
#
|
5
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
+
# you may not use this file except in compliance with the License.
|
7
|
+
# You may obtain a copy of the License at
|
8
|
+
#
|
9
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
+
#
|
11
|
+
# Unless required by applicable law or agreed to in writing, software
|
12
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
+
# See the License for the specific language governing permissions and
|
15
|
+
# limitations under the License.
|
16
|
+
|
17
|
+
module Forj
|
18
|
+
module Settings
|
19
|
+
def Settings.account_show_all(oConfig, account_name)
|
20
|
+
oConfig.set(:account_name, account_name)
|
21
|
+
|
22
|
+
oForjAccount = ForjAccount.new(oConfig)
|
23
|
+
oForjAccount.ac_load()
|
24
|
+
puts "List of account settings for provider '%s': " % [oForjAccount.get(:provider)]
|
25
|
+
puts "%-15s %-12s :\n------------------------------" % ['key', 'section name']
|
26
|
+
|
27
|
+
oForjAccount.metadata_each { |section, found_key, hValue|
|
28
|
+
next if rhGet(hValue, :readonly)
|
29
|
+
sDesc = rhGet(hValue, :desc)
|
30
|
+
puts "%-15s %-12s : %s" % [found_key, section, sDesc]
|
31
|
+
}
|
32
|
+
puts "\nUse `forj set KeyName=Value -a %s` to set one." % [ account_name]
|
33
|
+
puts "Use `forj get -a %s` to check current values." % [ account_name]
|
34
|
+
end
|
35
|
+
|
36
|
+
def Settings.config_show_all(oConfig)
|
37
|
+
puts "List of available FORJ default settings:"
|
38
|
+
puts "%-15s %-12s :\n------------------------------" % ['key', 'section name']
|
39
|
+
oConfig.meta_each { |section, found_key, hValue|
|
40
|
+
next if rhGet(hValue, :readonly)
|
41
|
+
sDesc = rhGet(hValue, :desc)
|
42
|
+
puts "%-15s %-12s : %s" % [found_key, section, sDesc]
|
43
|
+
}
|
44
|
+
puts "\nUse `forj set KeyName=Value` to set one. "
|
45
|
+
puts "Use `forj get` to get current values. "
|
46
|
+
end
|
47
|
+
|
48
|
+
def Settings.account_set(oConfig, account_name, *p)
|
49
|
+
bDirty = false
|
50
|
+
|
51
|
+
oConfig.set(:account_name, account_name)
|
52
|
+
|
53
|
+
oForjAccount = ForjAccount.new(oConfig)
|
54
|
+
oForjAccount.ac_load()
|
55
|
+
|
56
|
+
p.flatten!
|
57
|
+
p.each { | key_val |
|
58
|
+
mkey_val = key_val.match(/^(.*) *= *(.*)$/)
|
59
|
+
|
60
|
+
Logging.fatal(1, "Syntax error. Please set your value like: 'key=value' and retry.") if not mkey_val
|
61
|
+
|
62
|
+
key_to_set = mkey_val[1]
|
63
|
+
key_value = mkey_val[2]
|
64
|
+
|
65
|
+
sBef = "unset"
|
66
|
+
sAft = "unset"
|
67
|
+
|
68
|
+
Logging.fatal(1, "Unable to update protected '%s'. use `forj setup`, to update it." % key_to_set) if oForjAccount.readonly?(key_to_set)
|
69
|
+
if oForjAccount.meta_type?(key_to_set) == :default
|
70
|
+
Logging.fatal(1, "Unable set '%s' value. To update this one, use forj set %s, WITHOUT -a %s" % [key_to_set, key_to_set, account_name])
|
71
|
+
end
|
72
|
+
|
73
|
+
full_key = '%s/%s' % [ForjDefault.get_meta_section(key_to_set), key_to_set]
|
74
|
+
|
75
|
+
old_value = oForjAccount.get(key_to_set)
|
76
|
+
sBef = "'%s' (%s)" % [old_value, oForjAccount.exist?(key_to_set)] if oForjAccount.exist?(key_to_set)
|
77
|
+
|
78
|
+
if old_value == key_value
|
79
|
+
puts "%-25s: No update" % [full_key]
|
80
|
+
next
|
81
|
+
end
|
82
|
+
bDirty = true
|
83
|
+
|
84
|
+
if key_value == ""
|
85
|
+
oForjAccount.del(key_to_set)
|
86
|
+
else
|
87
|
+
oForjAccount.set(key_to_set, key_value)
|
88
|
+
end
|
89
|
+
|
90
|
+
sAft = "'%s' (%s)" % [oForjAccount.get(key_to_set), oForjAccount.exist?(key_to_set)] if oForjAccount.exist?(key_to_set)
|
91
|
+
puts "%-25s: %s => %s" % [full_key, sBef, ANSI.bold+sAft+ANSI.clear]
|
92
|
+
}
|
93
|
+
oForjAccount.ac_save() if bDirty
|
94
|
+
end
|
95
|
+
|
96
|
+
def Settings.config_set(oConfig, *p)
|
97
|
+
bDirty = false
|
98
|
+
|
99
|
+
p.flatten!
|
100
|
+
p.each { | key_val |
|
101
|
+
mkey_val = key_val.match(/^(.*) *= *(.*)$/)
|
102
|
+
|
103
|
+
Logging.fatal(1, "Syntax error. Please set your value like: 'key=value' and retry.") if not mkey_val
|
104
|
+
|
105
|
+
key_to_set = mkey_val[1]
|
106
|
+
key_value = mkey_val[2]
|
107
|
+
|
108
|
+
sBef = "unset"
|
109
|
+
sAft = "unset"
|
110
|
+
|
111
|
+
old_value = oConfig.get(key_to_set)
|
112
|
+
sBef = "%s: '%s'" % [oConfig.exist?(key_to_set), oConfig.get(key_to_set)] if oConfig.exist?(key_to_set)
|
113
|
+
|
114
|
+
if old_value == key_value
|
115
|
+
puts "%-15s: No update" % [key_to_set]
|
116
|
+
next
|
117
|
+
end
|
118
|
+
|
119
|
+
bDirty = true
|
120
|
+
|
121
|
+
if key_value != ""
|
122
|
+
oConfig.LocalSet(key_to_set, key_value)
|
123
|
+
else
|
124
|
+
oConfig.LocalDel(key_to_set)
|
125
|
+
end
|
126
|
+
|
127
|
+
sAft = "%s: '%s'" % [oConfig.exist?(key_to_set), oConfig.get(key_to_set)] if oConfig.exist?(key_to_set)
|
128
|
+
puts "%-15s: %s => %s" % [key_to_set, sBef, ANSI.bold+sAft+ANSI.clear]
|
129
|
+
}
|
130
|
+
oConfig.SaveConfig() if bDirty
|
131
|
+
end
|
132
|
+
|
133
|
+
def Settings.account_get_all(oConfig, account_name)
|
134
|
+
oConfig.set(:account_name, account_name)
|
135
|
+
oForjAccount = ForjAccount.new(oConfig)
|
136
|
+
Logging.fatal(1, "Unable to load account '%s'. Not found." % account_name) if not oForjAccount.ac_load
|
137
|
+
|
138
|
+
puts "legend: default = Application defaults, local = Local default config, %s = '%s' account config\n\n" % [account_name, account_name]
|
139
|
+
puts "%s %-15s(%-7s) %-12s:\n----------------------------------------" % ['U', 'key', 'origin', 'section name']
|
140
|
+
oForjAccount.metadata_each { | section, mykey, hValue |
|
141
|
+
key_exist = oForjAccount.exist?(mykey)
|
142
|
+
|
143
|
+
sUpdMsg = '+'
|
144
|
+
sUpdMsg = ' ' if rhGet(hValue, :readonly)
|
145
|
+
|
146
|
+
if key_exist
|
147
|
+
highlight = ''
|
148
|
+
highlight = ANSI.bold if key_exist == account_name
|
149
|
+
highlight = ANSI.bold + ANSI.yellow if key_exist == 'local'
|
150
|
+
default_key = nil
|
151
|
+
default_key = " (from default key '%s')" % rhGet(hValue, :default) if rhExist?(hValue, :default) == 1 and key_exist != account_name
|
152
|
+
puts "%s %-15s(%s%-7s%s) %-12s: '%s'%s" % [sUpdMsg, mykey, highlight, key_exist, ANSI.clear, section, oForjAccount.get(mykey), default_key]
|
153
|
+
else
|
154
|
+
puts "%s %-15s( ) %-12s: unset" % [sUpdMsg, mykey, section]
|
155
|
+
end
|
156
|
+
}
|
157
|
+
puts "\nOn values identified by '+' you can:"
|
158
|
+
puts "Use `forj set <key>=<value> -a %s` to update account data." % account_name
|
159
|
+
puts "Or `forj set <key>= -a %s` to restore key default value." % account_name
|
160
|
+
end
|
161
|
+
|
162
|
+
def Settings.config_get_all(oConfig)
|
163
|
+
puts "legend: default = Application defaults, local = Local default config\n\n"
|
164
|
+
puts "%s %-15s(%-7s) %-12s:\n----------------------------------------" % ['U', '''key', 'origin', 'section name']
|
165
|
+
|
166
|
+
oConfig.meta_each { |section, found_key, hValue|
|
167
|
+
sUpdMsg = '+'
|
168
|
+
sUpdMsg = ' ' if rhGet(hValue, :readonly)
|
169
|
+
found_key = rhGet(hValue, :default) if rhExist?(hValue, :default) == 1
|
170
|
+
|
171
|
+
where = oConfig.exist?(found_key)
|
172
|
+
if where
|
173
|
+
highlight = ''
|
174
|
+
highlight = ANSI.bold + ANSI.yellow if where == 'local'
|
175
|
+
puts "%s %-15s(%s%-7s%s) %-12s: '%s'" % [sUpdMsg, found_key, highlight, where, ANSI.clear, section, oConfig.get(found_key) ]
|
176
|
+
else
|
177
|
+
puts "%s %-15s( ) %-12s: unset" % [sUpdMsg, found_key, section]
|
178
|
+
end
|
179
|
+
}
|
180
|
+
puts "\nUse 'forj set <key>=<value>' to update defaults on values identified with '+'"
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
def Settings.account_get(oConfig, account_name, key)
|
185
|
+
|
186
|
+
oConfig.set(:account_name, account_name)
|
187
|
+
oForjAccount = ForjAccount.new(oConfig)
|
188
|
+
|
189
|
+
Logging.fatal(1, "Unable to load account '%s'. Not found." % account_name) if not oForjAccount.ac_load
|
190
|
+
|
191
|
+
if oForjAccount.exist?(key)
|
192
|
+
puts "%s: '%s'" % [oForjAccount.exist?(key), oForjAccount.get(key)]
|
193
|
+
elsif oForjAccount.exist?(key.parameterize.underscore.to_sym)
|
194
|
+
key_symb = key.parameterize.underscore.to_sym
|
195
|
+
puts "%s: '%s'" % [oForjAccount.exist?(key_symb), oForjAccount.get(key_symb)]
|
196
|
+
else
|
197
|
+
Logging.message("key '%s' not found"% [key])
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
def Settings.config_get(oConfig, key)
|
202
|
+
if oConfig.exist?(key)
|
203
|
+
puts "%s:'%s'" % [oConfig.exist?(key), oConfig.get(key)]
|
204
|
+
else
|
205
|
+
Logging.message("key '%s' not found" % [key])
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
data/lib/helpers.rb
CHANGED
data/lib/log.rb
CHANGED
@@ -20,6 +20,7 @@
|
|
20
20
|
|
21
21
|
require 'rubygems'
|
22
22
|
require 'logger'
|
23
|
+
require 'ansi'
|
23
24
|
|
24
25
|
require 'require_relative'
|
25
26
|
|
@@ -32,31 +33,6 @@ include Helpers
|
|
32
33
|
#
|
33
34
|
module Logging
|
34
35
|
|
35
|
-
class SSLErrorMgt
|
36
|
-
|
37
|
-
def initialize()
|
38
|
-
@iRetry=0
|
39
|
-
end
|
40
|
-
|
41
|
-
def ErrorDetected(message,backtrace)
|
42
|
-
if message.match('SSLv2/v3 read server hello A: unknown protocol')
|
43
|
-
if @iRetry <5
|
44
|
-
sleep(2)
|
45
|
-
@iRetry+=1
|
46
|
-
print "%s/5 try...\r" % @iRetry if $FORJ_LOGGER.level == 0
|
47
|
-
return false
|
48
|
-
else
|
49
|
-
Logging.error('Too many retry. %s' % message)
|
50
|
-
return true
|
51
|
-
end
|
52
|
-
else
|
53
|
-
Logging.error("%s\n%s" % [message,backtrace.join("\n")])
|
54
|
-
return true
|
55
|
-
end
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
36
|
class ForjLog
|
61
37
|
# Class used to create 2 log object, in order to keep track of error in a log file and change log output to OUTPUT on needs (option flags).
|
62
38
|
|