procon_bypass_man 0.1.19 → 0.1.20.2

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 (45) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +25 -4
  3. data/CHANGELOG.md +20 -1
  4. data/Gemfile.lock +3 -3
  5. data/README.md +1 -11
  6. data/docs/getting_started.md +62 -6
  7. data/docs/setting/splatoon2_recommended_setting.md +127 -0
  8. data/lib/procon_bypass_man/background/jobs/report_completed_upgrade_pbm_job.rb +10 -0
  9. data/lib/procon_bypass_man/background/jobs/report_error_reload_config_job.rb +11 -0
  10. data/lib/procon_bypass_man/background/jobs/report_start_reboot_job.rb +10 -0
  11. data/lib/procon_bypass_man/background.rb +3 -0
  12. data/lib/procon_bypass_man/buttons_setting_configuration/loader.rb +21 -2
  13. data/lib/procon_bypass_man/buttons_setting_configuration/validator.rb +10 -0
  14. data/lib/procon_bypass_man/buttons_setting_configuration.rb +2 -0
  15. data/lib/procon_bypass_man/bypass/bypass_mode.rb +29 -0
  16. data/lib/procon_bypass_man/bypass.rb +10 -8
  17. data/lib/procon_bypass_man/commands/bypass_command.rb +20 -8
  18. data/lib/procon_bypass_man/commands/connect_device_command.rb +4 -2
  19. data/lib/procon_bypass_man/commands/print_boot_message_command.rb +6 -0
  20. data/lib/procon_bypass_man/configuration.rb +30 -1
  21. data/lib/procon_bypass_man/device_connector.rb +12 -42
  22. data/lib/procon_bypass_man/device_procon_finder.rb +45 -0
  23. data/lib/procon_bypass_man/never_exit_accidentally.rb +12 -0
  24. data/lib/procon_bypass_man/plugin/splatoon2/macro/fast_return.rb +4 -0
  25. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_left_key.rb +4 -0
  26. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_right_key.rb +4 -0
  27. data/lib/procon_bypass_man/plugin/splatoon2/macro/jump_to_up_key.rb +4 -0
  28. data/lib/procon_bypass_man/plugin/splatoon2/macro/sokuwari_for_splash_bomb.rb +4 -0
  29. data/lib/procon_bypass_man/plugin/splatoon2/mode/guruguru.rb +4 -0
  30. data/lib/procon_bypass_man/remote_pbm_action/change_pbm_version_action.rb +4 -1
  31. data/lib/procon_bypass_man/remote_pbm_action/reboot_os_action.rb +1 -0
  32. data/lib/procon_bypass_man/remote_pbm_action/restore_pbm_setting.rb +8 -1
  33. data/lib/procon_bypass_man/runner.rb +7 -7
  34. data/lib/procon_bypass_man/scheduler.rb +1 -1
  35. data/lib/procon_bypass_man/support/yaml_writer.rb +8 -1
  36. data/lib/procon_bypass_man/usb_device_controller.rb +53 -0
  37. data/lib/procon_bypass_man/version.rb +1 -1
  38. data/lib/procon_bypass_man/websocket/pbm_job_client.rb +13 -3
  39. data/lib/procon_bypass_man.rb +21 -11
  40. data/procon_bypass_man.gemspec +1 -1
  41. data/project_template/app.rb +13 -1
  42. data/project_template/setting.yml +6 -22
  43. data/project_template/systemd_units/pbm.service +1 -1
  44. data/sig/main.rbs +5 -0
  45. metadata +12 -4
@@ -4,6 +4,7 @@ class ProconBypassMan::PrintBootMessageCommand
4
4
  @table = {}
5
5
  @table[:ruby_version] = RUBY_VERSION
6
6
  @table[:pbm_version] = ProconBypassMan::VERSION
7
+ @table[:pbmenv_version] = Pbmenv::VERSION
7
8
  @table[:pid] = $$
8
9
  @table[:root_path] = ProconBypassMan.root
9
10
  @table[:pid_path] = ProconBypassMan.pid_path
