diff --git a/profile/jabber/etc/jabber/ejabberd.yml b/profile/jabber/etc/jabber/ejabberd.yml index 6706b1e..ad390ad 100644 --- a/profile/jabber/etc/jabber/ejabberd.yml +++ b/profile/jabber/etc/jabber/ejabberd.yml @@ -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: diff --git a/profile/samba/etc/conf.d/calculate-profile b/profile/samba/etc/conf.d/calculate-profile new file mode 100644 index 0000000..7597ed3 --- /dev/null +++ b/profile/samba/etc/conf.d/calculate-profile @@ -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" diff --git a/profile/samba/etc/init.d/calculate-profile b/profile/samba/etc/init.d/calculate-profile new file mode 100644 index 0000000..b977901 --- /dev/null +++ b/profile/samba/etc/init.d/calculate-profile @@ -0,0 +1 @@ +# Calculate link=/etc/init.d/sshd symbolic force diff --git a/profile/samba/etc/samba/smb.conf b/profile/samba/etc/samba/smb.conf index d11542c..4eeb2d4 100644 --- a/profile/samba/etc/samba/smb.conf +++ b/profile/samba/etc/samba/smb.conf @@ -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# diff --git a/profile/samba/etc/ssh/sshd_profile_config b/profile/samba/etc/ssh/sshd_profile_config new file mode 100644 index 0000000..f9a944f --- /dev/null +++ b/profile/samba/etc/ssh/sshd_profile_config @@ -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 diff --git a/profile/samba/usr/libexec/calculate/cl-rsync-profile b/profile/samba/usr/libexec/calculate/cl-rsync-profile new file mode 100755 index 0000000..523765c --- /dev/null +++ b/profile/samba/usr/libexec/calculate/cl-rsync-profile @@ -0,0 +1,18 @@ +# Calculate chmod=0755 chown=root:root +#!/bin/bash + +RSYNC_CONFIG_FILE="/tmp/rsync.$USER.$$" +cat >$RSYNC_CONFIG_FILE < 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): diff --git a/scripts/execsamba b/scripts/execsamba new file mode 100755 index 0000000..17e5891 --- /dev/null +++ b/scripts/execsamba @@ -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) diff --git a/setup.py b/setup.py index 8f485e7..c32e2de 100755 --- a/setup.py +++ b/setup.py @@ -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",