|
|
|
@ -1696,7 +1696,7 @@ This command is not allowed."))
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def execProg(self, cmdStrProg, inStr=False, retFull=True, envProg={}):
|
|
|
|
|
def execProg(self, cmdStrProg, inStr=False, retFull=True, envProg=None):
|
|
|
|
|
"""Выполняет внешнюю программу
|
|
|
|
|
|
|
|
|
|
Параметры:
|
|
|
|
@ -1705,13 +1705,15 @@ This command is not allowed."))
|
|
|
|
|
Возвращаемые параметры:
|
|
|
|
|
строка которую выведет внешняя программа или False в случае ошибки
|
|
|
|
|
"""
|
|
|
|
|
if not envProg:
|
|
|
|
|
envProg = {}
|
|
|
|
|
env_path = {"PATH" : cl_utils.getpathenv()}
|
|
|
|
|
env = {}
|
|
|
|
|
env.update(dict(os.environ))
|
|
|
|
|
env.update(env_path)
|
|
|
|
|
env.update(envProg)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
inStr = inStr.encode("UTF-8") if isinstance(inStr, str) else inStr
|
|
|
|
|
retCode,programOut = cl_utils.runOsCommand(cmdStrProg,inStr,retFull,env)
|
|
|
|
|
if not retCode:
|
|
|
|
|
return programOut
|
|
|
|
@ -6024,10 +6026,12 @@ of version > 2.1.10, then you can delete this file.") + "\n"
|
|
|
|
|
self.printERROR(_("Can not delete group") + " " + groupName)
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def delUserSambaServer(self,userName,options,printSuccess=True,
|
|
|
|
|
backup=True, notDeletedDirs=[]):
|
|
|
|
|
def delUserSambaServer(self, userName, options, printSuccess=True,
|
|
|
|
|
backup=True, notDeletedDirs=None):
|
|
|
|
|
"""Удаляем Samba пользователя"""
|
|
|
|
|
# Проверим установлен ли сервис samba
|
|
|
|
|
if not notDeletedDirs:
|
|
|
|
|
notDeletedDirs = []
|
|
|
|
|
if not self.initialChecks("samba"):
|
|
|
|
|
return False
|
|
|
|
|
if "$" in userName:
|
|
|
|
@ -7512,9 +7516,13 @@ outdated. If the backup is obsolete, use cl-backup-server."))
|
|
|
|
|
"""Перегенерирует конфигурационные файлы, и базу данных LDAP"""
|
|
|
|
|
return self.rebuildServer(options)
|
|
|
|
|
|
|
|
|
|
def applyProfilesFromService(self, service, verbose=False, dirsFilter = [],
|
|
|
|
|
filesFilter = []):
|
|
|
|
|
def applyProfilesFromService(self, service, verbose=False, dirsFilter=None,
|
|
|
|
|
filesFilter=None):
|
|
|
|
|
"""Применяем профили для данного сервиса"""
|
|
|
|
|
if dirsFilter is None:
|
|
|
|
|
dirsFilter = []
|
|
|
|
|
if filesFilter is None:
|
|
|
|
|
filesFilter = []
|
|
|
|
|
# Cоздаем объект профиль устанавливая директорию
|
|
|
|
|
# service для файлов профилей
|
|
|
|
|
clProf = cl_profile.profile(self.clVars,service,dirsFilter,filesFilter)
|
|
|
|
@ -7541,12 +7549,14 @@ outdated. If the backup is obsolete, use cl-backup-server."))
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def updateServer(self, options, serviceUpdate, clVars=False,
|
|
|
|
|
noInputAllowNetServices=[], printReplServ=True):
|
|
|
|
|
noInputAllowNetServices=None, printReplServ=True):
|
|
|
|
|
"""Перегенерируем конфигурационные файлы
|
|
|
|
|
|
|
|
|
|
определенного или всех сервисов
|
|
|
|
|
"""
|
|
|
|
|
# Создаем переменные
|
|
|
|
|
if not noInputAllowNetServices:
|
|
|
|
|
noInputAllowNetServices = []
|
|
|
|
|
if clVars:
|
|
|
|
|
self.clVars = clVars
|
|
|
|
|
else:
|
|
|
|
@ -12719,10 +12729,12 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def modReplMailAlias(self, userName, srcMails, filterHosts=[]):
|
|
|
|
|
def modReplMailAlias(self, userName, srcMails, filterHosts=None):
|
|
|
|
|
"""Изменяем запись в Replication/Mail
|
|
|
|
|
|
|
|
|
|
(имя пользователя, список почтовых адресов пользователя"""
|
|
|
|
|
if filterHosts is None:
|
|
|
|
|
filterHosts = []
|
|
|
|
|
rez = self.searchMailAlias(userName)
|
|
|
|
|
if not rez:
|
|
|
|
|
# Если алиас не найден создаем его
|
|
|
|
@ -12784,10 +12796,12 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
@adminConnectLdap
|
|
|
|
|
def addReplMailAlias(self, userName, srcMails , filterHosts=[]):
|
|
|
|
|
def addReplMailAlias(self, userName, srcMails, filterHosts=None):
|
|
|
|
|
"""Добавляем запись в Replication/Mail
|
|
|
|
|
|
|
|
|
|
(имя пользователя, список почтовых адресов пользователя"""
|
|
|
|
|
if filterHosts is None:
|
|
|
|
|
filterHosts = []
|
|
|
|
|
rez = self.searchMailAlias(userName)
|
|
|
|
|
if not rez:
|
|
|
|
|
ldifFile = self.ldifFileMailUser
|
|
|
|
@ -12867,13 +12881,15 @@ if %%errorlevel%%==0 NET USE T: \\\\%s\\ftp' %(netbios,netbios,netbios)
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def maxDateAndListInDir(self, scanDir, listFiles, skipPathTime=[],
|
|
|
|
|
def maxDateAndListInDir(self, scanDir, listFiles, skipPathTime=None,
|
|
|
|
|
checkTime=True, prefix=None, maxTime=None,
|
|
|
|
|
flagDir=False):
|
|
|
|
|
"""Время последней модификации внутри директории scanDir
|
|
|
|
|
|
|
|
|
|
Генерация списка файлов и директорий
|
|
|
|
|
"""
|
|
|
|
|
if skipPathTime is None:
|
|
|
|
|
skipPathTime = []
|
|
|
|
|
startCheckTime = checkTime
|
|
|
|
|
if not prefix:
|
|
|
|
|
prefix = os.path.join(scanDir,"")
|
|
|
|
@ -16861,8 +16877,10 @@ class dnsTxt(cl_profile.bind,shareTxt):
|
|
|
|
|
if not self.getError():
|
|
|
|
|
cl_profile.bind.__init__(self, text)
|
|
|
|
|
|
|
|
|
|
def getTextZone(self, clVars, zoneName, zoneType, zoneMasters=[]):
|
|
|
|
|
def getTextZone(self, clVars, zoneName, zoneType, zoneMasters=None):
|
|
|
|
|
"""Создание текста DNS зоны"""
|
|
|
|
|
if zoneMasters is None:
|
|
|
|
|
zoneMasters = []
|
|
|
|
|
if zoneType == "master":
|
|
|
|
|
dnsBaseDN = clVars.Get("ld_dns_dn")
|
|
|
|
|
dnsCommaSplDN = dnsBaseDN.replace(",","%2c")
|
|
|
|
@ -17078,8 +17096,10 @@ class dnsTxt(cl_profile.bind,shareTxt):
|
|
|
|
|
text = self.getConfig()
|
|
|
|
|
return self.writeInConfig(text)
|
|
|
|
|
|
|
|
|
|
def createZone(self, clVars, zoneName, zoneType, zoneMasters=[]):
|
|
|
|
|
def createZone(self, clVars, zoneName, zoneType, zoneMasters=None):
|
|
|
|
|
"""Создает зону в файле конфигурации bind"""
|
|
|
|
|
if zoneMasters is None:
|
|
|
|
|
zoneMasters = []
|
|
|
|
|
if self.getError():
|
|
|
|
|
return False
|
|
|
|
|
textZone = self.getTextZone(clVars, zoneName, zoneType,
|
|
|
|
@ -17107,13 +17127,15 @@ class dnsTxt(cl_profile.bind,shareTxt):
|
|
|
|
|
existsZones = self.getAllNamesZones()
|
|
|
|
|
return sorted(list(set(zoneNames)-set(existsZones)))
|
|
|
|
|
|
|
|
|
|
def createExclZones(self, clVars, zoneNames, zoneType, zoneMasters=[]):
|
|
|
|
|
def createExclZones(self, clVars, zoneNames, zoneType, zoneMasters=None):
|
|
|
|
|
"""Создает зоны в файле конфигурации bind
|
|
|
|
|
|
|
|
|
|
Будут созданы зоны которых нет в конфигурационном файле
|
|
|
|
|
zoneNames - зоны которые будут созданы
|
|
|
|
|
Не проверяется наличие зон в конфигурационном файле
|
|
|
|
|
"""
|
|
|
|
|
if zoneMasters is None:
|
|
|
|
|
zoneMasters = []
|
|
|
|
|
if self.getError():
|
|
|
|
|
return False
|
|
|
|
|
# Находим зоны отсутствующие в конфигурационном файле
|
|
|
|
@ -17365,13 +17387,13 @@ class servDns(shareLdap):
|
|
|
|
|
def createMasterZone(self, zoneName,
|
|
|
|
|
nameServer="",
|
|
|
|
|
emailAddr="",
|
|
|
|
|
namesServers = [],
|
|
|
|
|
namesServers=None,
|
|
|
|
|
serialNumber="1",
|
|
|
|
|
refresh=zoneRefresh,
|
|
|
|
|
updateRetry=zoneUpdateRetry,
|
|
|
|
|
expiry=zoneExpiry,
|
|
|
|
|
minimum=zoneMinimum,
|
|
|
|
|
ip="", mxList=[]):
|
|
|
|
|
ip="", mxList=None):
|
|
|
|
|
"""Создание первичной DNS зоны в конфигурационном файле и в LDAP
|
|
|
|
|
Параметры:
|
|
|
|
|
nameServer - имя первичного мастер сервера DNS зоны
|
|
|
|
@ -17393,6 +17415,10 @@ class servDns(shareLdap):
|
|
|
|
|
mx - MX записи для зоны
|
|
|
|
|
"""
|
|
|
|
|
# Добавление зоны в конфигурационный файл
|
|
|
|
|
if namesServers is None:
|
|
|
|
|
namesServers = []
|
|
|
|
|
if mxList is None:
|
|
|
|
|
mxList = []
|
|
|
|
|
ldapParser = iniLdapParser()
|
|
|
|
|
part = "dns"
|
|
|
|
|
self.clVars.Set("ld_dns_dn",ldapParser.getVar(part,"DN"),True)
|
|
|
|
@ -19715,8 +19741,10 @@ with type DNS record PTR (option "-t")'))
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def addDNSRecord(self, domainName, ipAddrOrHost, namesMailServers=[]):
|
|
|
|
|
def addDNSRecord(self, domainName, ipAddrOrHost, namesMailServers=None):
|
|
|
|
|
"""Добавляем DNS запись в LDAP прямую или обратную"""
|
|
|
|
|
if namesMailServers is None:
|
|
|
|
|
namesMailServers = []
|
|
|
|
|
hostName, spl, zoneName = domainName.partition(".")
|
|
|
|
|
# При поиске зоны создается объект переменных и соединение LDAP
|
|
|
|
|
if not self.searchZoneInLDAP(zoneName):
|
|
|
|
@ -21073,7 +21101,7 @@ incompatible, use one of the options"))
|
|
|
|
|
retData.update(dynamicHosts)
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
return retData.items()
|
|
|
|
|
return list(retData.items())
|
|
|
|
|
|
|
|
|
|
def foundDynamicDNSRecords(self, zoneName, minIpRange, maxIpRange):
|
|
|
|
|
"""Находит имена динамических хостов
|
|
|
|
@ -21093,7 +21121,7 @@ incompatible, use one of the options"))
|
|
|
|
|
# ip в диапазоне динамических адресов
|
|
|
|
|
if isRange(self.getNumberIP(ip), minIpRange, maxIpRange):
|
|
|
|
|
retData[domainName] = ip
|
|
|
|
|
return retData.items()
|
|
|
|
|
return list(retData.items())
|
|
|
|
|
|
|
|
|
|
def removeDynamicDNSRecords(self, netAndMask):
|
|
|
|
|
"""Удаляет динамические адреса для сети"""
|
|
|
|
|