@@ -12,6 +13,9 @@ class ProconBypassMan::PrintBootMessageCommand
12
13
  @table[:use_pbmenv] = !(!!`which pbmenv`.empty?)
13
14
  @table[:session_id] = ProconBypassMan.session_id
14
15
  @table[:device_id] = ProconBypassMan.device_id
16
+ @table[:bypass_mode] = ProconBypassMan.config.bypass_mode.to_s
17
+ @table[:never_exit_accidentally] = ProconBypassMan.config.never_exit_accidentally
18
+ @table[:uname] = `uname -a`.chomp
15
19
 
16
20
  # 開発中のHEADを取りたかったけど、Gem::Specification経由から取得する必要がありそう
17
21
  # build_version = `git rev-parse --short HEAD`.chomp
@@ -30,6 +34,7 @@ class ProconBypassMan::PrintBootMessageCommand
30
34
  ----
31
35
  RUBY_VERSION: #{@table[:ruby_version]}
32
36
  ProconBypassMan::VERSION: #{@table[:pbm_version]}
37
+ Pbmenv::VERSION: #{@table[:pbmenv_version]}
33
38
  pid: #{@table[:pid]}
34
39
  root: #{@table[:root_path]}
35
40
  pid_path: #{@table[:pid_path]}
@@ -38,6 +43,7 @@ class ProconBypassMan::PrintBootMessageCommand
38
43
  use_pbmenv: #{@table[:use_pbmenv]}
39
44
  session_id: #{ProconBypassMan.session_id}
40
45
  device_id: #{ProconBypassMan.device_id}
46
+ bypass_mode: #{ProconBypassMan.config.bypass_mode}
41
47
  ----
42
48
  EOF
43
49
  end
@@ -38,10 +38,19 @@ class ProconBypassMan::Configuration
38
38
  def device_id
39
39
  ENV["DEBUG_DEVICE_ID"] || ProconBypassMan::WriteDeviceIdCommand.execute
40
40
  end
41
+
42
+ # @return [Boolean]
43
+ def never_exit_accidentally
44
+ config.never_exit_accidentally
45
+ end
46
+
47
+ def fallback_setting_path
48
+ "/tmp/procon_bypass_man_fallback_setting.yaml"
49
+ end
41
50
  end
42
51
 
43
52
  attr_accessor :enable_critical_error_logging
44
- attr_writer :verbose_bypass_log, :raw_setting, :enable_reporting_pressed_buttons
53
+ attr_writer :verbose_bypass_log, :raw_setting, :enable_reporting_pressed_buttons, :never_exit_accidentally
45
54
 
46
55
  def root=(path)
47
56
  @root = path
@@ -56,6 +65,17 @@ class ProconBypassMan::Configuration
56
65
  end
57
66
  end
58
67
 
68
+ def bypass_mode=(value)
69
+ @bypass_mode = ProconBypassMan::BypassMode.new(
70
+ mode: value[:mode],
71
+ gadget_to_procon_interval: value[:gadget_to_procon_interval],
72
+ )
73
+ end
74
+
75
+ def bypass_mode
76
+ @bypass_mode || ProconBypassMan::BypassMode.default_value
77
+ end
78
+
59
79
  def api_servers=(api_servers)
60
80
  @api_servers = api_servers
61
81
  return self
@@ -147,6 +167,10 @@ class ProconBypassMan::Configuration
147
167
  end
148
168
  end
149
169
 
170
+ def has_api_server?
171
+ not api_servers.length.zero?
172
+ end
173
+
150
174
  def verbose_bypass_log
151
175
  @verbose_bypass_log || !!ENV["VERBOSE_BYPASS_LOG"]
152
176
  end
@@ -158,4 +182,9 @@ class ProconBypassMan::Configuration
158
182
  def enable_reporting_pressed_buttons
159
183
  @enable_reporting_pressed_buttons ||= false
160
184
  end
185
+
186
+ # @return [Boolean]
187
+ def never_exit_accidentally
188
+ @never_exit_accidentally || false
189
+ end
161
190
  end
@@ -61,9 +61,9 @@ class ProconBypassMan::DeviceConnector
61
61
  begin
