procon_bypass_man 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +19 -6
  3. data/.github/workflows/gitleacks.yml +2 -1
  4. data/.github/workflows/release.yml +1 -0
  5. data/.github/workflows/ruby.yml +1 -1
  6. data/.rubocop.yml +4 -0
  7. data/.ruby-version +1 -1
  8. data/CHANGELOG.md +16 -1
  9. data/Gemfile +6 -3
  10. data/Gemfile.lock +3 -3
  11. data/README.md +17 -8
  12. data/Steepfile +0 -1
  13. data/bin/generate_default_app +10 -0
  14. data/docs/getting_started.md +98 -25
  15. data/docs/setup_raspi_by_mitamae.md +44 -2
  16. data/lib/procon_bypass_man/background/job_performer.rb +1 -2
  17. data/lib/procon_bypass_man/background/job_queue.rb +50 -0
  18. data/lib/procon_bypass_man/background/jobs/base_job.rb +1 -1
  19. data/lib/procon_bypass_man/background/jobs/concerns/has_external_api_setting.rb +2 -2
  20. data/lib/procon_bypass_man/background/jobs/concerns/job_performable.rb +16 -0
  21. data/lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb +1 -1
  22. data/lib/procon_bypass_man/background/jobs/report_boot_job.rb +1 -1
  23. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +1 -1
  24. data/lib/procon_bypass_man/background/jobs/report_error_job.rb +1 -1
  25. data/lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb +1 -1
  26. data/lib/procon_bypass_man/background/jobs/report_load_config_job.rb +1 -1
  27. data/lib/procon_bypass_man/background/jobs/report_procon_performance_measurements_job.rb +43 -0
  28. data/lib/procon_bypass_man/background/jobs/report_reload_config_job.rb +1 -1
  29. data/lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb +1 -1
  30. data/lib/procon_bypass_man/background/jobs/sync_device_stats_job.rb +1 -1
  31. data/lib/procon_bypass_man/background.rb +3 -4
  32. data/lib/procon_bypass_man/bypass/bypass_command.rb +6 -15
  33. data/lib/procon_bypass_man/bypass/bypass_value.rb +6 -0
  34. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +107 -0
  35. data/lib/procon_bypass_man/bypass/switch_to_procon.rb +64 -0
  36. data/lib/procon_bypass_man/bypass.rb +5 -112
  37. data/lib/procon_bypass_man/configuration.rb +16 -40
  38. data/lib/procon_bypass_man/device_connection/output_report_sub_command_table.rb +1 -1
  39. data/lib/procon_bypass_man/device_connection/procon_setting_overrider.rb +12 -3
  40. data/lib/procon_bypass_man/procon/macro.rb +1 -1
  41. data/lib/procon_bypass_man/procon/performance_measurement/last_bypass_at.rb +17 -0
  42. data/lib/procon_bypass_man/procon/performance_measurement/measurement_collection.rb +9 -0
  43. data/lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb +84 -0
  44. data/lib/procon_bypass_man/procon/performance_measurement/procon_performance_span_transfer_job.rb +8 -0
  45. data/lib/procon_bypass_man/procon/performance_measurement/queue_over_process.rb +38 -0
  46. data/lib/procon_bypass_man/procon/performance_measurement/span_queue.rb +42 -0
  47. data/lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb +39 -0
  48. data/lib/procon_bypass_man/procon/performance_measurement.rb +103 -0
  49. data/lib/procon_bypass_man/procon.rb +2 -1
  50. data/lib/procon_bypass_man/procon_display/bypass_hook.rb +12 -0
  51. data/lib/procon_bypass_man/procon_display/http_request.rb +31 -0
  52. data/lib/procon_bypass_man/procon_display/http_response.rb +23 -0
  53. data/lib/procon_bypass_man/procon_display/server.rb +33 -0
  54. data/lib/procon_bypass_man/procon_display/server_app.rb +17 -0
  55. data/lib/procon_bypass_man/procon_display/status.rb +20 -0
  56. data/lib/procon_bypass_man/procon_display.rb +11 -0
  57. data/lib/procon_bypass_man/remote_macro/queue_over_process.rb +26 -44
  58. data/lib/procon_bypass_man/remote_macro/remote_macro_object.rb +22 -24
  59. data/lib/procon_bypass_man/remote_macro/remote_macro_receiver.rb +1 -1
  60. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +1 -1
  61. data/lib/procon_bypass_man/remote_macro/task.rb +1 -5
  62. data/lib/procon_bypass_man/remote_macro/task_queue.rb +6 -10
  63. data/lib/procon_bypass_man/remote_pbm_action/commands/update_remote_pbm_action_status_command.rb +1 -1
  64. data/lib/procon_bypass_man/runner.rb +4 -9
  65. data/lib/procon_bypass_man/scheduler.rb +15 -6
  66. data/lib/procon_bypass_man/support/callbacks.rb +72 -34
  67. data/lib/procon_bypass_man/support/can_over_process.rb +60 -0
  68. data/lib/procon_bypass_man/support/gc.rb +8 -0
  69. data/lib/procon_bypass_man/support/http_client.rb +9 -6
  70. data/lib/procon_bypass_man/support/load_agv.rb +20 -0
  71. data/lib/procon_bypass_man/support/procon_performance_http_client.rb +7 -0
  72. data/lib/procon_bypass_man/support/retryable.rb +16 -0
  73. data/lib/procon_bypass_man/support/signal_handler.rb +1 -1
  74. data/lib/procon_bypass_man/version.rb +1 -1
  75. data/lib/procon_bypass_man/websocket/client.rb +2 -2
  76. data/lib/procon_bypass_man/worker.rb +32 -0
  77. data/lib/procon_bypass_man.rb +41 -10
  78. data/procon_bypass_man.gemspec +1 -1
  79. data/project_template/README.md +0 -5
  80. data/project_template/app.rb +21 -11
  81. data/project_template/app.rb.erb +62 -0
  82. data/project_template/lib/app_generator.rb +31 -0
  83. data/project_template/web.rb +1 -1
  84. data/sig/main.rbs +10 -52
  85. data/tmp/.keep +0 -0
  86. metadata +34 -10
  87. data/lib/procon_bypass_man/background/job_runner.rb +0 -45
  88. data/lib/procon_bypass_man/background/jobs/concerns/has_internal_api_setting.rb +0 -5
  89. data/lib/procon_bypass_man/background/jobs/concerns/job_runnable.rb +0 -16
  90. data/lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb +0 -15
  91. data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +0 -44
  92. data/lib/procon_bypass_man/io_monitor.rb +0 -108
  93. data/lib/procon_bypass_man/support/server_pool.rb +0 -46
