úterý 11. října 2011

Počítání sezení s ConsoleKit em

Řešil jsem problém, který spočívá v tom, že pokud je v systému přihlášeno více uživatelů než jeden, vyskočí při pokusu o vypnutí/restartování systému požadavkem na službu ConsoleKit (nevím na koho mocnějšího se obrátit :) okno, které chce akci autorizovat heslem superuživatele. Stačí se v některém terminálu přihlásit jako root pomocí příkazu sudo su (rozumnější sudo -i, sudo -s, nezakládají další session) a můj Shutdown GTimer nesplní svůj úkol. A vzhledem k tomu, že okno System policy po chvíli samo zmizí (alespoň v některých verzích Ubuntu), tak pokud není uživatel očima na monitoru, ani se nedozví proč. V nové verzi by měl být Shutdown GTimer schopen předem na tuto skutečnost upozornit. Tato systémová politika je funkční přinejmenším od Ubuntu 10.04 výš, verze 8.04, kde vypnutí systému ještě řeší HAL, toto omezení neplatí, alespoň pokud jste v rámci GNOME session přihlášeni v emulátoru terminálu jako root.

Služba ConsoleKit je správcem sezení (sessions) a tudíž je to zase ona která dodá informaci, kolik sezení je aktivních a tím zda se dá systém vypnout bez požehnání vyšší moci. Tedy služba dodá seznam, který je nutno spočítat. Šel jsem na to klasicky přes DBus, v příkazovém řádku je dotaz možno formulovat takto:

dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit/Manager org.freedesktop.ConsoleKit.Manager.GetSessions | grep Session | wc -l
nebo takto (vzhledem k tomu, že pro každé sezení založí ConsoleKit uzel (node), který odkazuje na metody a signály určené pro jeho správu):
dbus-send --system --print-reply --dest=org.freedesktop.ConsoleKit /org/freedesktop/ConsoleKit org.freedesktop.DBus.Introspectable.Introspect | grep Session | wc -l

Pro ConsoleKit jsou ovšem v systému pro příkazový řádek přímo příkazy, které se používají jednodušeji a výstup je již formátován, bez xml značek. Příkaz ck-list-sessions vypíše všechna sezení, včetně jejich atributů. Z výpisu lze vyfiltrovat počet sezení takto:

ck-list-sessions | grep ^Session | wc -l

ConsoleKit toho z příkazového řádku nabízí více, můžete si třeba zkontrolovat historii sezení a zjistit, že se vám díky nedostatečně zabezpečenému ssh serveru někdo několikrát naboural do systému :D Více třeba zde:
http://wiki.ubuntu.cz/ConsoleKit 

V Pythonu to samozřejmě řeším bez shellu, ale princip je stejný, navíc tam mám možnost se pověsit na signály, které jsou ConsoleKitem generovány při přidání, či odebrání sezení a na jejich základě aktualizovat stavovou informaci. Pro další verzi Shutdown GTimeru si ale vystačím s detekcí více sezení při aktivaci odpočtu v režimu Vypnutí a Restartu, málokdo asi při tomto použití ocení upozornění o změně situace v průběhu odpočtu. Ještě mě teď napadlo, že pokud spustíte Shutdown GTimer jako root, zmíněné omezení samozřejmě neplatí a tudíž musím v kódu podchytit i tuto situaci. Tak snad brzy, první nástřely jsou již v svn.


Žádné komentáře:

Okomentovat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.