62
62
  timer.throw_if_timeout!
63
63
  data = from_device(item).read_nonblock(64)
64
- debug_log_buffer << "read_from(#{item.read_from}): #{data}"
64
+ debug_log_buffer << "read_from(#{item.read_from}): #{data.unpack("H*")}"
65
65
  rescue IO::EAGAINWaitReadable
66
- debug_log_buffer << "read_from(#{item.read_from}): IO::EAGAINWaitReadable"
66
+ # debug_log_buffer << "read_from(#{item.read_from}): IO::EAGAINWaitReadable"
67
67
  retry
68
68
  end
69
69
 
@@ -263,49 +263,21 @@ class ProconBypassMan::DeviceConnector
263
263
  @procon
264
264
  end
265
265
 
266
- def is_available_device?(path)
267
- return false if !File.exist?(path)
268
-
269
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
270
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
271
- sleep 0.5
272
-
273
- file = File.open(path, "w+")
274
- begin
275
- file.read_nonblock(64)
276
- rescue EOFError
277
- file.close
278
- return false
279
- rescue IO::EAGAINWaitReadable
280
- file.close
281
- return true
282
- end
283
- end
284
-
285
- def to_bin(string)
286
- string.unpack "H*"
287
- end
288
-
289
266
  def init_devices
290
267
  if @initialized_devices
291
268
  return
292
269
  end
270
+ ProconBypassMan::UsbDeviceController.init
293
271
 
294
- case
295
- when is_available_device?(PROCON_PATH)
296
- ProconBypassMan.logger.info "proconのデバイスファイルは#{PROCON_PATH}を使います"
297
- @procon = File.open(PROCON_PATH, "w+b")
298
- @gadget = File.open('/dev/hidg0', "w+b")
299
- when is_available_device?(PROCON2_PATH)
300
- ProconBypassMan.logger.info "proconのデバイスファイルは#{PROCON2_PATH}を使います"
301
- @procon = File.open(PROCON2_PATH, "w+b")
302
- @gadget = File.open('/dev/hidg0', "w+b")
272
+ if path = ProconBypassMan::DeviceProconFinder.find
273
+ @procon = File.open(path, "w+b")
274
+ ProconBypassMan.logger.info "proconのデバイスファイルは#{path}を使います"
303
275
  else
304
- raise NotFoundProconError, "/dev/hidraw0, /dev/hidraw1の両方見つかりませんでした"
276
+ raise(ProconBypassMan::DeviceConnector::NotFoundProconError)
305
277
  end
306
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
307
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
308
- sleep 0.5
278
+ @gadget = File.open('/dev/hidg0', "w+b")
279
+
280
+ ProconBypassMan::UsbDeviceController.reset
309
281
 
310
282
  @initialized_devices = true
311
283
 
@@ -317,10 +289,8 @@ class ProconBypassMan::DeviceConnector
317
289
  end
318
290
  rescue Errno::ENXIO => e
319
291
  # /dev/hidg0 をopenできないときがある
320
- ProconBypassMan::SendErrorCommand.execute(error: "Errno::ENXIO (No such device or address @ rb_sysopen - /dev/hidg0)が起きました。resetします. #{e.full_message}")
321
- system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
322
- system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
323
- sleep 0.5
292
+ ProconBypassMan::SendErrorCommand.execute(error: "Errno::ENXIO (No such device or address @ rb_sysopen - /dev/hidg0)が起きました。resetします.\n #{e.full_message}")
293
+ ProconBypassMan::UsbDeviceController.reset
324
294
  retry
325
295
  end
326
296
  end