@@ -12,8 +12,6 @@ require "resolv-replace"
12
12
  require "pbmenv"
13
13
 
14
14
  require_relative "procon_bypass_man/version"
15
- require_relative "procon_bypass_man/remote_pbm_action"
16
- require_relative "procon_bypass_man/remote_macro"
17
15
 
18
16
  require_relative "procon_bypass_man/device_connection"
19
17
  require_relative "procon_bypass_man/support/usb_device_controller"
@@ -26,16 +24,21 @@ require_relative "procon_bypass_man/support/yaml_writer"
26
24
  require_relative "procon_bypass_man/support/safe_timeout"
27
25
  require_relative "procon_bypass_man/support/compress_array"
28
26
  require_relative "procon_bypass_man/support/uptime"
27
+ require_relative "procon_bypass_man/support/load_agv"
29
28
  require_relative "procon_bypass_man/support/on_memory_cache"
30
29
  require_relative "procon_bypass_man/support/http_client"
31
30
  require_relative "procon_bypass_man/support/report_http_client"
32
31
  require_relative "procon_bypass_man/support/remote_macro_http_client"
33
32
  require_relative "procon_bypass_man/support/update_remote_pbm_action_status_http_client"
34
33
  require_relative "procon_bypass_man/support/send_device_stats_http_client"
35
- require_relative "procon_bypass_man/support/server_pool"
34
+ require_relative "procon_bypass_man/support/procon_performance_http_client"
36
35
  require_relative "procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler"
37
36
  require_relative "procon_bypass_man/support/never_exit_accidentally"
38
37
  require_relative "procon_bypass_man/support/cycle_sleep"
38
+ require_relative "procon_bypass_man/support/can_over_process"
39
+ require_relative "procon_bypass_man/support/gc"
40
+ require_relative "procon_bypass_man/support/retryable"
41
+ require_relative "procon_bypass_man/procon_display"
39
42
  require_relative "procon_bypass_man/background"
40
43
  require_relative "procon_bypass_man/commands"
41
44
  require_relative "procon_bypass_man/bypass"
@@ -52,10 +55,14 @@ require_relative "procon_bypass_man/procon/analog_stick_manipulator"
52
55
  require_relative "procon_bypass_man/remote_pbm_action/value_objects/remote_pbm_action_object"
53
56
  require_relative "procon_bypass_man/scheduler"
54
57
  require_relative "procon_bypass_man/plugins"
58
+ require_relative "procon_bypass_man/worker"
55
59
  require_relative "procon_bypass_man/websocket/client"
56
60
  require_relative "procon_bypass_man/websocket/watchdog"
57
61
  require_relative "procon_bypass_man/websocket/forever"
58
62
 
63
+ require_relative "procon_bypass_man/remote_pbm_action"
64
+ require_relative "procon_bypass_man/remote_macro"
65
+
59
66
  STDOUT.sync = true
60
67
  Thread.abort_on_exception = true
61
68
 
@@ -66,11 +73,18 @@ module ProconBypassMan
66
73
  class CouldNotLoadConfigError < StandardError; end
