diff options
author | Simon Schampijer <simon@schampijer.de> | 2012-03-02 08:38:17 (GMT) |
---|---|---|
committer | Simon Schampijer <simon@schampijer.de> | 2012-03-14 17:28:05 (GMT) |
commit | 99bb52c5dbea01a3ffc9b8821ec12af2536f76ca (patch) | |
tree | 1d19000b07c7c2f9281b2eb8937369895e0d8827 | |
parent | 55a4df2fb8476d295f90767d42f54eca81b37cd9 (diff) |
If available use systemd to reboot/shutdown the system
ConsoleKit is being obsoleted by systemd [1]. Accordingly use the
systemd D-Bus API now to Reboot and PowerOff the system. We keep the
fallback for ConsoleKit around. This adds a dependency on systemd.
[1] http://fedoraproject.org/wiki/Features/ckremoval
Signed-off-by: Simon Schampijer <simon@laptop.org>
Reviewed-by: Manuel QuiƱones <manuq@laptop.org>
-rw-r--r-- | src/jarabe/model/session.py | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/src/jarabe/model/session.py b/src/jarabe/model/session.py index 9b277ff..4e66bdc 100644 --- a/src/jarabe/model/session.py +++ b/src/jarabe/model/session.py @@ -28,6 +28,10 @@ from sugar import env _session_manager = None +def have_systemd(): + return os.access("/sys/fs/cgroup/systemd", 0) >= 0 + + class SessionManager(session.SessionManager): MODE_LOGOUT = 0 MODE_SHUTDOWN = 1 @@ -53,21 +57,38 @@ class SessionManager(session.SessionManager): if env.is_emulator(): self._close_emulator() elif self._logout_mode != self.MODE_LOGOUT: - try: - bus = dbus.SystemBus() - proxy = bus.get_object('org.freedesktop.ConsoleKit', - '/org/freedesktop/ConsoleKit/Manager') - pm = dbus.Interface(proxy, - 'org.freedesktop.ConsoleKit.Manager') - - if self._logout_mode == self.MODE_SHUTDOWN: - pm.Stop() - elif self._logout_mode == self.MODE_REBOOT: - pm.Restart() - except: - logging.exception('Can not stop sugar') - self.session.cancel_shutdown() - return + bus = dbus.SystemBus() + if have_systemd(): + try: + proxy = bus.get_object('org.freedesktop.login1', + '/org/freedesktop/login1') + pm = dbus.Interface(proxy, + 'org.freedesktop.login1.Manager') + + if self._logout_mode == self.MODE_SHUTDOWN: + pm.PowerOff(False) + elif self._logout_mode == self.MODE_REBOOT: + pm.Reboot(True) + except: + logging.exception('Can not stop sugar') + self.session.cancel_shutdown() + return + else: + CONSOLEKIT_DBUS_PATH = '/org/freedesktop/ConsoleKit/Manager' + try: + proxy = bus.get_object('org.freedesktop.ConsoleKit', + CONSOLEKIT_DBUS_PATH) + pm = dbus.Interface(proxy, + 'org.freedesktop.ConsoleKit.Manager') + + if self._logout_mode == self.MODE_SHUTDOWN: + pm.Stop() + elif self._logout_mode == self.MODE_REBOOT: + pm.Restart() + except: + logging.exception('Can not stop sugar') + self.session.cancel_shutdown() + return session.SessionManager.shutdown_completed(self) gtk.main_quit() |