[ovirt-guest-agent] Implementation for logind based session locking

Vinzenz Feenstra evilissimo at fedoraproject.org
Mon Mar 31 07:55:47 UTC 2014


commit c4b5bc2e118b7d6bcb29779ffb04523a71cd1b73
Author: Vinzenz Feenstra <vfeenstr at redhat.com>
Date:   Mon Mar 31 09:55:36 2014 +0200

    Implementation for logind based session locking
    
    Signed-off-by: Vinzenz Feenstra <vfeenstr at redhat.com>

 ...mentation-of-logind-based-session-locking.patch |  155 ++++++++++++++++++++
 ovirt-guest-agent.spec                             |    7 +-
 2 files changed, 161 insertions(+), 1 deletions(-)
---
diff --git a/0001-Implementation-of-logind-based-session-locking.patch b/0001-Implementation-of-logind-based-session-locking.patch
new file mode 100644
index 0000000..72f3e08
--- /dev/null
+++ b/0001-Implementation-of-logind-based-session-locking.patch
@@ -0,0 +1,155 @@
+From 723de8e6075a255cf49df0d16b03cce185580a21 Mon Sep 17 00:00:00 2001
+From: Vinzenz Feenstra <vfeenstr at redhat.com>
+Date: Tue, 18 Feb 2014 11:28:26 +0100
+Subject: [PATCH] Implementation of logind based session locking
+
+Support screen lock for logind based systems, since ConsoleKit
+is no longer developed in the long run this will be the way to
+go.
+
+Change-Id: Iafc4b88d9c508647e1d09407556359fbefbba34c
+Signed-off-by: Vinzenz Feenstra <vfeenstr at redhat.com>
+---
+ ovirt-guest-agent/LockActiveSession.py | 95 ++++++++++++++++++++++++++--------
+ 1 file changed, 74 insertions(+), 21 deletions(-)
+
+diff --git a/ovirt-guest-agent/LockActiveSession.py b/ovirt-guest-agent/LockActiveSession.py
+index aed5aa0..919e975 100755
+--- a/ovirt-guest-agent/LockActiveSession.py
++++ b/ovirt-guest-agent/LockActiveSession.py
+@@ -20,36 +20,87 @@ import logging
+ import os
+ 
+ 
+-def GetActiveSession():
++class SessionWrapper(object):
++    def __init__(self, session, bus, path):
++        self._bus = bus
++        self._path = path
++        self._session = session
++        self._props = GetInterface(bus, 'login1', '', path,
++                                   'org.freedesktop.DBus.Properties')
++
++    def _getProperty(self, name):
++        return self._props.Get('org.freedesktop.login1.Session', name)
++
++    def GetId(self):
++        return self._getProperty('Id')
++
++    def IsActive(self):
++        return self._getProperty('Active')
++
++    def GetX11Display(self):
++        return self._getProperty('Display')
++
++    def GetUnixUser(self):
++        return self._getProperty('User')[0]
++
++    def Lock(self):
++        return self._session.Lock()
++
++
++def GetInterface(bus, service, name, path, fname=None):
++    obj = bus.get_object('org.freedesktop.%s' % service, path)
++    iface = fname
++    if not iface:
++        iface = 'org.freedesktop.%s.%s' % (service, name)
++        if not name:
++            iface = iface[:-1]
++    return dbus.Interface(obj, dbus_interface=iface)
++
++
++def GetInterfaceByName(bus, service, name, isSub):
++    path = '/org/freedesktop/' + service
++    if isSub:
++        path += '/' + name
++    return GetInterface(bus, service, name, path)
++
++
++def GetSessions(manager):
++    try:
++        return manager.GetSessions()
++    except dbus.DBusException:
++        return [x[4] for x in manager.ListSessions()]
++
++
++def GetSession(bus, service, managerIsSub, wrapSession):
+     session = None
+     try:
+-        bus = dbus.SystemBus()
+-        manager = dbus.Interface(
+-            bus.get_object(
+-                'org.freedesktop.ConsoleKit',
+-                '/org/freedesktop/ConsoleKit/Manager'),
+-            dbus_interface='org.freedesktop.ConsoleKit.Manager')
+-        sessions = manager.GetSessions()
+-        for session_path in sessions:
+-            s = dbus.Interface(
+-                bus.get_object(
+-                    'org.freedesktop.ConsoleKit', session_path),
+-                dbus_interface='org.freedesktop.ConsoleKit.Session')
++        manager = GetInterfaceByName(bus, service, 'Manager', managerIsSub)
++        for session_path in GetSessions(manager):
++            s = GetInterface(bus, service, 'Session', session_path)
++            s = wrapSession(s, bus, session_path)
+             if s.IsActive():
+                 session = s
+-    except:
+-        logging.exception("Error retrieving active session (ignore if running "
+-                          "on a system without ConsoleKit installed).")
++                break
++    except dbus.DBusException:
++        logging.exception("%s seems not to be available", service)
++    return session
++
++
++def GetActiveSession():
++    bus = dbus.SystemBus()
++    ARGS = (('ConsoleKit', True, lambda *a: a[0]),
++            ('login1', False, SessionWrapper))
++    for args in ARGS:
++        session = GetSession(bus, *args)
++        if session:
++            break
+     return session
+ 
+ 
+ def GetScreenSaver():
+     try:
+         bus = dbus.SessionBus()
+-        screensaver = dbus.Interface(
+-            bus.get_object(
+-                'org.freedesktop.ScreenSaver', '/ScreenSaver'),
+-            dbus_interface='org.freedesktop.ScreenSaver')
++        screensaver = GetInterface(bus, 'ScreenSaver', '', '/ScreenSaver')
+     except dbus.DBusException:
+         logging.exception("Error retrieving ScreenSaver interface (ignore if "
+                           "running on GNOME).")
+@@ -70,6 +121,7 @@ def LockSession(session):
+             screensaver.Lock()
+             exitcode = 0
+         else:
++            logging.info("KDE standard interface seems not to be supported")
+             exitcode = 1
+         os._exit(exitcode)
+ 
+@@ -78,6 +130,7 @@ def LockSession(session):
+ 
+     # If our first try failed, try the GNOME "standard" interface.
+     if result[1] != 0:
++        logging.info("Attempting session lock via ConsoleKit/LoginD")
+         session.Lock()
+ 
+ 
+@@ -87,7 +140,7 @@ def main():
+         try:
+             LockSession(session)
+             logging.info("Session %s should be locked now.", session.GetId())
+-        except:
++        except dbus.DBusException:
+             logging.exception("Error while trying to lock session.")
+     else:
+         logging.error("Error locking session (no active session).")
+-- 
+1.8.5.3
+
diff --git a/ovirt-guest-agent.spec b/ovirt-guest-agent.spec
index bc988cf..7a414d4 100644
--- a/ovirt-guest-agent.spec
+++ b/ovirt-guest-agent.spec
@@ -1,5 +1,5 @@
 
