簡體   English   中英

如果文件存在,如何設置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規則使用一個幫助程序,該腳本帶有一個檢查文件是否存在的腳本

detect_pendrive.sh是這樣的:

#!/bin/bash
if ! test -e "/tmp/usbdevinfo" 
then
    exit 0
else
    exit 1
fi

我將規則復制到/usr/share/polkit-1/rules.d/中。 但是,當我嘗試在連接筆式驅動器的情況下關閉時,系統只會關閉電源並忽略該規則。

我在Debian GNOME和Gentoo Cinnamon上測試過

問題出在哪里?

在我的OpenBSD 6.2 GENERIC.MP#134 amd64上您的polkit.rule正常

我不使用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;
    }
 }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM