procon_bypass_man 0.3.4 → 0.3.6

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -1
  3. data/Gemfile.lock +3 -3
  4. data/README.md +1 -8
  5. data/Steepfile +0 -1
  6. data/bin/generate_output_report +18 -0
  7. data/docs/getting_started.md +13 -9
  8. data/docs/setting/splatoon3_macro_dasei_cancel.md +7 -0
  9. data/docs/setting/{splatoon3_rotation_forward_stick.md → splatoon3_rotation_left_stick.md} +1 -1
  10. data/lib/procon_bypass_man/background/jobs/post_completed_remote_action_job.rb +20 -0
  11. data/lib/procon_bypass_man/background/jobs/report_info_log_job.rb +11 -0
  12. data/lib/procon_bypass_man/background/jobs/report_warning_job.rb +11 -0
  13. data/lib/procon_bypass_man/background.rb +2 -0
  14. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +6 -0
  15. data/lib/procon_bypass_man/buttons_setting_configuration/metadata_loader.rb +27 -0
  16. data/lib/procon_bypass_man/buttons_setting_configuration/validator.rb +4 -4
  17. data/lib/procon_bypass_man/bypass/bypass_command.rb +2 -2
  18. data/lib/procon_bypass_man/bypass/procon_to_switch.rb +3 -0
  19. data/lib/procon_bypass_man/commands/send_info_log_command.rb +11 -0
  20. data/lib/procon_bypass_man/commands/send_warning_command.rb +18 -0
  21. data/lib/procon_bypass_man/commands.rb +2 -0
  22. data/lib/procon_bypass_man/configuration.rb +1 -1
  23. data/lib/procon_bypass_man/procon.rb +22 -11
  24. data/lib/procon_bypass_man/procon_display/status.rb +1 -0
  25. data/lib/procon_bypass_man/procon_display.rb +0 -1
  26. data/lib/procon_bypass_man/{remote_macro → remote_action}/queue_over_process.rb +2 -2
  27. data/lib/procon_bypass_man/{remote_macro/remote_macro_object.rb → remote_action/remote_action_object.rb} +1 -1
  28. data/lib/procon_bypass_man/{remote_macro/remote_macro_receiver.rb → remote_action/remote_action_receiver.rb} +8 -7
  29. data/lib/procon_bypass_man/remote_action/remote_action_sender.rb +9 -0
  30. data/lib/procon_bypass_man/remote_action/remote_pbm_job/base_action.rb +55 -0
  31. data/lib/procon_bypass_man/remote_action/remote_pbm_job/change_pbm_version_action.rb +31 -0
  32. data/lib/procon_bypass_man/remote_action/remote_pbm_job/commands/run_remote_pbm_job_dispatch_command.rb +29 -0
  33. data/lib/procon_bypass_man/{remote_pbm_action/commands/update_remote_pbm_action_status_command.rb → remote_action/remote_pbm_job/commands/update_remote_pbm_job_status_command.rb} +2 -2
  34. data/lib/procon_bypass_man/remote_action/remote_pbm_job/reboot_os_action.rb +24 -0
  35. data/lib/procon_bypass_man/remote_action/remote_pbm_job/report_procon_status.rb +25 -0
  36. data/lib/procon_bypass_man/remote_action/remote_pbm_job/restore_pbm_setting.rb +42 -0
  37. data/lib/procon_bypass_man/remote_action/remote_pbm_job/stop_pbm_action.rb +23 -0
  38. data/lib/procon_bypass_man/{remote_pbm_action/value_objects/remote_pbm_action_object.rb → remote_action/remote_pbm_job/value_objects/remote_pbm_job_object.rb} +2 -2
  39. data/lib/procon_bypass_man/remote_action/remote_pbm_job.rb +45 -0
  40. data/lib/procon_bypass_man/remote_action/task.rb +14 -0
  41. data/lib/procon_bypass_man/{remote_macro → remote_action}/task_queue.rb +1 -1
  42. data/lib/procon_bypass_man/remote_action.rb +19 -0
  43. data/lib/procon_bypass_man/support/callbacks.rb +1 -0
  44. data/lib/procon_bypass_man/support/{update_remote_pbm_action_status_http_client.rb → update_remote_pbm_job_status_http_client.rb} +1 -1
  45. data/lib/procon_bypass_man/version.rb +1 -1
  46. data/lib/procon_bypass_man/websocket/client.rb +42 -26
  47. data/lib/procon_bypass_man.rb +5 -7
  48. data/procon_bypass_man.gemspec +1 -1
  49. data/project_template/app.rb +1 -1
  50. data/project_template/app.rb.erb +1 -1
  51. data/sig/main.rbs +0 -6
  52. metadata +30 -23
  53. data/lib/procon_bypass_man/procon_display/bypass_hook.rb +0 -12
  54. data/lib/procon_bypass_man/remote_macro/remote_macro_sender.rb +0 -8
  55. data/lib/procon_bypass_man/remote_macro/task.rb +0 -2
  56. data/lib/procon_bypass_man/remote_macro.rb +0 -16
  57. data/lib/procon_bypass_man/remote_pbm_action/base_action.rb +0 -53
  58. data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +0 -28
  59. data/lib/procon_bypass_man/remote_pbm_action/commands/run_remote_pbm_action_dispatch_command.rb +0 -21
  60. data/lib/procon_bypass_man/remote_pbm_action/reboot_os_action.rb +0 -22
  61. data/lib/procon_bypass_man/remote_pbm_action/restore_pbm_setting.rb +0 -41
  62. data/lib/procon_bypass_man/remote_pbm_action/stop_pbm_action.rb +0 -21
  63. data/lib/procon_bypass_man/remote_pbm_action.rb +0 -36
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '019476402097b5b57976cd88c61d41b23c9eb7e6195a0f49240d4d89db9622a6'
4
- data.tar.gz: '0590db283b885d28994ab318393876c2fc1acc3082960dbe7adaaec5c7080d21'
3
+ metadata.gz: 2f19608c134a980243f4e45da1a1685367dd4bffc114482682b5d8d6bef03a90
4
+ data.tar.gz: c0ce801d735e63e5d6a385854ad83abb08fe044342bda63b5d70d2d50b3589f4
5
5
  SHA512:
