systemd 模板单元文件的 Polkit 规则

systemd 模板单元文件的 Polkit 规则

我正在尝试弄清楚如何为 systemd 模板文件编写 polkit 规则。当我使用将被实例化的实际服务 ( [email protected]) 时,会触发该规则,但当我省略实例标识符字符串 ( [email protected]) 时,不会触发该规则。

这是完整的工作规则:

polkit.addRule(function(action, subject) {
  if ( action.id == "org.freedesktop.systemd1.manage-units") {
    if (action.lookup("unit") == "[email protected]" && subject.isInGroup("wheel")) {
      var verb = action.lookup("verb");
      if (verb == "start" || verb == "stop" || verb == "restart") {
        return polkit.Result.YES;
      }
    }
  }
  polkit.log("action=" + action);
  polkit.log("subject=" + subject);
});

我的预感是我可以使用 javascript 正则表达式来将字符串放在“@”和“.service”之间,但我不太明白。

我的 VPN 提供商有许多可能的服务器,每个服务器都有自己的配置(由[电子邮件受保护]模板单元文件),所以我真的不想为模板的每个实例编写 polkit 规则。多谢!

更新:

我根据上面的预感解决了这个问题,使用正则表达式来测试模板文件。这也许不安全?

polkit.addRule(function(action, subject) {
  if ( action.id == "org.freedesktop.systemd1.manage-units") {
      var instance = /openvpn-client@[a-z]+.service/.test(action.lookup("unit"));
    if ( instance === true && subject.isInGroup("wheel")) {
      var verb = action.lookup("verb");
      if (verb == "start" || verb == "stop" || verb == "restart") {
        return polkit.Result.YES;
      }
    }
  }
  polkit.log("action=" + action);
  polkit.log("subject=" + subject);
});

相关内容