1

如果笔式驱动器连接到系统,我正在编写一个应用程序来控制系统关闭。

当 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 规则使用一个助手,带有一个检查文件是否存在的脚本

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 上测试了它

问题可能出在哪里?

4

2 回答 2

1

你的 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";
    }
  }
});
于 2018-02-17T22:18:56.540 回答
1

解决方案:

正如@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;
    }
 }
});
于 2018-02-19T12:46:33.693 回答