6
- metadata.gz: e0e858601e6a4d98c5e7cd6eafafccf3e123c3ea956f70398d3382c6239aef888b84210a028b18b763cf8865b4b645181fa9c5f3d9f29047cd639a706979b0eb
7
- data.tar.gz: 455638d194448fa0a535915e585519486b423828251de66f345e3888269b15f34c459cb55266ec08f271aa114a92f927195b1ef0e9621422695cfea356548a35
6
+ metadata.gz: 11e84f9b7fa368adc1cbbb8593aca61d2a1a362453a13c5b226912d490c82933d476072f11ecb36226657107aa68b08be734ac19ec8901b56a00deb980d218b9
7
+ data.tar.gz: 642a6813619dccbb9d28f634bb7bb866ec92a2ed34fac254336562ed462512b1e9eb6ec2672dae17727e9c6790651f4e481e24a9a919dbd87381e4a457c62796
data/CHANGELOG.md CHANGED
@@ -1,6 +1,15 @@
1
+ ## [0.3.6] 2023-03-12
2
+ - プロコンの入力状態をpbm-cloudサーバに送信できるようになりました
3
+
4
+ ## [0.3.5] - 2023-2-9
5
+ * 設定ファイルに起動に必要なPBMのバージョンを表記できるようになりました
6
+ * https://github.com/splaplapla/procon_bypass_man/pull/238
7
+ * レイヤー変更ボタン(prefix_keys_for_changing_layer)が空欄の時に設定ファイルをエラーが起きないようにしました
8
+ * PBM-CloudからPBMをアップグレードするときに、古いバージョンを削除するようにしました
9
+
1
10
  ## [0.3.4] - 2022-12-26
2
11
  * 左スティックを1回転するマクロを追加しました
3
- * 詳しい設定方法については docs/setting/splatoon3_rotation_forward_stick.md を参照してください
12
+ * 詳しい設定方法については docs/setting/splatoon3_rotation_left_stick.md を参照してください
4
13
  * プログラムの停止時・再読み込み時に時間がかかってた不具合を修正しました
5
14
 
6
15
  ## [0.3.3.1] - 2022-11-13
data/Gemfile.lock CHANGED
@@ -1,10 +1,10 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- procon_bypass_man (0.3.4)
4
+ procon_bypass_man (0.3.6)
5
5
  action_cable_client
6
6
  blue_green_process (= 0.1.4.2)
7
- pbmenv (>= 0.1.9)
7
+ pbmenv (>= 0.1.11)
8
8
  sorted_set
9
9
 
10
10
  GEM
@@ -38,7 +38,7 @@ GEM
38
38
  parallel (1.21.0)
39
39
  parser (3.0.3.2)
40
40
  ast (~> 2.4.1)
41
- pbmenv (0.1.10)
41
+ pbmenv (0.1.11)
42
42
  pry (0.14.1)
43
43
  coderay (~> 1.1)
44
44
  method_source (~> 1.0)
data/README.md CHANGED
@@ -38,7 +38,7 @@ https://user-images.githubusercontent.com/1664497/171327108-f12f56a5-fc36-48da-9
38
38
  * レイヤーを切り替える方法は?
39
39
  * 設定ファイルに記述している `prefix_keys_for_changing_layer`の後ろにあるキーを同時押しながら、十字キーのどれかを押すことで任意のレイヤーに切り替わります
40
40
  * このツールでできることは?
