From 9a7914eee9417f0d20665b2b4074881bb85fcc3d Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sat, 18 Aug 2012 14:05:52 +0200 Subject: [PATCH] Consolidate systemd and consolekit in a common abstract class Various code around had different paths for ConsoleKit and logind. Consolidate it by making an abstract class that all callers can use, which hides the implementation details of the two daemons. https://bugzilla.gnome.org/show_bug.cgi?id=682096 --- js/Makefile.am | 3 +- js/gdm/powerMenu.js | 76 +++------------ js/misc/consoleKit.js | 55 ----------- js/misc/loginManager.js | 197 ++++++++++++++++++++++++++++++++++++++ js/misc/systemd.js | 44 --------- js/ui/automountManager.js | 25 ++--- js/ui/screenShield.js | 16 +--- 7 files changed, 223 insertions(+), 193 deletions(-) delete mode 100644 js/misc/consoleKit.js create mode 100644 js/misc/loginManager.js delete mode 100644 js/misc/systemd.js diff --git a/js/Makefile.am b/js/Makefile.am index 37c4a9278..a98ffb065 100644 --- a/js/Makefile.am +++ b/js/Makefile.am @@ -23,15 +23,14 @@ nobase_dist_js_DATA = \ gdm/util.js \ extensionPrefs/main.js \ misc/config.js \ - misc/consoleKit.js \ misc/extensionUtils.js \ misc/fileUtils.js \ misc/gnomeSession.js \ misc/history.js \ misc/jsParse.js \ + misc/loginManager.js \ misc/modemManager.js \ misc/params.js \ - misc/systemd.js \ misc/util.js \ perf/core.js \ ui/altTab.js \ diff --git a/js/gdm/powerMenu.js b/js/gdm/powerMenu.js index e06c7a268..b2c05f129 100644 --- a/js/gdm/powerMenu.js +++ b/js/gdm/powerMenu.js @@ -21,8 +21,7 @@ const Lang = imports.lang; const UPowerGlib = imports.gi.UPowerGlib; -const ConsoleKit = imports.misc.consoleKit; -const Systemd = imports.misc.systemd; +const LoginManager = imports.misc.loginManager; const PanelMenu = imports.ui.panelMenu; const PopupMenu = imports.ui.popupMenu; @@ -35,10 +34,7 @@ const PowerMenuButton = new Lang.Class({ this.parent('system-shutdown', null); this._upClient = new UPowerGlib.Client(); - if (Systemd.haveSystemd()) - this._systemdLoginManager = new Systemd.SystemdLoginManager(); - else - this._consoleKitManager = new ConsoleKit.ConsoleKitManager(); + this._loginManager = LoginManager.getLoginManager(); this._createSubMenu(); @@ -65,57 +61,19 @@ const PowerMenuButton = new Lang.Class({ }, _updateHaveShutdown: function() { - - if (Systemd.haveSystemd()) { - this._systemdLoginManager.CanPowerOffRemote(Lang.bind(this, - function(result, error) { - if (!error) - this._haveShutdown = result[0] != 'no'; - else - this._haveShutdown = false; - - this._powerOffItem.actor.visible = this._haveShutdown; - this._updateVisibility(); - })); - } else { - this._consoleKitManager.CanStopRemote(Lang.bind(this, - function(result, error) { - if (!error) - this._haveShutdown = result[0]; - else - this._haveShutdown = false; - - this._powerOffItem.actor.visible = this._haveShutdown; - this._updateVisibility(); - })); - } + this._loginManager.canPowerOff(Lang.bind(this, function(result) { + this._haveShutdown = result; + this._powerOffItem.actor.visible = this._haveShutdown; + this._updateVisibility(); + })); }, _updateHaveRestart: function() { - - if (Systemd.haveSystemd()) { - this._systemdLoginManager.CanRebootRemote(Lang.bind(this, - function(result, error) { - if (!error) - this._haveRestart = result[0] != 'no'; - else - this._haveRestart = false; - - this._restartItem.actor.visible = this._haveRestart; - this._updateVisibility(); - })); - } else { - this._consoleKitManager.CanRestartRemote(Lang.bind(this, - function(result, error) { - if (!error) - this._haveRestart = result[0]; - else - this._haveRestart = false; - - this._restartItem.actor.visible = this._haveRestart; - this._updateVisibility(); - })); - } + this._loginManager.canReboot(Lang.bind(this, function(result) { + this._haveRestart = result; + this._restartItem.actor.visible = this._haveRestart; + this._updateVisibility(); + })); }, _updateHaveSuspend: function() { @@ -152,19 +110,13 @@ const PowerMenuButton = new Lang.Class({ if (!this._haveRestart) return; - if (Systemd.haveSystemd()) - this._systemdLoginManager.RebootRemote(true); - else - this._consoleKitManager.RestartRemote(); + this._loginManager.reboot(); }, _onActivatePowerOff: function() { if (!this._haveShutdown) return; - if (Systemd.haveSystemd()) - this._systemdLoginManager.PowerOffRemote(true); - else - this._consoleKitManager.StopRemote(); + this._loginManager.powerOff(); } }); diff --git a/js/misc/consoleKit.js b/js/misc/consoleKit.js deleted file mode 100644 index 96afd5ac8..000000000 --- a/js/misc/consoleKit.js +++ /dev/null @@ -1,55 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; - -const ConsoleKitManagerIface = - - - - - - - - - - - -; - -const ConsoleKitSessionIface = - - - - - - - - -; - -const ConsoleKitSessionProxy = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); - -const ConsoleKitManagerInfo = Gio.DBusInterfaceInfo.new_for_xml(ConsoleKitManagerIface); - -function ConsoleKitManager() { - var self = new Gio.DBusProxy({ g_connection: Gio.DBus.system, - g_interface_name: ConsoleKitManagerInfo.name, - g_interface_info: ConsoleKitManagerInfo, - g_name: 'org.freedesktop.ConsoleKit', - g_object_path: '/org/freedesktop/ConsoleKit/Manager', - g_flags: Gio.DBusProxyFlags.DO_NOT_LOAD_PROPERTIES }); - self.init(null); - - self.GetCurrentSessionRemote(function([session]) { - self.ckSession = new ConsoleKitSessionProxy(Gio.DBus.system, 'org.freedesktop.ConsoleKit', session); - - self.ckSession.connectSignal('ActiveChanged', function(object, senderName, [isActive]) { - self.sessionActive = isActive; - }); - self.ckSession.IsActiveRemote(function([isActive]) { - self.sessionActive = isActive; - }); - }); - - return self; -} diff --git a/js/misc/loginManager.js b/js/misc/loginManager.js new file mode 100644 index 000000000..b7c26c369 --- /dev/null +++ b/js/misc/loginManager.js @@ -0,0 +1,197 @@ +// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- + +const GLib = imports.gi.GLib; +const Gio = imports.gi.Gio; +const Lang = imports.lang; +const Shell = imports.gi.Shell; + +const SystemdLoginManagerIface = + + + + + + + + + + + + +; + +const SystemdLoginSessionIface = + + +; + +const SystemdLoginManager = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); +const SystemdLoginSession = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); + +const ConsoleKitManagerIface = + + + + + + + + + + + +; + +const ConsoleKitSessionIface = + + + + + + + + +; + +const ConsoleKitSession = Gio.DBusProxy.makeProxyWrapper(ConsoleKitSessionIface); +const ConsoleKitManager = Gio.DBusProxy.makeProxyWrapper(ConsoleKitManagerIface); + +function haveSystemd() { + return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0; +} + +let _loginManager = null; + +/** + * LoginManager: + * An abstraction over systemd/logind and ConsoleKit. + * + */ +function getLoginManager() { + if (_loginManager == null) { + if (haveSystemd()) + _loginManager = new LoginManagerSystemd(); + else + _loginManager = new LoginManagerConsoleKit(); + } + + return _loginManager; +} + +const LoginManagerSystemd = new Lang.Class({ + Name: 'LoginManagerSystemd', + + _init: function() { + this._proxy = new SystemdLoginManager(Gio.DBus.system, + 'org.freedesktop.login1', + '/org/freedesktop/login1'); + }, + + // Having this function is a bit of a hack since the Systemd and ConsoleKit + // session objects have different interfaces - but in both cases there are + // Lock/Unlock signals, and that's all we count upon at the moment. + getCurrentSessionProxy: function() { + if (!this._currentSession) { + this._currentSession = new SystemdLoginSession(Gio.DBus.system, + 'org.freedesktop.login1', + '/org/freedesktop/login1/session/' + + GLib.getenv('XDG_SESSION_ID')); + } + + return this._currentSession; + }, + + get sessionActive() { + return Shell.session_is_active_for_systemd(); + }, + + canPowerOff: function(asyncCallback) { + this._proxy.CanPowerOffRemote(function(result, error) { + if (error) + asyncCallback(false); + else + asyncCallback(result[0] != 'no'); + }); + }, + + canReboot: function(asyncCallback) { + this._proxy.CanRebootRemote(function(result, error) { + if (error) + asyncCallback(false); + else + asyncCallback(result[0] != 'no'); + }); + }, + + powerOff: function() { + this._proxy.PowerOffRemote(true); + }, + + reboot: function() { + this._proxy.RebootRemote(true); + } +}); + +const LoginManagerConsoleKit = new Lang.Class({ + Name: 'LoginManagerConsoleKit', + + _init: function() { + this._proxy = new ConsoleKitManager(Gio.DBus.system, + 'org.freedesktop.ConsoleKit', + '/org/freedesktop/ConsoleKit/Manager'); + }, + + // Having this function is a bit of a hack since the Systemd and ConsoleKit + // session objects have different interfaces - but in both cases there are + // Lock/Unlock signals, and that's all we count upon at the moment. + getCurrentSessionProxy: function() { + if (!this._currentSession) { + let [currentSessionId] = this._proxy.GetCurrentSessionSync(); + this._currentSession = new ConsoleKitSession(Gio.DBus.system, + 'org.freedesktop.ConsoleKit', + currentSessionId); + } + + return this._currentSession; + }, + + get sessionActive() { + if (this._sessionActive !== undefined) + return this._sessionActive; + + let session = this.getCurrentSessionProxy(); + session.connectSignal('ActiveChanged', Lang.bind(this, function(object, senderName, [isActive]) { + this._sessionActive = isActive; + })); + [this._sessionActive] = session.IsActiveSync(); + + return this._sessionActive; + }, + + canPowerOff: function(asyncCallback) { + this._proxy.CanStopRemote(function(result, error) { + if (error) + asyncCallback(false); + else + asyncCallback(result[0]); + }); + }, + + canReboot: function(asyncCallback) { + this._proxy.CanRestartRemote(function(result, error) { + if (error) + asyncCallback(false); + else + asyncCallback(result[0]); + }); + }, + + powerOff: function() { + this._proxy.StopRemote(); + }, + + reboot: function() { + this._proxy.RestartRemote(); + } + +}); diff --git a/js/misc/systemd.js b/js/misc/systemd.js deleted file mode 100644 index 39ef12933..000000000 --- a/js/misc/systemd.js +++ /dev/null @@ -1,44 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const GLib = imports.gi.GLib; -const Gio = imports.gi.Gio; - -const SystemdLoginManagerIface = - - - - - - - - - - - - -; - -const SystemdLoginSessionIface = - - -; - -const SystemdLoginManagerProxy = Gio.DBusProxy.makeProxyWrapper(SystemdLoginManagerIface); - -const SystemdLoginSessionProxy = Gio.DBusProxy.makeProxyWrapper(SystemdLoginSessionIface); - -function SystemdLoginManager() { - return new SystemdLoginManagerProxy(Gio.DBus.system, - 'org.freedesktop.login1', - '/org/freedesktop/login1'); -}; - -function SystemdLoginSession(id) { - return new SystemdLoginSessionProxy(Gio.DBus.system, - 'org.freedesktop.login1', - '/org/freedesktop/login1/session/' + id); -} - -function haveSystemd() { - return GLib.access("/sys/fs/cgroup/systemd", 0) >= 0; -} diff --git a/js/ui/automountManager.js b/js/ui/automountManager.js index 19f2aca66..a49eb1794 100644 --- a/js/ui/automountManager.js +++ b/js/ui/automountManager.js @@ -7,11 +7,10 @@ const Gio = imports.gi.Gio; const Params = imports.misc.params; const Shell = imports.gi.Shell; -const ConsoleKit = imports.misc.consoleKit; const GnomeSession = imports.misc.gnomeSession; +const LoginManager = imports.misc.loginManager; const Main = imports.ui.main; const ShellMountOperation = imports.ui.shellMountOperation; -const Systemd = imports.misc.systemd; const GNOME_SESSION_AUTOMOUNT_INHIBIT = 16; @@ -34,8 +33,7 @@ const AutomountManager = new Lang.Class({ Lang.bind(this, this._InhibitorsChanged)); this._inhibited = false; - if (!Systemd.haveSystemd()) - this.ckListener = new ConsoleKit.ConsoleKitManager(); + this._loginManager = LoginManager.getLoginManager(); Main.screenShield.connect('lock-status-changed', Lang.bind(this, this._lockStatusChanged)); @@ -92,21 +90,10 @@ const AutomountManager = new Lang.Class({ return false; }, - isSessionActive: function() { - // Return whether the current session is active, using the - // right mechanism: either systemd if available or ConsoleKit - // as fallback. - - if (Systemd.haveSystemd()) - return Shell.session_is_active_for_systemd(); - - return this.ckListener.sessionActive; - }, - _onDriveConnected: function() { // if we're not in the current ConsoleKit session, // or screensaver is active, don't play sounds - if (!this.isSessionActive()) + if (!this._loginManager.sessionActive) return; if (Main.screenShield.locked) @@ -118,7 +105,7 @@ const AutomountManager = new Lang.Class({ _onDriveDisconnected: function() { // if we're not in the current ConsoleKit session, // or screensaver is active, don't play sounds - if (!this.isSessionActive()) + if (!this._loginManager.sessionActive) return; if (Main.screenShield.locked) @@ -130,7 +117,7 @@ const AutomountManager = new Lang.Class({ _onDriveEjectButton: function(monitor, drive) { // TODO: this code path is not tested, as the GVfs volume monitor // doesn't emit this signal just yet. - if (!this.isSessionActive()) + if (!this._loginManager.sessionActive) return; // we force stop/eject in this case, so we don't have to pass a @@ -170,7 +157,7 @@ const AutomountManager = new Lang.Class({ if (params.checkSession) { // if we're not in the current ConsoleKit session, // don't attempt automount - if (!this.isSessionActive()) + if (!this._loginManager.sessionActive) return; if (Main.screenShield.locked) { diff --git a/js/ui/screenShield.js b/js/ui/screenShield.js index e82386314..74996da87 100644 --- a/js/ui/screenShield.js +++ b/js/ui/screenShield.js @@ -9,13 +9,12 @@ const Meta = imports.gi.Meta; const Signals = imports.signals; const St = imports.gi.St; -const ConsoleKit = imports.misc.consoleKit; const GnomeSession = imports.misc.gnomeSession; const Layout = imports.ui.layout; +const LoginManager = imports.misc.loginManager; const Lightbox = imports.ui.lightbox; const Main = imports.ui.main; const MessageTray = imports.ui.messageTray; -const Systemd = imports.misc.systemd; const Tweener = imports.ui.tweener; const SCREENSAVER_SCHEMA = 'org.gnome.desktop.screensaver'; @@ -341,15 +340,10 @@ const ScreenShield = new Lang.Class({ this._onStatusChanged(status); })); - if (Systemd.haveSystemd()) { - this._systemdProxy = new Systemd.SystemdLoginSession(GLib.getenv('XDG_SESSION_ID')); - this._systemdProxy.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); - this._systemdProxy.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); - } else { - this._consoleKitProxy = new ConsoleKit.ConsoleKitManager(); - this._consoleKitProxy.ckSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); - this._consoleKitProxy.ckSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); - } + this._loginManager = LoginManager.getLoginManager(); + this._loginSession = this._loginManager.getCurrentSessionProxy(); + this._loginSession.connectSignal('Lock', Lang.bind(this, function() { this.lock(false); })); + this._loginSession.connectSignal('Unlock', Lang.bind(this, function() { this.unlock(); })); this._settings = new Gio.Settings({ schema: SCREENSAVER_SCHEMA });