67
74
  class NotFoundProconError < StandardError; end
68
75
 
76
+ class InterruptForRestart < StandardError; end
77
+
78
+ class << self
79
+ attr_accessor :worker
80
+ end
81
+
69
82
  # @return [void]
70
83
  def self.run(setting_path: nil)
71
84
  ProconBypassMan::PrintMessageCommand.execute(text: "PBMを起動しています")
72
85
  initialize_pbm
73
86
 
87
+ # 設定ファイルの読み込み
74
88
  begin
75
89
  ProconBypassMan::ButtonsSettingConfiguration::Loader.load(setting_path: setting_path)
76
90
  rescue ProconBypassMan::CouldNotLoadConfigError
@@ -83,6 +97,7 @@ module ProconBypassMan
83
97
  return
84
98
  end
85
99
 
100
+ # デバイスの接続フェーズ
86
101
  begin
87
102
  gadget, procon = ProconBypassMan::DeviceConnection::Command.execute!
88
103
  rescue ProconBypassMan::DeviceConnection::NotFoundProconError
@@ -94,7 +109,7 @@ module ProconBypassMan
94
109
  end
95
110
  return
96
111
  rescue ProconBypassMan::DeviceConnection::TimeoutError
97
- ProconBypassMan::SendErrorCommand.execute(error: "接続の見込みがないのでsleepしまくります")
112
+ ProconBypassMan::SendErrorCommand.execute(error: "接続に失敗しました。プロコンとRaspberry Piのケーブルを差し直して、再実行してください。\n改善しない場合は、app.logの中身を添えて不具合報告をお願いします。")
98
113
  ProconBypassMan::DeviceStatus.change_to_connected_but_sleeping!
99
114
  %w(TERM INT).each do |sig|
100
115
  Kernel.trap(sig) { exit 0 }
@@ -130,33 +145,49 @@ module ProconBypassMan
130
145
  ProconBypassMan::Procon::ModeRegistry.reset!
131
146
  ProconBypassMan::Procon.reset!
132
147
  ProconBypassMan::ButtonsSettingConfiguration.instance.reset!
133
- ProconBypassMan::IOMonitor.reset!
134
148
  end
135
149
 
136
150
  # @return [void]
137
151
  def self.initialize_pbm
138
- ProconBypassMan::Scheduler.start!
139
- ProconBypassMan::Background::JobRunner.start!
152
+ `renice -n 20 -p #{$$}`
153
+ ProconBypassMan::Background::JobQueue.start!
140
154
  ProconBypassMan::Websocket::Client.start!
141
- ProconBypassMan::QueueOverProcess.start!
155
+ # TODO ProconBypassMan::DrbObjects.start_all! みたいな感じで書きたい
156
+ ProconBypassMan::RemoteMacro::QueueOverProcess.start!
157
+ ProconBypassMan::Procon::PerformanceMeasurement::QueueOverProcess.start!
158
+ ProconBypassMan::Scheduler.start!
142
159
 
143
160
  ProconBypassMan::WriteDeviceIdCommand.execute
144
161
  ProconBypassMan::WriteSessionIdCommand.execute
145
- `renice -n -20 -p #{$$}`
146
162
  File.write(pid_path, $$)
147
163
  ProconBypassMan::DeviceStatus.change_to_running!
148
164
  end
149
165
 
166
+ # @return [void]
150
167
  def self.ready_pbm
151
168
  ProconBypassMan::PrintBootMessageCommand.execute
152
169
  ProconBypassMan::ReportLoadConfigJob.perform_async(ProconBypassMan.config.raw_setting)
170
+
171
+ self.worker = ProconBypassMan::Worker.run
172
+ end
173
+
174
+ # @return [void]
175
+ def self.after_fork_on_bypass_process
176
+ `renice -n -20 -p #{$$}`
177
+ ::GC.start
178
+ DRb.start_service if defined?(DRb)
179
+ ProconBypassMan::RemoteMacroReceiver.start!
180
+ ProconBypassMan::ProconDisplay::Server.start!
153
181
  end
154
182
 
155
183
  # @return [void]
156
184
  def self.terminate_pbm
157
185
  FileUtils.rm_rf(ProconBypassMan.pid_path)
158
186
  FileUtils.rm_rf(ProconBypassMan.digest_path)
159
- ProconBypassMan::QueueOverProcess.shutdown
187
+ ProconBypassMan::Background::JobQueue.shutdown
188
+ ProconBypassMan::RemoteMacro::QueueOverProcess.shutdown
189
+ ProconBypassMan::Procon::PerformanceMeasurement::QueueOverProcess.shutdown
190
+ self.worker&.shutdown
160
191
  end
161
192
 
162
193
  # @return [void]
@@ -12,7 +12,7 @@ Gem::Specification.new do |spec|
12
12
  spec.description = spec.summary
13
13
  spec.homepage = "https://github.com/splaplapla/procon_bypass_man"
