web-dev-qa-db-ja.com

polkit 0.106で通知を送信するにはどうすればよいですか?

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

ペンドライブがマシンに接続されている場合、このアプリはシャットダウンをロックする必要があります。このフォームのように、ユーザーがペンドライブの接続中にシステムをシャットダウンしたい場合、システムは、シャットダウンのロックを解除するためにペンドライブを切断する必要があることを警告する通知を表示します。

シャットダウンイベントを検出するために、スクリプトを呼び出すpolkitルールを設定して、ペンドライブがシステムに接続されているかどうかを確認します。

接続されているペンドライブがある場合、polkitルールはnotifyを呼び出します-スクリプトを介して送信しますsend_notify.sh、このコマンドを実行します:

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

Polkitのルールは次のとおりです。

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;
     }
   }
  }

だが。このpolkitルールを設定してシャットダウンボタンを押した後、ユーザーは通知を受け取りません。

ルールをデバッグし、その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/160598 rootとして通知を送信することを許可しません。

後で、ユーザーを変更する回避策を変更するためにテストします

UPDATE2:コードをこれに変更した後。問題は続きます:

#!/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'
2
AlmuHS

最後に、システムバスから信号を受信して​​ユーザーに通知を表示する、ユーザーとして起動されるdbusクライアントを作成しました。

Dbusクライアントコードは https://github.com/AlmuHS/Pendrive_Reminder/blob/work-in-progress/dbus-client/client.py にあります

の中に send-notify.shスクリプト、追加しただけ

 dbus-send --system /org/preminder/mensaje org.preminder.App

Dbusクライアントをユーザーとして実行すると、通知が正しく表示されます

ユーザーがペンドライブを接続すると、クライアントを自動的に起動できるようにしようとしています

続行 スクリプトからdbusクライアントを起動する方法は?

0
AlmuHS

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

pkexecのマンページ から:

その結果、$ DISPLAYおよび$ XAUTHORITY環境変数が設定されていないため、pkexecはX11アプリケーションを別のユーザーとして実行することを許可しません。アクションのorg.freedesktop.policykit.exec.allow_guiアノテーションが空でない値に設定されている場合、これら2つの変数は保持されます。

私はpolkitに精通していません。このルールのためだけにorg.freedesktop.policykit.exec.allow_guiを設定できるかもしれませんし、他の可能性もあります。申し訳ありませんが、すぐに解決策を提供することはできません。

ただし、コアポイントは、notify-sendDISPLAYXAUTHORITYを提供することです。

(私を殴らないでください。汚い解決策は、通知スクリプトにDISPLAY=:0XAUTHORITY=...をハードコーディングすることです。何かが変更されると、これが失敗する可能性があることに注意してください)。


編集:上記の説明に基づいて、複数のユーザーで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)
0
mviereck

@mviereck

この内容で、notify-sendするpolkitポリシーファイルを作成しようとしました

<policyconfig>
<action id="org.freedesktop.notify-send">
<description>Launch notify-send command</description>
<message>Authentication is required to run the gedit</message>
<icon_name>accessories-text-editor</icon_name>
<defaults>
    <allow_any>yes</allow_any>
    <allow_inactive>yes</allow_inactive>
    <allow_active>yes</allow_active>
</defaults>
<annotate key="org.freedesktop.policykit.exec.path">/usr/bin/notify-send</annotate>
<annotate key="org.freedesktop.policykit.exec.allow_gui">true</annotate>
</action>

このファイルを/usr/share/polkit-1/actions/org.freedesktop.policykit.notify-send.policyに入れました

しかし、シャットダウンボタンを押した後、シャットダウンメニューが表示されるまでに時間がかかり、通知が表示されませんでした

0
AlmuHS