limitusus’s diary

主に技術のことを書きます

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なのかがわかります。

app | Electron

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に上がっていました。

gitlab.freedesktop.org

ここにはよく参考になるpatchがリンクしてありました。

https://raw.githubusercontent.com/pld-linux/xdg-utils/d00c89c373952fc89dc6179ad327785236a54782/0001-xdg-settings-add-MATE-support.patch

AmazonLinux2のxdg-utilsは妙に古く、このpatchも入っていません。またこのpatchはbrowserを設定しているだけで、schemeの設定は入っていないため、上記を参考にしつつpatchを追加する必要がありました。

結果として必要となるpatchはこちらです。

gist.github.com

もうちょっとだけ続く

これで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環境も快適に運用していきましょう。