-%global release_version 1
+%global release_version 2
 %global _moduledir /%{_lib}/security
 
 # Note this is not building any package
@@ -12,6 +12,7 @@ Group: Applications/System
 License: ASL 2.0
 URL: http://wiki.ovirt.org/wiki/Category:Ovirt_guest_agent
 Source0: http://evilissimo.fedorapeople.org/releases/ovirt-guest-agent/%{version}/%{name}-%{version}.tar.bz2
+Patch1: 0001-Implementation-of-logind-based-session-locking.patch
 BuildRequires: libtool
 BuildRequires: pam-devel
 BuildRequires: python2-devel
@@ -105,6 +106,7 @@ oVirt automatic log-in system.
 
 %prep
 %setup -q -n ovirt-guest-agent-%{version}
+%patch1 -p1
 
 %build
 %configure \
@@ -225,6 +227,9 @@ fi
 %attr (755,root,root) %{_libdir}/kde4/kgreet_ovirtcred.so
 
 %changelog
+* Mon Mar 31 2014 Vinzenz Feenstra <evilissimo at redhat.com> - 1.0.9-2
+- Support for logind based session locking
+
 * Mon Jan 20 2014 Vinzenz Feenstra <evilissimo at redhat.com> - 1.0.9-1
 - Report swap usage of guests
 - Updated pam conversation approach


More information about the scm-commits mailing list