openc3 5.0.6 → 5.0.9

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of openc3 might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e697341ab4bde4e1e328f09cbddd864c876b3abe9fcf733310d54da6db94eeb1
4
- data.tar.gz: 0bbb0a7f995179dafaacaca3e4200d9be15999d17450332e250941bdaab8d31d
3
+ metadata.gz: ce13d20a53c970d01c019afff0088ee574998e393eb0e56be1ea3bc1af2dbc3c
4
+ data.tar.gz: '079099f252bf45fcbbcec9f05239de9c84858a166cfb2077806554bcdae76258'
5
5
  SHA512:
6
- metadata.gz: 0c80dc72a7cddced1220dd8092794a5d795d2a169e6112afef6a0a22292b8efe6b97db7ab5894ef6fd5d638afa949f5d27c9f93a279e2761692af11ea047fd8f
7
- data.tar.gz: 4b9a87364b61120819992fde6ec36afe3fad6b13ae19f23945c39abfbbfe475c24bba93966c9edb6b4234e3a0c526506580e582bf324e7f3320dd7f24c5b75b5
6
+ metadata.gz: bf8762aa78976151e1c561e55fd08de0593f82055d759a6c1c2ed5db9fd3b0510141077f70592cade4a7dbf1ff957657ea4252b6a7d4839046b6b69f853a5cda
7
+ data.tar.gz: 457563612d61588d7f18da69a48df88b0368b0fba3e9840d7a316eabf334d3e88218cfca584327f927f23f119c005aef4dba63e033b011a7d4c8bcdc071df15c
data/bin/openc3cli CHANGED
@@ -21,9 +21,11 @@
21
21
  # This file will handle OpenC3 tasks such as instantiating a new project
22
22
 
23
23
  require 'openc3'
24
+ require 'openc3/utilities/local_mode'
24
25
  require 'openc3/utilities/s3'
25
26
  require 'openc3/models/scope_model'
26
27
  require 'openc3/models/plugin_model'
28
+ require 'openc3/models/gem_model'
27
29
  require 'openc3/packets/packet_config'
28
30
  require 'openc3/bridge/bridge'
29
31
  require 'ostruct'
@@ -35,6 +37,7 @@ require 'json'
35
37
  require 'redis'
36
38
  require 'psych'
37
39
  require 'erb'
40
+ require 'pp'
38
41
 
39
42
  $redis_url = "redis://#{ENV['OPENC3_REDIS_HOSTNAME']}:#{ENV['OPENC3_REDIS_PORT']}"
40
43
 
@@ -313,18 +316,30 @@ ensure
313
316
  exit(result)
314
317
  end
315
318
 
316
- def update_plugin(plugin_file_path, plugin_name, variables: nil, plugin_txt_lines: nil, scope:)
319
+ def update_plugin(plugin_file_path, plugin_name, variables: nil, plugin_txt_lines: nil, scope:, existing_plugin_name:)
317
320
  new_gem = File.basename(plugin_file_path)
318
- old_gem = plugin_name.split("__")[0]
319
- puts "Updating existing plugin: #{plugin_name} with #{File.basename(plugin_file_path)}"
320
- plugin_model = OpenC3::PluginModel.get_model(name: plugin_name, scope: scope)
321
+ old_gem = existing_plugin_name.split("__")[0]
322
+ puts "Updating existing plugin: #{existing_plugin_name} with #{File.basename(plugin_file_path)}"
323
+ plugin_model = OpenC3::PluginModel.get_model(name: existing_plugin_name, scope: scope)
321
324
  begin
322
325
  # Only update if something has changed
323
- if (new_gem != old_gem) or (variables != plugin_model.variables) or (plugin_txt_lines != plugin_model.plugin_txt_lines)
326
+ if (new_gem != old_gem) or (variables and variables != plugin_model.variables) or (plugin_txt_lines and plugin_txt_lines != plugin_model.plugin_txt_lines)
327
+ puts "Gem version change detected - New: #{new_gem}, Old: #{old_gem}" if new_gem != old_gem
328
+ if variables and variables != plugin_model.variables
329
+ pp_variables = ""
330
+ PP.pp(variables, pp_variables)
331
+ pp_plugin_model_variables = ""
332
+ PP.pp(plugin_model.variables, pp_plugin_model_variables)
333
+ puts "Variables change detected\nNew:\n#{pp_variables}\nOld:\n#{pp_plugin_model_variables}"
334
+ end
335
+ puts "plugin.txt change detected\nNew:\n#{plugin_txt_lines.join("\n")}\n\nOld:\n#{plugin_model.plugin_txt_lines.join("\n")}\n" if plugin_txt_lines and plugin_txt_lines != plugin_model.plugin_txt_lines
324
336
  variables = plugin_model.variables unless variables
