Устранена ошибка получения пароля из потока при модификации пользователя Samba сервиса

Добавлены методы для вывода информации из сервиса DNS
develop
Самоукин Алексей 15 years ago
parent ffa5d03147
commit ca9ad726d3

@ -7,7 +7,7 @@ calculate-server needs the following library version installed, in order to run:
Python >= 2.5
python-ldap >= 2.0.0
pyxml >= 0.8
calculate-lib >= 2.1.0
calculate-lib >= 2.1.2
To install calculate-server , just execute the install script 'setup.py'.
Example:

@ -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

Loading…
Cancel
Save