|
|
|
@ -133,6 +133,7 @@ class report():
|
|
|
|
|
char ="-+-"
|
|
|
|
|
convLines.append(self._insertStrChar(lines[i], lenCols, char))
|
|
|
|
|
print "\n".join(convLines)
|
|
|
|
|
print "(%s %s)"%(len(self.dataList), _("rows"))
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def _insertStrChar(self, line, lenCols, char):
|
|
|
|
@ -6908,13 +6909,7 @@ Samba and Unix services") %", ".join(exclGroup)
|
|
|
|
|
if options.has_key('P') or options.has_key('p'):
|
|
|
|
|
pwDialog = [_("New SMB password"),
|
|
|
|
|
_("Retype new SMB password")]
|
|
|
|
|
pwdA = getpass.getpass(pwDialog[0]+":")
|
|
|
|
|
pwdB = getpass.getpass(pwDialog[1]+":")
|
|
|
|
|
if not (pwdA == pwdB):
|
|
|
|
|
self.printERROR (_("ERROR") + ": " +\
|
|
|
|
|
_("password incorrect")+ ": " + _("try again"))
|
|
|
|
|
return False
|
|
|
|
|
userPwd = pwdA
|
|
|
|
|
userPwd = self.getUserPassword(options, "p", "P", pwDialog)
|
|
|
|
|
# Опция s пароль только для Samba
|
|
|
|
|
if not options.has_key('s'):
|
|
|
|
|
if not self.servUnixObj.modUserUnixPasswd(userName,{},
|
|
|
|
@ -9827,8 +9822,8 @@ name), delete forward record")
|
|
|
|
|
{'progAccess':(17,),
|
|
|
|
|
'longOption':"mx",
|
|
|
|
|
'helpChapter':_("Common options"),
|
|
|
|
|
'help':_("remove the MX record from an existing A record\
|
|
|
|
|
(used with option --host)")
|
|
|
|
|
'help':_("remove all MX records from an existing A record \
|
|
|
|
|
(used with option --host)")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(18,),
|
|
|
|
|
'longOption':"automod",
|
|
|
|
@ -12442,13 +12437,15 @@ class cl_info(cl_utils2.cl_smartcon):
|
|
|
|
|
if service == "ftp" or service == "dns":
|
|
|
|
|
strService = service.upper()
|
|
|
|
|
# Информация о DNS
|
|
|
|
|
if options.has_key("z") or options.has_key("Z") or options.has_key("R"):
|
|
|
|
|
if options.has_key("z") or options.has_key("Z") or options.has_key("r"):
|
|
|
|
|
# cоздаем объект DNS
|
|
|
|
|
servDnsObj = servDns()
|
|
|
|
|
# Проверим установлен ли сервис dns
|
|
|
|
|
if not servDnsObj.isServiceSetup("dns"):
|
|
|
|
|
return False
|
|
|
|
|
objTxtZone = dnsZoneTxt()
|
|
|
|
|
# Удаляет лишние точки в названии
|
|
|
|
|
delDot = lambda y: ".".join(filter(lambda x: x, y.split(".")))
|
|
|
|
|
# Информация о всех DNS зонах
|
|
|
|
|
if options.has_key("z"):
|
|
|
|
|
# Зоны в файле
|
|
|
|
@ -12459,9 +12456,6 @@ class cl_info(cl_utils2.cl_smartcon):
|
|
|
|
|
namesZonesLDAP = servDnsObj.searchAllZonesInLDAP()
|
|
|
|
|
# Подчиненные зоны
|
|
|
|
|
slaveZones = list(set(namesZonesFile)-set(namesZonesLDAP))
|
|
|
|
|
# Все зоны
|
|
|
|
|
#allNamesZones = list(set(namesZonesLDAP)|set(namesZonesFile))
|
|
|
|
|
#allNamesZones.sort()
|
|
|
|
|
# Обратные зоны
|
|
|
|
|
if namesZonesLDAP:
|
|
|
|
|
namesZonesLDAP.sort()
|
|
|
|
@ -12473,8 +12467,8 @@ class cl_info(cl_utils2.cl_smartcon):
|
|
|
|
|
# Формирование строки для отчета
|
|
|
|
|
title=_("Information about the master DNS zones in LDAP")
|
|
|
|
|
headerList = [_("DNS zone"),
|
|
|
|
|
_("domain"),
|
|
|
|
|
_("network")]
|
|
|
|
|
_("Domain (forward zone)"),
|
|
|
|
|
_("Network (reverse zone)")]
|
|
|
|
|
# Получение домена
|
|
|
|
|
getDomain = lambda x: not '.in-addr.arpa' in x and x or ""
|
|
|
|
|
# Получение сети
|
|
|
|
@ -12519,7 +12513,301 @@ class cl_info(cl_utils2.cl_smartcon):
|
|
|
|
|
print ""
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
# Информация о DNS зоне
|
|
|
|
|
if options.has_key("Z"):
|
|
|
|
|
zoneName = options["Z"]
|
|
|
|
|
if not zoneName:
|
|
|
|
|
self.printERROR(_('Incorrect zone name'))
|
|
|
|
|
return False
|
|
|
|
|
net = zoneName
|
|
|
|
|
# Проверка на прямую зону
|
|
|
|
|
forwardZone = servDnsObj.isForwardName(zoneName)
|
|
|
|
|
# Обратная зона
|
|
|
|
|
if not forwardZone:
|
|
|
|
|
network, spl, netmask = net.rpartition("/")
|
|
|
|
|
if not netmask == "24" or \
|
|
|
|
|
not servDnsObj.isCorrectStringNet(net):
|
|
|
|
|
self.printERROR(_('Incorrect network %s for reverse zone')\
|
|
|
|
|
%zoneName)
|
|
|
|
|
self.printWARNING(_("Example network for reverse zone") +\
|
|
|
|
|
" :")
|
|
|
|
|
self.printWARNING(_('"192.168.0.0/24"'))
|
|
|
|
|
return False
|
|
|
|
|
dataIP = servDnsObj.getDomainAndZoneFromIP(network)
|
|
|
|
|
if not dataIP:
|
|
|
|
|
self.printERROR(_("IP address %s incorrectly")%network)
|
|
|
|
|
return False
|
|
|
|
|
hostNameTmp, domainNameTmp, zoneName = dataIP
|
|
|
|
|
# Ищем мастер зону в LDAP
|
|
|
|
|
if not servDnsObj.searchZoneInLDAP(zoneName):
|
|
|
|
|
# Зоны в файле
|
|
|
|
|
namesZonesFile = objTxtZone.getAllNamesZones()
|
|
|
|
|
if namesZonesFile == False:
|
|
|
|
|
return False
|
|
|
|
|
# Зоны в LDAP
|
|
|
|
|
namesZonesLDAP = servDnsObj.searchAllZonesInLDAP()
|
|
|
|
|
# Подчиненные зоны
|
|
|
|
|
slaveZones = list(set(namesZonesFile)-set(namesZonesLDAP))
|
|
|
|
|
# Если подчиненная зона
|
|
|
|
|
if not zoneName in slaveZones:
|
|
|
|
|
self.printERROR(_("Can not found master zone %s in LDAP")\
|
|
|
|
|
%zoneName)
|
|
|
|
|
return False
|
|
|
|
|
# ip мастер серверов в подчиненной зоне
|
|
|
|
|
ipMasterServers = []
|
|
|
|
|
xmlArea = objTxtZone.getXMLZoneToName(zoneName)[0]
|
|
|
|
|
xmlNodes = xpath.Evaluate("child::field[child::name='%s']"\
|
|
|
|
|
%("masters"), xmlArea)
|
|
|
|
|
if xmlNodes:
|
|
|
|
|
masterIPNode = xmlNodes[0]
|
|
|
|
|
xmlNodes = xpath.Evaluate( "child::value", masterIPNode)
|
|
|
|
|
ipMasterServers = map(lambda x:\
|
|
|
|
|
x.firstChild.nodeValue.strip(),\
|
|
|
|
|
xmlNodes)
|
|
|
|
|
if not ipMasterServers:
|
|
|
|
|
self.printERROR(_("The program does not support information \
|
|
|
|
|
for %s DNS zone")%zoneName)
|
|
|
|
|
return False
|
|
|
|
|
title=_("Information about slave DNS zone %s in \
|
|
|
|
|
/etc/bind/named.conf") %zoneName
|
|
|
|
|
headerList = [_("Field"), _("Value")]
|
|
|
|
|
flagF = True
|
|
|
|
|
dataList = []
|
|
|
|
|
for ipMS in ipMasterServers:
|
|
|
|
|
if flagF:
|
|
|
|
|
dataList.append([_("IP master DNS servers"), ipMS])
|
|
|
|
|
flagF = False
|
|
|
|
|
else:
|
|
|
|
|
dataList.append(["", ipMS])
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
return True
|
|
|
|
|
# Получение данных зоны из LDAP
|
|
|
|
|
zoneData = servDnsObj.searchAllDomainNamesInLDAP("@.%s"%zoneName)
|
|
|
|
|
if not zoneData:
|
|
|
|
|
self.printERROR(_("Can not found SOA record in zone %s")\
|
|
|
|
|
%zoneName)
|
|
|
|
|
return False
|
|
|
|
|
soaRecord = zoneData[0][0][1]['sOARecord'][0]
|
|
|
|
|
nSRecords = zoneData[0][0][1]['nSRecord']
|
|
|
|
|
soaData = map(lambda x: delDot(x), soaRecord.split(" "))
|
|
|
|
|
if len(soaData)!=7:
|
|
|
|
|
self.printERROR(_("Incorrect SOA Record in DNS zone %s")\
|
|
|
|
|
%zoneName)
|
|
|
|
|
return False
|
|
|
|
|
# Все авторитативные сервера зоны, в случае slаve зоны
|
|
|
|
|
namesServers = map(lambda x: delDot(x), nSRecords)
|
|
|
|
|
# Авторитативный сервер
|
|
|
|
|
nameServer = soaData[0]
|
|
|
|
|
# Почтовый адрес администратора зоны
|
|
|
|
|
splEmail = soaData[1].partition(".")
|
|
|
|
|
email = "%s@%s"%(splEmail[0], delDot(splEmail[2]))
|
|
|
|
|
# Серийный номер зоны
|
|
|
|
|
serialNumber = soaData[2]
|
|
|
|
|
# refresh - интервал времени для обновления зоны
|
|
|
|
|
refresh = soaData[3]
|
|
|
|
|
# update - интервал времени после неудачного обновления зоны
|
|
|
|
|
update = soaData[4]
|
|
|
|
|
# expiry - интервал времени устаревания данных зоны
|
|
|
|
|
expiry = soaData[5]
|
|
|
|
|
# minimum - интервал времени хранения данных неудачных запросов
|
|
|
|
|
minimum = soaData[6]
|
|
|
|
|
# Формирование строки для отчета
|
|
|
|
|
title=_("Information about master DNS zone %s")%zoneName
|
|
|
|
|
headerList = [_("Field"), _("Value")]
|
|
|
|
|
dataList = [[_("Zone name"), zoneName],
|
|
|
|
|
[_("Master autoritative server"), nameServer],
|
|
|
|
|
[_("Autoritative servers"), ",".join(namesServers)],
|
|
|
|
|
[_("Email administrator"), email],
|
|
|
|
|
[_("Serial number"), serialNumber],
|
|
|
|
|
[_("Refresh"), refresh],
|
|
|
|
|
[_("Update"), update],
|
|
|
|
|
[_("Expiry"), expiry],
|
|
|
|
|
[_("Minimum"), minimum]]
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
recordsSearch = servDnsObj.searchAllRecordInZone(zoneName)
|
|
|
|
|
if recordsSearch:
|
|
|
|
|
# Если прямая зона
|
|
|
|
|
if forwardZone:
|
|
|
|
|
dataAList = []
|
|
|
|
|
dataCNList = []
|
|
|
|
|
dataMXList = []
|
|
|
|
|
for record in recordsSearch:
|
|
|
|
|
domainName = "%s.%s"\
|
|
|
|
|
%(record[0][1]["relativeDomainName"][0],\
|
|
|
|
|
zoneName)
|
|
|
|
|
if record[0][1].has_key("aRecord"):
|
|
|
|
|
dataAList.append([domainName,
|
|
|
|
|
record[0][1]["aRecord"][0]])
|
|
|
|
|
if record[0][1].has_key("mXRecord"):
|
|
|
|
|
flagFirst = True
|
|
|
|
|
flagError = False
|
|
|
|
|
for mxData in record[0][1]["mXRecord"]:
|
|
|
|
|
mxDataSpl = mxData.split(" ")
|
|
|
|
|
if len(mxDataSpl) != 2:
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
prioritet, mxDomain = mxDataSpl
|
|
|
|
|
if flagFirst:
|
|
|
|
|
dataMXList.append([domainName,
|
|
|
|
|
prioritet,
|
|
|
|
|
delDot(mxDomain)])
|
|
|
|
|
flagFirst = False
|
|
|
|
|
else:
|
|
|
|
|
dataMXList.append(["",
|
|
|
|
|
prioritet,
|
|
|
|
|
delDot(mxDomain)])
|
|
|
|
|
if flagError:
|
|
|
|
|
self.printERROR(\
|
|
|
|
|
_("Incorrect MX records in A record %s")\
|
|
|
|
|
%domainName)
|
|
|
|
|
return False
|
|
|
|
|
elif record[0][1].has_key("cNAMERecord"):
|
|
|
|
|
dataCNList.append([domainName,
|
|
|
|
|
delDot(record[0][1]["cNAMERecord"][0])])
|
|
|
|
|
allDataList = [dataAList, dataCNList,dataMXList]
|
|
|
|
|
allRecordList = ["A","CNAME","MX"]
|
|
|
|
|
allHeaderList = [(_("Domain"), "ip"),
|
|
|
|
|
(_("Domain"), _("CNAME Domain")),
|
|
|
|
|
(_("Domain"), _("Prioritet"),\
|
|
|
|
|
_("MX Domain"))]
|
|
|
|
|
for i in range(len(allRecordList)):
|
|
|
|
|
if allDataList[i]:
|
|
|
|
|
title=_("Information about %s records")\
|
|
|
|
|
%allRecordList[i] + " " +\
|
|
|
|
|
("in master DNS zone %s")%zoneName
|
|
|
|
|
headerList = allHeaderList[i]
|
|
|
|
|
dataList = allDataList[i]
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
print ""
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
# Если обратная зона
|
|
|
|
|
else:
|
|
|
|
|
dataPTRList = []
|
|
|
|
|
# Получение из названия зоны cтроки из 3-х частей IP
|
|
|
|
|
getThreeOctetsIP = lambda x: ".".join(map(lambda x:x,\
|
|
|
|
|
reversed('.in-addr.arpa' in x and\
|
|
|
|
|
x.rpartition(".in-addr.arpa")[0].split(".") or [])))
|
|
|
|
|
threeOctetsIP = getThreeOctetsIP(zoneName)
|
|
|
|
|
if not threeOctetsIP:
|
|
|
|
|
self.printERROR(_("Incorrect zone name %s")%zoneName)
|
|
|
|
|
return False
|
|
|
|
|
for record in recordsSearch:
|
|
|
|
|
if record[0][1].has_key("pTRRecord"):
|
|
|
|
|
IP = "%s.%s"%(threeOctetsIP,\
|
|
|
|
|
record[0][1]["relativeDomainName"][0])
|
|
|
|
|
domainName = delDot(record[0][1]["pTRRecord"][0])
|
|
|
|
|
dataPTRList.append([IP, domainName])
|
|
|
|
|
if dataPTRList:
|
|
|
|
|
title=_("Information about %s records")\
|
|
|
|
|
%"PTR" + " " +\
|
|
|
|
|
("in master DNS zone %s")%zoneName
|
|
|
|
|
headerList = ("ip", _("Domain"))
|
|
|
|
|
dataList = dataPTRList
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
print ""
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
return True
|
|
|
|
|
# Информация о DNS записи
|
|
|
|
|
if options.has_key("r"):
|
|
|
|
|
hostOrIP = options["r"]
|
|
|
|
|
# Флаг True - hostOrIP является хостом
|
|
|
|
|
hostInForwardZone = servDnsObj.isForwardName(hostOrIP)
|
|
|
|
|
domainName = ""
|
|
|
|
|
domainNamePTR = ""
|
|
|
|
|
# Найденные данные о записи
|
|
|
|
|
dataRecords = []
|
|
|
|
|
headerList = [_("Field"), _("Value")]
|
|
|
|
|
dataList = []
|
|
|
|
|
# Удаляет лишние точки в названии
|
|
|
|
|
delDot = lambda y: ".".join(filter(lambda x: x, y.split(".")))
|
|
|
|
|
# hostOrIP является именем хоста
|
|
|
|
|
if hostInForwardZone:
|
|
|
|
|
domainName = delDot(hostOrIP.lower())
|
|
|
|
|
# Имя хоста, имя зоны
|
|
|
|
|
hostName, spl, zoneName = domainName.partition(".")
|
|
|
|
|
if not zoneName or "@" in hostName:
|
|
|
|
|
self.printERROR(_("Domain name %s incorrectly")%domainName)
|
|
|
|
|
return False
|
|
|
|
|
dataRecords = servDnsObj.searchAllDomainNamesInLDAP(domainName)
|
|
|
|
|
if not dataRecords:
|
|
|
|
|
self.printERROR(_("Record %s not exists in LDAP")\
|
|
|
|
|
%domainName)
|
|
|
|
|
return False
|
|
|
|
|
flagF = True
|
|
|
|
|
for record in dataRecords:
|
|
|
|
|
dataList.append([_("Domain name"), domainName])
|
|
|
|
|
if record[0][1].has_key("aRecord"):
|
|
|
|
|
dataList.append([_("A record"),\
|
|
|
|
|
record[0][1]["aRecord"][0]])
|
|
|
|
|
if record[0][1].has_key("mXRecord"):
|
|
|
|
|
flagFirst = True
|
|
|
|
|
flagError = False
|
|
|
|
|
for mxData in record[0][1]["mXRecord"]:
|
|
|
|
|
mxDataSpl = mxData.split(" ")
|
|
|
|
|
if len(mxDataSpl) != 2:
|
|
|
|
|
flagError = True
|
|
|
|
|
break
|
|
|
|
|
if flagFirst:
|
|
|
|
|
dataList.append([_("MX record") ,mxData])
|
|
|
|
|
flagFirst = False
|
|
|
|
|
else:
|
|
|
|
|
dataList.append(["", mxData])
|
|
|
|
|
if flagError:
|
|
|
|
|
self.printERROR(\
|
|
|
|
|
_("Incorrect MX records in A record %s")\
|
|
|
|
|
%domainName)
|
|
|
|
|
return False
|
|
|
|
|
typeRecord = "A"
|
|
|
|
|
elif record[0][1].has_key("cNAMERecord"):
|
|
|
|
|
dataList.append([_("CNAME record"),\
|
|
|
|
|
record[0][1]["cNAMERecord"][0]])
|
|
|
|
|
typeRecord = "CNAME"
|
|
|
|
|
title=_("Information about %s record")\
|
|
|
|
|
%typeRecord + " " +\
|
|
|
|
|
("in master DNS zone %s")%zoneName
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
if flagF:
|
|
|
|
|
flagF = False
|
|
|
|
|
else:
|
|
|
|
|
print ""
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
# hostOrIP является ip
|
|
|
|
|
else:
|
|
|
|
|
if "," in hostOrIP or \
|
|
|
|
|
not servDnsObj.isCorrectStringNet(hostOrIP, False):
|
|
|
|
|
self.printERROR(_("IP address %s incorrectly")%hostOrIP)
|
|
|
|
|
return False
|
|
|
|
|
ip = hostOrIP
|
|
|
|
|
dataIP = servDnsObj.getDomainAndZoneFromIP(ip)
|
|
|
|
|
if not dataIP:
|
|
|
|
|
self.printERROR(_("IP address %s incorrectly")%ip)
|
|
|
|
|
return False
|
|
|
|
|
hostNamePTR, domainNamePTR, zoneNamePTR = dataIP
|
|
|
|
|
dataRecords=servDnsObj.searchAllDomainNamesInLDAP(domainNamePTR)
|
|
|
|
|
if not dataRecords:
|
|
|
|
|
self.printERROR(_("Record %s not exists in LDAP")\
|
|
|
|
|
%domainNamePTR)
|
|
|
|
|
return False
|
|
|
|
|
flagF = True
|
|
|
|
|
typeRecord = "Unknown"
|
|
|
|
|
for record in dataRecords:
|
|
|
|
|
dataList.append(["ip", ip])
|
|
|
|
|
if record[0][1].has_key("pTRRecord"):
|
|
|
|
|
domainNameDot = record[0][1]["pTRRecord"][0]
|
|
|
|
|
dataList.append([_("PTR record"), domainNameDot])
|
|
|
|
|
typeRecord = "PTR"
|
|
|
|
|
title=_("Information about %s record")\
|
|
|
|
|
%typeRecord + " " +\
|
|
|
|
|
("in master DNS zone %s")%zoneNamePTR
|
|
|
|
|
repObj = report(title, headerList, dataList)
|
|
|
|
|
if flagF:
|
|
|
|
|
flagF = False
|
|
|
|
|
else:
|
|
|
|
|
print ""
|
|
|
|
|
repObj.printReport()
|
|
|
|
|
return True
|
|
|
|
|
# Информация о компьютере
|
|
|
|
|
if options.has_key("M"):
|
|
|
|
|
machineName = options["M"]
|
|
|
|
@ -14429,10 +14717,24 @@ class servDns(shareLdap):
|
|
|
|
|
["zoneName"])
|
|
|
|
|
resSearchRev = self.searchLdapDN('*', self.relReverseDN, "zoneName",
|
|
|
|
|
["zoneName"])
|
|
|
|
|
|
|
|
|
|
return map (lambda x: x[0][1]['zoneName'][0],\
|
|
|
|
|
resSearchFwd + resSearchRev)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def searchAllRecordInZone(self, zoneName):
|
|
|
|
|
"""Информация о всех записях в LDAP зоне (для cl-info)
|
|
|
|
|
|
|
|
|
|
Кроме SOA записи (имя домена @)
|
|
|
|
|
"""
|
|
|
|
|
relZonesDN = self.getRelZonesDN(zoneName)
|
|
|
|
|
relZoneDN = self.addDN("zoneName=%s"%zoneName,relZonesDN)
|
|
|
|
|
resSearch = self.searchLdapDN("*", relZoneDN,"relativeDomainName")
|
|
|
|
|
if resSearch:
|
|
|
|
|
resSearch = filter(lambda x:\
|
|
|
|
|
not x[0][1]["relativeDomainName"][0]=="@",\
|
|
|
|
|
resSearch)
|
|
|
|
|
return resSearch
|
|
|
|
|
|
|
|
|
|
def searchAllDomainNamesInLDAP(self, domainName):
|
|
|
|
|
"""Находит узел описания домена (если домен @ - это описание зоны)
|
|
|
|
|
|
|
|
|
@ -15422,10 +15724,9 @@ this DNS server')%nameServer)
|
|
|
|
|
# Добавляем мастер сервер в имена авторитативаных серверов
|
|
|
|
|
if not nameServer in namesServers:
|
|
|
|
|
namesServers.insert(0, nameServer)
|
|
|
|
|
modAttrs.append((ldap.MOD_DELETE, 'nSRecord', None))
|
|
|
|
|
map (lambda x:\
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'nSRecord', addDot(x))),
|
|
|
|
|
namesServers)
|
|
|
|
|
modAttrs.append((ldap.MOD_DELETE, 'nSRecord', None))
|
|
|
|
|
modAttrs.append((ldap.MOD_ADD, 'nSRecord',\
|
|
|
|
|
map(lambda x: addDot(x), namesServers)))
|
|
|
|
|
DN = self.addDN("relativeDomainName=@", relZoneDN)
|
|
|
|
|
if not self.modAttrsDN(DN, modAttrs):
|
|
|
|
|
self.printERROR(_("Can not modify new SOA record for zone %s\
|
|
|
|
@ -15949,8 +16250,6 @@ is incompatible with option "--ip"')
|
|
|
|
|
return False
|
|
|
|
|
# Изменяем cname указатель
|
|
|
|
|
if cnameServer:
|
|
|
|
|
# Ищем A запись
|
|
|
|
|
|
|
|
|
|
if not self.modCNAMERecord(hostName, domainName, zoneName,
|
|
|
|
|
cnameServer):
|
|
|
|
|
return False
|
|
|
|
|