325
337
  plugin_model.destroy
338
+
326
339
  plugin_hash = OpenC3::PluginModel.install_phase1(plugin_file_path, existing_variables: variables, existing_plugin_txt_lines: plugin_txt_lines, process_existing: true, scope: scope)
327
- OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
340
+ puts "Updating plugin: #{plugin_file_path}\n#{plugin_hash}"
341
+ plugin_hash = OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
342
+ OpenC3::LocalMode.update_local_plugin(plugin_file_path, plugin_hash, old_plugin_name: plugin_name, scope: scope)
328
343
  else
329
344
  puts "No changes detected - Exiting without change"
330
345
  end
@@ -354,6 +369,7 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
354
369
  # Only create the scope if it doesn't already exist
355
370
  unless OpenC3::ScopeModel.names.include?(scope)
356
371
  begin
372
+ puts "Creating scope: #{scope}"
357
373
  scope_model = OpenC3::ScopeModel.new(name: scope, scope: scope)
358
374
  scope_model.create
359
375
  scope_model.deploy(".", {})
@@ -381,7 +397,9 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
381
397
  found = true
382
398
  # Upgrade if version changed else do nothing
383
399
  if file_full_name != full_name
384
- update_plugin(plugin_file_path, plugin_name, scope: scope)
400
+ update_plugin(plugin_file_path, plugin_name, scope: scope, existing_plugin_name: plugin_name)
401
+ else
402
+ puts "No version change detected for: #{plugin_name}"
385
403
  end
386
404
  end
387
405
  end
@@ -394,16 +412,24 @@ def load_plugin(plugin_file_path, scope:, plugin_hash_file: nil)
394
412
  existing_plugin_hash = OpenC3::PluginModel.get(name: plugin_hash['name'], scope: scope)
395
413
 
396
414
  # Existing plugin hash will be present if plugin is being edited or upgraded
397
- # If editing, gem name will match existing hash name
398
- # If upgrading, gem name will not match the existing hash name
415
+ # However, a missing existing could also be that a plugin was updated in local mode directly from across installations
416
+ # changing the plugin name without really meaning to create a new instance of the plugin
417
+ # ie.
418
+ # User on machine 1 checks in a changed plugin_instance.json with a different name - There is still only one plugin desired and committed
419
+ # User on machine 2 starts up with the new configuration, OpenC3::PluginModel.get will return nil because the exact name is different
420
+ # In this case, the plugin should be updated without installing a second instance. analyze_local_mode figures this out.
421
+ unless existing_plugin_hash
422
+ existing_plugin_hash = OpenC3::LocalMode.analyze_local_mode(plugin_name: plugin_hash['name'], scope: scope)
423
+ end
399
424
 
400
425
  if existing_plugin_hash
401
426
  # Upgrade or Edit
402
- update_plugin(plugin_file_path, plugin_hash['name'], variables: plugin_hash['variables'], plugin_txt_lines: plugin_hash['plugin_txt_lines'], scope: scope)
427
+ update_plugin(plugin_file_path, plugin_hash['name'], variables: plugin_hash['variables'], plugin_txt_lines: plugin_hash['plugin_txt_lines'], scope: scope, existing_plugin_name: existing_plugin_hash['name'])
403
428
  else
404
429
  # New Install
405
430
  puts "Loading new plugin: #{plugin_file_path}\n#{plugin_hash}"
406
- OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
431
+ plugin_hash = OpenC3::PluginModel.install_phase2(plugin_hash, scope: scope)
432
+ OpenC3::LocalMode.update_local_plugin(plugin_file_path, plugin_hash, scope: scope)
407
433
  end
408
434
  rescue => err
409
435
  abort("Error installing plugin: #{scope}: #{plugin_file_path}: #{err.formatted}")
@@ -414,6 +440,7 @@ def unload_plugin(plugin_name, scope:)
414
440
  scope ||= 'DEFAULT'
415
441
  begin
416
442
  OpenC3::PluginModel.new(name: plugin_name, scope: scope).destroy
443
+ OpenC3::LocalMode.remove_local_plugin(plugin_name, scope: scope)
417
444
  OpenC3::Logger.info("PluginModel destroyed: #{plugin_name}", scope: scope)
