polkit 0.106を使用して通知を送信するには?

polkit 0.106を使用して通知を送信するには?

ペンドライブを忘れないようにアプリケーションを開発しています。

ペンドライブが本機に接続されている場合は、このアプリケーションをロックする必要があります。この形式では、フラッシュドライブの接続中にユーザーがシステムをシャットダウンしようとすると、システムはシャットダウンロックを解除するためにフラッシュドライブを取り外す必要があることを知らせる通知を表示します。

終了イベントを検出するために、システムに接続されたペンドライブがあることを確認するスクリプトを呼び出すpolkitルールを設定しました。

ペンドライブが接続されている場合は、send_notify.sh次のコマンドを実行するスクリプト呼び出しを介してpolkitルールに通知が渡されます。

notify-send "Pendrive-Reminder" "Extract Pendrive to enable shutdown" -t 5000

ポルケットルールは次のとおりです。

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.consolekit.system.stop" ||
        action.id == "org.freedesktop.login1.power-off" ||
        action.id == "org.freedesktop.login1.power-off-multiple-sessions" || 
        action.id == "org.xfce.session.xfsm-shutdown-helper")  
    {

        try{    
            polkit.spawn(["/usr/bin/pendrive-reminder/check_pendrive.sh", subject.user]);        
            return polkit.Result.YES;

        }catch(error){
            polkit.spawn(["/usr/bin/pendrive-reminder/send_notify.sh", subject.user]);
        return polkit.Result.NO;
     }
   }
  }

しかし。このポルケットルールを設定して閉じるボタンを押した後、ユーザーに通知は送信されません。

ルールをデバッグし、実行された2番目のスクリプトを確認しましたが、notify-sendユーザーに通知が表示されませんでした。

この問題をどのように解決できますか?

修正する:

スクリプトを次のように修正してみました。

#!/bin/bash

user=$1

XAUTHORITY="/home/$user/.Xauthority"
DISPLAY=$( who | grep -m1 $user.*\( | awk '{print $5}' | sed 's/[(|)]//g')

notify-send "Extract Pendrive to enable shutdown" -t 5000

exit 0

ユーザーはpólkitによってパラメータに渡されます。

しかし、問題はまだ存在します

更新:ちょうどこのエラーを見ました。https://bugs.launchpad.net/ubuntu/+source/libnotify/+bug/160598root で通知を送信することはできません。

後でユーザーを変更するために解決策を修正してテストします。

アップデート2:コードがこれに変更されました。問題はまだ存在します。

#!/bin/bash

export XAUTHORITY="/home/$user/.Xauthority"
export DISPLAY=$(cat "/tmp/display.$user")

user=$1
su $user -c 'notify-send "Pendrive Reminder" "Shutdown lock enabled. Disconnect pendrive to enable shutdown" -u critical'

ベストアンサー1

polkit(およびpkexec)は、Xアクセスに必要な環境変数を削除しますDISPLAY。ディスプレイにアクセスできないため失敗します。XAUTHORITYnotify-send

~からpkexec マンページ:

したがって、$ DISPLAYおよび$ XAUTHORITY環境変数が設定されていないため、pkexecは他のユーザーとしてX11アプリケーションを実行できません。ジョブのorg.freedesktop.policykit.exec.allow_guiコメントがnull以外の値に設定されている場合、これら2つの変数は保持されます。

私はpolkitに慣れていません。おそらくorg.freedesktop.policykit.exec.allow_guiこのルールを設定することも、他の可能性もあります。申し訳ありません。既製のソリューションを提供できません。

しかし、重要なのはDISPLAYXAUTHORITYを提供することですnotify-send

(私を叩かないでください。汚い解決策はハードコーディングしてDISPLAY=:0通知XAUTHORITY=...スクリプトに含めることです。状況が変わると失敗する可能性があります。)


編集:上記の議論に基づいて、回避策は複数のユーザーに適用する必要があり、以下は必要ありませんXAUTHORITY

Xログイン時にスクリプトを自動的に実行する必要があります(おそらく.desktopいくつかの設定で~/.config/autostart):

#! /bin/bash
# allow polkitd access to X. 
# xhost is an alternative to XAUTHORITY authentication
xhost +SI:localuser:polkitd
# store DISPLAY for each user
echo $DISPLAY > /tmp/display.$USER

polkit スクリプトには以下が含まれます。

export DISPLAY=$(cat /tmp/display.$user)

おすすめ記事