ペンドライブを忘れないようにアプリケーションを開発しています。
ペンドライブが本機に接続されている場合は、このアプリケーションをロックする必要があります。この形式では、フラッシュドライブの接続中にユーザーがシステムをシャットダウンしようとすると、システムはシャットダウンロックを解除するためにフラッシュドライブを取り外す必要があることを知らせる通知を表示します。
終了イベントを検出するために、システムに接続されたペンドライブがあることを確認するスクリプトを呼び出す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
。ディスプレイにアクセスできないため失敗します。XAUTHORITY
notify-send
~からpkexec マンページ:
したがって、$ DISPLAYおよび$ XAUTHORITY環境変数が設定されていないため、pkexecは他のユーザーとしてX11アプリケーションを実行できません。ジョブのorg.freedesktop.policykit.exec.allow_guiコメントがnull以外の値に設定されている場合、これら2つの変数は保持されます。
私はpolkitに慣れていません。おそらくorg.freedesktop.policykit.exec.allow_gui
このルールを設定することも、他の可能性もあります。申し訳ありません。既製のソリューションを提供できません。
しかし、重要なのはDISPLAY
科XAUTHORITY
を提供することです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)
答え2
@mviereck
次の内容で通知を送信するための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
ところで、終了ボタンを押した後、終了メニューが表示されるまでに時間がかかり、通知も表示されませんでした。
答え3
最後に、ユーザーとして起動し、システムバスから信号を受信し、ユーザーに通知を表示する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クライアントを起動するには?