418
445
  rescue => err
419
446
  abort("Error uninstalling plugin: #{scope}: #{plugin_name}: #{err.formatted}")
@@ -450,82 +477,119 @@ def get_redis_keys
450
477
  puts "Packets Defs: #{keys.select { |item| item[/^tlm__/] }}"
451
478
  end
452
479
 
453
- if not ARGV[0].nil? # argument(s) given
480
+ if __FILE__ == $0
481
+ if not ARGV[0].nil? # argument(s) given
454
482
 
455
- # Handle each task
456
- case ARGV[0].downcase
483
+ # Handle each task
484
+ case ARGV[0].downcase
457
485
 
458
- when 'rake'
459
- puts `rake #{ARGV[1..-1].join(' ')}`
486
+ when 'rake'
487
+ puts `rake #{ARGV[1..-1].join(' ')}`
460
488
 
461
- when 'validate'
462
- validate_plugin(ARGV[1], scope: ARGV[2], variables_file: ARGV[3])
489
+ when 'validate'
490
+ validate_plugin(ARGV[1], scope: ARGV[2], variables_file: ARGV[3])
463
491
 
464
- when 'load'
465
- load_plugin(ARGV[1], scope: ARGV[2], plugin_hash_file: ARGV[3])
492
+ when 'load'
493
+ load_plugin(ARGV[1], scope: ARGV[2], plugin_hash_file: ARGV[3])
466
494
 
467
- when 'unload'
468
- unload_plugin(ARGV[1], scope: ARGV[2])
495
+ when 'unload'
496
+ unload_plugin(ARGV[1], scope: ARGV[2])
469
497
 
470
- when 'geminstall'
471
- gem_install(ARGV[1])
498
+ when 'geminstall'
499
+ gem_install(ARGV[1])
472
500
 
473
- when 'generate'
474
- generate(ARGV[1..-1])
501
+ when 'generate'
502
+ generate(ARGV[1..-1])
475
503
 
476
- when 'migrate'
477
- migrate(ARGV[1..-1])
504
+ when 'migrate'
505
+ migrate(ARGV[1..-1])
478
506
 
479
- when 'rubysloc'
480
- puts `ruby /openc3/bin/rubysloc #{ARGV[1..-1].join(' ')}`
507
+ when 'rubysloc'
508
+ puts `ruby /openc3/bin/rubysloc #{ARGV[1..-1].join(' ')}`
481
509
 
482
- when 'cstol_converter'
483
- puts `ruby /openc3/bin/cstol_converter #{ARGV[1..-1].join(' ')}`
510
+ when 'cstol_converter'
511
+ puts `ruby /openc3/bin/cstol_converter #{ARGV[1..-1].join(' ')}`
484
512
 
485
- when 'xtce_converter'
486
- xtce_converter(ARGV[1..-1])
513
+ when 'xtce_converter'
514
+ xtce_converter(ARGV[1..-1])
487
515
 
488
- when 'bridge'
489
- ENV['OPENC3_NO_STORE'] = '1'
490
- filename = ARGV[1]
491
- filename = 'bridge.txt' unless filename
492
- bridge = OpenC3::Bridge.new(filename)
493
- begin
494
- while true
495
- sleep(1)
516
+ when 'bridge'
517
+ ENV['OPENC3_NO_STORE'] = '1'
518
+ filename = ARGV[1]
519
+ filename = 'bridge.txt' unless filename
520
+ bridge = OpenC3::Bridge.new(filename)
521
+ begin
522
+ while true
523
+ sleep(1)
524
+ end
525
+ rescue Interrupt
526
+ exit(0)
496
527
  end
497
- rescue Interrupt
498
- exit(0)
499
- end
500
528
 
501
- when 'bridgesetup'
502
- ENV['OPENC3_NO_STORE'] = '1'
503
- filename = ARGV[1]
504
- filename = 'bridge.txt' unless filename
505
- unless File.exist?(filename)
506
- OpenC3::BridgeConfig.generate_default(filename)
507
- end
529
+ when 'bridgesetup'
530
+ ENV['OPENC3_NO_STORE'] = '1'
531
+ filename = ARGV[1]
532
+ filename = 'bridge.txt' unless filename
533
+ unless File.exist?(filename)
534
+ OpenC3::BridgeConfig.generate_default(filename)
535
+ end
508
536
 
