origen 0.36.0 → 0.36.1
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/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
|