41
- * キーリマップ, 連射, マクロ, 特定の同じ操作の繰り返し(mode)
41
+ * キーリマップ, 連射, マクロ
42
42
  * リマップは1つのキーを別のキーに割り当てます
43
43
  * 連射中には特定のキーの入力を無視したり、複数のキーをトリガーに連射することができます
44
44
  * どうしてsudoが必要なの?
@@ -80,13 +80,6 @@ sudo kill -USR2 `cat ./pbm_pid`
80
80
  * githubのreleaseを作成する
81
81
  -->
82
82
 
83
- ## Raspberry Pi4のセットアップを代行します
84
- * Raspberry Pi4を開発者である私の家に配送してくれれば、セットアップを代行します。セットアップが終わり次第送り返します
85
- * 使い方に関しては、https://pbm-cloud.jiikko.com ですべて完結するので、Linuxの知識は不要です
86
- * 何か問題が起きた時はリモートログインでサポート可能です
87
- * 希望者はDiscordの `kawagu#7684` にDMを送ってください
88
- * お金はかかりません
89
-
90
83
  ## 開発を支援してくれる人を募集しています
91
84
  * https://jiikko.fanbox.cc/
92
85
  * procon_bypassの運営・開発・サーバー費用に充てさせていただきます。また、問い合わせに優先して対応します。
data/Steepfile CHANGED
@@ -40,7 +40,6 @@ target :lib do
40
40
  check 'lib/procon_bypass_man/support/on_memory_cache'
41
41
  check 'lib/procon_bypass_man/support/uptime.rb'
42
42
  check 'lib/procon_bypass_man/support/safe_timeout'
43
- check 'lib/procon_bypass_man/support/update_remote_pbm_action_status_http_client'
44
43
  check 'lib/procon_bypass_man/support/compress_array'
45
44
 
