AmazonLinux2でkontena-lensを使えるようにする
AmazonLinux2でkontena-lensを起動しようとしたところ、以下のようになってうまく起動できませんでした。
% kontena-lens info: 📟 Setting Lens as protocol client for lens:// info: 📟 failed ❗
調べて何とか解決したものの、それなりに大変だったので経緯と解決方法をメモ
(将来のkontena-lensやxdg-utilsでは修正されている可能性があります)
環境
- AmazonLinux2 … Desktop環境はMATE(default)
- Lens kontena-lens-4.2.2-20210416.7.x86_64 … 公式サイトからLinux x64 RPMをダウンロードして入れる (v4.2.2)
- xdg-utils xdg-utils-1.1.0-0.17.20120809git.amzn2.noarch
調査
なぜ"failed"なのか?
とりあえずfailedと表示される部分がどこなのかを調べます。これはLensのコードを少し探せばすぐ見付かります。
lens/index.ts at v4.2.2 · lensapp/lens · GitHub
つまり setAsDefaultProtocolClient("lens")
がfalseを返しています。
これはelectronの関数なので、そちらを調べればなぜfalseなのかがわかります。
Returns Boolean - Whether the call succeeded.
具体的に何をしているのかはよくわかりませんでした。
electronのコードを読んでもよかったかもしれませんが、今回はstraceで調べます。
% strace -o /tmp/z -s 4000 -f kontena-lens
のようにしてkontena-lens起動から終了までの動きを記録し、何をしているのかを理解します。
するとforkした後にxdg-settingsにexecveしていることがわかりました。
27174 execve("/usr/bin/xdg-settings", ["xdg-settings", "set", "default-url-scheme-handler", "lens", "Lens.desktop"], 0x728a8742180 /* 75 vars */) = 0
xdg-settingsはデスクトップアプリケーションの起動設定をしてくれているので、これが成功しているかどうかを見ているということですね。
実際にxdg-settings set default-url-scheme-handler lens Lens.desktop
してみると3で終了したため、ここを掘り下げていくことにします。
xdg-settingsを調べていく
setが何も言わずに終了してしまうため、とりあえずgetで調べてみます。
% xdg-settings get default-url-scheme-handler
xdg-settings: unknown desktop environment
この辺りで嫌な気配を感じます。決してメジャーではないMATEというデスクトップ環境、xdg-settingsが対応していないのでは…?
幸いxdg-settingsはshアプリケーションです。実際に読んで動きを追います。行数は1000行を越えるものの、ほとんどが関数定義であり、基本的にはdetectDEによりDEという変数(Desktop Environment)を設定し、これに応じて処理を呼び出すだけです。
detectDE case "$DE" in kde|gnome*|xfce) dispatch_specific "$@" ;; generic) dispatch_generic "$@" ;; *) exit_failure_operation_impossible "unknown desktop environment" ;; esac
実は存在している環境変数からMATEであることは判定されていて、DEにはmateという値が入っています。ただこのcaseでmateに合致するものがないため、exit_failure_operation_impossibleが呼び出されてしまっていることがわかりました。
調べてみたところMATEは基本的にGNOME3がベースとなっており、似たような処理をさせればよいようです。非常に似たissueがxdg-utilsに上がっていました。
ここにはよく参考になるpatchがリンクしてありました。
AmazonLinux2のxdg-utilsは妙に古く、このpatchも入っていません。またこのpatchはbrowserを設定しているだけで、schemeの設定は入っていないため、上記を参考にしつつpatchを追加する必要がありました。
結果として必要となるpatchはこちらです。
もうちょっとだけ続く
これでgetはできるようになったものの、当初のsetは2で失敗するようになります。
これはRPMではkontena-lens.desktopがインストールされるものの、実際にsetしようとしているのはLens.desktopという存在しないファイルだからです。
これはRPM側が直らないと何とも…というところですが、renameしたりsymbolic linkを作成するなどすればよいです。
今回は(MATEのメニューでLensが重複することを覚悟の上で)以下のようにsymbolic linkの作成を行いました。
% sudo ln -s /usr/share/applications/{kontena-lens.desktop,Lens.desktop}
これで kontena-lens が起動できるようになり、めでたしめでたし。
まとめ
AmazonLinux2 MATEの環境でkontena-lens RPMを入れた場合には大きく以下の2つが必要でした。
- xdg-settingsへのpatch適用
- Lens.desktopの用意
これでk8s環境も快適に運用していきましょう。