openc3 5.0.6 → 5.0.9

Sign up to get free protection for your applications and to get access to all the features.
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+