14
14
  spec.license = "MIT"
15
- spec.required_ruby_version = Gem::Requirement.new(">= 3.0.0")
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.5.0")
16
16
 
17
17
  spec.metadata["homepage_uri"] = spec.homepage
18
18
  spec.metadata["source_code_uri"] = spec.homepage
@@ -1,6 +1,5 @@
1
1
  # Project Template
2
2
  * これらは https://github.com/splaplapla/pbmenv がinstallするときに配備するファイルです
3
- * pbm_webはオプショナルです
4
3
 
5
4
  ## systemdを使ってサービスに登録する方法
6
5
  systemctl enableした後は、次回のOS起動時にserviceも自動起動します
@@ -8,13 +7,9 @@ systemctl enableした後は、次回のOS起動時にserviceも自動起動し
8
7
  * pbm
9
8
  * sudo systemctl link /usr/share/pbm/current/systemd_units/pbm.service
10
9
  * sudo systemctl enable pbm.service
11
- * pbm_web
12
- * sudo systemctl link /usr/share/pbm/current/systemd_units/pbm_web.service
13
- * sudo systemctl enable pbm_web.service
14
10
 
15
11
  ## systemdを使ってサービスから解除する方法
16
12
  * sudo systemctl disable pbm.service
17
- * sudo systemctl disable pbm_web.service
18
13
 
19
14
  ### CheatSheet
20
15
  * systemctl daemon-reload
@@ -2,31 +2,44 @@
2
2
 
3
3
  require 'bundler/inline'
4
4
 
5
+ retry_count_on_git_command_error = 0
5
6
  begin
7
+ if retry_count_on_git_command_error > 10
8
+ STDOUT.puts "Stopped the procon_bypass_man program because could not download any source codes."
9
+ exit 1
10
+ end
11
+
6
12
  gemfile do
7
13
  source 'https://rubygems.org'
8
14
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
9
- gem 'procon_bypass_man', '0.2.0'
15
+ gem 'procon_bypass_man', '0.2.3'
10
16
  end
11
17
  rescue Bundler::Source::Git::GitCommandError => e
18
+ retry_count_on_git_command_error = retry_count_on_git_command_error + 1
19
+ sleep(5) # サービスの起動順によっては、まだoffline状態なので待機する
20
+
12
21
  # install中に強制終了するとgitの管理ファイルが不正状態になり、次のエラーが起きるので発生したらcache directoryを削除する
13
22
  #"Git error: command `git fetch --force --quiet --tags https://github.com/splaplapla/procon_bypass_man refs/heads/\\*:refs/heads/\\*` in directory /home/pi/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/cache/bundler/git/procon_bypass_man-ae4c9016d76b667658c8ba66f3bbd2eebf2656af has failed.\n\nIf this error persists you could try removing the cache directory '/home/pi/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/cache/bundler/git/procon_bypass_man-ae4c9016d76b667658c8ba66f3bbd2eebf2656af'"
14
- if /try removing the cache directory '([^']+)'/ =~ e.message
23
+ if /try removing the cache directory '([^']+)'/ =~ e.message && $1&.start_with?('/home/pi/.rbenv')
24
+ require 'fileutils'
15
25
  FileUtils.rm_rf($1)
16
- retry
26
+ STDOUT.puts "Deleted #{$1}"
17
27
  end
28
+
29
+ retry
18
30
  end
19
31
 
20
32
  ProconBypassMan.configure do |config|
21
33
  config.root = File.expand_path(__dir__)
22
- config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
34
+ config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 1, 1024 * 1024 * 1)
23
35
  config.logger.level = :debug
24
36
 
25
37
  # バイパスするログを全部app.logに流すか
26
38
  config.verbose_bypass_log = false
27
39
 
28
- # webからProconBypassManを操作できるwebサービス
29
- # config.api_servers = ['https://pbm-cloud.herokuapp.com']
40
+ # webからProconBypassManを操作できるwebサービスと連携します
41
+ # 連携中はエラーログ、パフォーマンスに関するメトリクスを送信します
42
+ # config.api_servers = 'https://pbm-cloud.herokuapp.com'
30
43
 
31
44
  # エラーが起きたらerror.logに書き込みます
32
45
  config.enable_critical_error_logging = true
@@ -34,14 +47,11 @@ ProconBypassMan.configure do |config|
34
47
  # pbm-cloudで使う場合はnever_exitにtrueをセットしてください. trueがセットされている場合、不慮の事故が発生してもプロセスが終了しなくなります
35
48
  config.never_exit_accidentally = true
36
49
 
37
- # 毎秒行ったIOをログに出力するか
38
- config.io_monitor_logging = false
39
-
40
50
  # 接続に成功したらコントローラーのHOME LEDを光らせるか
41
51
  config.enable_home_led_on_connect = true
42
52
 
43
- # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値は大きくしてください
44
- config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 5 }
53
+ # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値を大きくしてください
54
+ config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 10 }
45
55
  end