46
45
  signature 'sig'
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "procon_bypass_man"
5
+ require "pry"
6
+
7
+ # \x30のみ生成する
8
+ # Usage:
9
+ # $ `generate_output_report x zl y` のように、引数にボタン名を渡す
10
+
11
+ no_action_binary = ["30f28100800078c77448287509550274ff131029001b0022005a0271ff191028001e00210064027cff1410280020002100000000000000000000000000000000"].pack("H*")
12
+ user_operation = ProconBypassMan::Procon::UserOperation.new(no_action_binary)
13
+
14
+ ARGV.map { |x| x.to_sym }.each do |button|
15
+ user_operation.press_button(button)
16
+ end
17
+
18
+ puts user_operation.binary.unpack.first
@@ -3,17 +3,16 @@
3
3
  * [はじめに](#はじめに)
4
4
  * [procon_bypass_manで解決したいこと](#procon_bypass_manで解決したいこと)
5
5
  * [procon_bypass_manでできること](#procon_bypass_manでできること)
6
- * [セットアップを代行できます](#セットアップを代行できます)
7
6
  * [セットアップ](#セットアップ)
8
7
  * [ラズベリーパイのセットアップ](#ラズベリーパイのセットアップ)
9
8
  * [procon_bypass_manのインストール](#procon_bypass_manのインストール)
10
9
  * [pbmenvを使う方法](#pbmenvを使う方法)
11
10
  * [pbmenvを使わない方法](#pbmenvを使わない方法)
11
+ * [RaspberryPiの給電について](#RaspberryPiの給電について)
12
12
  * [普段使いをするためのセットアップ](#普段使いをするためのセットアップ)
13
13
  * [レイヤー](#レイヤー)
14
14
  * [マクロ](#マクロ)
15
15
  * [左スティックの感度調整](#左スティックの感度調整)
16
- * [入力表示](#入力表示)
17
16
  * [設定ファイルの書き方](#設定ファイルの書き方)
18
17
  * プラグインの書き方
19
18
  * [設定ファイルの書き方がわからない、エラーが起きるとき](#設定ファイルの書き方がわからない、エラーが起きるとき)
@@ -43,15 +42,10 @@
43
42
  * [設定方法](/docs/setting/left-analogstick-cap.md)
44
43
  * WEBから設定状態の閲覧・反映
45
44
  * ボタンリマップ
45
+ <!--
46
46
  * 入力表示
47
47
  * https://github.com/splaplapla/switch-procon-input-viewer
48
-
49
- ## セットアップを代行できます
50
- * Raspberry Pi4を開発者である私の家に配送してくれれば、セットアップを代行します。セットアップが終わり次第送り返します
51
- * 使い方に関しては、https://pbm-cloud.jiikko.com ですべて完結するので、Linuxの知識は不要です
52
- * 何か問題が起きた時はリモートログインでサポート可能です
53
- * 希望者はDiscordの `kawagu#7684` にDMを送ってください
54
- * お金はかかりません
48
+ -->
55
49
 
56
50
  ## セットアップ
57
51
  ### ラズベリーパイのセットアップ
@@ -123,6 +117,14 @@ wget https://raw.githubusercontent.com/jiikko/procon_bypass_man_sample/master/se
123
117
  sudo /home/pi/.rbenv/versions/3.0.1/bin/ruby app.rb
124
118
  ```
125
119
 
120
+ ## RaspberryPiの給電について
121
+ Raspberry Piの状態によっては、Switchと接続しているときに、Raspberry Piが電力不足になるようで動作が不安定になることがあります。
122
+ 不安定になるようであれば、Switch以外からも給電してみてください。詳細には言及しませんが、主な給電方法には、以下があります。
123
+
124
+ * GPIO端子
125
+ * セルフパワーUSBハブ
126
+ * PoE
127
+
126
128
  ## 普段使いをするためのセットアップ
127
129
 
128
130
  procon_bypass_manを起動するだけでプロコンと接続ができるようになったら、Raspberry Piを起動したときにprocon_bypass_manも自動起動するように設定しましょう。
@@ -215,9 +217,11 @@ open_macro :sokuwari, steps: [:toggle_r_for_0_2sec, :toggle_thumbr_for_0_14sec,
215
217
  ## 左スティックの感度調整
216
218
  [左スティックの感度調整](/docs/setting/left-analogstick-cap.md)
217
219
 
220
+ <!--
218
221
  ## 入力表示
219
222
  * 使い方は https://github.com/splaplapla/switch-procon-input-viewer を参照してください。
220
223
  * https://zenn.dev/jiikko/articles/2ef0ccbdfe0fe7 に技術的な解説を書きました
224
+ -->
221
225
 
222
226
  ## 設定ファイルの書き方
223
227
  設定ファイルは、ymlフォーマットに埋め込まれたRubyスクリプトで記述します。
@@ -3,6 +3,13 @@
3
3
  * 本マクロは実験段階で、オプション名などの仕様が変更される可能性が高いです
4
4
  * procon_bypass_man: 0.3.3以上が必要です
5
5
 
6
+
7
+
8
+ https://user-images.githubusercontent.com/1664497/210229394-493a7ad4-b4cf-4dfd-87da-2398494e00fd.mp4
9
+
10
+
11
+
12
+
6
13
  ## 1. install_macro_pluginでマクロを有効化します
7
14
  * `setting.yml` に`install_macro_plugin ProconBypassMan::Plugin::Splatoon3::Macro::DaseiCancel` と書きます
8
15
  * これを記述することで、layer内でmacroを呼び出せるようになります
@@ -12,7 +12,7 @@ https://user-images.githubusercontent.com/1664497/205416889-d458668e-ab46-4867-8
12
12
  version: 1.0
13
13
  setting: |-
14
14
  prefix_keys_for_changing_layer [:zr, :zl, :l]
15
- install_macro_plugin(ProconBypassMan::Plugin::Splatoon2::Macro::RotationLeftStick)
15
+ install_macro_plugin(ProconBypassMan::Plugin::Splatoon3::Macro::RotationLeftStick)
16
16
 
17
17
  layer :up do
18
18
  macro ProconBypassMan::Plugin::Splatoon3::Macro::RotationLeftStick, if_pressed: [:left]
@@ -0,0 +1,20 @@
1
+ class ProconBypassMan::PostCompletedRemoteActionJob < ProconBypassMan::BaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [Symbol] status
5
+ def self.perform(job_id)
6
+ ProconBypassMan::RemoteMacroHttpClient.new(
7
+ path: path,
8
+ server: api_server,
9
+ ).post(job_id: job_id)
10
+ end
11
+
12
+ def self.path
13
+ device_id = ProconBypassMan.device_id
14
+ "/api/devices/#{ProconBypassMan.device_id}/completed_pbm_remote_macro_jobs"
15
+ end
16
+
17
+ def self.re_enqueue_if_failed
18
+ true
19
+ end
20
+ end
@@ -0,0 +1,11 @@
1
+ class ProconBypassMan::ReportInfoLogJob < ProconBypassMan::ReportEventBaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [String] body
5
+ def self.perform(body)
6
+ ProconBypassMan::ReportHttpClient.new(
7
+ path: path,
8
+ server: api_server,
9
+ ).post(body: body, event_type: :info)
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ class ProconBypassMan::ReportWarningJob < ProconBypassMan::ReportEventBaseJob
2
+ extend ProconBypassMan::HasExternalApiSetting
3
+
4
+ # @param [String] body
5
+ def self.perform(body)
6
+ ProconBypassMan::ReportHttpClient.new(
7
+ path: path,
8
+ server: api_server,
9
+ ).post(body: body, event_type: :warn)
10
+ end
11
+ end
@@ -9,6 +9,8 @@ require "procon_bypass_man/background/jobs/report_reload_config_job"
9
9
  require "procon_bypass_man/background/jobs/report_error_reload_config_job"
10
10
  require "procon_bypass_man/background/jobs/report_load_config_job"
11
11
  require "procon_bypass_man/background/jobs/report_error_job"
12
+ require "procon_bypass_man/background/jobs/report_warning_job"
13
+ require "procon_bypass_man/background/jobs/report_info_log_job"
12
14
  require "procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job"
13
15
  require "procon_bypass_man/background/jobs/report_procon_performance_measurements_job"
14
16
  require "procon_bypass_man/background/jobs/sync_device_stats_job"
@@ -1,4 +1,5 @@
1
1
  require "procon_bypass_man/buttons_setting_configuration/param_normalizer"
2
+ require "procon_bypass_man/buttons_setting_configuration/metadata_loader"
2
3
 
3
4
  module ProconBypassMan
4
5
  class ButtonsSettingConfiguration
@@ -9,6 +10,11 @@ module ProconBypassMan
9
10
  def self.load(setting_path: )
10
11
  ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path = setting_path
11
12
 
13
+ metadata_loader = ProconBypassMan::ButtonsSettingConfiguration::MetadataLoader.load(setting_path: setting_path)
14
+ if(Gem::Version.new(metadata_loader.required_pbm_version) >= Gem::Version.new(ProconBypassMan::VERSION))
15
+ ProconBypassMan::SendErrorCommand.execute(error: '起動中のPBMが設定ファイルのバージョンを満たしていません。設定ファイルが意図した通り動かない可能性があります。PBMのバージョンをあげてください。')
16
+ end
17
+
12
18
  ProconBypassMan::ButtonsSettingConfiguration.switch_new_context(:validation) do |new_instance|
13
19
  yaml = YAML.load_file(setting_path) or raise "読み込みに失敗しました"
14
20
  new_instance.instance_eval(yaml["setting"])
@@ -0,0 +1,27 @@
1
+ module ProconBypassMan
2
+ class ButtonsSettingConfiguration
3
+ class MetadataLoader
4
+ EMPTY_VERSION = '0.0.0'
5
+
6
+ # @param [String] setting_path
7
+ # @return [MetadataLoader]
8
+ def self.load(setting_path: )
9
+ self.new(setting_path)
10
+ end
11
+
12
+ # @param [String] setting_path
13
+ def initialize(setting_path)
14
+ content = File.read(setting_path)
15
+ if(matched = content.match(/metadata-required_pbm_version: ([\d.]+)/))
16
+ @required_pbm_version = matched[1]
17
+ end
18
+ end
19
+
20
+ # @return [String]
21
+ def required_pbm_version
22
+ return EMPTY_VERSION unless defined?(@required_pbm_version)
23
+ return @required_pbm_version if @required_pbm_version
24
+ end
25
+ end
26
+ end
27
+ end
@@ -12,7 +12,7 @@ module ProconBypassMan
12
12
  def valid?
13
13
  @errors = Hash.new {|h,k| h[k] = [] }
14
14
 
15
- validate_require_prefix_keys
15
+ warn_blank_prefix_keys
16
16
  validate_config_of_button_lonely
17
17
  validate_verify_button_existence
18
18
  validate_flip_and_remap_are_hate_each_other
@@ -56,10 +56,10 @@ module ProconBypassMan
56
56
  end
57
57
  end
58
58
 
59
- def validate_require_prefix_keys
59
+ # @return [void]
60
+ def warn_blank_prefix_keys
60
61
  if @prefix_keys.empty?
61
- @errors[:prefix_keys] ||= []
62
- @errors[:prefix_keys] << "prefix_keys_for_changing_layerに値が入っていません。"
62
+ ProconBypassMan.logger.warn "prefix_keys_for_changing_layerに値が入っていません。"
63
63
  end
64
64
  end
65
65
 
@@ -65,8 +65,8 @@ class ProconBypassMan::BypassCommand
65
65
  process.work
66
66
 
67
67
  process_switching_time_before_work = BlueGreenProcess.performance.process_switching_time_before_work
68
- if process_switching_time_before_work > 0.1
69
- ProconBypassMan::PrintMessageCommand.execute(text: "slow process_switching_time_before_work: #{process_switching_time_before_work}")
68
+ if process_switching_time_before_work > 0.2
69
+ ProconBypassMan::SendWarningCommand.execute(warning: "[PERFORMANCE] BlueGreenProcess.performance.process_switching_time_before_work: #{process_switching_time_before_work}", stdout: false)
70
70
  end
71
71
 
72
72
  rescue EOFError => e
@@ -47,6 +47,9 @@ class ProconBypassMan::Bypass::ProconToSwitch
47
47
  self.bypass_value.binary = ProconBypassMan::Domains::InboundProconBinary.new(binary: raw_output)
48
48
  end
49
49
 
50
+ # 後続処理で入力値を取得できるように詰めておく
51
+ ProconBypassMan::ProconDisplay::Status.instance.current = bypass_value.binary.to_procon_reader.to_hash
52
+
50
53
  result = measurement.record_write_time do
51
54
  begin
52
55
  ProconBypassMan::Retryable.retryable(tries: 5, on_no_retry: [Errno::EIO, Errno::ENODEV, Errno::EPROTO, IOError, Errno::ESHUTDOWN, Errno::ETIMEDOUT]) do
@@ -0,0 +1,11 @@
1
+ class ProconBypassMan::SendInfoLogCommand
2
+ # @param [String] message
3
+ # @return [void]
4
+ def self.execute(message: , stdout: true)
5
+ body = message
6
+ ProconBypassMan.logger.info(body)
7
+ puts body if stdout
8
+
9
+ ProconBypassMan::ReportInfoLogJob.perform(body)
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ class ProconBypassMan::SendWarningCommand
2
+ # @param [String, Hash, Exception] warning
3
+ # @return [void]
4
+ def self.execute(warning: , stdout: true)
5
+ body =
6
+ case warning
7
+ when String, Hash
8
+ warning
9
+ else
10
+ warning.full_message
11
+ end
12
+
13
+ ProconBypassMan.logger.warn body
14
+ puts body if stdout
15
+
16
+ ProconBypassMan::ReportWarningJob.perform(warning)
17
+ end
18
+ end
@@ -4,3 +4,5 @@ require "procon_bypass_man/commands/write_session_id_command"
4
4
  require "procon_bypass_man/commands/write_device_id_command"
5
5
  require "procon_bypass_man/commands/send_reload_config_event_command"
6
6
  require "procon_bypass_man/commands/send_error_command"
7
+ require "procon_bypass_man/commands/send_warning_command"
8
+ require "procon_bypass_man/commands/send_info_log_command"
@@ -149,7 +149,7 @@ class ProconBypassMan::Configuration
149
149
  end
150
150
 
151
151
  # @return [Boolean]
152
- def enable_remote_macro?
152
+ def enable_remote_action?
153
153
  enable_ws?
154
154
  end
155
155
 
@@ -127,17 +127,28 @@ class ProconBypassMan::Procon
127
127
  end
128
128
  end
129
129
 
130
- # remote macro
131
- if task = ProconBypassMan::RemoteMacro::TaskQueueInProcess.non_blocking_shift
132
- no_op_step = :wait_for_0_3 # マクロの最後に固まって最後の入力をし続けるので、無の状態を最後に注入する
133
- BlueGreenProcess::SharedVariable.extend_run_on_this_process = true
134
- ProconBypassMan::Procon::MacroRegistry.cleanup_remote_macros!
135
- macro_name = task.name || "RemoteMacro-#{task.steps.join}".to_sym
136
- task.steps << no_op_step
137
- ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: task.steps, macro_type: :remote)
138
- @@status[:ongoing_macro] = MacroRegistry.load(macro_name, macro_type: :remote) do
139
- GC.start # NOTE: extend_run_on_this_process = true するとGCされなくなるので手動で呼び出す
140
- ProconBypassMan::PostCompletedRemoteMacroJob.perform_async(task.uuid)
130
+ # remote macro or pbm action
131
+ if task = ProconBypassMan::RemoteAction::TaskQueueInProcess.non_blocking_shift
132
+ case task.type
133
+ when ProconBypassMan::RemoteAction::Task::TYPE_MACRO
134
+ no_op_step = :wait_for_0_3 # マクロの最後に固まって最後の入力をし続けるので、無の状態を最後に注入する
135
+ BlueGreenProcess::SharedVariable.extend_run_on_this_process = true
136
+ ProconBypassMan::Procon::MacroRegistry.cleanup_remote_macros!
137
+ macro_name = task.name || "RemoteMacro-#{task.steps.join}".to_sym
138
+ task.steps << no_op_step
139
+ ProconBypassMan::Procon::MacroRegistry.install_plugin(macro_name, steps: task.steps, macro_type: :remote)
140
+ @@status[:ongoing_macro] = MacroRegistry.load(macro_name, macro_type: :remote) do
141
+ GC.start # NOTE: extend_run_on_this_process = true するとGCされなくなるので手動で呼び出す
142
+ ProconBypassMan::PostCompletedRemoteMacroJob.perform_async(task.uuid)
143
+ end
144
+ when ProconBypassMan::RemoteAction::Task::TYPE_ACTION
145
+ ProconBypassMan::RemoteAction::RemotePbmJob::RunRemotePbmJobDispatchCommand.execute(
146
+ action: task.action,
147
+ uuid: task.uuid,
148
+ job_args: task.job_args,
149
+ )
150
+ else
151
+ ProconBypassMan::SendErrorCommand.execute(error: 'unknown type of remote pbm action')
141
152
  end
142
153
  end
143
154
 
@@ -10,6 +10,7 @@ class ProconBypassMan::ProconDisplay::Status
10
10
 
11
11
  # @return [void]
12
12
  # @param [Hash] value
13
+ # NOTE: valueには参照が入ってくるので変更する時はdupすること
13
14
  def current=(value)
14
15
  if value.is_a?(Hash)
15
16
  @current = value
@@ -8,4 +8,3 @@ require "procon_bypass_man/procon_display/server_app"
8
8
  require "procon_bypass_man/procon_display/status"
9
9
  require "procon_bypass_man/procon_display/http_response"
10
10
  require "procon_bypass_man/procon_display/http_request"
11
- require "procon_bypass_man/procon_display/bypass_hook"
@@ -1,4 +1,4 @@
1
- class ProconBypassMan::RemoteMacro::QueueOverProcess
1
+ class ProconBypassMan::RemoteAction::QueueOverProcess
2
2
  extend ProconBypassMan::CanOverProcess
3
3
 
4
4
  include Singleton
@@ -7,7 +7,7 @@ class ProconBypassMan::RemoteMacro::QueueOverProcess
7
7
 
8
8
  # @override
9
9
  def self.enable?
10
- ProconBypassMan.config.enable_remote_macro?
10
+ ProconBypassMan.config.enable_remote_action?
11
11
  end
12
12
 
13
13
  # @override
@@ -1,4 +1,4 @@
1
- class ProconBypassMan::RemoteMacro::RemoteMacroObject
1
+ class ProconBypassMan::RemoteAction::RemoteActionObject
2
2
  # valueobjectがvalidatorの責務も持っている. 今度分離する
3
3
  class ValidationError < StandardError; end
4
4
  class MustBeNotNilError < ValidationError; end
@@ -1,13 +1,14 @@
1
- class ProconBypassMan::RemoteMacroReceiver
1
+ # FIXME: BypassProcessSenderみたいにする
2
+ class ProconBypassMan::RemoteActionReceiver
2
3
  # forkしたプロセスで動かすクラス。sock経由で命令を受け取ってmacoのキューに積んでいく
3
4
  def self.start_with_foreground!
4
- return unless ProconBypassMan.config.enable_remote_macro?
5
+ return unless ProconBypassMan.config.enable_remote_action?
5
6
 
6
7
  run
7
8
  end
8
9
 
9
10
  def self.start!
10
- return unless ProconBypassMan.config.enable_remote_macro?
11
+ return unless ProconBypassMan.config.enable_remote_action?
11
12
 
12
13
  Thread.start do
13
14
  start_with_foreground!
@@ -15,7 +16,7 @@ class ProconBypassMan::RemoteMacroReceiver
15
16
  end
16
17
 
17
18
  def self.run
18
- while(task = ProconBypassMan::RemoteMacro::QueueOverProcess.pop)
19
+ while(task = ProconBypassMan::RemoteAction::QueueOverProcess.pop)
19
20
  receive(task)
20
21
  end
21
22
  shutdown
@@ -24,10 +25,10 @@ class ProconBypassMan::RemoteMacroReceiver
24
25
  end
25
26
 
26
27
 
27
- # @param [ProconBypassMan::RemoteMacro::Task] task
28
+ # @param [ProconBypassMan::RemoteAction::Task] task
28
29
  def self.receive(task)
29
- ProconBypassMan.logger.info "[remote macro][receiver] name: #{task.name}, uuid: #{task.uuid}, steps: #{task.steps}"
30
- ProconBypassMan::RemoteMacro::TaskQueueInProcess.push(task)
30
+ ProconBypassMan.logger.info "[remote macro][receiver] name: #{task.name}, uuid: #{task.uuid}, steps: #{task.steps}, type: #{task.type}"
31
+ ProconBypassMan::RemoteAction::TaskQueueInProcess.push(task)
31
32
  true
32
33
  end
33
34
 
@@ -0,0 +1,9 @@
1
+ # FIXME: RemoteMacroSenderという名前をやめる。BypassProcessSenderみたいにする
2
+ class ProconBypassMan::RemoteActionSender
3
+ def self.execute(name: , uuid: , steps: , type: )
4
+ ProconBypassMan.logger.info "[remote macro][sender] name: #{name}, uuid: #{uuid}, steps: #{steps}, type: #{type}"
5
+ ProconBypassMan::RemoteAction::QueueOverProcess.push(
6
+ ProconBypassMan::RemoteAction::Task.new(name, uuid, steps, type)
7
+ )
8
+ end
9
+ end
@@ -0,0 +1,55 @@
1
+ module ProconBypassMan
2
+ module RemoteAction
3
+ module RemotePbmJob
4
+ class ActionUnexpectedError < StandardError; end
5
+ class NeedPbmVersionError < ActionUnexpectedError; end
6
+
7
+ class BaseAction
8
+ attr_accessor :pbm_job_uuid
9
+
10
+ # @param [String] pbm_job_uuid
11
+ def initialize(pbm_job_uuid: )
12
+ self.pbm_job_uuid = pbm_job_uuid
13
+ end
14
+
15
+ # @return [void]
16
+ def action_content(_args)
17
+ raise NotImplementedError, nil
18
+ end
19
+
20
+ # @param [Hash] args
21
+ # @return [void]
22
+ def run!(job_args: )
23
+ before_action_callback
24
+ action_content(args: job_args)
25
+ after_action_callback
26
+ rescue => e
27
+ be_failed
28
+ ProconBypassMan::SendErrorCommand.execute(error: e)
29
+ end
30
+
31
+ private
32
+
33
+ # @return [void]
34
+ def before_action_callback; end
35
+ # @return [void]
36
+ def after_action_callback; end
37
+
38
+ # @return [void]
39
+ def be_failed
40
+ ProconBypassMan::UpdateRemotePbmJobStatusCommand.new(pbm_job_uuid: pbm_job_uuid).execute(to_status: :failed)
41
+ end
42
+
43
+ # @return [void]
44
+ def be_in_progress
45
+ ProconBypassMan::UpdateRemotePbmJobStatusCommand.new(pbm_job_uuid: pbm_job_uuid).execute(to_status: :in_progress)
46
+ end
47
+
48
+ # @return [void]
49
+ def be_processed
50
+ ProconBypassMan::UpdateRemotePbmJobStatusCommand.new(pbm_job_uuid: pbm_job_uuid).execute(to_status: :processed)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,31 @@
1
+ module ProconBypassMan
2
+ module RemoteAction
3
+ module RemotePbmJob
4
+ class ChangePbmVersionAction < BaseAction
5
+
6
+ def action_content(args: )
7
+ require "pbmenv"
8
+ ProconBypassMan.logger.info "execute ChangePbmVersionAction!"
9
+ pbm_version = args["pbm_version"] or raise(ProconBypassMan::RemotePbmJob::NeedPbmVersionError, "pbm_versionが必要です, #{args.inspect}")
10
+ Pbmenv.uninstall(pbm_version) # 途中でシャットダウンしてしまった、とか状態が途中の状態かもしれないので一旦消す
11
+ Pbmenv.install(pbm_version, enable_pbm_cloud: true)
12
+ Pbmenv.use(pbm_version)
13
+ Pbmenv.clean(10)
14
+ ProconBypassMan.logger.info "#{pbm_version}へアップグレードしました"
15
+ ProconBypassMan::ReportCompletedUpgradePbmJob.perform
16
+ `reboot` # symlinkの参照先が変わるのでrebootする必要がある
17
+ end
18
+
19
+ private
20
+
21
+ def before_action_callback
22
+ be_processed
23
+ end
24
+
25
+ def after_action_callback
26
+ # no-op
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,29 @@
1
+ module ProconBypassMan
2
+ module RemoteAction
3
+ module RemotePbmJob
4
+ class RunRemotePbmJobDispatchCommand
5
+ # @param [String] action
6
+ # @param [String] uuid
7
+ # @return [void]
8
+ def self.execute(action: , uuid: , job_args: )
9
+ case action
10
+ when ProconBypassMan::RemoteAction::RemotePbmJob::ACTION_CHANGE_PBM_VERSION
11
+ ProconBypassMan::RemoteAction::RemotePbmJob::ChangePbmVersionAction.new(pbm_job_uuid: uuid).run!(job_args: job_args)
12
+ when ProconBypassMan::RemoteAction::RemotePbmJob::ACTION_STOP_PBM
13
+ ProconBypassMan::RemoteAction::RemotePbmJob::StopPbmJob.new(pbm_job_uuid: uuid).run!(job_args: {})
14
+ when ProconBypassMan::RemoteAction::RemotePbmJob::ACTION_REBOOT_OS
15
+ ProconBypassMan::RemoteAction::RemotePbmJob::RebootOsAction.new(pbm_job_uuid: uuid).run!(job_args: {})
16
+ when ProconBypassMan::RemoteAction::RemotePbmJob::ACTION_RESTORE_SETTING
17
+ ProconBypassMan::RemoteAction::RemotePbmJob::RestorePbmSettingAction.new(pbm_job_uuid: uuid).run!(job_args: job_args)
18
+ when ProconBypassMan::RemoteAction::RemotePbmJob::ACTION_REPORT_PORCON_STATUS
19
+ ProconBypassMan::RemoteAction::RemotePbmJob::ReportProconStatusAction.new(pbm_job_uuid: uuid).run!(job_args: {})
20
+ else
21
+ raise "#{action}は対応していないアクションです"
22
+ end
23
+ rescue ProconBypassMan::RemoteAction::RemotePbmJob::ActionUnexpectedError => e
24
+ ProconBypassMan::SendErrorCommand.execute(error: e)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end