|
|
|
@ -25,7 +25,8 @@ import traceback
|
|
|
|
|
from datavars import DataVarsDesktop, DataVars, __version__,__app__
|
|
|
|
|
|
|
|
|
|
from calculate.lib.cl_template import Template, ProgressTemplate,TemplatesError
|
|
|
|
|
from calculate.lib.utils.files import runOsCommand, isMount
|
|
|
|
|
from calculate.lib.utils.files import runOsCommand, isMount,process, \
|
|
|
|
|
getRunCommands
|
|
|
|
|
from calculate.lib.utils.common import getpathenv,appendProgramToEnvFile, \
|
|
|
|
|
removeProgramToEnvFile
|
|
|
|
|
from calculate.core.server.func import safetyWrapper
|
|
|
|
@ -33,6 +34,7 @@ from calculate.core.server.func import safetyWrapper
|
|
|
|
|
from calculate.lib.cl_lang import setLocalTranslate,getLazyLocalTranslate
|
|
|
|
|
setLocalTranslate('cl_desktop3',sys.modules[__name__])
|
|
|
|
|
__ = getLazyLocalTranslate(_)
|
|
|
|
|
from itertools import ifilter
|
|
|
|
|
|
|
|
|
|
class DesktopError(Exception):
|
|
|
|
|
"""Desktop Error"""
|
|
|
|
@ -237,3 +239,50 @@ class Desktop:
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@safetyWrapper(native_errors=(TemplatesError,DesktopError),
|
|
|
|
|
man_int=__("Logout manually interrupted"),
|
|
|
|
|
post_action=umountUserRes,
|
|
|
|
|
success_message=__("The user logged out from the session!"),
|
|
|
|
|
failed_message=__("Unable to logout the user"))
|
|
|
|
|
def userLogout(self, datavars=None):
|
|
|
|
|
"""
|
|
|
|
|
Raise user logout throught dbus
|
|
|
|
|
"""
|
|
|
|
|
self.initVars(datavars)
|
|
|
|
|
if not self.clVars.Get('ur_login') in \
|
|
|
|
|
self.clVars.Get('cl_desktop_online_user'):
|
|
|
|
|
raise DesktopError(_("X session users not found"))
|
|
|
|
|
urLogin = self.clVars.Get('ur_login')
|
|
|
|
|
display = self.clVars.Select('cl_desktop_online_display',
|
|
|
|
|
where='cl_desktop_online_user',eq=urLogin,limit=1)
|
|
|
|
|
session = self.clVars.Get('cl_desktop_xsession')
|
|
|
|
|
if session == 'xfce':
|
|
|
|
|
logoutCommand = "org.xfce.SessionManager " \
|
|
|
|
|
"/org/xfce/SessionManager Logout False False"
|
|
|
|
|
elif session == 'kde':
|
|
|
|
|
logoutCommand = "org.kde.ksmserver /KSMServer logout 0 0 0"
|
|
|
|
|
elif session == 'gnome':
|
|
|
|
|
logoutCommand = "org.gnome.SessionManager " \
|
|
|
|
|
"/org/gnome/SessionManager Logout 1"
|
|
|
|
|
else:
|
|
|
|
|
raise DesktopError(_("Unable detect X session"))
|
|
|
|
|
if process("su",urLogin,"-c",
|
|
|
|
|
("DISPLAY=:%s /usr/bin/qdbus "%display)+logoutCommand).failed():
|
|
|
|
|
raise DesktopError(_("Unable send logout command"))
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
if filter(lambda x: "xdm/xdm\x00--logout" in x,
|
|
|
|
|
getRunCommands()):
|
|
|
|
|
self.startTask(_("Waiting for completion of the user logout"))
|
|
|
|
|
for i in range(0,10):
|
|
|
|
|
if not filter(lambda x: "xdm/xdm\x00--logout" in x,
|
|
|
|
|
getRunCommands()):
|
|
|
|
|
return True
|
|
|
|
|
time.sleep(1)
|
|
|
|
|
self.endTask()
|
|
|
|
|
else:
|
|
|
|
|
raise DesktopError(_("Unable to wait for completion "
|
|
|
|
|
"of the user logout"))
|
|
|
|
|
if self.clVars.Get('ur_login') in \
|
|
|
|
|
self.clVars.Get('cl_desktop_online_user'):
|
|
|
|
|
raise DesktopError(_("Wrong logout"))
|
|
|
|
|
return True
|
|
|
|
|