@@ -0,0 +1,45 @@
1
+ class ProconBypassMan::DeviceProconFinder
2
+ HID_NAME = "Nintendo Co., Ltd. Pro Controller"
3
+
4
+ def self.find
5
+ new.find
6
+ end
7
+
8
+ # @return [String, NilClass]
9
+ def find
10
+ find_device_path
11
+ end
12
+
13
+ private
14
+
15
+ # @return [String , NilClass]
16
+ def find_device_path
17
+ if(line = device_from_shell) && (hidraw_name = line.match(/(hidraw\d+)\s+/)[1])
18
+ "/dev/#{hidraw_name}"
19
+ end
20
+ end
21
+
22
+ # @return [String , NilClass]
23
+ def device_from_shell
24
+ shell_output.split("\n").detect { |o| o.include?(HID_NAME) }
25
+ end
26
+
27
+ # @return [String]
28
+ def shell_output
29
+ `bash -c '#{get_list_shell}'`
30
+ end
31
+
32
+ def get_list_shell
33
+ <<~SHELL
34
+ #!/bin/bash
35
+
36
+ FILES=/dev/hidraw*
37
+ for f in $FILES
38
+ do
39
+ FILE=${f##*/}
40
+ DEVICE="$(cat /sys/class/hidraw/${FILE}/device/uevent | grep HID_NAME | cut -d '=' -f2)"
41
+ printf "%s %s\n" $FILE "$DEVICE"
42
+ done
43
+ SHELL
44
+ end
45
+ end
@@ -0,0 +1,12 @@
1
+ module ProconBypassMan
2
+ module NeverExitAccidentally
3
+ def exit_if_allow(status)
4
+ if ProconBypassMan.never_exit_accidentally
5
+ eternal_sleep
6
+ else
7
+ yield if block_given?
8
+ exit(status)
9
+ end
10
+ end
11
+ end
12
+ end
@@ -10,6 +10,10 @@ module ProconBypassMan
10
10
  def self.steps
11
11
  [:x, :down, :a, :a].freeze
12
12
  end
13
+
14
+ def self.description
15
+ '試合中にリスポーンにスーパージャンプ'
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -10,6 +10,10 @@ module ProconBypassMan
10
10
  def self.steps
11
11
  [:x, :left, :a, :a].freeze
12
12
  end
13
+
14
+ def self.description
15
+ '試合中に左キーに割り当てられている味方へのスーパージャンプ'
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -10,6 +10,10 @@ module ProconBypassMan
10
10
  def self.steps
11
11
  [:x, :right, :a, :a].freeze
12
12
  end
13
+
14
+ def self.description
15
+ '試合中に右キーに割り当てられている味方へのスーパージャンプ'
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -10,6 +10,10 @@ module ProconBypassMan
10
10
  def self.steps
11
11
  [:x, :up, :a, :a].freeze
12
12
  end
13
+
14
+ def self.description
15
+ '試合中に上キーに割り当てられている味方へのスーパージャンプ'
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -15,6 +15,10 @@ module ProconBypassMan
15
15
  :toggle_r_for_1sec,
16
16
  ].freeze
17
17
  end
18
+
19
+ def self.description
20
+ 'バブル即割'
21
+ end
18
22
  end
19
23
  end
20
24
  end
@@ -3,6 +3,10 @@ module ProconBypassMan
3
3
  module Splatoon2
4
4
  module Mode
5
5
  module Guruguru
6
+ def self.description
7
+ '適当に動きます'
8
+ end
9
+
6
10
  def self.binaries