46
56
 
47
57
  ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler/inline'
4
+
5
+ retry_count_on_git_command_error = 0
6
+ begin
7
+ if retry_count_on_git_command_error > 10
8
+ STDOUT.puts "Stopped the procon_bypass_man program because could not download any source codes."
9
+ exit 1
10
+ end
11
+
12
+ gemfile do
13
+ source 'https://rubygems.org'
14
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
15
+ gem 'procon_bypass_man', '0.2.3'
16
+ end
17
+ rescue Bundler::Source::Git::GitCommandError => e
18
+ retry_count_on_git_command_error = retry_count_on_git_command_error + 1
19
+ sleep(5) # サービスの起動順によっては、まだoffline状態なので待機する
20
+
21
+ # install中に強制終了するとgitの管理ファイルが不正状態になり、次のエラーが起きるので発生したらcache directoryを削除する
22
+ #"Git error: command `git fetch --force --quiet --tags https://github.com/splaplapla/procon_bypass_man refs/heads/\\*:refs/heads/\\*` in directory /home/pi/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/cache/bundler/git/procon_bypass_man-ae4c9016d76b667658c8ba66f3bbd2eebf2656af has failed.\n\nIf this error persists you could try removing the cache directory '/home/pi/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/cache/bundler/git/procon_bypass_man-ae4c9016d76b667658c8ba66f3bbd2eebf2656af'"
23
+ if /try removing the cache directory '([^']+)'/ =~ e.message && $1&.start_with?('/home/pi/.rbenv')
24
+ require 'fileutils'
25
+ FileUtils.rm_rf($1)
26
+ STDOUT.puts "Deleted #{$1}"
27
+ end
28
+
29
+ retry
30
+ end
31
+
32
+ ProconBypassMan.configure do |config|
33
+ config.root = File.expand_path(__dir__)
34
+ config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 1, 1024 * 1024 * 1)
35
+ config.logger.level = :debug
36
+
37
+ # バイパスするログを全部app.logに流すか
38
+ config.verbose_bypass_log = false
39
+
40
+ # webからProconBypassManを操作できるwebサービスと連携します
41
+ # 連携中はエラーログ、パフォーマンスに関するメトリクスを送信します
42
+ <%- api_server_config = "config.api_servers = 'https://pbm-cloud.herokuapp.com'" -%>
43
+ <%- if enable_integration_with_pbm_cloud -%>
44
+ <%= api_server_config %>
45
+ <%- else -%>
46
+ <%= "# #{api_server_config}" %>
47
+ <%- end -%>
48
+
49
+ # エラーが起きたらerror.logに書き込みます
50
+ config.enable_critical_error_logging = true
51
+
52
+ # pbm-cloudで使う場合はnever_exitにtrueをセットしてください. trueがセットされている場合、不慮の事故が発生してもプロセスが終了しなくなります
53
+ config.never_exit_accidentally = true
54
+
55
+ # 接続に成功したらコントローラーのHOME LEDを光らせるか
56
+ config.enable_home_led_on_connect = true
57
+
58
+ # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値を大きくしてください
59
+ config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 10 }
60
+ end
61
+
62
+ ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")
@@ -0,0 +1,31 @@
1
+ require "erb"
2
+
3
+ # NOTE pbmenvで参照しているクラス
4
+ # 後方互換を維持するために、パラメータの削除・必須をしてはいけない
5
+ class AppGenerator
6
+ attr_reader :prefix_path
7
+
8
+ # @param [String] prefix_path
9
+ # @param [Boolean] enable_integration_with_pbm_cloud
10
+ def initialize(prefix_path: , enable_integration_with_pbm_cloud: )
11
+ @prefix_path = prefix_path
12
+ @enable_integration_with_pbm_cloud = enable_integration_with_pbm_cloud
13
+ end
14
+
15
+ def generate
16
+ erb = File.read(template_path)
17
+ enable_integration_with_pbm_cloud = @enable_integration_with_pbm_cloud
18
+ app_rb = ERB.new(erb, nil, '-').result(binding)
19
+ File.write(output_path, app_rb)
20
+ end
21
+
22
+ private
23
+
24
+ def template_path
25
+ File.join(prefix_path, "app.rb.erb")
26
+ end
27
+
28
+ def output_path
29
+ File.join(prefix_path, "app.rb")
30
+ end
31
+ end
@@ -10,7 +10,7 @@ end
10
10
 
11
11
  ProconBypassMan::Web.configure do |config|
12
12
  config.root = File.expand_path(__dir__)
13
- config.logger = Logger.new("#{ProconBypassMan::Web.root}/web.log", 1, 1024 * 1024 * 10)
13
+ config.logger = Logger.new("#{ProconBypassMan::Web.root}/web.log", 1, 1024 * 1024 * 1)
14
14
  end
15
15
 
16
16
  ProconBypassMan::Web::Server.start
