デスクトップ環境構築 - 共通事項 - OctoPkg - 機能しないとき
1. 概要 あるときから、「OctoPkg」が、機能しなくなったのです。 自分の記録をたどると、2019年01月17日、「FreeBSD 12.0 RLEASE」を扱っていたあたりからかな。 状況は、パッケージの更新やインストール時に、「Confirmation」で「Yes」入力後、いつまで待っても、「認証」のダイアログが表示されないのです。 ソースを変えて、無理やり、「sudo」で起動したりもしましたが、どうやら、原因ははっきりとつかめていなかったのです。 2. 対策(一般) インストール時に pkg install -y octopkg gksu でインストールしていたのですが、このとき、「bash」も同時にインストールします。 pkg install -y octopkg gksu bash こうすることで、たいていのデスクトップでは、「OctoPkg」が機能するようになります。 3. 対策(KDE) 「KDE」は、さらに特別、インストールは pkg install -y octopkg gksu kf5-kdesu bash となりますが、インストール後に mkdir -pv /usr/local/lib/kde4 ln -s /usr/local/lib/libexec/kf5 /usr/local/lib/kde4/libexec とすることで、「OctoPkg」が機能するようになります。 4. 傍証 「ports」を展開して、軽く「hack」してみて、なんとなくわかりました。 ソースディレクトリで、「grep」してみます。 $ grep bash *.cpp unixcommand.cpp: proc.start("/usr/local/bin/bash -c \"which " + binary + "\""); unixcommand.cpp: proc.start("/usr/local/bin/bash -c " + sParam); utils.cpp: proc.start("ps -o pid -C bash"); 認証のダイアログを表示させるのにおそらくは、「bash」を使用しているのです。 なんだかなぁ。 「bash」必須であれば、依存関係をつけてくれればいいし、どこでも使えるようにするには、「bash」でなく、「sh」なんだがな。 「KDE」に関しては $ grep kdesu *.cpp mainwindow_transaction.cpp: else if (WMHelper::getSUCommand().contains("kdesu")) mainwindow_transaction.cpp: msg.remove(QRegularExpression("kdesu.+")); wmhelper.cpp: result = "/usr/local/lib/kde4/libexec/kdesu"; wmhelper.cpp: QFile kdesu("/usr/local/lib/kde4/libexec/kdesu"); wmhelper.cpp: if (kdesu.exists()){ とまぁ、「/usr/local/lib/kde4/libexec/kdesu」を使っていますが、現在(2020年6月25日)の「KDE」では、「kdesu」は「/usr/local/lib/libexec/kf5/kdesu」にあるのです。 「ports」や「pkg」のチームもしくは、「OctoPkg」のメンテナに伝えたいのですが、英語ができないので、伝えられないのだ。
pkg install -y octopkg gksu
pkg install -y octopkg gksu bash
pkg install -y octopkg gksu kf5-kdesu bash
mkdir -pv /usr/local/lib/kde4 ln -s /usr/local/lib/libexec/kf5 /usr/local/lib/kde4/libexec
$ grep bash *.cpp unixcommand.cpp: proc.start("/usr/local/bin/bash -c \"which " + binary + "\""); unixcommand.cpp: proc.start("/usr/local/bin/bash -c " + sParam); utils.cpp: proc.start("ps -o pid -C bash");
$ grep kdesu *.cpp mainwindow_transaction.cpp: else if (WMHelper::getSUCommand().contains("kdesu")) mainwindow_transaction.cpp: msg.remove(QRegularExpression("kdesu.+")); wmhelper.cpp: result = "/usr/local/lib/kde4/libexec/kdesu"; wmhelper.cpp: QFile kdesu("/usr/local/lib/kde4/libexec/kdesu"); wmhelper.cpp: if (kdesu.exists()){