7
11
  [ "309481408000362d684658750968f71cfe2c0e51000001480053f71ffedf0d4b000a013d00caf6ecfd4c0d480003011c00000000000000000000000000000000",
8
12
  "30978140800037dd6748687509fdf6adfded0d6d0081005d00eef68dfdef0d6d00830059001bf791fd140e720090005400000000000000000000000000000000",
@@ -6,8 +6,11 @@ module ProconBypassMan
6
6
  require "pbmenv"
7
7
  ProconBypassMan.logger.info "execute ChangePbmVersionAction!"
8
8
  pbm_version = args["pbm_version"] or raise(ProconBypassMan::RemotePbmAction::NeedPbmVersionError, "pbm_versionが必要です, #{args.inspect}")
9
- Pbmenv.install(pbm_version)
9
+ Pbmenv.uninstall(pbm_version) # 途中でシャットダウンしてしまった、とか状態が途中の状態かもしれないので一旦消す
10
+ Pbmenv.install(pbm_version, enable_pbm_cloud: true)
10
11
  Pbmenv.use(pbm_version)
12
+ ProconBypassMan.logger.info "#{pbm_version}へアップグレードしました"
13
+ ProconBypassMan::ReportCompletedUpgradePbmJob.perform
11
14
  `reboot` # symlinkの参照先が変わるのでrebootする必要がある
12
15
  end
13
16
 
@@ -10,6 +10,7 @@ module ProconBypassMan
10
10
  private
11
11
 
12
12
  def before_action_callback
13
+ ProconBypassMan::ReportStartRebootJob.perform
13
14
  be_processed
14
15
  end
15
16
 
@@ -6,7 +6,14 @@ module ProconBypassMan
6
6
  require "pbmenv"
7
7
  ProconBypassMan.logger.info "execute RestorePbmSettingAction!"
8
8
  setting = args.dig("setting") or raise(ProconBypassMan::RemotePbmAction::NeedPbmVersionError, "settingが必要です, #{args.inspect}")
9
- ProconBypassMan::YamlWriter.execute(
9
+
10
+ # 復元に失敗したら戻せるように退避する
11
+ FileUtils.copy(
12
+ ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path,
13
+ ProconBypassMan.fallback_setting_path,
14
+ )
15
+
16
+ ProconBypassMan::YamlWriter.write(
10
17
  path: ProconBypassMan::ButtonsSettingConfiguration.instance.setting_path,
11
18
  content: setting,
12
19
  )
@@ -27,7 +27,7 @@ class ProconBypassMan::Runner
27
27
  loop do
28
28
  $will_terminate_token = false
29
29
  # NOTE メインプロセスではThreadをいくつか起動しているので念のためパフォーマンスを優先するためにforkしていく
30
- main_loop_pid = Kernel.fork { ProconBypassMan::BypassCommand.new(gadget: @gadget, procon: @procon).execute }
30
+ child_pid = Kernel.fork { ProconBypassMan::BypassCommand.new(gadget: @gadget, procon: @procon).execute }
31
31
 
32
32
  begin
33
33
  # TODO 小プロセスが消滅した時に、メインプロセスは生き続けてしまい、何もできなくなる問題がある
@@ -37,25 +37,25 @@ class ProconBypassMan::Runner
37
37
  end
38
38
  rescue InterruptForRestart
39
39
  $will_terminate_token = true
40
- Process.kill("TERM", main_loop_pid)
40
+ Process.kill("TERM", child_pid)
41
41
  Process.wait
42
42
  ProconBypassMan::PrintMessageCommand.execute(text: "Reloading config file")
43
43
  begin
44
44
  ProconBypassMan::ButtonsSettingConfiguration::Loader.reload_setting
45
45
  ProconBypassMan::SendReloadConfigEventCommand.execute
46
- rescue ProconBypassMan::CouldNotLoadConfigError
46
+ rescue ProconBypassMan::CouldNotLoadConfigError => error
47
47
  ProconBypassMan::SendErrorCommand.execute(error: "設定ファイルが不正です。再読み込みができませんでした")
48
+ ProconBypassMan::ReportErrorReloadConfigJob.perform_async(error.message)
48
49
  end
49
50
  ProconBypassMan::PrintMessageCommand.execute(text: "バイパス処理を再開します")
50
51
  rescue Interrupt
51
52
  $will_terminate_token = true
52
- Process.kill("TERM", main_loop_pid)
53
+ Process.kill("TERM", child_pid)
53
54
  Process.wait
55
+ ProconBypassMan::PrintMessageCommand.execute(text: "処理を終了します")
54
56
  @gadget&.close
55
57
  @procon&.close
56
- FileUtils.rm_rf(ProconBypassMan.pid_path)
57
- FileUtils.rm_rf(ProconBypassMan.digest_path)
58
- exit 1
58
+ break
59
59
  end
60
60
  end
61
61
  end
@@ -74,7 +74,7 @@ module ProconBypassMan
74
74
  args: [->{ ProconBypassMan::DeviceStatus.current }],
75
75
  interval: 60,
76
76
  )
77
- )
77
+ ) if ProconBypassMan.config.has_api_server?
78
78
  end