data/sig/main.rbs CHANGED
@@ -174,6 +174,8 @@ class ProconBypassMan::Configuration
174
174
 
175
175
  def pid_path: () -> String
176
176
 
177
+ def worker_pid_path: () -> String
178
+
177
179
  def digest_path: () -> String
178
180
 
179
181
  def cache: () -> ProconBypassMan::OnMemoryCache
@@ -186,7 +188,6 @@ class ProconBypassMan::Configuration
186
188
  attr_reader api_server: untyped
187
189
  attr_reader api_servers: untyped
188
190
  attr_writer never_exit_accidentally: bool
189
- attr_writer io_monitor_logging: bool
190
191
 
191
192
  attr_accessor enable_critical_error_logging: bool
192
193
 
@@ -213,9 +214,13 @@ class ProconBypassMan::Configuration
213
214
 
214
215
  def enable_ws?: () -> bool
215
216
 
216
- def server_pool: () -> untyped
217
+ def has_api_server?: () -> bool
218
+
219
+ def enable_procon_performance_measurement?: () -> bool
217
220
 
218
- def internal_server_pool: () -> untyped
221
+ def server: () -> untyped
222
+
223
+ def internal_server: () -> untyped
219
224
 
220
225
  def internal_servers: () -> ::Array[string | nil]
221
226
 
@@ -226,8 +231,6 @@ class ProconBypassMan::Configuration
226
231
  def verbose_bypass_log: () -> bool
227
232
 
228
233
  def never_exit_accidentally: () -> bool
229
-
230
- def io_monitor_logging: () -> bool
231
234
  end
232
235
 
233
236
 
@@ -274,35 +277,6 @@ class ProconBypassMan::DeviceConnector
274
277
  def init_devices: () -> untyped
275
278
  end
276
279
 
277
- module ProconBypassMan
278
- class Counter
279
- attr_accessor label: untyped
280
-
281
- attr_accessor table: untyped
282
-
283
- attr_accessor previous_table: untyped
284
-
285
- def initialize: (label: untyped label) -> untyped
286
-
287
- # アクティブなバケットは1つだけ
288
- def record: (untyped event_name) -> untyped
289
-
290
- def formated_previous_table: () -> ::String
291
- end
292
-
293
- module IOMonitor
294
- def self.new: (label: untyped label) -> untyped
295
-
296
- # @return [Array<Counter>]
297
- def self.targets: () -> untyped
298
-
299
- # ここで集計する
300
- def self.start!: () -> untyped
301
-
302
- def self.reset!: () -> untyped
303
- end
304
- end
305
-
306
280
  class ProconBypassMan::Processor
307
281
  # @return [String] binary
308
282
  def initialize: (untyped binary) -> untyped
@@ -598,11 +572,11 @@ end
598
572
 
599
573
  module ProconBypassMan
600
574
  class HttpClient
601
- @server_pool: untyped
575
+ @server: untyped
602
576
  @uri: ::URI
603
577
  @retry_on_connection_error: false
604
578
 
605
- def initialize: (path: String, server_pool: untyped, ?retry_on_connection_error: false) -> void
579
+ def initialize: (path: String, server: untyped, ?retry_on_connection_error: false) -> void
606
580
  def get: -> nil
607
581
  def post: (request_body: untyped) -> nil
608
582
  def put: (request_body: untyped) -> nil
@@ -645,22 +619,6 @@ module ProconBypassMan
645
619
  end
646
620
  end
647
621
 
648
- module ProconBypassMan
649
- class ServerPool
650
- @servers: Array[String]
651
- @index: Integer?
652
-
653
- def initialize: (servers: Array[String]) -> void
654
- def pick: -> String?
655
- def server: -> String?
656
- def next!: -> nil
657
-
658
- private
659
- def reset: -> Integer
660
- def inc_index: -> Integer
661
- end
662
- end
663
-
664
622
  module ProconBypassMan
665
623
  class CompressArray
666
624
  @array: [String]
data/tmp/.keep ADDED
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: procon_bypass_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - jiikko
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-05-20 00:00:00.000000000 Z
11
+ date: 2022-08-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pbmenv
@@ -76,6 +76,7 @@ files:
76
76
  - Steepfile
77
77
  - bin/console
78
78
  - bin/dev_api_server.rb
79
+ - bin/generate_default_app
79
80
  - bin/setup
80
81
  - docs/getting_started.md
81
82
  - docs/how_to_connect_procon.md
@@ -93,11 +94,10 @@ files:
93
94
  - lib/procon_bypass_man.rb
94
95
  - lib/procon_bypass_man/background.rb
95
96
  - lib/procon_bypass_man/background/job_performer.rb
96
- - lib/procon_bypass_man/background/job_runner.rb
97
+ - lib/procon_bypass_man/background/job_queue.rb
97
98
  - lib/procon_bypass_man/background/jobs/base_job.rb
