Добавлена поддержка синхронизации пользовательских профилей через rsync-ssh

legacy 2.1.20
parent 4dcd8e86e5
commit 8b7901bbf2

@ -58,6 +58,35 @@ acl:
local:
user_regexp:
- ""
#?pkg(ejabberd)>=20.04#
access_rules:
announce:
- allow: admin
c2s:
- deny: blocked
- allow
configure:
- allow: admin
local:
- allow: local
muc:
- allow
muc_admin:
- allow: admin
pubsub_createnode:
- allow
register:
- allow
host_config:
"localhost":
access:
c2s:
- allow: admin
- deny
register:
- deny
#pkg#
#?pkg(ejabberd)<20.04#
access:
announce:
admin: allow
@ -91,6 +120,7 @@ host_config:
all: deny
register:
all: deny
#pkg#
language: "en"
modules:
mod_adhoc: []
@ -122,7 +152,12 @@ modules:
mod_pubsub:
access_createnode: pubsub_createnode
plugins:
#?pkg(ejabberd)>=20.04#
- "flat"
#pkg#
#?pkg(ejabberd)<20.04#
- "default"
#pkg#
- "pep"
mod_register:
welcome_message:

@ -0,0 +1,8 @@
# /etc/conf.d/calculate-profile: config file for /etc/init.d/calculate-profile
SSHD_CONFDIR="${RC_PREFIX%/}/etc/ssh"
SSHD_CONFIG="${SSHD_CONFDIR}/sshd_profile_config"
SSHD_OPTS=""
rc_want="sshd"

@ -0,0 +1 @@
# Calculate link=/etc/init.d/sshd symbolic force

@ -10,8 +10,7 @@ chown=root:root
# Права на создание файлов
# --------------------------------------------------------------------
#маска создаваемых директорий для Windows и cifs-клиентов
directory mask = 0755
#?pkg(samba)<4.10#
#маска для изменения прав на директории для cifs-клиентов
directory security mask = 0755
#маска создаваемых директорий для smbfs-клиентов
@ -20,11 +19,27 @@ chown=root:root
#для cifs и smbfs клиентов
security mask = 0644
force security mode = 0644
#pkg#
#?pkg(samba)>=4.10#
!directory security mask =
!force directory security mode =
!security mask =
!force security mode =
#pkg#
#маска создаваемых директорий для Windows и cifs-клиентов
directory mask = 0755
force directory mode = 0755
#права файлов на создаваемые и модифицируемые файлы из Windows
create mask = 0644
force create mode = 0644
#?pkg(samba)<4.10#
# добавление админских привилегий в домене группе Domain Admins
enable privileges = yes
#pkg#
#?pkg(samba)>=4.10#
!enable privileges =
#pkg#
# Настройки LDAP
# --------------------------------------------------------------------
@ -59,7 +74,12 @@ chown=root:root
dos charset = 866
unix charset = UTF-8
#?pkg(samba)<4.10#
display charset = UTF-8
#pkg#
#?pkg(samba)>=4.10#
!display charset =
#pkg#
local master = yes
domain master = yes
@ -79,14 +99,25 @@ chown=root:root
#interfaces = 127.0.0.1 eth0
map to guest = bad user
security = user
#?pkg(samba)<4.11#
encrypt passwords = yes
#pkg#
#?pkg(samba)>=4.11#
!encrypt passwords =
#pkg#
# Запрет изменения пароля пользователя windows компьютера
unix password sync = yes
unix password sync = no
#?pkg(samba)<4.11#
null passwords = no
#pkg#
#?pkg(samba)>=4.11#
!null passwords =
#pkg#
hide unreadable = yes
hide dot files = yes
socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192
server min protocol = NT1
# Поддержка wins
# --------------------------------------------------------------------
@ -108,6 +139,8 @@ chown=root:root
valid users = %U
read only = No
browseable = No
root preexec = /usr/lib/calculate/calculate-server/bin/execsamba -s --makedir %U
root postexec = /usr/lib/calculate/calculate-server/bin/execsamba -s --logout %U
[profiles]
path = #-sr_samba_winprof_path-#
@ -124,12 +157,24 @@ chown=root:root
path = #-sr_samba_linprof_path-#/%u
browseable = No
writable = yes
#?pkg(samba)<4.11#
directory mask = 0777
directory security mask = 0777
force directory security mode = 0
create mask = 0777
security mask = 0777
force security mode = 0
#pkg#
#?pkg(samba)>=4.11#
!directory security mask =
!force directory security mode =
!security mask =
!force security mode =
directory mask = 0777
force directory mode = 0
create mask = 0777
force create mode = 0
#pkg#
force user = %U
valid users = %U
hide unreadable = no
@ -162,7 +207,7 @@ chown=root:root
browseable = No
writable = yes
hide unreadable = yes
#?pkg(net-fs/samba)>=3.5.8#
#?pkg(net-fs/samba)<4.11#
security mask = 0664
force create mode = 0664
force security mode = 0664
@ -170,6 +215,16 @@ chown=root:root
force directory mode = 2775
vfs objects = acl_xattr fake_perms
#pkg#
#pkg(net-fs/samba)>=4.11#
force create mode = 0664
force directory mode = 2775
!security mask =
!force directory security mode =
vfs objects = acl_xattr
inherit acls = yes
inherit owner = yes
inherit permissions = yes
#pkg#
#Удаляем ресурс для FTP - сервис FTP не установлен
#?sr_ftp_set==off#