79
79
 
80
80
  # @param [Schedule] schedule
@@ -3,7 +3,14 @@ class ProconBypassMan::YamlWriter
3
3
  def self.write(path: , content: )
4
4
  File.write(
5
5
  path,
6
- content.gsub("\r\n", "\n").to_yaml,
6
+ content.transform_values { |x|
7
+ case x
8
+ when String
9
+ x.gsub("\r\n", "\n")
10
+ else
11
+ x
12
+ end
13
+ }.to_yaml
7
14
  )
8
15
  end
9
16
  end
@@ -0,0 +1,53 @@
1
+ class ProconBypassMan::UsbDeviceController
2
+ class << self
3
+ def reset
4
+ system('echo > /sys/kernel/config/usb_gadget/procon/UDC')
5
+ system('ls /sys/class/udc > /sys/kernel/config/usb_gadget/procon/UDC')
6
+ sleep 0.5
7
+ end
8
+
9
+ def init
10
+ return if initialized?
11
+
12
+ shell = <<~EOH
13
+ #!/bin/bash
14
+
15
+ cd /sys/kernel/config/usb_gadget/
16
+ mkdir -p procon
17
+ cd procon
18
+ echo 0x057e > idVendor
19
+ echo 0x2009 > idProduct
20
+ echo 0x0200 > bcdDevice
21
+ echo 0x0200 > bcdUSB
22
+ echo 0x00 > bDeviceClass
23
+ echo 0x00 > bDeviceSubClass
24
+ echo 0x00 > bDeviceProtocol
25
+
26
+ mkdir -p strings/0x409
27
+ echo "000000000001" > strings/0x409/serialnumber
28
+ echo "Nintendo Co., Ltd." > strings/0x409/manufacturer
29
+ echo "Pro Controller" > strings/0x409/product
30
+
31
+ mkdir -p configs/c.1/strings/0x409
32
+ echo "Nintendo Switch Pro Controller" > configs/c.1/strings/0x409/configuration
33
+ echo 500 > configs/c.1/MaxPower
34
+ echo 0xa0 > configs/c.1/bmAttributes
35
+
36
+ mkdir -p functions/hid.usb0
37
+ echo 0 > functions/hid.usb0/protocol
38
+ echo 0 > functions/hid.usb0/subclass
39
+ echo 64 > functions/hid.usb0/report_length
40
+ echo 050115000904A1018530050105091901290A150025017501950A5500650081020509190B290E150025017501950481027501950281030B01000100A1000B300001000B310001000B320001000B35000100150027FFFF0000751095048102C00B39000100150025073500463B0165147504950181020509190F2912150025017501950481027508953481030600FF852109017508953F8103858109027508953F8103850109037508953F9183851009047508953F9183858009057508953F9183858209067508953F9183C0 | xxd -r -ps > functions/hid.usb0/report_desc
41
+
42
+ ln -s functions/hid.usb0 configs/c.1/
43
+ ls /sys/class/udc > UDC
44
+ EOH
45
+
46
+ `bash -c '#{shell}'`
47
+ end
48
+
49
+ def initialized?
50
+ Dir.exist?("/sys/kernel/config/usb_gadget/procon")
51
+ end
52
+ end
53
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ProconBypassMan
4
- VERSION = "0.1.19"
4
+ VERSION = "0.1.20.2"
5
5
  end
@@ -9,7 +9,8 @@ module ProconBypassMan
9
9
  Thread.start do
10
10
  loop do
11
11
  run
12
- rescue
12
+ rescue => e
13
+ ProconBypassMan.logger.error("websocket client: #{e.full_message}")
13
14
  retry
14
15
  end
15
16
  end
@@ -24,14 +25,16 @@ module ProconBypassMan
24
25
  )
25
26
 
26
27
  client.connected {
27
- ProconBypassMan.logger.info('successfully connected in ProconBypassMan::Websocket::PbmJobClient')
28
+ ProconBypassMan.logger.info('websocket client: successfully connected in ProconBypassMan::Websocket::PbmJobClient')
28
29
  }
