|
|
|
@ -0,0 +1,197 @@
|
|
|
|
|
diff --git client/cl_client.py client/cl_client.py
|
|
|
|
|
index 393f185..71298d8 100644
|
|
|
|
|
--- client/cl_client.py
|
|
|
|
|
+++ client/cl_client.py
|
|
|
|
|
@@ -460,12 +460,14 @@ class Client(commandServer, encrypt):
|
|
|
|
|
"""Mount samba resource"""
|
|
|
|
|
if res in mountUidList:
|
|
|
|
|
# mount by uid
|
|
|
|
|
- mountStr = "mount -t cifs -o user=%s,uid=%s,gid=%s,noperm"\
|
|
|
|
|
+ mountStr = \
|
|
|
|
|
+ "mount -t cifs -o cache=loose,user=%s,uid=%s,gid=%s,noperm"\
|
|
|
|
|
%(userName,uid,gid) +\
|
|
|
|
|
" //%s/%s %s" %(host, res, rpath)
|
|
|
|
|
else:
|
|
|
|
|
# mount by root
|
|
|
|
|
- mountStr = "mount -t cifs -o user=%s"%(userName)+\
|
|
|
|
|
+ mountStr = \
|
|
|
|
|
+ "mount -t cifs -o cache=loose,user=%s"%(userName)+\
|
|
|
|
|
" //%s/%s %s" %(host, res, rpath)
|
|
|
|
|
textLine = self.execProg(mountStr, envProg={"PASSWD":userPwd})
|
|
|
|
|
return textLine
|
|
|
|
|
@@ -523,7 +525,7 @@ class Client(commandServer, encrypt):
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def syncUser(self, userName, userHome, sync, homeTemplate, \
|
|
|
|
|
- host="default"):
|
|
|
|
|
+ host="default",skipList=[]):
|
|
|
|
|
"""
|
|
|
|
|
Sync user profile from server or to server
|
|
|
|
|
"""
|
|
|
|
|
@@ -539,7 +541,7 @@ class Client(commandServer, encrypt):
|
|
|
|
|
deletePaths = []
|
|
|
|
|
excludePaths = " ".join(map(lambda x: '--exclude="/%s"'\
|
|
|
|
|
%x.replace('"',"").replace("'",""),
|
|
|
|
|
- skipPaths + deletePaths))
|
|
|
|
|
+ skipPaths + deletePaths + skipList))
|
|
|
|
|
if sync == "login":
|
|
|
|
|
if os.path.exists(userHome) and\
|
|
|
|
|
os.path.exists(homeTemplate):
|
|
|
|
|
@@ -1277,14 +1279,15 @@ class Client(commandServer, encrypt):
|
|
|
|
|
def tarSymLinks(self,userHome,uid,gid):
|
|
|
|
|
"""Create tar archive of symlinks"""
|
|
|
|
|
linkArch = pathJoin(userHome,".calculate/links.tar.bz2")
|
|
|
|
|
+ symList = []
|
|
|
|
|
try:
|
|
|
|
|
- for filename in tarLinks(userHome,linkArch,
|
|
|
|
|
+ symList = list(tarLinks(userHome,linkArch,
|
|
|
|
|
skip=self.clVars.Get("cl_sync_del_path")+
|
|
|
|
|
- self.clVars.Get("cl_sync_skip_path")):
|
|
|
|
|
- try:
|
|
|
|
|
- os.unlink(filename)
|
|
|
|
|
- except OSError:
|
|
|
|
|
- self.printWARNING(_("Failed to remove %s")%filename)
|
|
|
|
|
+ self.clVars.Get("cl_sync_skip_path")))
|
|
|
|
|
+ #try:
|
|
|
|
|
+ # os.unlink(filename)
|
|
|
|
|
+ #except OSError:
|
|
|
|
|
+ # self.printWARNING(_("Failed to remove %s")%filename)
|
|
|
|
|
except:
|
|
|
|
|
self.printWARNING(_("Failed to make a links archive"))
|
|
|
|
|
try:
|
|
|
|
|
@@ -1292,6 +1295,7 @@ class Client(commandServer, encrypt):
|
|
|
|
|
os.chown(linkArch,uid,gid)
|
|
|
|
|
except:
|
|
|
|
|
self.printWARNING(_("Failed to make a links archive"))
|
|
|
|
|
+ return symList
|
|
|
|
|
|
|
|
|
|
def unpackLinks(self,userHome):
|
|
|
|
|
"""Unpack archive of symlinks"""
|
|
|
|
|
@@ -1598,10 +1602,13 @@ class Client(commandServer, encrypt):
|
|
|
|
|
configFileName = os.path.join(self.homeDir, self.configFileDesktop)
|
|
|
|
|
self.setVarToConfig("main", {"date_logout":currentDateStr},
|
|
|
|
|
configFileName)
|
|
|
|
|
+ skipList = []
|
|
|
|
|
if os.path.exists(self.homeDir):
|
|
|
|
|
self.moveHomeDir(self.homeDir)
|
|
|
|
|
if self.sync:
|
|
|
|
|
- self.tarSymLinks(self.homeDir,self.uid,self.gid)
|
|
|
|
|
+ skipList = self.tarSymLinks(self.homeDir,self.uid,self.gid)
|
|
|
|
|
+ lHomeDir = len(self.homeDir)+1
|
|
|
|
|
+ skipList = map(lambda x:x[lHomeDir:],skipList)
|
|
|
|
|
else:
|
|
|
|
|
raise ClientError(_("Directory %s not found") % self.homeDir)
|
|
|
|
|
# get status sync
|
|
|
|
|
@@ -1626,7 +1633,8 @@ class Client(commandServer, encrypt):
|
|
|
|
|
if self.sync:
|
|
|
|
|
# sync profiles local to domain
|
|
|
|
|
if not self.syncUser(self.userName, self.homeDir, "logout",
|
|
|
|
|
- homeProfile,host=self.domain):
|
|
|
|
|
+ homeProfile,host=self.domain,
|
|
|
|
|
+ skipList=skipList):
|
|
|
|
|
return False
|
|
|
|
|
finally:
|
|
|
|
|
# remove files, which hinder correct dm work
|
|
|
|
|
@@ -1831,6 +1839,9 @@ class Client(commandServer, encrypt):
|
|
|
|
|
|
|
|
|
|
def restartDBus(self):
|
|
|
|
|
"""Restart D-Bus service"""
|
|
|
|
|
+ # перезапуск dbus выключен, в связи с переходом
|
|
|
|
|
+ # на новую схему ввода/вывода в домен
|
|
|
|
|
+ return True
|
|
|
|
|
dbusDaemon = '/sbin/rc-service -i dbus'
|
|
|
|
|
existsDaemon = '/sbin/rc-service -e dbus'
|
|
|
|
|
# if exists dbus and running
|
|
|
|
|
@@ -1911,6 +1922,7 @@ class Client(commandServer, encrypt):
|
|
|
|
|
return False
|
|
|
|
|
reFoundHostSamba = re.compile("Server=\[Samba.+\]")
|
|
|
|
|
resSmbClient = self.execProg("smbclient -N -L %s" %domain)
|
|
|
|
|
+ foundHostSamba = False
|
|
|
|
|
if not resSmbClient is False:
|
|
|
|
|
for string in resSmbClient:
|
|
|
|
|
if reFoundHostSamba.search(string):
|
|
|
|
|
diff --git data/logout data/logout
|
|
|
|
|
new file mode 100644
|
|
|
|
|
index 0000000..09abf5d
|
|
|
|
|
--- /dev/null
|
|
|
|
|
+++ data/logout
|
|
|
|
|
@@ -0,0 +1,50 @@
|
|
|
|
|
+# Calculate chmod=0755
|
|
|
|
|
+#!/bin/bash
|
|
|
|
|
+
|
|
|
|
|
+source /lib/rc/sh/functions.sh
|
|
|
|
|
+
|
|
|
|
|
+variable_value()
|
|
|
|
|
+{
|
|
|
|
|
+ local varname=$1
|
|
|
|
|
+ /usr/sbin/cl-core-variables-show --only-value $varname
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+ONLINE_USERS="`variable_value desktop.cl_desktop_online_user`"
|
|
|
|
|
+
|
|
|
|
|
+# если есть пользователи в сеансе или выполняется выход
|
|
|
|
|
+if [[ -n $ONLINE_USERS ]] || pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
|
|
+then
|
|
|
|
|
+ # есть пользователи в сеансе
|
|
|
|
|
+ if [[ -n $ONLINE_USERS ]]
|
|
|
|
|
+ then
|
|
|
|
|
+ ebegin "Logout users"
|
|
|
|
|
+ # переменная online_data возвращает строки пользователь,дисплей
|
|
|
|
|
+ for user_disp in $(variable_value desktop.cl_desktop_online_data | sed -r "s/;/ /g")
|
|
|
|
|
+ do
|
|
|
|
|
+ user=$(echo $user_disp | cut -d, -f1)
|
|
|
|
|
+ disp=$(echo $user_disp | cut -d, -f2)
|
|
|
|
|
+ # завершаем сессию пользователя
|
|
|
|
|
+ /usr/sbin/cl-core --method desktop_logout $user &>/dev/null
|
|
|
|
|
+ # удаляем запить о пользователе
|
|
|
|
|
+ /usr/bin/sessreg -d -l :$disp $user &>/dev/null
|
|
|
|
|
+ # выполняем принудительный выход из сеанса
|
|
|
|
|
+ USER="$user" /usr/share/calculate/xdm/xdm --logout &>/dev/null &
|
|
|
|
|
+ done
|
|
|
|
|
+ eend 0
|
|
|
|
|
+ fi
|
|
|
|
|
+ # ожидаение завершения процесса выхода пользователя из сеанса
|
|
|
|
|
+ if pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
|
|
+ then
|
|
|
|
|
+ ebegin "Please wait for complete logout"
|
|
|
|
|
+ for i in {1..500}
|
|
|
|
|
+ do
|
|
|
|
|
+ if pgrep -f 'xdm/xdm --logout' &>/dev/null
|
|
|
|
|
+ then
|
|
|
|
|
+ sleep 1
|
|
|
|
|
+ else
|
|
|
|
|
+ break
|
|
|
|
|
+ fi
|
|
|
|
|
+ done
|
|
|
|
|
+ eend 0
|
|
|
|
|
+ fi
|
|
|
|
|
+fi
|
|
|
|
|
diff --git setup.py setup.py
|
|
|
|
|
index a29ca1f..94a48bd 100755
|
|
|
|
|
--- setup.py
|
|
|
|
|
+++ setup.py
|
|
|
|
|
@@ -18,7 +18,7 @@
|
|
|
|
|
# limitations under the License.
|
|
|
|
|
|
|
|
|
|
__app__ = "calculate-client"
|
|
|
|
|
-__version__ = "3.1.4"
|
|
|
|
|
+__version__ = "3.1.5"
|
|
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
import stat
|
|
|
|
|
@@ -33,6 +33,7 @@ import sys
|
|
|
|
|
data_files = []
|
|
|
|
|
|
|
|
|
|
data_files += [('/etc/init.d', ['data/client'])]
|
|
|
|
|
+data_files += [('/usr/sbin', ['data/logout'])]
|
|
|
|
|
data_files += [('/usr/share/calculate/xdm/login.d',
|
|
|
|
|
['data/login.d/10client'])] +\
|
|
|
|
|
[('/usr/share/calculate/xdm/logout.d',
|
|
|
|
|
@@ -74,6 +75,7 @@ class cl_install_data(install_data):
|
|
|
|
|
def run (self):
|
|
|
|
|
install_data.run(self)
|
|
|
|
|
data_file = [("/etc/init.d/client",0755),
|
|
|
|
|
+ ("/usr/sbin/logout",0755),
|
|
|
|
|
("/usr/share/calculate/xdm/wait_domain",0755)]
|
|
|
|
|
fileNames = map(lambda x: os.path.split(x[0])[1], data_file)
|
|
|
|
|
listNames = map(lambda x: filter(lambda y: y, x[0].split("/")),
|