procon_bypass_man 0.1.8 → 0.1.12
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.circleci/config.yml +3 -2
- data/.github/workflows/ruby.yml +5 -4
- data/.gitignore +5 -0
- data/.rubocop.yml +2 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +18 -1
- data/Gemfile +4 -0
- data/Gemfile.lock +53 -2
- data/README.md +14 -8
- data/Steepfile +39 -0
- data/bin/console +4 -0
- data/bin/dev_api_server.rb +18 -0
- data/docs/setup_raspi.mitamae.rb +12 -0
- data/lib/procon_bypass_man/background/has_server_pool.rb +54 -0
- data/lib/procon_bypass_man/background/http_client.rb +70 -0
- data/lib/procon_bypass_man/background/job_performer.rb +16 -0
- data/lib/procon_bypass_man/background/job_runnable.rb +16 -0
- data/lib/procon_bypass_man/background/job_runner.rb +44 -0
- data/lib/procon_bypass_man/background/jobs/base_job.rb +12 -0
- data/lib/procon_bypass_man/background/jobs/report_boot_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_error_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_heartbeat_job.rb +10 -0
- data/lib/procon_bypass_man/background/jobs/report_pressed_buttons_job.rb +18 -0
- data/lib/procon_bypass_man/background/jobs/report_reload_config_job.rb +10 -0
- data/lib/procon_bypass_man/background.rb +10 -0
- data/lib/procon_bypass_man/boot_message.rb +42 -0
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/layer.rb +50 -4
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/loader.rb +12 -11
- data/lib/procon_bypass_man/{configuration → buttons_setting_configuration}/validator.rb +1 -1
- data/lib/procon_bypass_man/buttons_setting_configuration.rb +101 -0
- data/lib/procon_bypass_man/bypass/usb_hid_logger.rb +36 -0
- data/lib/procon_bypass_man/bypass.rb +61 -29
- data/lib/procon_bypass_man/callbacks.rb +70 -0
- data/lib/procon_bypass_man/commands/connect_device_command.rb +11 -0
- data/lib/procon_bypass_man/commands/print_boot_message_command.rb +9 -0
- data/lib/procon_bypass_man/commands/send_error_command.rb +18 -0
- data/lib/procon_bypass_man/commands/send_reload_config_event_command.rb +10 -0
- data/lib/procon_bypass_man/commands/write_device_id_command.rb +11 -0
- data/lib/procon_bypass_man/commands/write_session_id_command.rb +13 -0
- data/lib/procon_bypass_man/commands.rb +6 -0
- data/lib/procon_bypass_man/configuration.rb +92 -67
- data/lib/procon_bypass_man/device_connector.rb +11 -29
- data/lib/procon_bypass_man/io_monitor.rb +16 -8
- data/lib/procon_bypass_man/on_memory_cache.rb +34 -0
- data/lib/procon_bypass_man/procon/analog_stick.rb +31 -0
- data/lib/procon_bypass_man/procon/analog_stick_cap.rb +65 -0
- data/lib/procon_bypass_man/procon/button_collection.rb +15 -6
- data/lib/procon_bypass_man/procon/{data.rb → consts.rb} +1 -1
- data/lib/procon_bypass_man/procon/layer_changer.rb +40 -0
- data/lib/procon_bypass_man/procon/macro_registry.rb +2 -2
- data/lib/procon_bypass_man/procon/mode_registry.rb +4 -4
- data/lib/procon_bypass_man/procon/press_button_aware.rb +13 -0
- data/lib/procon_bypass_man/procon/user_operation.rb +21 -16
- data/lib/procon_bypass_man/procon.rb +23 -9
- data/lib/procon_bypass_man/procon_reader.rb +31 -0
- data/lib/procon_bypass_man/runner.rb +43 -64
- data/lib/procon_bypass_man/uptime.rb +14 -2
- data/lib/procon_bypass_man/version.rb +1 -1
- data/lib/procon_bypass_man.rb +38 -43
- data/project_template/README.md +1 -1
- data/project_template/app.rb +7 -5
- data/project_template/systemd_units/pbm_web.service +11 -0
- data/project_template/web.rb +16 -0
- data/sig/README.rb +4 -0
- data/sig/main.rbs +505 -0
- metadata +42 -11
- data/examples/practical/app.rb +0 -21
- data/examples/practical/setting.yml +0 -24
- data/lib/procon_bypass_man/procon/layer_changeable.rb +0 -28
- data/lib/procon_bypass_man/procon/pressed_button_helper.rb +0 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 42551d494786247ae06f81c416f522360001fb0a78ffdd67311520aafb56587a
|
4
|
+
data.tar.gz: 92da20f533512ec4e1fdebe93f2c064f5ae1513fd6f26d3c4f34f2a0d488dffd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b52fde78831c29dc1b56b56217a604e421b6c0cdf5859b997732b36d94b9b7dc9d02f3906835d41df5f7168a2b694c2c457d3f96fd235903fc4827f42e74422b
|
7
|
+
data.tar.gz: 50defecca29919fca30680469deddc5adc5c41d0c4f02f084c0a73f9633aa8e11101a5f07e863ea4e0b6481178d4f11e0d466a4bf2d9954f08cb5407d3cb10dd
|
data/.circleci/config.yml
CHANGED
@@ -32,15 +32,16 @@ jobs:
|
|
32
32
|
- run: bundle install --jobs 4
|
33
33
|
- run: bundle exec rubocop
|
34
34
|
- run: bundle exec rspec
|
35
|
+
- run: bundle exec steep check
|
35
36
|
|
36
37
|
build_jobs: &build_jobs
|
37
38
|
- rspec:
|
38
39
|
matrix:
|
39
40
|
parameters:
|
40
41
|
version:
|
41
|
-
- "2.5"
|
42
42
|
- "2.7"
|
43
|
-
- "3.0"
|
43
|
+
- "3.0.1"
|
44
|
+
- "3.0.2"
|
44
45
|
workflows:
|
45
46
|
version: 2
|
46
47
|
build:
|
data/.github/workflows/ruby.yml
CHANGED
@@ -16,7 +16,7 @@ jobs:
|
|
16
16
|
runs-on: ubuntu-latest
|
17
17
|
strategy:
|
18
18
|
matrix:
|
19
|
-
ruby-version: ['2.
|
19
|
+
ruby-version: ['2.7', '3.0.1']
|
20
20
|
|
21
21
|
steps:
|
22
22
|
- uses: actions/checkout@v2
|
@@ -24,10 +24,11 @@ jobs:
|
|
24
24
|
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
25
25
|
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
26
26
|
# uses: ruby/setup-ruby@v1
|
27
|
-
uses: ruby/setup-ruby@
|
27
|
+
uses: ruby/setup-ruby@v1
|
28
28
|
with:
|
29
29
|
ruby-version: ${{ matrix.ruby-version }}
|
30
30
|
bundler-cache: true # runs 'bundle install' and caches installed gems automatically
|
31
31
|
- name: Run tests
|
32
|
-
run:
|
33
|
-
|
32
|
+
run: |-
|
33
|
+
bundle exec rake
|
34
|
+
bundle exec steep check
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
3.0.
|
1
|
+
3.0.2
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,22 @@
|
|
1
|
+
## [0.1.12] - 2021-11-18
|
2
|
+
- 起動ログなどを設定した外部サーバに送信できるようにしました
|
3
|
+
|
4
|
+
## [0.1.11] - 2021-11-05
|
5
|
+
- PBM-WEB(>= 0.1.3)でボタンの入力を見るためのスレッドが動くようになりました
|
6
|
+
|
7
|
+
## [0.1.10] - 2021-10-28
|
8
|
+
- ボタンを無効化するdisableを設定できるようになりました
|
9
|
+
- pvmenvで生成する初期ファイルにprocon_bypass_man-webを同梱しました
|
10
|
+
- PBM自体の設定の構文を変更しました
|
11
|
+
|
12
|
+
## [0.1.9] - 2021-10-20
|
13
|
+
- 左スティックを傾けた時に設定した最大値内に丸めることができるようになりました
|
14
|
+
- 関連メソッド: set_neutral_position, left_analog_stick_cap
|
15
|
+
- 数時間に一度起きる、数秒間入力が通らなくなる問題の改善
|
16
|
+
|
1
17
|
## [0.1.8] - 2021-09-19
|
2
|
-
-
|
18
|
+
- 使える場合、GC.auto_compactを有効にしました
|
19
|
+
- 起動ログにuptimeからの経過時間を表示しました
|
3
20
|
|
4
21
|
## [0.1.7] - 2021-09-11
|
5
22
|
- Support pbmenv
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,23 +1,47 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
procon_bypass_man (0.1.
|
4
|
+
procon_bypass_man (0.1.12)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
|
+
activesupport (6.1.4.1)
|
10
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
11
|
+
i18n (>= 1.6, < 2)
|
12
|
+
minitest (>= 5.1)
|
13
|
+
tzinfo (~> 2.0)
|
14
|
+
zeitwerk (~> 2.3)
|
9
15
|
ast (2.4.2)
|
10
16
|
coderay (1.1.3)
|
17
|
+
concurrent-ruby (1.1.9)
|
11
18
|
diff-lcs (1.4.4)
|
19
|
+
ffi (1.15.4)
|
20
|
+
i18n (1.8.10)
|
21
|
+
concurrent-ruby (~> 1.0)
|
22
|
+
language_server-protocol (3.16.0.3)
|
23
|
+
listen (3.7.0)
|
24
|
+
rb-fsevent (~> 0.10, >= 0.10.3)
|
25
|
+
rb-inotify (~> 0.9, >= 0.9.10)
|
12
26
|
method_source (1.0.0)
|
27
|
+
minitest (5.14.4)
|
28
|
+
mustermann (1.1.1)
|
29
|
+
ruby2_keywords (~> 0.0.1)
|
13
30
|
parallel (1.20.1)
|
14
31
|
parser (3.0.2.0)
|
15
32
|
ast (~> 2.4.1)
|
16
33
|
pry (0.14.1)
|
17
34
|
coderay (~> 1.1)
|
18
35
|
method_source (~> 1.0)
|
36
|
+
rack (2.2.3)
|
37
|
+
rack-protection (2.1.0)
|
38
|
+
rack
|
19
39
|
rainbow (3.0.0)
|
20
40
|
rake (13.0.6)
|
41
|
+
rb-fsevent (0.11.0)
|
42
|
+
rb-inotify (0.10.1)
|
43
|
+
ffi (~> 1.0)
|
44
|
+
rbs (1.6.2)
|
21
45
|
regexp_parser (2.1.1)
|
22
46
|
rexml (3.2.5)
|
23
47
|
rspec (3.10.0)
|
@@ -45,12 +69,35 @@ GEM
|
|
45
69
|
rubocop-ast (1.11.0)
|
46
70
|
parser (>= 3.0.1.1)
|
47
71
|
ruby-progressbar (1.11.0)
|
72
|
+
ruby2_keywords (0.0.5)
|
73
|
+
sinatra (2.1.0)
|
74
|
+
mustermann (~> 1.0)
|
75
|
+
rack (~> 2.2)
|
76
|
+
rack-protection (= 2.1.0)
|
77
|
+
tilt (~> 2.0)
|
78
|
+
steep (0.46.0)
|
79
|
+
activesupport (>= 5.1)
|
80
|
+
language_server-protocol (>= 3.15, < 4.0)
|
81
|
+
listen (~> 3.0)
|
82
|
+
parallel (>= 1.0.0)
|
83
|
+
parser (>= 3.0)
|
84
|
+
rainbow (>= 2.2.2, < 4.0)
|
85
|
+
rbs (>= 1.2.0)
|
86
|
+
terminal-table (>= 2, < 4)
|
87
|
+
terminal-table (3.0.2)
|
88
|
+
unicode-display_width (>= 1.1.1, < 3)
|
89
|
+
tilt (2.0.10)
|
48
90
|
timecop (0.9.4)
|
91
|
+
tzinfo (2.0.4)
|
92
|
+
concurrent-ruby (~> 1.0)
|
49
93
|
unicode-display_width (2.0.0)
|
94
|
+
webrick (1.7.0)
|
95
|
+
zeitwerk (2.4.2)
|
50
96
|
|
51
97
|
PLATFORMS
|
52
98
|
arm-linux
|
53
99
|
arm64-darwin-20
|
100
|
+
arm64-darwin-21
|
54
101
|
armv7l-linux
|
55
102
|
x86_64-linux
|
56
103
|
|
@@ -58,9 +105,13 @@ DEPENDENCIES
|
|
58
105
|
procon_bypass_man!
|
59
106
|
pry
|
60
107
|
rake (~> 13.0)
|
108
|
+
rbs
|
61
109
|
rspec
|
62
110
|
rubocop
|
111
|
+
sinatra
|
112
|
+
steep
|
63
113
|
timecop
|
114
|
+
webrick
|
64
115
|
|
65
116
|
BUNDLED WITH
|
66
|
-
2.2.
|
117
|
+
2.2.30
|
data/README.md
CHANGED
@@ -1,4 +1,6 @@
|
|
1
1
|
# ProconBypassMan
|
2
|
+
[![Ruby](https://github.com/splaplapla/procon_bypass_man/actions/workflows/ruby.yml/badge.svg?branch=master)](https://github.com/splaplapla/procon_bypass_man/actions/workflows/ruby.yml)
|
3
|
+
|
2
4
|
* Switchに繋いだプロコンを連射機にしたり、キーのリマップをしたり、マクロを実行できるツールです
|
3
5
|
* 設定ファイルはrubyスクリプトで記述します
|
4
6
|
* 特定のタイトルに特化した振る舞いにしたい時は各プラグインを使ってください
|
@@ -57,21 +59,25 @@ Switch <-- (PBM): ZR連打
|
|
57
59
|
* 設定ファイル マクロの引数に、ボタンを取れるようにする
|
58
60
|
|
59
61
|
## 開発系
|
60
|
-
|
61
|
-
ProconBypassMan.tap do |pbm|
|
62
|
-
pbm.root = File.expand_path(__dir__)
|
63
|
-
pbm.logger = Logger.new("#{ProconBypassMan.root}/app.log", 5, 1024 * 1024 * 10)
|
64
|
-
pbm.logger.level = :debug
|
65
|
-
end
|
66
|
-
```
|
62
|
+
* pbmenvで生成するapp.rbに開発用ブランチを参照してください
|
67
63
|
|
68
64
|
### プロコンとの接続を維持したまま、現在の設定ファイルをPBMに反映する
|
69
65
|
```shell
|
70
66
|
sudo kill -USR2 `cat ./pbm_pid`
|
71
67
|
```
|
72
68
|
|
69
|
+
### 起動ログをサーバに送信する
|
70
|
+
* `ProconBypassMan.api_server = "http://.."` を設定すると、 `POST /api/events` に対して起動ログなどを送信するようになります
|
71
|
+
|
72
|
+
### 開発環境でログの送信を確認する方法
|
73
|
+
* `bundle exec bin/dev_api_server.rb`
|
74
|
+
* `INTERNAL_API_SERVER=http://localhost:4567 bin/console`
|
75
|
+
* `API_SERVER=http://localhost:4567 bin/console`
|
76
|
+
* `message = ProconBypassMan::BootMessage.new; ProconBypassMan::ReportBootJob.report(body: message.to_hash)`
|
77
|
+
|
73
78
|
### リリース手順
|
74
|
-
* project_template/app.rb, lib/procon_bypass_man/version.rb のバージョンをあげる
|
79
|
+
* project_template/web.rb, project_template/app.rb, lib/procon_bypass_man/version.rb のバージョンをあげる
|
80
|
+
* CHANGELOG.md に日付を書く
|
75
81
|
* be rake release
|
76
82
|
|
77
83
|
## License
|
data/Steepfile
ADDED
@@ -0,0 +1,39 @@
|
|
1
|
+
# D = Steep::Diagnostic
|
2
|
+
#
|
3
|
+
# target :lib do
|
4
|
+
# signature "sig"
|
5
|
+
#
|
6
|
+
# check "lib" # Directory name
|
7
|
+
# check "Gemfile" # File name
|
8
|
+
# check "app/models/**/*.rb" # Glob
|
9
|
+
# # ignore "lib/templates/*.rb"
|
10
|
+
#
|
11
|
+
# # library "pathname", "set" # Standard libraries
|
12
|
+
# # library "strong_json" # Gems
|
13
|
+
#
|
14
|
+
# # configure_code_diagnostics(D::Ruby.strict) # `strict` diagnostics setting
|
15
|
+
# # configure_code_diagnostics(D::Ruby.lenient) # `lenient` diagnostics setting
|
16
|
+
# # configure_code_diagnostics do |hash| # You can setup everything yourself
|
17
|
+
# # hash[D::Ruby::NoMethod] = :information
|
18
|
+
# # end
|
19
|
+
# end
|
20
|
+
|
21
|
+
# target :test do
|
22
|
+
# signature "sig", "sig-private"
|
23
|
+
#
|
24
|
+
# check "test"
|
25
|
+
#
|
26
|
+
# # library "pathname", "set" # Standard libraries
|
27
|
+
# end
|
28
|
+
|
29
|
+
target :lib do
|
30
|
+
check "lib/procon_bypass_man/timer.rb"
|
31
|
+
check "lib/procon_bypass_man/uptime.rb"
|
32
|
+
check "lib/procon_bypass_man/configuration.rb"
|
33
|
+
|
34
|
+
signature "sig"
|
35
|
+
|
36
|
+
library "time"
|
37
|
+
library "logger"
|
38
|
+
library "monitor"
|
39
|
+
end
|
data/bin/console
CHANGED
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
require "bundler/setup"
|
5
5
|
require "procon_bypass_man"
|
6
|
+
require "pry"
|
6
7
|
|
7
8
|
# You can add fixtures and/or initialization code here to make experimenting
|
8
9
|
# with your gem easier. You can also use a different console, if you like.
|
@@ -12,4 +13,7 @@ require "procon_bypass_man"
|
|
12
13
|
# Pry.start
|
13
14
|
|
14
15
|
require "irb"
|
16
|
+
|
17
|
+
ProconBypassMan.config.logger = Logger.new($stdout)
|
18
|
+
|
15
19
|
IRB.start(__FILE__)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "sinatra"
|
4
|
+
require "webrick"
|
5
|
+
require "pry"
|
6
|
+
|
7
|
+
post '/api/events' do
|
8
|
+
puts JSON.parse(request.body.read)
|
9
|
+
status 200
|
10
|
+
body ''
|
11
|
+
end
|
12
|
+
|
13
|
+
post '/api/pressed_buttons' do
|
14
|
+
r = JSON.parse(request.body.read)
|
15
|
+
puts r
|
16
|
+
status 200
|
17
|
+
body ''
|
18
|
+
end
|
data/docs/setup_raspi.mitamae.rb
CHANGED
@@ -41,6 +41,18 @@ execute "Initialize PBM" do
|
|
41
41
|
SHELL
|
42
42
|
end
|
43
43
|
|
44
|
+
# rbenv
|
45
|
+
execute "Install rbenv" do
|
46
|
+
not_if "which rbenv"
|
47
|
+
command "git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build"
|
48
|
+
end
|
49
|
+
|
50
|
+
# ruby
|
51
|
+
execute "Install ruby" do
|
52
|
+
not_if "rbenv versions | grep 3.0.1"
|
53
|
+
command "rbenv install 3.0.1"
|
54
|
+
end
|
55
|
+
|
44
56
|
run_command 'sudo systemctl disable triggerhappy.socket'
|
45
57
|
run_command 'sudo systemctl disable triggerhappy.service'
|
46
58
|
run_command 'sudo systemctl disable bluetooth'
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module ProconBypassMan::Background::HasServerPool
|
2
|
+
class ServerPool
|
3
|
+
def initialize(servers: )
|
4
|
+
if servers.nil? || servers.empty?
|
5
|
+
return
|
6
|
+
end
|
7
|
+
|
8
|
+
@servers = servers
|
9
|
+
if @servers.size >= 1
|
10
|
+
@index = 0
|
11
|
+
else
|
12
|
+
@index = nil
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def pick
|
17
|
+
if @index.nil?
|
18
|
+
return @servers&.first
|
19
|
+
end
|
20
|
+
@servers[@index] or raise "bug!!!"
|
21
|
+
end
|
22
|
+
def server; pick; end
|
23
|
+
|
24
|
+
def next!
|
25
|
+
inc_index
|
26
|
+
if @servers[@index].nil?
|
27
|
+
reset
|
28
|
+
return
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def reset
|
33
|
+
@index = 0
|
34
|
+
end
|
35
|
+
|
36
|
+
def inc_index
|
37
|
+
@index = @index + 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def reset_server_pool!
|
42
|
+
@pool_server = nil
|
43
|
+
end
|
44
|
+
|
45
|
+
def pool_server
|
46
|
+
@pool_server ||= ServerPool.new(
|
47
|
+
servers: servers
|
48
|
+
)
|
49
|
+
end
|
50
|
+
|
51
|
+
def servers
|
52
|
+
raise NotImplementedError, nil
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module ProconBypassMan
|
2
|
+
module Background
|
3
|
+
class HttpClient
|
4
|
+
class HttpRequest
|
5
|
+
def self.request!(uri: , hostname: , body: , device_id: , session_id: nil, event_type: )
|
6
|
+
@uri = uri
|
7
|
+
@http = Net::HTTP.new(uri.host, uri.port)
|
8
|
+
@http.use_ssl = uri.scheme === "https"
|
9
|
+
@params = {
|
10
|
+
hostname: hostname,
|
11
|
+
event_type: event_type,
|
12
|
+
session_id: session_id,
|
13
|
+
device_id: device_id,
|
14
|
+
}.merge(body)
|
15
|
+
@http.post(
|
16
|
+
@uri.path,
|
17
|
+
@params.to_json,
|
18
|
+
{ "Content-Type" => "application/json" },
|
19
|
+
)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(path: , pool_server: , retry_on_connection_error: false)
|
24
|
+
@path = path
|
25
|
+
@pool_server = pool_server
|
26
|
+
@hostname = `hostname`.chomp
|
27
|
+
@retry_on_connection_error = retry_on_connection_error
|
28
|
+
end
|
29
|
+
|
30
|
+
def post(body: , event_type: )
|
31
|
+
if @pool_server.server.nil?
|
32
|
+
ProconBypassMan.logger.info('送信先が未設定なのでスキップしました')
|
33
|
+
return
|
34
|
+
end
|
35
|
+
if body.is_a?(Hash)
|
36
|
+
body = { body: body, event_type: event_type }
|
37
|
+
else
|
38
|
+
body = { body: { value: body, event_type: event_type } }
|
39
|
+
end
|
40
|
+
session_id = ProconBypassMan.session_id
|
41
|
+
device_id = ProconBypassMan.device_id
|
42
|
+
|
43
|
+
response = HttpRequest.request!(
|
44
|
+
uri: URI.parse("#{@pool_server.server}#{@path}"),
|
45
|
+
hostname: @hostname,
|
46
|
+
device_id: device_id,
|
47
|
+
session_id: session_id,
|
48
|
+
body: body,
|
49
|
+
event_type: event_type,
|
50
|
+
)
|
51
|
+
case response.code
|
52
|
+
when /^200/
|
53
|
+
return
|
54
|
+
else
|
55
|
+
@pool_server.next!
|
56
|
+
ProconBypassMan.logger.error("200以外(#{response.code})が帰ってきました. #{response.body}")
|
57
|
+
end
|
58
|
+
rescue SocketError => e
|
59
|
+
ProconBypassMan.logger.error("error in outbound module: #{e}")
|
60
|
+
if @retry_on_connection_error
|
61
|
+
sleep(10)
|
62
|
+
retry
|
63
|
+
end
|
64
|
+
rescue => e
|
65
|
+
puts e
|
66
|
+
ProconBypassMan.logger.error("error in outbound module: #{e}")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ProconBypassMan
|
2
|
+
module Background
|
3
|
+
class JobPerformer
|
4
|
+
def initialize(klass: , args: )
|
5
|
+
@klass = klass
|
6
|
+
@args = args
|
7
|
+
end
|
8
|
+
|
9
|
+
def perform
|
10
|
+
@klass.perform(*@args)
|
11
|
+
rescue => e
|
12
|
+
ProconBypassMan::ReportErrorJob.perform(e)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
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
|
@@ -0,0 +1,44 @@
|
|
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 self.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
|
+
end
|
29
|
+
|
30
|
+
def self.queue
|
31
|
+
@@queue ||= Queue.new
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.push(hash)
|
35
|
+
if queue.size > MAX_QUEUE_SIZE
|
36
|
+
ProconBypassMan.logger.error('Over queue size cap!!')
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
queue.push(hash)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class ProconBypassMan::ReportBootJob < ProconBypassMan::BaseJob
|
2
|
+
# @param [String] body
|
3
|
+
def self.perform(body)
|
4
|
+
ProconBypassMan::Background::HttpClient.new(
|
5
|
+
path: path,
|
6
|
+
pool_server: pool_server,
|
7
|
+
retry_on_connection_error: true,
|
8
|
+
).post(body: body, event_type: :boot)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class ProconBypassMan::ReportErrorJob < ProconBypassMan::BaseJob
|
2
|
+
# @param [String] body
|
3
|
+
def self.perform(body)
|
4
|
+
ProconBypassMan::Background::HttpClient.new(
|
5
|
+
path: path,
|
6
|
+
pool_server: pool_server,
|
7
|
+
retry_on_connection_error: false,
|
8
|
+
).post(body: body, event_type: :error,)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class ProconBypassMan::ReportHeartbeatJob < ProconBypassMan::BaseJob
|
2
|
+
# @param [String] body
|
3
|
+
def self.perform(body)
|
4
|
+
ProconBypassMan::Background::HttpClient.new(
|
5
|
+
path: path,
|
6
|
+
pool_server: pool_server,
|
7
|
+
retry_on_connection_error: false,
|
8
|
+
).post(body: body, event_type: :heartbeat)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class ProconBypassMan::ReportPressedButtonsJob
|
2
|
+
extend ProconBypassMan::Background::HasServerPool
|
3
|
+
extend ProconBypassMan::Background::JobRunnable
|
4
|
+
|
5
|
+
PATH = "/api/pressed_buttons"
|
6
|
+
|
7
|
+
# @param [String] body
|
8
|
+
def self.perform(body)
|
9
|
+
ProconBypassMan::Background::HttpClient.new(
|
10
|
+
path: PATH,
|
11
|
+
pool_server: pool_server,
|
12
|
+
).post(body: body, event_type: :internal)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.servers
|
16
|
+
ProconBypassMan.config.internal_api_servers
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
class ProconBypassMan::ReportReloadConfigJob < ProconBypassMan::BaseJob
|
2
|
+
# @param [String] body
|
3
|
+
def self.perform(body)
|
4
|
+
ProconBypassMan::Background::HttpClient.new(
|
5
|
+
path: path,
|
6
|
+
pool_server: pool_server,
|
7
|
+
retry_on_connection_error: false,
|
8
|
+
).post(body: body, event_type: :reload_config)
|
9
|
+
end
|
10
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require "procon_bypass_man/background/job_runnable"
|
2
|
+
require "procon_bypass_man/background/job_performer"
|
3
|
+
require "procon_bypass_man/background/has_server_pool"
|
4
|
+
require "procon_bypass_man/background/http_client"
|
5
|
+
require "procon_bypass_man/background/jobs/base_job"
|
6
|
+
require "procon_bypass_man/background/jobs/report_boot_job"
|
7
|
+
require "procon_bypass_man/background/jobs/report_reload_config_job"
|
8
|
+
require "procon_bypass_man/background/jobs/report_error_job"
|
9
|
+
require "procon_bypass_man/background/jobs/report_heartbeat_job"
|
10
|
+
require "procon_bypass_man/background/jobs/report_pressed_buttons_job"
|