29
30
  client.subscribed { |msg|
31
+ ProconBypassMan.logger.info('websocket client: subscribed')
30
32
  puts({ event: :subscribed, msg: msg })
31
33
  ProconBypassMan::SyncDeviceStatsJob.perform(ProconBypassMan::DeviceStatus.current)
32
34
  }
33
35
 
34
36
  client.received do |data|
37
+ ProconBypassMan.logger.info('websocket client: received!!')
35
38
  ProconBypassMan.logger.info(data)
36
39
 
37
40
  dispatch(data: data, client: client)
@@ -40,13 +43,20 @@ module ProconBypassMan
40
43
  end
41
44
 
42
45
  client.disconnected {
46
+ ProconBypassMan.logger.info('websocket client: disconnected!!')
43
47
  puts :disconnected
44
48
  client.reconnect!
45
49
  sleep 2
46
50
  }
47
- client.errored { |msg| puts :errored; puts msg }
51
+ client.errored { |msg|
52
+ ProconBypassMan.logger.error("websocket client: errored!!, #{msg}")
53
+ puts :errored
54
+ client.reconnect!
55
+ sleep 2
56
+ }
48
57
  client.pinged { |msg|
49
58
  ProconBypassMan.cache.fetch key: 'ws_pinged', expires_in: 10 do
59
+ ProconBypassMan.logger.info('websocket client: pinged!!')
50
60
  ProconBypassMan.logger.info(msg)
51
61
  end
52
62
  }
@@ -8,6 +8,8 @@ require 'em/pure_ruby'
8
8
  require "action_cable_client"
9
9
  require "ext/em_pure_ruby"
10
10
  require "ext/module"
11
+ require "resolv-replace"
12
+ require "pbmenv"
11
13
 
12
14
  require_relative "procon_bypass_man/version"
13
15
  require_relative "procon_bypass_man/remote_pbm_action"
@@ -27,8 +29,11 @@ require_relative "procon_bypass_man/background"
27
29
  require_relative "procon_bypass_man/commands"
28
30
  require_relative "procon_bypass_man/bypass"
29
31
  require_relative "procon_bypass_man/domains"
32
+ require_relative "procon_bypass_man/never_exit_accidentally"
30
33
  require_relative "procon_bypass_man/device_connector"
34
+ require_relative "procon_bypass_man/device_procon_finder"
31
35
  require_relative "procon_bypass_man/device_status"
36
+ require_relative "procon_bypass_man/usb_device_controller"
32
37
  require_relative "procon_bypass_man/runner"
33
38
  require_relative "procon_bypass_man/processor"
34
39
  require_relative "procon_bypass_man/configuration"
@@ -48,9 +53,9 @@ Thread.abort_on_exception = true
48
53
 
49
54
  module ProconBypassMan
50
55
  extend ProconBypassMan::Configuration::ClassMethods
56
+ extend ProconBypassMan::NeverExitAccidentally
51
57
 
52
58
  class CouldNotLoadConfigError < StandardError; end
53
- class NotFoundProconError < StandardError; end
54
59
  class ConnectionError < StandardError; end
55
60
  class FirstConnectionError < ConnectionError; end
56
61
  class EternalConnectionError < ConnectionError; end
@@ -62,22 +67,26 @@ module ProconBypassMan
62
67
  ProconBypassMan::Websocket::PbmJobClient.start!
63
68
 
64
69
  ProconBypassMan::PrintMessageCommand.execute(text: "PBMを起動しています")
65
- ProconBypassMan::ButtonsSettingConfiguration::Loader.load(setting_path: setting_path)
66
70
  initialize_pbm
71
+ ProconBypassMan::ButtonsSettingConfiguration::Loader.load(setting_path: setting_path)
67
72
  gadget, procon = ProconBypassMan::ConnectDeviceCommand.execute!
68
- Runner.new(gadget: gadget, procon: procon).run
73
+ Runner.new(gadget: gadget, procon: procon).run # ここでblockingする
74
+ FileUtils.rm_rf(ProconBypassMan.pid_path)
75
+ FileUtils.rm_rf(ProconBypassMan.digest_path)
69
76
  rescue ProconBypassMan::CouldNotLoadConfigError
