rabbit-slide-kenhys-tokyodebian-apt-json-hook-202309 2023.11.18.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 62c0f791bb452ebb0bb7471abe3c823764f0c87a83887cb75f12691959626ae2
4
+ data.tar.gz: 1dbcb9d9ea8fee93282363786815fcb5d54b0901c4d68fbb0f82cca17bdfa146
5
+ SHA512:
6
+ metadata.gz: 492b1cf43dc2df5667b787d4bdf317fd97c7f6c2e8a1ff097bfc7ea17c5317e7f5628ea382640f13ee3c115223fb19a8da141b569a5dae94f2166344c7374a3e
7
+ data.tar.gz: 6aa8a6f75d8f2671f371d8cb43e45473da8fdb2eeb49adbda833e126fd58378b6fa806eab9bd6dc64a297e8869162a949a87e20811d3738235aa2d7319f14c43
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ --size=1920,1080 apt-json-hook.md
data/README.md ADDED
@@ -0,0 +1,30 @@
1
+ # Tokyo Debian Apt JSON Hook 202311
2
+
3
+ ## How to show
4
+
5
+ % rabbit
6
+
7
+ ## How to install
8
+
9
+ % gem install rabbit-slide-kenhys-tokyodebian-apt-json-hook-202311
10
+
11
+ ## How to create PDF
12
+
13
+ % rake pdf
14
+
15
+
16
+ # References
17
+
18
+ https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-apt-json-hook-202311
19
+
20
+ https://www.clear-code.com/blog/2023/10/19/use-apt-json-hook.html
21
+
22
+ https://gihyo.jp/admin/serial/01/ubuntu-recipe/0676
23
+
24
+ https://salsa.debian.org/apt-team/apt/-/blob/main/doc/json-hooks-protocol.md
25
+
26
+ https://salsa.debian.org/apt-team/apt/-/blob/main/test/integration/test-apt-cli-json-hooks#L29-67
27
+
28
+ https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1051271
29
+
30
+ https://wiki.debian.org/UltimateDebianDatabase
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/apt-json-hook.md ADDED
@@ -0,0 +1,284 @@
1
+ # APT JSON Hookを\\n試してみた話
2
+
3
+ subtitle
4
+ : 更新したらまずいパッケージを回避したい
5
+
6
+ author
7
+ : Kentaro Hayashi
8
+
9
+ institution
10
+ : ClearCode Inc.
11
+
12
+ content-source
13
+ : 2023年11月 東京エリア・関西合同Debian勉強会
14
+
15
+ allotted-time
16
+ : 20m
17
+
18
+ theme
19
+ : .
20
+
21
+ # スライドはRabbit Slide Showにて\\n公開済みです
22
+
23
+ * APT JSON Hookを試してみた話
24
+ * <https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-apt-json-hook-202311>
25
+
26
+ # 元となる記事も公開済み
27
+
28
+ * 参考: Apt 1.6で導入されたJSONフックを活用する方法
29
+ * <https://www.clear-code.com/blog/2023/10/19/use-apt-json-hook.html>
30
+
31
+ # 本日の内容
32
+
33
+ * APT JSON Hookを試してみた話
34
+ * APT JSON Hookはどういうものなのか
35
+ * シェルスクリプトによるフックの説明
36
+ * Rubyによるフックのサンプルも
37
+ * Hookを活用するアイデアについて
38
+ * 最近あった致命的なバグの事例
39
+
40
+ # APT JSON Hookとは(1)
41
+
42
+ * 参考(元ネタ): <https://gihyo.jp/admin/serial/01/ubuntu-recipe/0676>
43
+ * 「Ubuntu Weekly Recipe 第676回aptコマンドの最新機能あれこれ」
44
+ * 「Apt CLIの操作結果をJSON RPCで受け取る」にて言及あり
45
+
46
+ # APT JSON Hookとは(2)
47
+
48
+ * JSON-RPCを使って、APT実行中に任意の処理を割り込み実行させるしくみ
49
+ * 割り込み処理の結果、APTの挙動を変えるものではない
50
+ * フック処理とはハンドシェイクするぐらい
51
+ →対応プロトコルバージョンを返すことしか想定されていない
52
+ * ❌フックで処理した結果をAPTにJSON-RPC経由で伝える
53
+ * ✅フックで通知された情報をもとになにかする
54
+
55
+ # APT JSON Hookの仕様
56
+
57
+ * 参考: <https://salsa.debian.org/apt-team/apt/-/blob/main/doc/json-hooks-protocol.md>
58
+ * リクエストとレスポンスはJSON-RPC 2.0に準拠
59
+ * 最新プロトコルバージョンは0.2
60
+ * UNIXドメインソケット(ファイルディスクリプタが渡される)でAPTとやりとり
61
+
62
+ # APT JSON Hookの利用方法
63
+
64
+ * フックの設定ファイルを配置
65
+ * 例: /etc/apt.conf.d/99apt-json-hook
66
+ * `AptCli::Hooks::<name>`と対応するコマンドのパスを記載 (`<name>`はInstallとかUpgradeとか)
67
+ * 設定ファイルで言及したパスに仕様に準拠したコマンドを配置
68
+ * 例: /usr/local/bin/apt-json-hook
69
+ * APTと通信するフックスクリプト
70
+
71
+ # フックを設定する方法
72
+
73
+ * 例: /etc/apt.conf.d/99apt-json-hookに記載する内容
74
+ * ✅実行するコマンドを配置するパスは任意で良い
75
+ * ✅Search,Install,UpgradeといったAPTのサブコマンドに対応したフックを指定できる
76
+
77
+ ```
78
+ AptCli::Hooks::Upgrade:: "/usr/local/bin/apt-json-hook";
79
+ ```
80
+
81
+ # test-apt-cli-json-hooks\\nサンプル
82
+
83
+ ```bash
84
+ #!/bin/bash
85
+ trap '' SIGPIPE
86
+ while true; do
87
+ read request <&$APT_HOOK_SOCKET || exit 1 # UNIXドメインソケットから読み込み
88
+ if echo "$request" | grep -q ".hello"; then
89
+ echo "HOOK: HELLO"
90
+ fi
91
+ if echo "$request" | grep -q ".bye"; then
92
+ # {"json-rpc":"2.0", "method": "org.debian.apt.hooks.bye", ...}なら終了"
93
+ echo "HOOK: BYE"
94
+ exit 0;
95
+ fi
96
+ echo HOOK: request $request
97
+ read empty <&$APT_HOOK_SOCKET || exit 1 # {"json-rpc":"2.0", "method": ...}\n + \n が送られてくるので空行を読み飛ばす
98
+ echo HOOK: empty $empty
99
+ if echo "$request" | grep -q ".hello"; then
100
+ # 対応するプロトコルバージョンを返す
101
+ printf '{"jsonrpc": "2.0", "result": {"version": "'$TEST_HOOK_VERSION'"}, "id": 0}\n\n' >&$APT_HOOK_SOCKET 2>/dev/null || exit 1
102
+ fi
103
+ done
104
+ ```
105
+
106
+ * 参考: {::note}<https://salsa.debian.org/apt-team/apt/-/blob/main/test/integration/test-apt-cli-json-hooks#L29-67>{:/note}
107
+
108
+ # サンプルスクリプトの挙動の説明
109
+
110
+ * APTから.helloがきたら対応しているプロトコルバージョンを返す
111
+ * APTから.byeがきたらスクリプトを終了
112
+ * requestにはmethodに応じてパッケージの情報が含まれている
113
+
114
+ # Rubyで書いてみると
115
+
116
+
117
+ ```ruby
118
+ IO.open(ENV['APT_HOOK_SOCKET'].to_i, "a+") do |io|
119
+ while true do
120
+ request = io.gets
121
+ io.gets
122
+ json = JSON.parse(request)
123
+ method = json["method"]
124
+ if method.end_with?(".bye")
125
+ exit 0
126
+ end
127
+ if method.end_with?(".hello")
128
+ io.puts({"jsonrpc" => "2.0", "result" => {"version" => "0.2"}, "id" => 0}.to_json)
129
+ io.puts
130
+ end
131
+ # ここでなにか処理をする
132
+ end
133
+ end
134
+ ```
135
+
136
+ # フックをどう活用するか?
137
+
138
+ * Debian sidを常用するけど、やばいバグは踏みたくない
139
+ * 例: GRUB2 2.12~rc1-7 prevent machine to boot
140
+ * <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1051271>
141
+
142
+ # GRUB2 2.12~rc1-7 prevent machine to boot
143
+
144
+ * <https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1051271>
145
+ * タイトルの通り起動しなくなる **critical** バグです
146
+ * 9/5 早朝にunstableに投入された
147
+ * バグ報告されたのが9/5 23:21:02(日本時間)
148
+ * 9/5 日中にアップデート後、夕方シャットダウンしていると次回起動で必ず踏む 💣
149
+
150
+ # やばいバグを回避できないか?
151
+
152
+ * ✅アップグレードしようとした時点でバグ登録されている
153
+ * 登録されているバグをチェックすればいい?
154
+ * {::wait/}**今日焦点をあてるのはこちら**
155
+ * ❌バグ登録されるタイミングが遅ければ不可避
156
+ * Unattended-Upgrade::Package-Blacklistも併用するのがよい
157
+ * See /etc/apt/apt.conf.d/50unattended-upgrades
158
+
159
+ # 更新とフックのタイミング
160
+
161
+ * JSON-RPCのメソッドの種類(アップグレード時)
162
+ * org.debian.apt.hooks.install.pre-prompt
163
+ * org.debian.apt.hooks.install.package-list
164
+ * org.debian.apt.hooks.install.statistics
165
+
166
+ # 更新とフックのタイミング(2)
167
+
168
+ * **org.debian.apt.hooks.install.pre-prompt**
169
+ * 「アップグレードパッケージを検出しています...完了」といったメッセージのあとにフックが実行
170
+ * org.debian.apt.hooks.install.package-list
171
+ * 「以下のパッケージはアップグレードされます」といったメッセージのあとにフックが実行
172
+
173
+ # 更新とフックのタイミング(3)
174
+
175
+ * org.debian.apt.hooks.install.pre-prompt
176
+ * 「アップグレードパッケージを検出しています...完了」といったメッセージのあとにフックが実行
177
+ * **org.debian.apt.hooks.install.package-list**
178
+ * 「以下のパッケージはアップグレードされます」といったメッセージのあとにフックが実行
179
+
180
+ # 更新とフックのタイミング(4)
181
+
182
+ * **org.debian.apt.hooks.install.statistics**
183
+ * 「アップグレード: 2 個、新規インストール: 0 個、削除: 0 個、保留: 1 個」といったメッセージのあとにフックが実行
184
+
185
+ # バグで泣かないためにできること
186
+
187
+ * 最終的なY/nを指示する前という意味ではどのフックも大差ない
188
+ * .statisticsのタイミングで登録されているバグを検索
189
+ * seriousやcriticalなバグがないか調べる
190
+ * マッチするバグがあればメッセージを表示する
191
+
192
+ # APTはどんな情報をくれるのか?
193
+
194
+ * 現在インストールしているパッケージとそのバージョン
195
+ * アップグレード候補のパッケージとそのバージョン
196
+ * アップグレードにてインストールされるはずのパッケージとそのバージョン
197
+
198
+ # APTはどんな情報をくれるのか?
199
+
200
+ * 現在インストールしているパッケージとそのバージョン
201
+ * アップグレード候補のパッケージとそのバージョン
202
+ * **アップグレードにてインストールされるはずのパッケージとそのバージョン**
203
+
204
+ # 具体的なもらえる情報の\\nサンプルは?
205
+
206
+ * {"json-rpc":"2.0", ... "params"{ "packages": ....}}に詰めたものがもらえる
207
+
208
+ ```
209
+ [{"id"=>3790,
210
+ "name"=>"at-spi2-common",
211
+ "architecture"=>"amd64",
212
+ "mode"=>"upgrade",
213
+ "automatic"=>true,
214
+ "versions"=>
215
+ {"candidate"=>
216
+ {"id"=>1455,
217
+ "version"=>"2.49.91-2",
218
+ "architecture"=>"all",
219
+ "pin"=>500,
220
+ "origins"=>[{"archive"=>"unstable", "codename"=>"sid", "origin"=>"Debian", "label"=>"Debian", "site"=>"deb.debian.org"}]},
221
+ "install"=>
222
+ {"id"=>1455,
223
+ "version"=>"2.49.91-2",
224
+ "architecture"=>"all",
225
+ "pin"=>500,
226
+ "origins"=>[{"archive"=>"unstable", "codename"=>"sid", "origin"=>"Debian", "label"=>"Debian", "site"=>"deb.debian.org"}]},
227
+ "current"=>{"id"=>71628, "version"=>"2.49.91-1", "architecture"=>"all", "pin"=>100, "origins"=>[]}}},]
228
+ ```
229
+
230
+ # どうやって登録されているバグを\\n検索するか
231
+
232
+ * Use UDD!
233
+ * 参考: <https://wiki.debian.org/UltimateDebianDatabase>
234
+ * 一般向けに UDD mirrorも公開されているよ
235
+ * `psql "postgresql://udd-mirror:udd-mirror@udd-mirror.debian.net/udd"`
236
+ * たまに接続できないこともある 😢
237
+
238
+ # どうやって登録されているバグを\\n検索するか(2)
239
+
240
+ * やばげなバグは?
241
+ * bugsテーブルのseverityカラムを参照する (`serious`, `critical`, ...)
242
+ * 該当するパッケージを絞るには?
243
+ * bugs_packagesテーブルのpackageカラムを参照する
244
+ * 該当するバージョンで絞り込むには?
245
+ * bugs_found_inテーブルのversionを参照する
246
+
247
+ # ざっくりとしたクエリの例
248
+
249
+ ```
250
+ SELECT * FROM bugs LEFT JOIN bugs_packages ON bugs.id=bugs_packages.id
251
+ LEFT JOIN bugs_found_in on bugs_packages.id=bugs_found_in.id
252
+ WHERE bugs.severity IN ('serious', 'critical') AND
253
+ (bugs_packages.package = 'パッケージ名'
254
+ AND bugs_found_in.version LIKE '%' || '対象バージョン' || '%' )
255
+ ```
256
+
257
+ # もしあのときすでにバグ登録されていたら回避できたか?
258
+
259
+ * 実験の条件
260
+ * sidのコンテナイメージにフックを設定済み
261
+ * バグの検索はarchivedを対象にする(もうすでに修正済みのため)
262
+ * **grub2 2.06-13からのアップグレード**
263
+
264
+ # もしあのときすでにバグ登録されていたら回避できたか?(2)
265
+
266
+ * 実験の手順
267
+ * snashot.debian.orgのアーカイブを利用し 2023/09/04の時点に巻き戻す
268
+ * <https://snapshot.debian.org/archive/debian/20230904T000000Z>
269
+ * 問題のなかったgrub2 2.06-13をインストール
270
+ * **snashot.debian.orgのアーカイブを利用し 2023/09/05のメタデータを使ってアップグレード**
271
+ * <https://snapshot.debian.org/archive/debian/20230905T120000Z>
272
+
273
+ # 実験してみる
274
+
275
+ * 注:
276
+ * snapshot.d.oへのアクセスは時間がかかるので、grubインストールまでは実施ずみ
277
+
278
+ # さいごに
279
+
280
+ * APTから渡されるのはバイナリパッケージ名なので、ソースパッケージ名も含めてバグを検索しないとヒットしない
281
+ * APTのフックにより既知の致命的なバグの回避は限定的ながら有効そう
282
+ * ✅UDDのバグ登録データを利用すると事前に機械的なチェックが実現可能👍
283
+ * ✅Debian sidを常用しても怖くなくなる(かもしれない)
284
+ * ❌未登録なバグはどうしても不可避(今回の範囲外)
data/config.yaml ADDED
@@ -0,0 +1,24 @@
1
+ ---
2
+ id: tokyodebian-apt-json-hook-202309
3
+ base_name: debian-installer
4
+ tags:
5
+ - rabbit
6
+ - debian
7
+ presentation_date: 2023-11-18
8
+ presentation_start_time:
9
+ presentation_end_time:
10
+ slideshare_id:
11
+ version: 2023.11.18.1
12
+ licenses:
13
+ - CC-BY-SA-4.0
14
+ slideshare_id: kenhys
15
+ speaker_deck_id:
16
+ vimeo_id:
17
+ youtube_id:
18
+ author:
19
+ markup_language: :md
20
+ name: Kentaro Hayashi
21
+ email: kenhys@gmail.com
22
+ rubygems_user: kenhys
23
+ slideshare_user:
24
+ speaker_deck_user: kenhys
data/theme.rb ADDED
@@ -0,0 +1,5 @@
1
+ @default_font = "Ubuntu"
2
+ @monospace_font = "Ubuntu"
3
+ include_theme("debian")
4
+ #@slide_show_span = 1300
5
+ @slide_show_loop = true
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-kenhys-tokyodebian-apt-json-hook-202309
3
+ version: !ruby/object:Gem::Version
4
+ version: 2023.11.18.1
5
+ platform: ruby
6
+ authors:
7
+ - Kentaro Hayashi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: ''
28
+ email:
29
+ - kenhys@gmail.com
30
+ executables: []
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - ".rabbit"
35
+ - README.md
36
+ - Rakefile
37
+ - apt-json-hook.md
38
+ - config.yaml
39
+ - pdf/tokyodebian-apt-json-hook-202309-debian-installer.pdf
40
+ - theme.rb
41
+ homepage: https://slide.rabbit-shocker.org/authors/kenhys/tokyodebian-apt-json-hook-202309/
42
+ licenses:
43
+ - CC-BY-SA-4.0
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubygems_version: 3.3.26
61
+ signing_key:
62
+ specification_version: 4
63
+ summary: Tokyo Debian Apt JSON Hook 202311
64
+ test_files: []