98
99
  - lib/procon_bypass_man/background/jobs/concerns/has_external_api_setting.rb
99
- - lib/procon_bypass_man/background/jobs/concerns/has_internal_api_setting.rb
100
- - lib/procon_bypass_man/background/jobs/concerns/job_runnable.rb
100
+ - lib/procon_bypass_man/background/jobs/concerns/job_performable.rb
101
101
  - lib/procon_bypass_man/background/jobs/post_completed_remote_macro_job.rb
102
102
  - lib/procon_bypass_man/background/jobs/report_boot_job.rb
103
103
  - lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb
@@ -105,7 +105,7 @@ files:
105
105
  - lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb
106
106
  - lib/procon_bypass_man/background/jobs/report_event_base_job.rb
107
107
  - lib/procon_bypass_man/background/jobs/report_load_config_job.rb
108
- - lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb
108
+ - lib/procon_bypass_man/background/jobs/report_procon_performance_measurements_job.rb
109
109
  - lib/procon_bypass_man/background/jobs/report_reload_config_job.rb
110
110
  - lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb
111
111
  - lib/procon_bypass_man/background/jobs/sync_device_stats_job.rb
@@ -124,7 +124,9 @@ files:
124
124
  - lib/procon_bypass_man/buttons_setting_configuration/validator.rb
125
125
  - lib/procon_bypass_man/bypass.rb
126
126
  - lib/procon_bypass_man/bypass/bypass_command.rb
127
- - lib/procon_bypass_man/bypass/usb_hid_logger.rb
127
+ - lib/procon_bypass_man/bypass/bypass_value.rb
128
+ - lib/procon_bypass_man/bypass/procon_to_switch.rb
129
+ - lib/procon_bypass_man/bypass/switch_to_procon.rb
128
130
  - lib/procon_bypass_man/commands.rb
129
131
  - lib/procon_bypass_man/commands/print_boot_message_command.rb
130
132
  - lib/procon_bypass_man/commands/print_message_command.rb
@@ -145,7 +147,6 @@ files:
145
147
  - lib/procon_bypass_man/device_connection/spoofing_output_report_watcher.rb
146
148
  - lib/procon_bypass_man/device_model.rb
147
149
  - lib/procon_bypass_man/device_status.rb
148
- - lib/procon_bypass_man/io_monitor.rb
149
150
  - lib/procon_bypass_man/plugin/splatoon2/macro/charge_tansan_bomb.rb
150
151
  - lib/procon_bypass_man/plugin/splatoon2/macro/dasei_cancel.rb
151
152
  - lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb
@@ -170,6 +171,14 @@ files:
170
171
  - lib/procon_bypass_man/procon/macro_plugin_map.rb
171
172
  - lib/procon_bypass_man/procon/macro_registry.rb
172
173
  - lib/procon_bypass_man/procon/mode_registry.rb
174
+ - lib/procon_bypass_man/procon/performance_measurement.rb
175
+ - lib/procon_bypass_man/procon/performance_measurement/last_bypass_at.rb
176
+ - lib/procon_bypass_man/procon/performance_measurement/measurement_collection.rb
177
+ - lib/procon_bypass_man/procon/performance_measurement/measurements_summarizer.rb
178
+ - lib/procon_bypass_man/procon/performance_measurement/procon_performance_span_transfer_job.rb
179
+ - lib/procon_bypass_man/procon/performance_measurement/queue_over_process.rb
180
+ - lib/procon_bypass_man/procon/performance_measurement/span_queue.rb
181
+ - lib/procon_bypass_man/procon/performance_measurement/span_transfer_buffer.rb
173
182
  - lib/procon_bypass_man/procon/press_button_aware.rb
174
183
  - lib/procon_bypass_man/procon/suppress_rumble.rb
175
184
  - lib/procon_bypass_man/procon/user_operation.rb
@@ -184,6 +193,13 @@ files:
184
193
  - lib/procon_bypass_man/procon/value_objects/bypass_mode.rb
185
194
  - lib/procon_bypass_man/procon/value_objects/procon_reader.rb
186
195
  - lib/procon_bypass_man/procon/value_objects/rumble_binary.rb
196
+ - lib/procon_bypass_man/procon_display.rb
197
+ - lib/procon_bypass_man/procon_display/bypass_hook.rb
198
+ - lib/procon_bypass_man/procon_display/http_request.rb
199
+ - lib/procon_bypass_man/procon_display/http_response.rb
200
+ - lib/procon_bypass_man/procon_display/server.rb
201
+ - lib/procon_bypass_man/procon_display/server_app.rb
202
+ - lib/procon_bypass_man/procon_display/status.rb
187
203
  - lib/procon_bypass_man/remote_macro.rb
188
204
  - lib/procon_bypass_man/remote_macro/queue_over_process.rb
189
205
  - lib/procon_bypass_man/remote_macro/remote_macro_object.rb