70
77
  ProconBypassMan::SendErrorCommand.execute(error: "設定ファイルが不正です。設定ファイルの読み込みに失敗しました")
71
78
  ProconBypassMan::DeviceStatus.change_to_setting_syntax_error_and_shutdown!
72
- FileUtils.rm_rf(ProconBypassMan.pid_path)
73
- FileUtils.rm_rf(ProconBypassMan.digest_path)
74
- exit 1
75
- rescue ProconBypassMan::NotFoundProconError
76
- ProconBypassMan::SendErrorCommand.execute(error: "プロコンが見つかりませんでした。終了します。")
79
+ ProconBypassMan.exit_if_allow(1) do
80
+ FileUtils.rm_rf(ProconBypassMan.pid_path)
81
+ FileUtils.rm_rf(ProconBypassMan.digest_path)
82
+ end
83
+ rescue ProconBypassMan::ConnectDeviceCommand::NotFoundProconError
84
+ ProconBypassMan::SendErrorCommand.execute(error: "プロコンが見つかりませんでした。")
77
85
  ProconBypassMan::DeviceStatus.change_to_procon_not_found_error!
78
- FileUtils.rm_rf(ProconBypassMan.pid_path)
79
- FileUtils.rm_rf(ProconBypassMan.digest_path)
80
- exit 1
86
+ ProconBypassMan.exit_if_allow(1) do
87
+ FileUtils.rm_rf(ProconBypassMan.pid_path)
88
+ FileUtils.rm_rf(ProconBypassMan.digest_path)
89
+ end
81
90
  rescue ProconBypassMan::ConnectionError
82
91
  begin
83
92
  raise
@@ -115,6 +124,7 @@ module ProconBypassMan
115
124
  def self.initialize_pbm
116
125
  ProconBypassMan::WriteDeviceIdCommand.execute
117
126
  ProconBypassMan::WriteSessionIdCommand.execute
127
+ system("renice -n -20 -p #{$$}")
118
128
  File.write(pid_path, $$)
119
129
  ProconBypassMan::DeviceStatus.change_to_running!
120
130
  end
@@ -28,7 +28,7 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib"]
29
29
 
30
30
  # Uncomment to register a new dependency of your gem
31
- spec.add_dependency "pbmenv"
31
+ spec.add_dependency "pbmenv", ">= 0.1.9" # Pbmenv.installでのenable_pbm_cloudに依存している
32
32
  spec.add_dependency "action_cable_client"
33
33
  spec.add_dependency "sorted_set"
34
34
 
@@ -5,16 +5,28 @@ require 'bundler/inline'
5
5
  gemfile do
6
6
  source 'https://rubygems.org'
7
7
  git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
8
- gem 'procon_bypass_man', '0.1.19'
8
+ gem 'procon_bypass_man', '0.1.20.2'
9
9
  end
10
10
 
11
11
  ProconBypassMan.configure do |config|
12
12
  config.root = File.expand_path(__dir__)
13
13
  config.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
14
14
  config.logger.level = :debug
15
+
16
+ # バイパスするログを全部app.logに流すか
17
+ config.verbose_bypass_log = false
18
+
15
19
  # webからProconBypassManを操作できるwebサービス
16
20
  # config.api_servers = ['https://pbm-cloud.herokuapp.com']
21
+
22
+ # エラーが起きたらerror.logに書き込みます
17
23
  config.enable_critical_error_logging = true
24
+
25
+ # pbm-cloudで使う場合はnever_exitにtrueをセットしてください. trueがセットされている場合、不慮の事故が発生してもプロセスが終了しなくなります
26
+ config.never_exit_accidentally = true
27
+
28
+ # 操作が高頻度で固まるときは、 gadget_to_procon_interval の数値は大きくしてください
29
+ config.bypass_mode = { mode: :normal, gadget_to_procon_interval: 5 }
18
30
  end
19
31
 
20
32
  ProconBypassMan.run(setting_path: "/usr/share/pbm/current/setting.yml")