509
- when 'help'
510
- print_usage()
537
+ when 'help'
538
+ print_usage()
539
+
540
+ when 'redis'
541
+ case (ARGV[1])
542
+ when 'keys'
543
+ get_redis_keys()
544
+ when 'hget'
545
+ redis = Redis.new(url: $redis_url, username: ENV['OPENC3_REDIS_USERNAME'], password: ENV['OPENC3_REDIS_PASSWORD'])
546
+ puts JSON.parse(redis.hget(ARGV[2], ARGV[3]), :allow_nan => true, :create_additions => true)
547
+ else
548
+ puts "Unknown redis task: #{ARGV[1]}\n"
549
+ puts "Valid redis tasks: keys, hget"
550
+ end
511
551
 
512
- when 'redis'
513
- case (ARGV[1])
514
- when 'keys'
515
- get_redis_keys()
516
- when 'hget'
517
- redis = Redis.new(url: $redis_url, username: ENV['OPENC3_REDIS_USERNAME'], password: ENV['OPENC3_REDIS_PASSWORD'])
518
- puts JSON.parse(redis.hget(ARGV[2], ARGV[3]), :allow_nan => true, :create_additions => true)
519
- else
520
- puts "Unknown redis task: #{ARGV[1]}\n"
521
- puts "Valid redis tasks: keys, hget"
552
+ when 'removebase'
553
+ # Used to remove tool base to better support enterprise upgrade
554
+ scopes = OpenC3::ScopeModel.all
555
+ scopes.each do |scope_name, scope|
556
+ plugins = OpenC3::PluginModel.all(scope: scope_name)
557
+ plugins.each do |plugin_name, plugin|
558
+ if plugin["name"] =~ /tool-base/ and plugin["name"] !~ /enterprise/
559
+ unload_plugin(plugin_name, scope: scope_name)
560
+ end
561
+ if plugin["name"] =~ /tool-admin/ and plugin["name"] !~ /enterprise/
562
+ unload_plugin(plugin_name, scope: scope_name)
563
+ end
564
+ end
565
+ end
566
+
567
+ when 'removeenterprise'
568
+ # Used to remove enterprise plugins to better support downgrade
569
+ scopes = OpenC3::ScopeModel.all
570
+ scopes.each do |scope_name, scope|
571
+ plugins = OpenC3::PluginModel.all(scope: scope_name)
572
+ plugins.each do |plugin_name, plugin|
573
+ if plugin["name"] =~ /enterprise/
574
+ unload_plugin(plugin_name, scope: scope_name)
575
+ end
576
+ end
577
+ end
578
+
579
+ when 'destroyscope'
580
+ scope = OpenC3::ScopeModel.get_model(name: ARGV[1])
581
+ scope.destroy
582
+
583
+ when 'localinit'
584
+ OpenC3::LocalMode.local_init()
585
+
586
+ else # Unknown task
587
+ print_usage()
588
+ abort("Unknown task: #{ARGV[0]}")
522
589
  end
523
590
 
524
- else # Unknown task
591
+ else # No arguments given
525
592
  print_usage()
526
- abort("Unknown task: #{ARGV[0]}")
527
593
  end
528
594
 
529
- else # No arguments given
530
- print_usage()
531
- end
595
+ end
@@ -78,7 +78,7 @@ ARRAY_PARAMETER:
78
78
  - name: Name
79
79
  required: true
80
80
  description: Name of the parameter. Must be unique within the command.
81
- values: \'
81
+ values: .*
82
82
  - name: Bit Offset
83
83
  required: true
84
84
  description: Bit offset into the command packet of the Most Significant Bit of this parameter.
@@ -95,7 +95,7 @@ APPEND_ARRAY_PARAMETER:
95
95
  - name: Name
96
96
  required: true
97
97
  description: Name of the parameter. Must be unique within the command.
98
- values: '\D\S*'
98
+ values: .*
99
99
  <%= MetaConfigParser.load('_array_params.yaml').to_meta_config_yaml(4) %>
100
100
  SELECT_PARAMETER:
101
101
  modifiers:
@@ -61,3 +61,11 @@ TOOL:
61
61
  required: true
62
62
  description: Whether or not the tool is shown. TRUE or FALSE
63
63
  values: ["true", "false"]
64
+ POSITION:
65
+ summary: Position of the tool in the nav bar
66
+ description: Position of the tool as an integer starting at 1. Tools without a position are appended to the end as they are installed.
67
+ parameters:
68
+ - name: Position
69
+ required: true
70
+ description: Numerical position
71
+ values: \d+