@@ -204,18 +220,22 @@ files:
204
220
  - lib/procon_bypass_man/scheduler.rb
205
221
  - lib/procon_bypass_man/support/analog_stick_hypotenuse_tilting_power_scaler.rb
206
222
  - lib/procon_bypass_man/support/callbacks.rb
223
+ - lib/procon_bypass_man/support/can_over_process.rb
207
224
  - lib/procon_bypass_man/support/compress_array.rb
208
225
  - lib/procon_bypass_man/support/cycle_sleep.rb
209
226
  - lib/procon_bypass_man/support/device_mouse_finder.rb
210
227
  - lib/procon_bypass_man/support/device_procon_finder.rb
228
+ - lib/procon_bypass_man/support/gc.rb
211
229
  - lib/procon_bypass_man/support/http_client.rb
230
+ - lib/procon_bypass_man/support/load_agv.rb
212
231
  - lib/procon_bypass_man/support/never_exit_accidentally.rb
213
232
  - lib/procon_bypass_man/support/on_memory_cache.rb
233
+ - lib/procon_bypass_man/support/procon_performance_http_client.rb
214
234
  - lib/procon_bypass_man/support/remote_macro_http_client.rb
215
235
  - lib/procon_bypass_man/support/report_http_client.rb
236
+ - lib/procon_bypass_man/support/retryable.rb
216
237
  - lib/procon_bypass_man/support/safe_timeout.rb
217
238
  - lib/procon_bypass_man/support/send_device_stats_http_client.rb
218
- - lib/procon_bypass_man/support/server_pool.rb
219
239
  - lib/procon_bypass_man/support/signal_handler.rb
220
240
  - lib/procon_bypass_man/support/update_remote_pbm_action_status_http_client.rb
221
241
  - lib/procon_bypass_man/support/uptime.rb
@@ -226,9 +246,12 @@ files:
226
246
  - lib/procon_bypass_man/websocket/client.rb
227
247
  - lib/procon_bypass_man/websocket/forever.rb
228
248
  - lib/procon_bypass_man/websocket/watchdog.rb
249
+ - lib/procon_bypass_man/worker.rb
229
250
  - procon_bypass_man.gemspec
230
251
  - project_template/README.md
231
252
  - project_template/app.rb
253
+ - project_template/app.rb.erb
254
+ - project_template/lib/app_generator.rb
232
255
  - project_template/setting.yml
233
256
  - project_template/systemd_units/pbm.service
234
257
  - project_template/systemd_units/pbm_web.service
@@ -236,6 +259,7 @@ files:
236
259
  - sig/README.md
237
260
  - sig/main.rbs
238
261
  - sig/on_memory_cache.rbs
262
+ - tmp/.keep
239
263
  homepage: https://github.com/splaplapla/procon_bypass_man
240
264
  licenses:
241
265
  - MIT
@@ -251,7 +275,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
251
275
  requirements:
252
276
  - - ">="
253
277
  - !ruby/object:Gem::Version
254
- version: 3.0.0
278
+ version: 2.5.0
255
279
  required_rubygems_version: !ruby/object:Gem::Requirement
256
280
  requirements:
257
281
  - - ">="
@@ -1,45 +0,0 @@
1
- module ProconBypassMan
2
- module Background
3
- class JobRunner
4
- MAX_QUEUE_SIZE = 100
5
-
6
- def self.start!
7
- new.start!
8
- end
9
-
10
- # for test
11
- def stop!
12
- return unless defined?(@thread)
13
- @thread.kill
14
- end
15
-
16
- def start!
17
- return if defined?(@thread)
18
- @thread = Thread.new do
19
- while(item = self.class.queue.pop)
20
- begin
21
- JobPerformer.new(klass: item[:reporter_class], args: item[:args]).perform
22
- sleep(1)
23
- rescue => e
24
- ProconBypassMan.logger.error(e)
25
- end
26
- end
27
- end
28
- self
29
- end
30
-
31
- def self.queue
32
- @@queue ||= Queue.new
33
- end
34
-
35
- def self.push(hash)
36
- if queue.size > MAX_QUEUE_SIZE
37
- ProconBypassMan.logger.error('Over queue size cap!!')
38
- return
39
- end
40
-
41
- queue.push(hash)
42
- end
43
- end
44
- end
45
- end
@@ -1,5 +0,0 @@
1
- module ProconBypassMan::HasInternalApiSetting
2
- def server_pool
3
- ProconBypassMan.config.internal_server_pool
4
- end
5
- end
@@ -1,16 +0,0 @@
1
- module ProconBypassMan
2
- module Background
3
- module JobRunnable
4
- def perform(*)
5
- raise NotImplementedError, nil
6
- end
7
-
8
- def perform_async(*args)
9
- ProconBypassMan::Background::JobRunner.push(
10
- args: args,
11
- reporter_class: self,
12
- )
13
- end
14
- end
15
- end
16
- end