私はペンドライブを忘れないようにアプリケーションを開発しています。
ペンドライブがマシンに接続されている場合、このアプリはシャットダウンをロックする必要があります。このフォームのように、ユーザーがペンドライブの接続中にシステムをシャットダウンしたい場合、システムは、シャットダウンのロックを解除するためにペンドライブを切断する必要があることを警告する通知を表示します。
シャットダウンイベントを検出するために、スクリプトを呼び出す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'
最後に、システムバスから信号を受信してユーザーに通知を表示する、ユーザーとして起動される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クライアントをユーザーとして実行すると、通知が正しく表示されます
ユーザーがペンドライブを接続すると、クライアントを自動的に起動できるようにしようとしています
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-send
にDISPLAY
とXAUTHORITY
を提供することです。
(私を殴らないでください。汚い解決策は、通知スクリプトに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)
@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
に入れました
しかし、シャットダウンボタンを押した後、シャットダウンメニューが表示されるまでに時間がかかり、通知が表示されませんでした