sobota 26. října 2013

Systemd-logind nahrazuje v Ubuntu 13.10 ConsoleKit a UPower

V novém Ubuntu proběhla ještě jedna změna, která není vidět na první pohled. Jde o výměnu správce sezení (sessions), který zajišťuje i logiku přístupu uživatele k funkcím jako je vypnutí a uspání systému. V posledních letech toto zajišťoval právě ConsoleKit, společně s UPower. Služby ConsoleKit i UPower byly z instalace vyřazeny, v systému se objeví pouze jako závislosti konkrétních aplikací, které ještě logind do své výbavy nezařadily. Současně to může přinést problémy při použití aplikací, které na tyto služby spoléhají, ale v závislostech je nemají. Tam spadá i můj SGTimer, který jsem psal s tím, že má být vždy schopen používat aktuální služby systému a nedával je do závislostí instalačního balíku. Ovšem bez aktualizace se to neobejde a tu momentálně sice mám hotovou, ale pouze na rozdělané alfa verzi, kterou přepisuju (velmi pomalu) z Pythonu do Vala. Opuštěné služby lze ale do systému dostat i ruční instalací a ukážu vám, jak vypínat, uspávat, hibernovat a restartovat systém pomocí logind. ...


Je to trochu komplikovanější. logind je součástí systemd, který je náhradou za sysvinit a slouží k zavádění systému, tedy spouští inicializační skripty. Ubuntu si ale vyvinulo vlasní náhradu a tou je Upstart, který používá již pár let, opuštět ho zatím nehodlá a tak ze systemd vyrvali jen logind a nacpali ho na stávající systém. Protože je logind nedílnou a integrovanou součástí systemd, bude podle jeho tvůrců problém s další aktualizací logind v Ubuntu, takže bude vždy dost pozadu.

Pokud budete opuštěné služby potřebovat (například pro Cinnamon 2.0, jak jsem zjistil od jednoho uživatele), můžete si je doinstalovat sami:

sudo apt-get install consolekit upower

Po rebootu vám začne bez problémů fungovat i SGTimer jako doposud.

Systemd-logind

Zajišťuje správu uživatelských sezení a přístup uživatelů k funkcím jako vypnutí a uspání systému v souladu s PolicyKit, tedy systémovou politikou přístupu uživatelů k těmto funkcím. Stará se o hardwarové klávesy Power a Sleep, přepínání uživatelských sezení, správu přístupu uživatelů k zařízením, ...

V systému se nachází v
/lib/systemd/systemd-logind

DBus rozhraní služby se hlásí jako

org.freedesktop.login1

na systémové sběrnici:



Využití login1 z příkazové řádky

Pokud jste si zvykli používat ve svých skriptech vypínání/uspávání systému pomocí DBus rozhraní ConsoleKit a UPower, která nevyžadují zadávání hesla administrátora, jednoduše přejdete na login1, který vám nabídne celý repertoár předchozích dvou služeb.

Vypnutí/Shutdown/Power Off
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.PowerOff boolean:false

Uspání/Suspend
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.Suspend boolean:false

Hibernace
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.Hibernate boolean:false

Reboot/Restart
dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager.Reboot boolean:false

Na dostupnost uvedených služeb se můžete i přeptat předem, stačí z předchozích příkazů umazat část boolean:false a před jméno metody přidat Can:

CanPowerOff, CanSuspend, CanHibernate, CanReboot

Vrátí se vám string "yes", nebo "no" společně s dalším bordelem. Zajímalo by mě, proč z boolean informace udělali string, ale je pravda, že z DBus to stejně leze v XML formátu..

login1 ve Vala

Zkrátka si musíte napsat jiný interface:

[DBus (name= "org.freedesktop.login1.Manager")]
interface Login1 : GLib.Object
{
  public abstract void hibernate (bool interactive = false) throws IOError;
  public abstract void suspend   (bool interactive = false) throws IOError;
  public abstract void power_off (bool interactive = false) throws IOError;
  public abstract void reboot    (bool interactive = false) throws IOError;
  public abstract string can_hibernate () throws IOError;
  public abstract string can_suspend   () throws IOError;
  public abstract string can_power_off () throws IOError;
  public abstract string can_reboot    () throws IOError;
}

l1_proxy = Bus.get_proxy_sync (BusType.SYSTEM,
  "org.freedesktop.login1", "/org/freedesktop/login1");

try {
  if (l1_proxy.can_power_off() == "yes")
    l1_proxy.power_off ();

} catch (IOError e) {
    stderr.printf(e.message);
}


V SGTimeru, který přepisuju do Vala, jsem již podporu login1 dopsal, v blízké době to zas všechno vyexportuju do svn (update: již to tam je). Momentálně mi plně funguje většina funkčnosti, kterou běžný uživatel ocení, jen ukládání předvoleb, indikátor v panelu a WFT modul (čekání na ukončení procesu/okna) chybí. Jde mi to pomalu, protože se rozptyluju psaním rozšíření pro GNOME Shell a dalšími zajímavými kravinami :)


Žá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.