J'essaie de comprendre comment écrire une règle polkit pour un fichier de modèle systemd. La règle est déclenchée lorsque j'utilise le service réel qui sera instancié ([email protected]
) mais pas lorsque j'omets la chaîne d'identifiant d'instance ([email protected]
).
Voici la règle de fonctionnement complète :
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);
});
Mon intuition est que je pourrais utiliser javascript regex pour simplement glob la chaîne entre "@" et ".service" mais je n'arrive pas à comprendre.
Mon fournisseur VPN a de nombreux serveurs possibles, chacun avec sa propre configuration (référencée par le fichier d'unité de modèle [protégé par e-mail]), donc j'aimerais vraiment ne pas avoir à écrire une règle polkit pour chaque instance du modèle.
Merci beaucoup !
Mise à jour :
J'ai résolu cela selon mon intuition ci-dessus, en utilisant regex pour tester le fichier de modèle. C'est peut-être dangereux ?
polkit.addRule(function(action, subject) {
if ( action.id == "org.freedesktop.systemd1.manage-units") {
var instance = /[email protected][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);
});