origen 0.36.0 → 0.36.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/origen +2 -1
- data/config/version.rb +1 -1
- data/lib/origen.rb +6 -0
- data/lib/origen/commands.rb +5 -0
- data/lib/origen/commands/site.rb +52 -0
- data/lib/origen/commands_global.rb +5 -0
- data/lib/origen/site_config.rb +232 -53
- data/lib/origen/site_config/config.rb +205 -0
- data/lib/origen/users/user.rb +3 -2
- data/lib/origen/utility/mailer.rb +42 -9
- data/origen_site_config.yml +24 -1
- data/vendor/lib/models/origen/export1.rb +1 -1
- data/vendor/lib/models/origen/export1/block1.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b7cd6e1fd31d6cf1cdcc85ced3c00da93d86b47b0bcdff4b882a88bac79ac45
|
4
|
+
data.tar.gz: d395df3f3faba1ed8c4a5d7d4e34e7193de1a75a62a116fcea80047727a1f99c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 928fa5eea49de2b7f75d1f023c2808f7bb9af6c4a7fd1d79c82cd0cfb83ecb2fdb93405fdd5e55fc959fffd4671e2383be47d1fa89b7c297107e98172972be1c
|
7
|
+
data.tar.gz: 12dc00e6e0557da57afb690ae34cada31ae633688c071ec26b91cef7e261ad234623635077a20b38add1058507b921763d7cc8f969ee83c0d9643e12a9d20281
|
data/bin/origen
CHANGED
@@ -170,7 +170,8 @@ if origen_root && File.exist?(ENV['BUNDLE_GEMFILE']) && Origen.site_config.gem_m
|
|
170
170
|
end
|
171
171
|
end
|
172
172
|
require 'bundler/setup'
|
173
|
-
|
173
|
+
_exec_remote = ARGV.include?('--exec_remote') ? true : false
|
174
|
+
if Origen.site_config.use_bootsnap && !Origen.os.windows? && !_exec_remote
|
174
175
|
ENV["BOOTSNAP_CACHE_DIR"] ||= "#{origen_root}/tmp/cache"
|
175
176
|
require 'bootsnap/setup'
|
176
177
|
end
|
data/config/version.rb
CHANGED
data/lib/origen.rb
CHANGED
@@ -28,6 +28,7 @@ unless defined? RGen::ORIGENTRANSITION
|
|
28
28
|
require 'bundler'
|
29
29
|
require 'origen/undefined'
|
30
30
|
require 'origen/componentable'
|
31
|
+
require 'socket'
|
31
32
|
|
32
33
|
module Origen
|
33
34
|
autoload :Features, 'origen/features'
|
@@ -670,6 +671,11 @@ unless defined? RGen::ORIGENTRANSITION
|
|
670
671
|
end
|
671
672
|
alias_method :interactive?, :running_interactively?
|
672
673
|
|
674
|
+
# Platform independent way of retrieving the hostname
|
675
|
+
def hostname
|
676
|
+
Socket.gethostbyname(Socket.gethostname).first.downcase
|
677
|
+
end
|
678
|
+
|
673
679
|
# Returns true if Origen is running with the -d or --debug switches enabled
|
674
680
|
def debug?
|
675
681
|
@debug || false
|
data/lib/origen/commands.rb
CHANGED
@@ -244,6 +244,10 @@ when 'version'
|
|
244
244
|
require 'origen/commands/version'
|
245
245
|
exit 0
|
246
246
|
|
247
|
+
when 'site'
|
248
|
+
require 'origen/commands/site'
|
249
|
+
exit 0
|
250
|
+
|
247
251
|
else
|
248
252
|
if ['-h', '--help'].include?(@command)
|
249
253
|
status = 0
|
@@ -273,6 +277,7 @@ The core origen commands are:
|
|
273
277
|
web Web page tools, see -h for details
|
274
278
|
time Tools for test time analysis and forecasting
|
275
279
|
lint Lint and style check (and correct) your application code
|
280
|
+
site Monitor and manage the Origen site configuration
|
276
281
|
EOT
|
277
282
|
cmds.split(/\n/).each do |line|
|
278
283
|
puts Origen.clean_help_line(line)
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'pathname'
|
3
|
+
require 'origen/commands/helpers'
|
4
|
+
|
5
|
+
module Origen
|
6
|
+
options = {}
|
7
|
+
|
8
|
+
# App options are options that the application can supply to extend this command
|
9
|
+
app_options = @application_options || []
|
10
|
+
opt_parser = OptionParser.new do |opts|
|
11
|
+
opts.banner = <<-END
|
12
|
+
env [filters...] Shows the current site environment configuration. Analogous to 'env' for shell environment.
|
13
|
+
In other words, lists all the site config variables and their values.
|
14
|
+
Aliased to 'environment'.
|
15
|
+
|
16
|
+
configs Shows the current config files used and their indexes.
|
17
|
+
|
18
|
+
inspect_config [config_indexes...] Inspects the configuration(s) at each index given.
|
19
|
+
Indexes can be found from 'origen site configs'
|
20
|
+
If no indexes are given, all configs are printed.
|
21
|
+
|
22
|
+
inspect_variable [variable_names...] Inspects and traces the variable(s) through the various sites configs.
|
23
|
+
|
24
|
+
refresh Forces a refresh of the centralized site config. This will reset the timer for the next automatc refresh.
|
25
|
+
END
|
26
|
+
|
27
|
+
# Apply any application option extensions to the OptionParser
|
28
|
+
Origen::CommandHelpers.extend_options(opts, app_options, options)
|
29
|
+
opts.separator ''
|
30
|
+
opts.on('-h', '--help', 'Show this message') { puts opts; exit }
|
31
|
+
end
|
32
|
+
opt_parser.parse! ARGV
|
33
|
+
|
34
|
+
if ARGV[0]
|
35
|
+
case ARGV.shift
|
36
|
+
when 'env', 'environment'
|
37
|
+
Origen.site_config.pretty_print_env(*ARGV)
|
38
|
+
when 'configs'
|
39
|
+
Origen.site_config.pretty_print_configs
|
40
|
+
when 'inspect_config', 'inspect_configs'
|
41
|
+
Origen.site_config.inspect_config(*ARGV)
|
42
|
+
when 'inspect_variable', 'inspect_variables'
|
43
|
+
Origen.site_config.inspect_variable(*ARGV)
|
44
|
+
when 'refresh'
|
45
|
+
Origen.site_config.refresh
|
46
|
+
else
|
47
|
+
puts "Unknown command, see 'origen site -h' for a list of commands"
|
48
|
+
end
|
49
|
+
else
|
50
|
+
puts "You must supply a command, see 'origen site -h' for a list of commands"
|
51
|
+
end
|
52
|
+
end
|
@@ -96,6 +96,10 @@ when '--version', '-v'
|
|
96
96
|
require 'origen/commands/version'
|
97
97
|
exit 0
|
98
98
|
|
99
|
+
when 'site'
|
100
|
+
require 'origen/commands/site'
|
101
|
+
exit 0
|
102
|
+
|
99
103
|
# when 'fetch', 'f'
|
100
104
|
# require 'origen/commands/fetch'
|
101
105
|
# exit 0
|
@@ -115,6 +119,7 @@ The following commands are available:
|
|
115
119
|
new origen application workspace in "./my_app"
|
116
120
|
interactive Start an interactive Origen console (short-cut alias: "i"), this is just
|
117
121
|
IRB with the 'origen' lib loaded automatically
|
122
|
+
site Monitor and manage the Origen site configuration
|
118
123
|
EOT
|
119
124
|
cmds.split(/\n/).each do |line|
|
120
125
|
puts Origen.clean_help_line(line)
|
data/lib/origen/site_config.rb
CHANGED
@@ -3,15 +3,20 @@ module Origen
|
|
3
3
|
require 'pathname'
|
4
4
|
require 'yaml'
|
5
5
|
require 'etc'
|
6
|
+
require 'erb'
|
7
|
+
require 'colored'
|
8
|
+
require 'httparty'
|
9
|
+
require_relative 'site_config/config'
|
10
|
+
|
11
|
+
# require this version of Origen
|
12
|
+
require_relative '../origen'
|
6
13
|
|
7
14
|
TRUE_VALUES = ['true', 'TRUE', '1', 1]
|
8
15
|
FALSE_VALUES = ['false', 'FALSE', '0', 0]
|
9
16
|
|
10
17
|
# Adding parameters to this array will prevent them from being converted to booleans if
|
11
18
|
# they are assigned one of the values in the TRUE_VALUES/FALSE_VALUES arrays
|
12
|
-
NON_BOOLEAN_PARAMETERS = [:lsf_cores]
|
13
|
-
|
14
|
-
# Define a couple of site configs variables that need a bit of processing
|
19
|
+
NON_BOOLEAN_PARAMETERS = [:lsf_cores, :centralized_site_config_refresh]
|
15
20
|
|
16
21
|
# Gets the gem_intall_dir. This is either site_config.home_dir/gems or the site configs gem_install_dir
|
17
22
|
def gem_install_dir
|
@@ -76,11 +81,15 @@ module Origen
|
|
76
81
|
path
|
77
82
|
end
|
78
83
|
|
84
|
+
def centralized_site_config_cache_dir
|
85
|
+
File.expand_path(find_val('centralized_site_config_cache_dir'))
|
86
|
+
end
|
87
|
+
|
79
88
|
# Dynamically remove the highest instance of :var
|
80
89
|
def remove_highest(var)
|
81
90
|
@configs.each do |c|
|
82
|
-
if c.
|
83
|
-
return c.
|
91
|
+
if c.has_var?(var)
|
92
|
+
return c.remove_var(var)
|
84
93
|
end
|
85
94
|
end
|
86
95
|
|
@@ -96,8 +105,8 @@ module Origen
|
|
96
105
|
# If [] is returned, it implies that there was no instancs of :var to be removed.
|
97
106
|
ret = []
|
98
107
|
@configs.each do |c|
|
99
|
-
if c.
|
100
|
-
ret << c.
|
108
|
+
if c.has_var?(var)
|
109
|
+
ret << c.remove_var(var)
|
101
110
|
end
|
102
111
|
end
|
103
112
|
ret
|
@@ -108,7 +117,8 @@ module Origen
|
|
108
117
|
def add_as_highest(var, value)
|
109
118
|
# Don't want to override anything, so just shift in a dummy site config instance at the highest level and
|
110
119
|
# set the value there.
|
111
|
-
|
120
|
+
c = Config.new(path: :runtime, parent: self, values: { var.to_s => value })
|
121
|
+
configs.prepend(Config.new(path: :runtime, parent: self, values: { var.to_s => value }))
|
112
122
|
end
|
113
123
|
alias_method :[]=, :add_as_highest
|
114
124
|
|
@@ -117,17 +127,19 @@ module Origen
|
|
117
127
|
def add_as_lowest(var, value)
|
118
128
|
# Don't want to override anything, so just shift in a dummy site config at the lowest level and
|
119
129
|
# set the value there.
|
120
|
-
configs.append(var.to_s => value)
|
130
|
+
configs.append(Config.new(path: :runtime, parent: self, values: { var.to_s => value }))
|
121
131
|
end
|
122
132
|
|
123
133
|
# Adds a new site config file as the highest priority
|
124
134
|
def add_site_config_as_highest(site_config_file)
|
125
|
-
configs.prepend YAML.load_file(File.expand_path('../../../origen_site_config.yml', __FILE__))
|
135
|
+
# configs.prepend YAML.load_file(File.expand_path('../../../origen_site_config.yml', __FILE__))
|
136
|
+
configs.prepend(Config.new(path: site_config_file, parent: self))
|
126
137
|
end
|
127
138
|
|
128
139
|
# Adds a new site config file as the highest priority
|
129
140
|
def add_site_config_as_lowest(site_config_file)
|
130
|
-
configs.append YAML.load_file(File.expand_path('../../../origen_site_config.yml', __FILE__))
|
141
|
+
# configs.append YAML.load_file(File.expand_path('../../../origen_site_config.yml', __FILE__))
|
142
|
+
configs.append(Config.new(path: site_config_file, parent: self))
|
131
143
|
end
|
132
144
|
|
133
145
|
def method_missing(method, *args, &block)
|
@@ -148,15 +160,10 @@ module Origen
|
|
148
160
|
val
|
149
161
|
end
|
150
162
|
|
151
|
-
def get(val)
|
152
|
-
find_val(val)
|
153
|
-
end
|
154
|
-
alias_method :[], :get
|
155
|
-
|
156
163
|
def get_all(val)
|
157
164
|
ret = []
|
158
165
|
@configs.each do |c|
|
159
|
-
if c.
|
166
|
+
if c.has_var?(val)
|
160
167
|
ret << c[val]
|
161
168
|
end
|
162
169
|
end
|
@@ -171,16 +178,162 @@ module Origen
|
|
171
178
|
configs!
|
172
179
|
end
|
173
180
|
|
174
|
-
|
181
|
+
def refresh
|
182
|
+
@configs.each(&:refresh)
|
183
|
+
end
|
184
|
+
|
185
|
+
def pretty_print_configs
|
186
|
+
puts 'The following config files are ordered from last-encountered (highest priority) first-encountered (lowest priority)'
|
187
|
+
puts
|
188
|
+
configs.each_with_index do |config, i|
|
189
|
+
puts "#{i}: #{config.path} (#{config.type})"
|
190
|
+
end
|
191
|
+
end
|
192
|
+
alias_method :pp_configs, :pretty_print_configs
|
193
|
+
|
194
|
+
def all_vars
|
195
|
+
vars = {}
|
196
|
+
configs.each do |c|
|
197
|
+
vars = c.values.merge(vars)
|
198
|
+
end
|
199
|
+
vars
|
200
|
+
end
|
201
|
+
alias_method :env, :all_vars
|
202
|
+
|
203
|
+
# Gets all config variables as a hash, but the hash's values are the Config instances which defines the highest
|
204
|
+
# priority of each var, instead of the var's value itself.
|
205
|
+
def vars_by_configs
|
206
|
+
vars = {}
|
207
|
+
configs.each do |c|
|
208
|
+
vars = c.values.map { |k, v| [k, c] }.to_h.merge(vars)
|
209
|
+
end
|
210
|
+
vars
|
211
|
+
end
|
212
|
+
alias_method :vars_by_config, :vars_by_configs
|
213
|
+
|
214
|
+
def pretty_print_env(*vars)
|
215
|
+
puts
|
216
|
+
spacing = ' ' * 2
|
217
|
+
r = vars.empty? ? nil : Regexp.union(vars.map { |v| Regexp.new(v) })
|
218
|
+
all_vars.each do |var, val|
|
219
|
+
if !r.nil? && !(var.match r)
|
220
|
+
next
|
221
|
+
end
|
222
|
+
|
223
|
+
if val.is_a?(Array)
|
224
|
+
puts "#{var}: ["
|
225
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
226
|
+
puts ']'
|
227
|
+
elsif val.is_a?(Hash)
|
228
|
+
puts "#{var}: {"
|
229
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
230
|
+
puts '}'
|
231
|
+
else
|
232
|
+
puts "#{var}: #{val}"
|
233
|
+
end
|
234
|
+
end
|
235
|
+
puts
|
236
|
+
end
|
237
|
+
alias_method :pp_env, :pretty_print_env
|
238
|
+
|
239
|
+
def to_env(val)
|
240
|
+
"ORIGEN_#{val.upcase}"
|
241
|
+
end
|
242
|
+
|
243
|
+
def env_contains?(val)
|
244
|
+
ENV.key?(val)
|
245
|
+
end
|
246
|
+
|
247
|
+
def env(val)
|
248
|
+
if env_contains?(val)
|
249
|
+
ENV[val]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def inspect_variable(*vars)
|
254
|
+
vars.each do |var|
|
255
|
+
puts "Inspecting Variable: #{var}"
|
256
|
+
if env_contains?(to_env(var))
|
257
|
+
puts "Environment Variable (#{to_env(var)}): #{env(to_env(var))}"
|
258
|
+
else
|
259
|
+
puts "(No enviornment variable #{to_env(var)} defined)"
|
260
|
+
end
|
261
|
+
@configs.each do |c|
|
262
|
+
if c.has_var?(var)
|
263
|
+
puts "#{c.path} (#{c.type}): #{c[var]}"
|
264
|
+
end
|
265
|
+
end
|
266
|
+
puts
|
267
|
+
end
|
268
|
+
end
|
269
|
+
alias_method :inspect_var, :inspect_variable
|
270
|
+
alias_method :inspect_variables, :inspect_variable
|
271
|
+
alias_method :inspect_vars, :inspect_variable
|
272
|
+
|
273
|
+
# Inspects the config(s) at the incex given.
|
274
|
+
def inspect_configs(*config_indexes)
|
275
|
+
config_indexes.each do |i|
|
276
|
+
if i.to_i > @configs.size
|
277
|
+
puts "Origen::SiteConfig: index #{i} is out of range of the available configs! Total configs: #{@configs.size}.".red
|
278
|
+
elsif i.to_i < 0
|
279
|
+
puts "Origen::SiteConfig: index #{i} is less than 0. This index is ignored.".red
|
280
|
+
else
|
281
|
+
c = @configs[i.to_i]
|
282
|
+
puts "Inspecting config \##{i}"
|
283
|
+
puts "Type: #{c.type}"
|
284
|
+
puts "Path: #{c.path}"
|
285
|
+
if c.centralized?
|
286
|
+
# Add a safeguard in case something happened being bootup and now and the cache is no longer present
|
287
|
+
puts "Cached At: #{c.cache_file}" if c.cache_file
|
288
|
+
puts "Cached On: #{c.cache_file.ctime}" if c.cache_file
|
289
|
+
end
|
290
|
+
|
291
|
+
puts
|
292
|
+
puts 'Values from this config:'
|
293
|
+
spacing = ' ' * 2
|
294
|
+
c.values.each do |var, val|
|
295
|
+
if val.is_a?(Array)
|
296
|
+
puts "#{var}: ["
|
297
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
298
|
+
puts ']'
|
299
|
+
elsif val.is_a?(Hash)
|
300
|
+
puts "#{var}: {"
|
301
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
302
|
+
puts '}'
|
303
|
+
else
|
304
|
+
puts "#{var}: #{val}"
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
308
|
+
puts
|
309
|
+
puts 'Active (highest-level) values from this config:'
|
310
|
+
spacing = ' ' * 2
|
311
|
+
vars_by_config.select { |k, v| v == c }.map { |k, v| [k, v[k]] }.to_h.each do |var, val|
|
312
|
+
if val.is_a?(Array)
|
313
|
+
puts "#{var}: ["
|
314
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
315
|
+
puts ']'
|
316
|
+
elsif val.is_a?(Hash)
|
317
|
+
puts "#{var}: {"
|
318
|
+
val.each { |v| puts "#{spacing} #{v}" }
|
319
|
+
puts '}'
|
320
|
+
else
|
321
|
+
puts "#{var}: #{val}"
|
322
|
+
end
|
323
|
+
end
|
324
|
+
puts
|
325
|
+
end
|
326
|
+
end
|
327
|
+
end
|
328
|
+
alias_method :inspect_config, :inspect_configs
|
175
329
|
|
176
330
|
def find_val(val, options = {})
|
177
331
|
env = "ORIGEN_#{val.upcase}"
|
178
332
|
if ENV.key?(env)
|
179
333
|
value = ENV[env]
|
180
|
-
value
|
181
334
|
else
|
182
|
-
config = configs.find { |c| c.
|
183
|
-
value = config ? config
|
335
|
+
config = configs.find { |c| c.has_var?(val) }
|
336
|
+
value = config ? config.find_val(val) : nil
|
184
337
|
end
|
185
338
|
|
186
339
|
unless NON_BOOLEAN_PARAMETERS.include?(val.to_s.downcase.to_sym)
|
@@ -192,56 +345,82 @@ module Origen
|
|
192
345
|
end
|
193
346
|
value
|
194
347
|
end
|
348
|
+
alias_method :get, :find_val
|
349
|
+
alias_method :[], :find_val
|
350
|
+
|
351
|
+
private
|
195
352
|
|
196
353
|
def configs
|
197
354
|
@configs ||= configs!
|
198
355
|
end
|
199
356
|
|
357
|
+
# Searches a directory and returns an array of config objects (from lowest to highest priority) that were found
|
358
|
+
# @note This includes searching for <code>./config/</code> in <code>dir</code>. In other words, this searches both
|
359
|
+
# <code>dir</code> and <code>dir/config</code>.
|
360
|
+
def load_directory(dir, prepend: false)
|
361
|
+
[
|
362
|
+
File.join(dir, 'config', 'origen_site_config.yml'),
|
363
|
+
File.join(dir, 'config', 'origen_site_config.yml.erb'),
|
364
|
+
File.join(dir, 'origen_site_config.yml'),
|
365
|
+
File.join(dir, 'origen_site_config.yml.erb')
|
366
|
+
].each do |f|
|
367
|
+
if File.exist?(f)
|
368
|
+
if prepend
|
369
|
+
configs.unshift(Config.new(path: f, parent: self))
|
370
|
+
else
|
371
|
+
configs << Config.new(path: f, parent: self)
|
372
|
+
end
|
373
|
+
end
|
374
|
+
end
|
375
|
+
end
|
376
|
+
|
200
377
|
# Forces a reparse of the site configs.
|
201
378
|
# This will set the @configs along the current path first,
|
202
379
|
# then, using those values, will add a site config at the home directory.
|
203
380
|
def configs!
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
configs << YAML.load_file(file) if File.exist?(file) && YAML.load_file(file)
|
219
|
-
path = path.parent
|
220
|
-
end
|
221
|
-
|
222
|
-
# Add and any site_configs from the directory hierarchy where Ruby is installed
|
223
|
-
path = Pathname.new($LOAD_PATH.last)
|
224
|
-
until path.root?
|
225
|
-
file = File.join(path, 'origen_site_config.yml')
|
226
|
-
configs << YAML.load_file(file) if File.exist?(file) && YAML.load_file(file)
|
227
|
-
path = path.parent
|
228
|
-
end
|
381
|
+
# This global is set when Origen is first required, it generally means that what is considered
|
382
|
+
# to be the pwd for the purposes of looking for a site_config file is the place from where the
|
383
|
+
# user invoked Origen. Otherwise if the running app switches the PWD it can lead to confusing
|
384
|
+
# behavior - this was a particular problem when testing the new app generator which switches the
|
385
|
+
# pwd to /tmp to build the new app
|
386
|
+
path = $_origen_invocation_pwd
|
387
|
+
@configs = []
|
388
|
+
|
389
|
+
# Add any site_configs from where we are currently running from, i.e. the application
|
390
|
+
# directory area
|
391
|
+
until path.root?
|
392
|
+
load_directory(path)
|
393
|
+
path = path.parent
|
394
|
+
end
|
229
395
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
396
|
+
# Add and any site_configs from the directory hierarchy where Ruby is installed
|
397
|
+
path = Pathname.new($LOAD_PATH.last)
|
398
|
+
until path.root?
|
399
|
+
load_directory(path)
|
400
|
+
path = path.parent
|
234
401
|
end
|
235
402
|
|
403
|
+
# Add the one from the Origen core as the lowest priority, this one defines
|
404
|
+
# the default values
|
405
|
+
load_directory(File.expand_path('../../../', __FILE__))
|
406
|
+
|
236
407
|
# Add the site_config from the user's home directory as highest priority, if it exists
|
237
408
|
# But, make sure we take the site installation's setup into account.
|
238
409
|
# That is, if user's home directories are somewhere else, make sure we use that directory to the find
|
239
410
|
# the user's overwrite file. The user can then override that if they want."
|
240
|
-
|
241
|
-
|
242
|
-
|
411
|
+
load_directory(File.expand_path(user_install_dir), prepend: true)
|
412
|
+
|
413
|
+
# Load any centralized site configs now.
|
414
|
+
centralized_site_config = find_val('centralized_site_config')
|
415
|
+
if centralized_site_config
|
416
|
+
# We know the last two site configs will exists (they are in Origen core) and that they contain the default
|
417
|
+
# values. We want the centralized config to load right after those.
|
418
|
+
@configs.insert(-3, Config.new(path: centralized_site_config, parent: self))
|
243
419
|
end
|
244
420
|
|
421
|
+
# After all configs have been populated, see if the centralized needs refreshing
|
422
|
+
@configs.each { |c| c.refresh if c.needs_refresh? }
|
423
|
+
|
245
424
|
@configs
|
246
425
|
end
|
247
426
|
end
|
@@ -0,0 +1,205 @@
|
|
1
|
+
module Origen
|
2
|
+
class SiteConfig
|
3
|
+
class Config
|
4
|
+
attr_reader :path
|
5
|
+
attr_reader :parent
|
6
|
+
attr_reader :type
|
7
|
+
attr_reader :values
|
8
|
+
|
9
|
+
RESTRICTED_FROM_CENTRALIZED_VARIABLES = %w(centralized_site_config centralized_site_config_cache_dir centralized_site_config_verify_ssl)
|
10
|
+
|
11
|
+
def initialize(path:, parent:, values: nil)
|
12
|
+
@parent = parent
|
13
|
+
if path == :runtime
|
14
|
+
path = "runtime_#{object_id}"
|
15
|
+
@type = :runtime
|
16
|
+
elsif path.start_with?('http')
|
17
|
+
@path = path
|
18
|
+
@type = :centralized
|
19
|
+
else
|
20
|
+
@path = path
|
21
|
+
@type = :local
|
22
|
+
end
|
23
|
+
@contains_centralized = false
|
24
|
+
@loaded = false
|
25
|
+
|
26
|
+
if values
|
27
|
+
@values = values
|
28
|
+
@loaded = true
|
29
|
+
else
|
30
|
+
@values = nil
|
31
|
+
load
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def needs_refresh?
|
36
|
+
if centralized?
|
37
|
+
if refresh_time < 0
|
38
|
+
false
|
39
|
+
elsif cached?
|
40
|
+
# If the refresh time is 0, this will always be true
|
41
|
+
# Note the difference of time objects below will give the difference in seconds.
|
42
|
+
(Time.now - cached_file.ctime) / 3600.0 > refresh_time
|
43
|
+
else
|
44
|
+
# If the cached file cannot be found, force a new fetch
|
45
|
+
true
|
46
|
+
end
|
47
|
+
else
|
48
|
+
false
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def refresh_time
|
53
|
+
parent.find_val('centralized_site_config_refresh')
|
54
|
+
end
|
55
|
+
|
56
|
+
def cached_file
|
57
|
+
@cached_file ||= Pathname(parent.centralized_site_config_cache_dir).join('cached_config')
|
58
|
+
end
|
59
|
+
|
60
|
+
def cached?
|
61
|
+
File.exist?(cached_file)
|
62
|
+
end
|
63
|
+
|
64
|
+
def fetch
|
65
|
+
def inform_user_of_cached_file
|
66
|
+
if cached?
|
67
|
+
puts 'Origen: Site Config: Found previously cached site config. Using the older site config.'.yellow
|
68
|
+
else
|
69
|
+
puts 'Origen: Site Config: No cached file found. An empty site config will be used in its place.'.yellow
|
70
|
+
end
|
71
|
+
puts
|
72
|
+
end
|
73
|
+
|
74
|
+
if centralized?
|
75
|
+
puts "Pulling centralized site config from: #{path}"
|
76
|
+
|
77
|
+
begin
|
78
|
+
text = HTTParty.get(path, verify: parent.find_val('centralized_site_config_verify_ssl'))
|
79
|
+
puts "Caching centralized site config to: #{cached_file}"
|
80
|
+
|
81
|
+
unless Dir.exist?(cached_file.dirname)
|
82
|
+
FileUtils.mkdir_p(cached_file.dirname)
|
83
|
+
end
|
84
|
+
File.open(cached_file, 'w').write(text)
|
85
|
+
|
86
|
+
rescue SocketError => e
|
87
|
+
puts "Origen: Site Config: Unable to connect to #{path}".red
|
88
|
+
puts 'Origen: Site Config: Failed to retrieve centralized site config!'.red
|
89
|
+
puts "Error from exception: #{e.message}".red
|
90
|
+
|
91
|
+
inform_user_of_cached_file
|
92
|
+
rescue OpenSSL::SSL::SSLError => e
|
93
|
+
puts "Origen: Site Config: Unable to connect to #{path}".red
|
94
|
+
puts 'Origen: Site Config: Failed to retrieve centralized site config!'.red
|
95
|
+
puts "Error from exception: #{e.message}".red
|
96
|
+
puts 'It looks like the error is related to SSL certification. If this is a trusted server, you can use ' \
|
97
|
+
"the site config setting 'centralized_site_config_verify_ssl' to disable verifying the SSL certificate.".red
|
98
|
+
|
99
|
+
inform_user_of_cached_file
|
100
|
+
rescue Exception => e
|
101
|
+
# Rescue anything else to avoid any un-caught exceptions causing Origen not to boot.
|
102
|
+
# Print lots of red so that the users are aware that there's a problem, but don't ultimately want this
|
103
|
+
# to render Origen un-bootable
|
104
|
+
puts "Origen: Site Config: Unexpected exception ocurred trying to either retrieve or cache the site config at #{path}".red
|
105
|
+
puts 'Origen: Site Config: Failed to retrieve centralized site config!'.red
|
106
|
+
puts "Class of exception: #{e.class}".red
|
107
|
+
puts "Error from exception: #{e.message}".red
|
108
|
+
|
109
|
+
inform_user_of_cached_file
|
110
|
+
end
|
111
|
+
text
|
112
|
+
end
|
113
|
+
end
|
114
|
+
alias_method :refresh, :fetch
|
115
|
+
|
116
|
+
# Loads the site config into memory.
|
117
|
+
# Process the site config as an ERB, if indicated to do so (.erb file extension)
|
118
|
+
# After the initial load, any centralized site configs will be retreived (if needed), cached, and loaded.
|
119
|
+
def load
|
120
|
+
def read_erb(erb)
|
121
|
+
ERB.new(File.read(erb), 0, '%<>')
|
122
|
+
end
|
123
|
+
|
124
|
+
if centralized?
|
125
|
+
if !cached?
|
126
|
+
if fetch
|
127
|
+
# erb = ERB.new(File.read(cached_file), 0, '%<>')
|
128
|
+
erb = read_erb(cached_file)
|
129
|
+
else
|
130
|
+
# There was a problem fetching the cnofig. Just use an empty string.
|
131
|
+
# Warning message will come from #fetch
|
132
|
+
erb = ERB.new('')
|
133
|
+
end
|
134
|
+
else
|
135
|
+
# erb = ERB.new(File.read(cached_file), 0, '%<>')
|
136
|
+
erb = read_erb(cached_file)
|
137
|
+
end
|
138
|
+
|
139
|
+
@values = (YAML.load(erb.result) || {})
|
140
|
+
else
|
141
|
+
if File.extname(path) == '.erb'
|
142
|
+
# erb = ERB.new(File.read(path), 0, '%<>')
|
143
|
+
erb = read_erb(path)
|
144
|
+
@values = (YAML.load(erb.result) || {})
|
145
|
+
else
|
146
|
+
@values = (YAML.load_file(path) || {})
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
unless @values.is_a?(Hash)
|
151
|
+
puts "Origen: Site Config: The config at #{path} was not parsed as a Hash, but as a #{@values.class}".red
|
152
|
+
puts ' Please review the format of the this file.'.red
|
153
|
+
puts ' This config will not be loaded and will be replaced with an empty config.'.red
|
154
|
+
puts
|
155
|
+
@values = {}
|
156
|
+
end
|
157
|
+
|
158
|
+
if centralized?
|
159
|
+
# check for restricted centralized config values
|
160
|
+
RESTRICTED_FROM_CENTRALIZED_VARIABLES.each do |var|
|
161
|
+
if @values.key?(var)
|
162
|
+
val = @values.delete(var)
|
163
|
+
puts 'Origen: Site Config: ' \
|
164
|
+
"config variable #{var} is not allowed in the centralized site config and will be removed. " \
|
165
|
+
"Value #{val} will not be applied!".red
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
@loaded = true
|
171
|
+
@values
|
172
|
+
end
|
173
|
+
|
174
|
+
def remove_var(var)
|
175
|
+
@values.delete(var)
|
176
|
+
end
|
177
|
+
|
178
|
+
def has_var?(var)
|
179
|
+
@values.key?(var)
|
180
|
+
end
|
181
|
+
|
182
|
+
# Finds the value from this config, or from one of its centralized configs (if applicable)
|
183
|
+
def find_val(val)
|
184
|
+
@values[val]
|
185
|
+
end
|
186
|
+
alias_method :[], :find_val
|
187
|
+
|
188
|
+
def loaded?
|
189
|
+
@loaded
|
190
|
+
end
|
191
|
+
|
192
|
+
def local?
|
193
|
+
type == :local
|
194
|
+
end
|
195
|
+
|
196
|
+
def centralized?
|
197
|
+
type == :centralized
|
198
|
+
end
|
199
|
+
|
200
|
+
def runtime?
|
201
|
+
type == :runtime
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
data/lib/origen/users/user.rb
CHANGED
@@ -44,10 +44,11 @@ module Origen
|
|
44
44
|
Origen.mailer.send_email(options)
|
45
45
|
end
|
46
46
|
|
47
|
-
def id
|
47
|
+
def id(options = {})
|
48
48
|
@id.to_s.downcase
|
49
49
|
end
|
50
50
|
alias_method :core_id, :id
|
51
|
+
alias_method :username, :id
|
51
52
|
|
52
53
|
# Returns true if the user is an admin for the current application
|
53
54
|
def admin?
|
@@ -73,7 +74,7 @@ module Origen
|
|
73
74
|
RevisionControl::Git.user_name
|
74
75
|
end
|
75
76
|
|
76
|
-
def email
|
77
|
+
def email(options = {})
|
77
78
|
if current?
|
78
79
|
@email ||= ENV['ORIGEN_EMAIL'] || email_from_rc || begin
|
79
80
|
if Origen.site_config.email_domain
|
@@ -7,13 +7,18 @@ module Origen
|
|
7
7
|
# Generic method to send an email, alternatively use one of the
|
8
8
|
# pre-defined mail types using the other methods.
|
9
9
|
def send_email(options = {})
|
10
|
-
options = { server:
|
11
|
-
port:
|
12
|
-
from:
|
13
|
-
from_alias:
|
14
|
-
subject:
|
15
|
-
body:
|
16
|
-
to:
|
10
|
+
options = { server: Origen.site_config.email_server,
|
11
|
+
port: Origen.site_config.email_port,
|
12
|
+
from: current_user.email,
|
13
|
+
from_alias: current_user.name,
|
14
|
+
subject: 'Hello',
|
15
|
+
body: 'Hello from Origen!',
|
16
|
+
to: current_user.email,
|
17
|
+
authentication: (Origen.site_config.email_authentication || :none).to_sym,
|
18
|
+
domain: (Origen.site_config.email_domain || ''),
|
19
|
+
|
20
|
+
auth_user: (Origen.site_config.email_auth_user || current_user.email),
|
21
|
+
auth_password: (Origen.site_config.email_auth_password || current_user.password)
|
17
22
|
}.merge(options)
|
18
23
|
|
19
24
|
# Force to an array
|
@@ -32,10 +37,38 @@ Subject: #{options[:subject]}
|
|
32
37
|
END_OF_MESSAGE
|
33
38
|
|
34
39
|
begin
|
40
|
+
Origen.log.debug('Origen::Utility::Mailer Setup:')
|
41
|
+
options.each { |k, v| Origen.log.debug(" #{k}: #{v}") }
|
42
|
+
|
43
|
+
# Net::SMTP.start(options[:server], options[:port]) do |smtp|
|
44
|
+
# smtp.send_message msg, options[:from], addr
|
45
|
+
# end
|
46
|
+
|
35
47
|
# Exceptions raised here will be caught by rescue clause
|
36
|
-
Net::SMTP.
|
37
|
-
|
48
|
+
smtp = Net::SMTP.new(options[:server], options[:port])
|
49
|
+
smtp.enable_starttls if options[:authentication] != :none
|
50
|
+
|
51
|
+
opts = begin
|
52
|
+
if options[:authentication] == :none
|
53
|
+
# Trying to add username and password if there's no authentication will actually be rejected by
|
54
|
+
# the server.
|
55
|
+
[options[:domain]]
|
56
|
+
else
|
57
|
+
[options[:domain], options[:auth_user], options[:auth_password], options[:authentication]]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
smtp.start(*opts) do |m|
|
62
|
+
m.send_message(msg, options[:from], addr)
|
38
63
|
end
|
64
|
+
|
65
|
+
# Exceptions raised here will be caught by rescue clause
|
66
|
+
# smtp = Net::SMTP.new(options[:server], options[:port])
|
67
|
+
# smtp.enable_starttls
|
68
|
+
|
69
|
+
# smtp.start (options[:domain], options[:auth_user], options[:auth_password], options[:authentication]) do |smtp|
|
70
|
+
# smtp.send_message(msg, options[:from], addr)
|
71
|
+
# end
|
39
72
|
rescue
|
40
73
|
warn "Email not able to be sent to address '#{addr}'"
|
41
74
|
end
|
data/origen_site_config.yml
CHANGED
@@ -12,6 +12,23 @@
|
|
12
12
|
# # Or a reference to a plugin's Git repository can be used
|
13
13
|
# - "http://bitbucket.mycompany.net/origen/my_app_generators.git"
|
14
14
|
|
15
|
+
# Centralized Site Config
|
16
|
+
# Origen +0.36 (versions after 36.0) supports a centralized site config. This site config will be implicitly read and
|
17
|
+
# injected into the site config following the default site configs from Origen.
|
18
|
+
# To surpress the number of requests and possible load time delays, the site config can be cached and read on each
|
19
|
+
# startup for :centralized_site_config_refresh number of hours.
|
20
|
+
centralized_site_config_cache_dir: '~/.origen/cache/site_config'
|
21
|
+
|
22
|
+
# Indicates how many hours should pass before the cached site config is refreshed (refetched, redownloaded)
|
23
|
+
# The default is to refresh once per day (every 24 hours). Decimal values can be used here to get more granularity
|
24
|
+
# if needed.
|
25
|
+
# 0 indidcates 'always refresh' (cache will still occur though)
|
26
|
+
# -1 indicates never refresh.
|
27
|
+
centralized_site_config_refresh: 24
|
28
|
+
|
29
|
+
# Indicates whether the SSL certificate should be verified when pulling the centralized site config
|
30
|
+
centralized_site_config_verify_ssl: true
|
31
|
+
|
15
32
|
# GEM SETUP
|
16
33
|
|
17
34
|
# If your company has an internal gem server enter it here
|
@@ -88,10 +105,16 @@ gem_use_from_system:
|
|
88
105
|
# User.new("ax1234").email # => "ax1234@company.com"
|
89
106
|
#
|
90
107
|
# # Without email_domain specified
|
91
|
-
# User.new("ax1234@company.com").email # => "ax1234@company.com"
|
108
|
+
# User.new("ax1234@company.com").email # => "ax1234@company.com"
|
109
|
+
# If authentication is needed to use the given server, email_authentication can be set to login.
|
110
|
+
# If a service user is used to access this account on behalf of the sending users, email_auth_user and email_auth_password
|
111
|
+
# can be set. If authentication is indicated but no auth user is given, the current user's email and password are used instead.
|
92
112
|
#email_domain: company.com
|
93
113
|
#email_server: smtp.company.net
|
94
114
|
#email_port: 25
|
115
|
+
#email_authentication: login
|
116
|
+
#email_auth_user: service_email
|
117
|
+
#email_auth_password: service_password
|
95
118
|
|
96
119
|
# Required parameters to connect to your company's LDAP system
|
97
120
|
#ldap_username: cn=manager,dc=example,dc=com
|
@@ -69,7 +69,7 @@ module Origen
|
|
69
69
|
model.add_virtual_pin :relay1
|
70
70
|
model.add_virtual_pin :relay2, packages: { bga: {} }
|
71
71
|
|
72
|
-
model.sub_block :block1, file: 'origen/export1/block1.rb', dir: '/
|
72
|
+
model.sub_block :block1, file: 'origen/export1/block1.rb', dir: '/proj/imxrt1170_test/users/nxa20023/origen/dev/trash/origen/vendor/lib/models', lazy: true
|
73
73
|
|
74
74
|
end
|
75
75
|
end
|
@@ -4,7 +4,7 @@ module Origen
|
|
4
4
|
module Export1
|
5
5
|
module Block1
|
6
6
|
def self.extended(model)
|
7
|
-
model.sub_block :x, file: 'origen/export1/block1/x.rb', dir: '/
|
7
|
+
model.sub_block :x, file: 'origen/export1/block1/x.rb', dir: '/proj/imxrt1170_test/users/nxa20023/origen/dev/trash/origen/vendor/lib/models', lazy: true, base_address: 0x40000000
|
8
8
|
|
9
9
|
end
|
10
10
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: origen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.36.
|
4
|
+
version: 0.36.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen McGinty
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -457,6 +457,7 @@ files:
|
|
457
457
|
- lib/origen/commands/program.rb
|
458
458
|
- lib/origen/commands/rc.rb
|
459
459
|
- lib/origen/commands/save.rb
|
460
|
+
- lib/origen/commands/site.rb
|
460
461
|
- lib/origen/commands/target.rb
|
461
462
|
- lib/origen/commands/time.rb
|
462
463
|
- lib/origen/commands/version.rb
|
@@ -568,6 +569,7 @@ files:
|
|
568
569
|
- lib/origen/revision_control/subversion.rb
|
569
570
|
- lib/origen/ruby_version_check.rb
|
570
571
|
- lib/origen/site_config.rb
|
572
|
+
- lib/origen/site_config/config.rb
|
571
573
|
- lib/origen/specs.rb
|
572
574
|
- lib/origen/specs/checkers.rb
|
573
575
|
- lib/origen/specs/creation_info.rb
|
@@ -652,7 +654,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
652
654
|
version: 1.8.11
|
653
655
|
requirements: []
|
654
656
|
rubyforge_project:
|
655
|
-
rubygems_version: 2.7.
|
657
|
+
rubygems_version: 2.7.7
|
656
658
|
signing_key:
|
657
659
|
specification_version: 4
|
658
660
|
summary: The Semiconductor Developer's Kit
|