@ -0,0 +1,13 @@
Port 2009
UsePAM yes
PrintMotd no
PrintLastLog no
UseDNS no
PidFile /run/calculate-profile.pid
DenyUsers guest
ForceCommand /usr/libexec/calculate/cl-rsync-profile
PermitTTY no
DisableForwarding yes
PermitUserRC no
AllowAgentForwarding no
AllowTcpForwarding no

@ -0,0 +1,18 @@
# Calculate chmod=0755 chown=root:root
#!/bin/bash
RSYNC_CONFIG_FILE="/tmp/rsync.$USER.$$"
cat >$RSYNC_CONFIG_FILE <<EOF
use chroot = false
read only = false
[profile]
path = #-sr_samba_linprof_path-#/$USER
EOF
if ! /usr/bin/rsync --config $RSYNC_CONFIG_FILE --server --daemon .
then
rm -f #-sr_samba_linprof_path-#/$USER/*/.logout
fi
rm -f $RSYNC_CONFIG_FILE
exit 0

@ -45,7 +45,7 @@ from xml import xpath
# Для 32 битного целого (генерация серийного номера DNS зоны)
import ctypes
Version = "calculate-server 2.1.18"
Version = "calculate-server 2.1.20"
tr = cl_base.lang()
tr.setLanguage(sys.modules[__name__])
@ -312,7 +312,7 @@ class shareLdap(imp_cl_err, imp_cl_xml, imp_cl_help, imp_cl_smcon, prnServ):
# Сервисы и демоны
servicesDaemons = {"ldap":["slapd"],
"unix":["slapd"],
"samba":["samba"],
"samba":["samba", "calculate-profile"],
"mail":["postfix","dovecot"],
"mail_relay":["postfix"],
"jabber":["ejabberd"],
@ -1035,6 +1035,7 @@ in a sambaDomainName',
"dovecot":("dovecot","master.pid"),
"proftpd":("","proftpd.pid"),
"squid":("","squid.pid"),
"calculate-profile":("","calculate-profile.pid"),
"sortmilter":("","sortmilter.pid")}
baselayoutDir = "/var/lib/init.d/daemons"
if not flagBaselayoutDir:
@ -1045,7 +1046,7 @@ in a sambaDomainName',
addDirDict["samba"] = (baselayoutDir,"samba")
addDirDict["named"] = (baselayoutDir,"named")
addDirDict["dhcpd"] = (baselayoutDir,"dhcpd")
elif daemon in ["ejabberd", "samba", "named", "dhcpd"]:
elif daemon in ["ejabberd", "samba", "named", "dhcpd", "calculate-profile"]:
if not os.system("/lib/rc/bin/service_started %s" %daemon):
runDaemons[daemon] = True
else:
@ -1090,7 +1091,7 @@ in a sambaDomainName',
"""Проверка, запущен ли сервис с данным именем"""
flagError = False
if not nameService in self.servicesDaemons.keys():
self.printERROR(_("Can not supported service '%s'")%nameService)
self.printERROR(_("Can1 not supported service '%s'")%nameService)
self.printERROR(_("Can not check run service"))
return False
# Названия демонов для сервиса
@ -1836,6 +1837,7 @@ This command is not allowed."))
return self.dialogYesNo(message)
def createJabberCertificate(self):
hostname = self.clVars.Get("sr_jabber_host")
# создаем сертификат если есть используем прежний
if not os.path.exists("/etc/jabber/ssl.pem"):
if os.path.exists("/etc/jabber/self-cert.sh"):
@ -1846,6 +1848,7 @@ This command is not allowed."))
"Automatically-generated ejabberd SSL key",
userName="jabber",
groupName="jabber",
sslCommonName=hostname,
certFile="/etc/jabber/ssl.pem",
genDH=True):
return False
@ -6317,14 +6320,15 @@ of version > 2.1.10, then you can delete this file.") + "\n"
if not flagError:
netbios = self.clVars.Get("sr_samba_netbios")
netbios = netbios.upper()
fileTxt='NET USE R: /D\r\nNET USE R: \\\\%s\\share\
\r\nNET USE T: /D\r\nNET VIEW \\\\%s | find "ftp"\r\n\
fileTxt='NET USE R: /D /Y\r\nNET USE R: \\\\%s\\share\
\r\nNET USE T: /D /Y\r\nNET VIEW \\\\%s | find "ftp"\r\n\
if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
fileDirectory = os.path.join(createDirLogon,
"start.cmd")
if not self.createUserFile(fileDirectory,
fileTxt, uid, gid):
flagError = True
os.chmod(fileDirectory, 0o755)
# Cоздаем директорию профиля win
if not flagError and createDirWinProfile:
if not self.createUserDir(uid,gid,createDirWinProfile):
@ -6989,6 +6993,8 @@ options '-w, --workgroup'"))
# Удаляем из автозапуска демона
if not self.delDaemonAutostart("samba"):
return False
if not self.delDaemonAutostart("calculate-profile"):
return False
# Удаляем из share файл .replrun
if not self.delReplFile(self.clVars):
return False
@ -7056,12 +7062,14 @@ options '-w, --workgroup'"))
print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
return False
self.printOK(_("Added ldif file") + " ...")
textLines = self.execProg("/etc/init.d/samba restart")
if textLines == False:
self.printNotOK(_("Starting") + " Samba ...")
return False
else:
self.printOK(_("Starting") + " Samba ...")
for service_initd, service_name in [("samba", "Samba"), ("calculate-profile", "Calculate Profile")]:
textLines = self.execProg("/etc/init.d/%s restart"%service_initd)
if textLines == False:
self.printNotOK(_("Starting") + " %s ..."%service_name)
return False
else:
self.printOK(_("Starting") + " %s ..."%service_name)
# Добавляем статические Samba группы и изменяем настройки
if not self.upgradeService():
return False
@ -7138,6 +7146,8 @@ options '-w, --workgroup'"))
# Устанавливаем автозапуск демона
if not self.setDaemonAutostart("samba"):
return False
if not self.setDaemonAutostart("calculate-profile"):
return False
# если нет share то создадим
sharePath = self.clVars.Get("sr_samba_share_path")
if not os.path.exists(sharePath):
@ -7814,6 +7824,15 @@ outdated. If the backup is obsolete, use cl-backup-server."))
self.delDaemonAutostart("sortmilter")
if not flagError and "samba" in servInstalled and\
serviceUpdate in ["all","samba"]:
self.setDaemonAutostart("calculate-profile")
for service_initd, service_name in [("calculate-profile", "Calculate Profile")]:
textLines = self.execProg("/etc/init.d/%s restart"%service_initd)
if textLines == False:
self.printNotOK(_("Starting") + " %s ..."%service_name)
return False
else:
self.printOK(_("Starting") + " %s ..."%service_name)
# Добавляем статические Samba группы и изменяем настройки
if not self.servSambaObj.upgradeService():
flagError = True
@ -8801,13 +8820,15 @@ for running replication")%bFile)
self.printERROR(_("Can not extract archive") +\
": "+str(bFile))
return False
self.changeHostname()
if not self.changeHostname():
return False
else:
# Распаковываем целиком архив
if self.execProg(tarCommand + "-xjf %s" %(bFile)) == False:
self.printERROR(_("Can not extract archive") + ": "+str(bFile))
return False
self.changeHostname()
if not self.changeHostname():
return False
# Удаляем временные файлы
self.removeTmpFiles()
# считаем переменные из ini файлов
@ -8841,8 +8862,17 @@ for running replication")%bFile)
hostname_fn = "/proc/sys/kernel/hostname"
old_hostname = open(hostname_fn, 'r').read().strip()
if old_hostname != hostname:
with open("/proc/sys/kernel/hostname",'w') as f:
f.write(hostname)
try:
with open("/proc/sys/kernel/hostname",'w') as f:
f.write(hostname)
except IOError:
self.printERROR(
_("Failed to change hostname from {ohn} to {nhn}").format(
ohn=old_hostname,
nhn=hostname
) + ".")
return False
return True
def removeTmpFiles(self):
"""Удаляем временные файлы"""
@ -9126,6 +9156,7 @@ class cl_ldap(shareLdap):
'cl-dhcp-hostdel':26,
'cl-dhcp-hostmod':27,
'dhcp':28,
'execsamba':29
}
# Cвязь сервисов и действующих опций
self.relServices = {"samba":[_("Common options"),
@ -11382,6 +11413,24 @@ service")
'test' when mounting its resources") + ".",
self.consolewidth-self.column_width)
},
{'progAccess':(29,),
'optVal':"MAKEDIR",
'longOption':"makedir",
'helpChapter':_("Common options"),
'help':_("user name to create user directories on the server")
},
{'progAccess':(29,),
'optVal':"LOGOUT",
'longOption':"logout",
'helpChapter':_("Common options"),
'help':_("user name to logout from the server")
},
{'progAccess':(29,),
'shortOption':"s",
'longOption':"silent",
'helpChapter':_("Common options"),
'help':_("silent mode messages")
},
#{
#'helpChapter':_("Examples"),
#'help':pcs(" " + cmdName + " --env boot", self.column_width,
@ -12275,16 +12324,20 @@ class servRepl(shareLdap):
return False
@adminConnectLdap
def getProfileDirs(self, userName):
def getProfileDirs(self, userName, onlyLogoutFile=False):
"""Выводит директории профилей для пользователя"""
profileDir = os.path.join(self.clVars.Get("sr_samba_linprof_path"),
userName)
if not os.path.exists(profileDir):
return False
return filter(lambda x:\
if onlyLogoutFile:
filterFunc = lambda x: os.path.exists(os.path.join(x, self.logOutFile))
else:
filterFunc = lambda x:\
os.path.exists(os.path.join(x, self.logOutFile)) or \
os.path.exists(os.path.join(x, self.srvFile)) or\
os.path.exists(os.path.join(x, self.deskFile)),
os.path.exists(os.path.join(x, self.deskFile))
return filter(filterFunc,
[profileDir] + map(lambda x: os.path.join(profileDir, x),\
filter(lambda x:\
os.path.isdir(os.path.join(profileDir, x)) ,\
@ -12375,14 +12428,15 @@ class servRepl(shareLdap):
# Создаем start.cmd
netbios = self.clVars.Get("sr_samba_netbios")
netbios = netbios.upper()
fileTxt='NET USE R: /D\r\nNET USE R: \\\\%s\\share\
\r\nNET USE T: /D\r\nNET VIEW \\\\%s | find "ftp"\r\n\
fileTxt='NET USE R: /D /Y\r\nNET USE R: \\\\%s\\share\
\r\nNET USE T: /D /Y\r\nNET VIEW \\\\%s | find "ftp"\r\n\
if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
fileDirectory = os.path.join(userDir,"start.cmd")
if not self.createUserFile(fileDirectory,
fileTxt, uid, gid):
flagError = True
break
os.chmod(fileDirectory, 0o755)
if flagError:
return False
return True
@ -13254,6 +13308,270 @@ incompatible"))
restorePrintMethods(prnSucces, prnErr)
return printErrMessages(errMessages, verboseMode, logObj)
def execSamba(self, options, logObj=False):
"""Выполняется при монтировании и отмонтировании пользовательской
директории. При использвании нового алгоритма rsync+ssh
"""
def printErrMessages(errMessages, verboseMode, logObj):
"""Печать и запись в лог-файл сообщений о ошибках"""
if errMessages:
if verboseMode:
for errMess in errMessages:
self.printERROR(errMess)
if logObj:
for errMess in errMessages:
logObj.writeError(errMess)
return False
def printSuccessMessages(messages, verboseMode, logObj):
"""Печать и запись в лог-файл сообщений о успехе"""
if verboseMode:
for mess in messages:
self.printSUCCESS(mess)
if logObj:
for mess in messages:
logObj.writeSuccess(mess)
return True
def redefinePrintMethods(messages, errMessages):
"""Переопределение методов печати успешных сообщений и ошибок"""
prnErr = cl_utils2.cl_smartcon.printERROR
cl_utils2.cl_smartcon.printERROR=lambda *x: errMessages.append(x[1])
prnSucces = cl_utils2.cl_smartcon.printSUCCESS
cl_utils2.cl_smartcon.printSUCCESS=lambda *x: messages.append(x[1])
return prnSucces, prnErr
def restorePrintMethods(prnSucces, prnErr):
"""Восстанавление методов печати успешных сообщений и ошибок"""
cl_utils2.cl_smartcon.printERROR = prnErr
cl_utils2.cl_smartcon.printSUCCESS = prnSucces
# Сообщения о успехе
messages = []
# Сообщения о ошибках
errMessages = []
# Опция выключает вывод cообщений на экран
verboseMode = True
if options.has_key('s'):
verboseMode = False
logout = ""
makeDir = ""
isLogout = options.has_key('logout')
isMakeDir = options.has_key('makedir')
dictOpt = {"logout":isLogout, "makedir":isMakeDir}
firstOpt = filter(lambda x: x[1] ,dictOpt.items())
lenOpt = len(firstOpt)
if lenOpt == 1:
if isLogout:
# Выход пользователя
logout = options['logout']
elif isMakeDir:
# Создание директорий для пользователя
makeDir = options['makedir']
elif lenOpt == 0:
errMessages.append(\
_("command line option '--logout' or '--makedir' is \
not set"))
return printErrMessages(errMessages, verboseMode, logObj)
else:
errMessages.append(\
_("command line option '--logout' and '--makedir' is \
incompatible"))
return printErrMessages(errMessages, verboseMode, logObj)
# Создаем переменные шаблонов
self.createClVars()
# Проверка на установку сервиса LDAP
if self.clVars.Get("sr_ldap_set") != "on":
errMessages.append(_("LDAP service not setuped"))
return printErrMessages(errMessages, verboseMode, logObj)
# Проверка на установку samba
if self.clVars.Get("sr_samba_set") != "on":
errMessages.append(_("Samba service not setuped"))
return printErrMessages(errMessages, verboseMode, logObj)
# включена или нет репликация
flagRepl = False
if self.clVars.Get("ld_repl_set") == "on":
flagRepl = True
if makeDir:
# Переопределение печати успешных сообщений и ошибок
prnSucces, prnErr = redefinePrintMethods(messages, errMessages)
userName = makeDir
if self.execMakedirs(userName, flagRepl, True):
# Восстановление печати успешных сообщений и ошибок
restorePrintMethods(prnSucces, prnErr)
return printSuccessMessages(messages, verboseMode, logObj)
# Восстановление печати успешных сообщений и ошибок
restorePrintMethods(prnSucces, prnErr)
return printErrMessages(errMessages, verboseMode, logObj)
elif logout:
# Переопределение печати успешных сообщений и ошибок
prnSucces, prnErr = redefinePrintMethods(messages, errMessages)
userName = logout
# Выход пользователя из сеанса
if self.execLogoutUserNew(userName, flagRepl):
# Восстановление печати успешных сообщений и ошибок
restorePrintMethods(prnSucces, prnErr)
return printSuccessMessages(messages, verboseMode, logObj)
# Восстановление печати успешных сообщений и ошибок
restorePrintMethods(prnSucces, prnErr)
return printErrMessages(errMessages, verboseMode, logObj)
def execMakedirs(self, userName, flagRepl, flagMakeDir):
"""Действия на сервере при входе пользователя в сеанс"""
# Поиск пользователя в Samba сервисе
if not self.servSambaObj.searchSambaUser(userName):
self.printERROR(_("Samba user %s is not found")%str(userName))
return False
# Создаем пользовательские директории на сервере
if not self.createUserDirs(userName):
self.printERROR(_("Can not create user %s directories")\
%str(userName))
return False
self.printSUCCESS(_("User %s login")%userName)
return True
def execLogoutUserNew(self, userName, flagRepl):
"""Действия на сервере при выходе пользователя из сеанса"""
def printErrMessages(error):
"""Печать сообщений о ошибках"""
errors = error.splitlines()
for err in errors:
self.printERROR(err)
def setWorkedUser(userName, dirLogOut, profileDir):
"""Запись пользователя в Worked ветку LDAP"""
if dirLogOut == profileDir:
userLogin = userName
else:
clientOs = os.path.split(dirLogOut)[1].\
replace(".","")
# если есть старый пользователь в ветке
# Worked и клиентская система CLD -
# удаляем старого пользователя
if self.searchWorkedUser(userName) and\
clientOs=="CLD":
# Удаляем пользователя из ветки
# второй параметр False
if not self.delReplWorkedUser(userName,
False):
self.printERROR(_("Can not \
remove user %s in the LDAP branch 'Worked'")%str(userName))
return False
userLogin = "%s@%s"%(userName,clientOs)
# Добавляем пользователя в ветку репликации
if not self.addReplWorkedUser(userLogin):
self.printERROR(_("Can not add user \
%s in LDAP branch 'Replication'")%str(userName))
return False
return True
# Поиск пользователя в Samba сервисе
if not self.servSambaObj.searchSambaUser(userName):
self.printERROR(_("Samba user %s is not found")%str(userName))
return False
# Директория хранения профилей
profileDir = os.path.join(\
self.clVars.Get("sr_samba_linprof_path"), userName)
# получаем директории профилей
dirsLogOut= self.getProfileDirs(userName, onlyLogoutFile=True)
flagLogOut = True
# Удаляем файлы .logout
for dirLogOut in dirsLogOut:
logoutFile = os.path.join(dirLogOut, self.logOutFile)
retStr = self.deleteLogoutFile(userName, logoutFile)
if not retStr:
self.printERROR(\
_("No access to the file %s")%logoutFile)
return False
# Читаем данные из ~/.calculate/desktop.env файла
desktopFile = os.path.join(dirLogOut,self.deskFile)
if retStr == "SUCCESS":
varsPackDict = {}
# Управление сервером
srvFile = os.path.join(dirLogOut,self.srvFile)
if os.path.exists(srvFile):
# Поддерживаемые секции которые не нужно удалять
supportSections = []
# Получим текущую дату
strCurrentTime = time.strftime(\
"%Y-%m-%d %H:%M:%S",time.localtime(time.time()))
# Получаем переменные из env файла
txtConfig = cl_base.iniParser(srvFile)
# Cловарь переменных из файла для изменения пароля
# пользователя
sectionPwd = ["command","passwd_samba"]
varsPwdDict = txtConfig.getAreaVars(sectionPwd)
# Если включена репликация
if flagRepl:
# Команда для упаковки профиля
sectionPack = ["command","pack"]
varsPackDict = txtConfig.getAreaVars(sectionPack)
error = txtConfig.getError()
if error:
printErrMessages(error)
return False
# Изменение пароля пользователя
if varsPwdDict:
# Если run=on выполняем команду
if varsPwdDict.get("run") == "on":
supportSections.append(",".join(sectionPwd))
if self.changeUserPassword(userName,
varsPwdDict,
srvFile,strCurrentTime):
# Записываем статус - успех
if not self.setDateAndStatusToConfig(\
sectionPwd,
"success",
strCurrentTime,
txtConfig):
return False
else:
# Записываем статус - ошибка
self.setDateAndStatusToConfig(sectionPwd,
"error",
strCurrentTime,
txtConfig)
return False
else:
if set(varsPwdDict.keys()) == set(["date",
"status"]):
supportSections.append(",".join(sectionPwd))
# Упаковка профиля пользователя
if flagRepl and varsPackDict:
# Если run=on выполняем команду
if varsPackDict.get("run") == "on":
# Дата новее которой файлы помещаются в архив
strArchDate = varsPackDict.get("arch_date")
# Текущее время на клинтском компьютере
strCurrentTime = varsPackDict.get("curr_time")
if strArchDate and strCurrentTime:
# Создаем инкрементный архив
if not self.packUserProfile(dirLogOut,
strArchDate,
strCurrentTime,
txtConfig):
return False
# Удаление секций которые не можем отработать
# и секции для создания архива профиля пользователя
sections = txtConfig.getAllSectionNames()
if supportSections:
sections = list(set(sections)-set(["command"]))
sections = set(sections)-set(supportSections)
delSections = map(lambda x: x.split(","), sections)
for delSect in delSections:
txtConfig.delArea(delSect)
# Если включена репликация и нет команды на упаковку
# профиля пользователя
if flagRepl and not varsPackDict:
# Запись пользователя в Worked ветку LDAP
if not setWorkedUser(userName, dirLogOut, profileDir):
return False
self.printSUCCESS(_("User %s logout")%userName)
return True
def setDateAndStatusToConfig(self, section, status, strDate, objConfig):
"""Устанавливает для секции текущюю дату и статус"""
def printErrMessages(error):

@ -0,0 +1,43 @@
#!/usr/bin/python2.7
#-*- coding: utf-8 -*-
# Copyright 2008-2010 Mir Calculate. http://www.calculate-linux.org
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import sys
import os
sys.path.insert(0,os.path.abspath('/usr/lib/calculate/calculate-lib/pym'))
sys.path.insert(0,os.path.abspath('/usr/lib/calculate/calculate-server/pym'))
import cl_base
# Логгирование
import cl_log
tr = cl_base.lang()
tr.setGlobalDomain('cl_server')
tr.setLanguage(sys.modules[__name__])
import cl_ldap
if __name__ == "__main__":
ldapObj = cl_ldap.cl_ldap("execsamba")
optObj = cl_ldap.tsOpt(ldapObj,[],False)
flagError = False
if not optObj.flagHelp:
# Добавление пользователя в ветку репликации
logObj = cl_log.log("execserv.log")
obj = cl_ldap.servRepl()
if obj.execSamba(optObj.opt, logObj):
flagError = False
if flagError:
sys.exit(1)
else:
sys.exit(0)

@ -112,7 +112,8 @@ class cl_build_scripts(build_scripts):
"""Class for build scripts"""
def run (self):
scripts = ['./scripts/proxy', './scripts/dhcp',
'./scripts/execserv']
'./scripts/execserv',
'./scripts/execsamba']
backup_build_dir = self.build_dir
backup_scripts = filter(lambda x: not x in scripts, self.scripts)
self.scripts = scripts
@ -194,6 +195,7 @@ setup(
"./scripts/cl-rebuild",
"./scripts/cl-replication",
"./scripts/execserv",
"./scripts/execsamba",
"./scripts/replcron",
"./scripts/cl-info",
"./scripts/proxy",

Loading…
Cancel
Save