如果文件存在,如何设置 polkit 规则以锁定关闭?
How to set a polkit rule to lock shutdown if a file exists?
我正在编写一个应用程序来控制在 pendrive 连接到系统时关闭系统。
连接 pendrive 后,它会将其标识符写入文件。如果 pendrive 断开连接,它会删除文件的标识符,然后,如果文件为空,则删除文件。
然后,我想设置一个polkit规则来控制关机,使用这个文件。
polkit 规则检测关机顺序并检查文件是否存在。如果存在则不允许关机,否则允许关机。
我尝试将其设置为这种形式:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop") ||
action.id.indexOf("org.freedesktop.login1.power-off") == 0)
{
try{
polkit.spawn(["/usr/bin/detect_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
return polkit.Result.NO;
}
}
});
polkit 规则使用一个助手,带有一个检查文件是否存在的脚本os
detect_pendrive.sh是这样的:
#!/bin/bash
if ! test -e "/tmp/usbdevinfo"
then
exit 0
else
exit 1
fi
我复制了/usr/share/polkit-1/rules.d/中的规则。但是,当我尝试在连接了 pendrive 的情况下关机时,系统只是关机并忽略了规则。
我在 Debian GNOME 和 Gentoo Cinnamon 上测试过它
哪里会出问题?
你的 polkit.rule 在我的 OpenBSD 6.2 上没问题 GENERIC.MP#134 amd64
我不使用 consolekit 但 org.xfce.session.policy
我的规则文件:
polkit.addRule (function (action, subject) {
if (action.id == "org.xfce.session.xfsm-shutdown-helper") {
try {
polkit.spawn(["/home/alain/polkitspawn.sh",subject.user]);
return polkit.Result.YES;
}
catch (error) {
return "no";
}
}
});
解决方案:
正如@ferrybig 之前所说,polkit 规则不会在 polkit < 0.106
中运行
然后,我用双重策略解决了这个问题:
如果 polkit < 0.106,我创建了这个 .pkla 文件
[Shutdown]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.xfce.session.xfsm-shutdown-helper
ResultAny=no
ResultInactive=yes
ResultActive=no
为了解决这个问题,我使用链接到两个 udev 规则的相同脚本来添加和删除规则。此脚本进一步创建和删除文件,在 pendrive 连接期间添加 .pkla 文件,在断开连接期间,如果文件为空,还删除 .pkla 文件
在 polkit >= 0.106 中,我只是简单地使用初始规则文件,添加一个新动作:
action.id == "org.freedesktop.login1.power-off-multiple-sessions"
规则文件如下:
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;
}
}
});
我正在编写一个应用程序来控制在 pendrive 连接到系统时关闭系统。
连接 pendrive 后,它会将其标识符写入文件。如果 pendrive 断开连接,它会删除文件的标识符,然后,如果文件为空,则删除文件。
然后,我想设置一个polkit规则来控制关机,使用这个文件。 polkit 规则检测关机顺序并检查文件是否存在。如果存在则不允许关机,否则允许关机。
我尝试将其设置为这种形式:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.consolekit.system.stop") ||
action.id.indexOf("org.freedesktop.login1.power-off") == 0)
{
try{
polkit.spawn(["/usr/bin/detect_pendrive.sh", subject.user]);
return polkit.Result.YES;
}catch(error){
return polkit.Result.NO;
}
}
});
polkit 规则使用一个助手,带有一个检查文件是否存在的脚本os
detect_pendrive.sh是这样的:
#!/bin/bash
if ! test -e "/tmp/usbdevinfo"
then
exit 0
else
exit 1
fi
我复制了/usr/share/polkit-1/rules.d/中的规则。但是,当我尝试在连接了 pendrive 的情况下关机时,系统只是关机并忽略了规则。
我在 Debian GNOME 和 Gentoo Cinnamon 上测试过它
哪里会出问题?
你的 polkit.rule 在我的 OpenBSD 6.2 上没问题 GENERIC.MP#134 amd64
我不使用 consolekit 但 org.xfce.session.policy
我的规则文件:
polkit.addRule (function (action, subject) {
if (action.id == "org.xfce.session.xfsm-shutdown-helper") {
try {
polkit.spawn(["/home/alain/polkitspawn.sh",subject.user]);
return polkit.Result.YES;
}
catch (error) {
return "no";
}
}
});
解决方案:
正如@ferrybig 之前所说,polkit 规则不会在 polkit < 0.106
中运行然后,我用双重策略解决了这个问题:
如果 polkit < 0.106,我创建了这个 .pkla 文件
[Shutdown]
Identity=unix-user:*
Action=org.freedesktop.consolekit.system.stop;org.freedesktop.login1.power-off;org.freedesktop.login1.power-off-multiple-sessions;org.xfce.session.xfsm-shutdown-helper
ResultAny=no
ResultInactive=yes
ResultActive=no
为了解决这个问题,我使用链接到两个 udev 规则的相同脚本来添加和删除规则。此脚本进一步创建和删除文件,在 pendrive 连接期间添加 .pkla 文件,在断开连接期间,如果文件为空,还删除 .pkla 文件
在 polkit >= 0.106 中,我只是简单地使用初始规则文件,添加一个新动作:
action.id == "org.freedesktop.login1.power-off-multiple-sessions"
规则文件如下:
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;
}
}
});