Fórum Root.cz
Hlavní témata => Server => Téma založeno: nonamex 27. 06. 2020, 11:50:17
-
Mám systémovou službu a potřebuju, aby byla obsluhovaná konkrétním uživatelem. Bohužel služba je jen template, a její celé jméno dopředu nevím: my-daemon@<serie alfanumerickych znaku>.service .
Zápis pravidla tímto způsobem funguje perfektně:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
action.lookup("unit") == "my-daemon@foo1.service" &&
subject.user == "user1") {
return polkit.Result.YES;
}
Jen to nefunguje obecně pro template služby, ale pro jedno konkrétní jméno. Zkoušel jsem například tyto zápisy, ale nezdá se, že by polkit dovolil nasadit regexp.
action.lookup("unit") == "my-daemon@*" &&
action.lookup("unit") == "my-daemon@[:alnum:]+" &&
action.lookup("unit") == "my-daemon@foo[0-9]" &&
Našel jsem podobný problém, bohužel řešení v mém případě nefunguje, autor testuje jména configů a v mém případě nejsou. https://unix.stackexchange.com/questions/351052/polkit-rule-for-systemd-template-unit-files .
Napadá vás, jak problém vyřešit?
OS Suse 12.5
Polkit version 0.113
Systemd version 228
-
Podle dokumentace https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html
Rules files are written in the JavaScript programming language
by to neměl být problém: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
Nicméně nezkoušel jsem to.
-
Díky, to byla správná stopa. Ještě mi to nějaké hodiny trvalo pročíst příslušné manuály a otestovat, ale upravené pravidlo funguje přesně jak má:
polkit.addRule(function(action, subject) {
if (action.id == "org.freedesktop.systemd1.manage-units" &&
RegExp('my-daemon@[A-Za-z0-9_-]+.service').test(action.lookup("unit")) === true &&
subject.user == "foo1") {
return polkit.Result.YES;
}
});
Podle manuálu by místo výpisu alfanumerických znaků mělo jít jen \w, ale to mi nefungovalo. Plus jsem to rozšířil o pomlčku. Je důležité si uvědomit, že RegExp je funkce sama o sobě a .test uprostřed řádku říká, aby porovnal vzor (v jednoduchých úvozovkách) s řetězcem, který dostane z výstupu následující funkce - v tomto případě se ptám na jméno služby. Zkoušel jsem všemožné varianty, většina nefungovala, asi se to dá udělat ještě jinak, přehledněji, ale tohle povolí přesně co chci a zatím se mi to nepovedlo oblbnout.