|
|
|
@ -19383,10 +19383,13 @@ eth0, eth1, ... etc."%net)
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
def createDNSHost(self, fullHostName, ip, delDNSRecord=True):
|
|
|
|
|
def createDNSHost(self, fullHostName,ip,delDNSRecord=True,checkName=True):
|
|
|
|
|
"""Добавляет A и PTR записи в DNS сервис
|
|
|
|
|
|
|
|
|
|
Если запись существует - удаляет ее (delDNSRecord=True)
|
|
|
|
|
Если запись существует и не в динамическом диапазоне -
|
|
|
|
|
не делает никаких действий
|
|
|
|
|
(checkName=True совместно с delDNSRecord=True)
|
|
|
|
|
"""
|
|
|
|
|
# Ищем А запись в DNS
|
|
|
|
|
flagCreateARecord = True
|
|
|
|
@ -19402,6 +19405,19 @@ eth0, eth1, ... etc."%net)
|
|
|
|
|
if ip in aRecords:
|
|
|
|
|
flagCreateARecord = False
|
|
|
|
|
flagDelARecord = False
|
|
|
|
|
if delDNSRecord and checkName:
|
|
|
|
|
flagFoundIpNotRanges = False
|
|
|
|
|
dhcpObj = dncpTxt()
|
|
|
|
|
for ipAdr in aRecords:
|
|
|
|
|
# Проверка на диапазон адресов
|
|
|
|
|
flagCorrect, flagError =\
|
|
|
|
|
self.isCorrectDynamicIP(\
|
|
|
|
|
fullHostName.partition(".")[0], ipAdr, dhcpObj,
|
|
|
|
|
False)
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
if not flagCorrect:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
if delDNSRecord:
|
|
|
|
|
# Удаляем A записи имеющие этот IP в прямой зоне
|
|
|
|
@ -19561,12 +19577,17 @@ incompatible, use one of the options"))
|
|
|
|
|
domain = listDomain[0].strip()
|
|
|
|
|
host = options['host']
|
|
|
|
|
fullHostName = "%s.%s"%(host,domain)
|
|
|
|
|
# Проверка на диапазон адресов
|
|
|
|
|
flagCorrect, flagError = self.isCorrectDynamicIP(host, ip)
|
|
|
|
|
if flagError:
|
|
|
|
|
return False
|
|
|
|
|
if not flagCorrect:
|
|
|
|
|
return True
|
|
|
|
|
# устанавливаем переменные в объекте сервиса DHCP
|
|
|
|
|
self.createClVars()
|
|
|
|
|
self.clVars.Set("sr_dhcp_set","on",True)
|
|
|
|
|
self.clVars.Set("sr_dns_set","on",True)
|
|
|
|
|
self.servDnsObj.clVars = self.clVars
|
|
|
|
|
|
|
|
|
|
if not self.addDNSHost(fullHostName, ip, adminDn, adminPw, baseDN):
|
|
|
|
|
return False
|
|
|
|
|
return True
|
|
|
|
@ -20013,6 +20034,7 @@ network %s")%net)
|
|
|
|
|
break
|
|
|
|
|
return flagCorrect
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def isCorrectNetRange(self, net, listRangeNew, dhcpObj=False):
|
|
|
|
|
"""Проверяет корректность нового диапазона динамических адресов"""
|
|
|
|
|
if not dhcpObj:
|
|
|
|
@ -20065,6 +20087,100 @@ network %s")%net)
|
|
|
|
|
break
|
|
|
|
|
return flagCorrect
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def isCorrectDynamicIP(self, host, ip, dhcpObj=False, printErr=True):
|
|
|
|
|
"""Проверяет имя хоста и ip при добавлении при помощи демона"""
|
|
|
|
|
flagError = False
|
|
|
|
|
if not dhcpObj:
|
|
|
|
|
dhcpObj = dncpTxt()
|
|
|
|
|
dataNets = dhcpObj.getDataInAllSubnet()
|
|
|
|
|
dataHosts = dhcpObj.getDataInAllHost()
|
|
|
|
|
getPar = lambda opt, data: map(lambda x: opt in x[1].keys() and\
|
|
|
|
|
(x[0],x[1][opt]) or (), data)
|
|
|
|
|
ranges = getPar('range', dataNets)
|
|
|
|
|
# сеть без последнего октета
|
|
|
|
|
rpIP = ip.rpartition(".")[0]
|
|
|
|
|
try:
|
|
|
|
|
numIP = int(ip.rpartition(".")[2])
|
|
|
|
|
except:
|
|
|
|
|
if printErr:
|
|
|
|
|
self.printERROR(_("IP address %s incorrect")%ip)
|
|
|
|
|
return (False, True)
|
|
|
|
|
flagCorrect = False
|
|
|
|
|
if not ranges:
|
|
|
|
|
if printErr:
|
|
|
|
|
self.printERROR(_("Can not found 'range' in config file %s")\
|
|
|
|
|
%dhcpObj.nameConfigFile)
|
|
|
|
|
return (False, True)
|
|
|
|
|
# Флаг ip найден в одной из сетей
|
|
|
|
|
flagFoundIpInNet = False
|
|
|
|
|
# Флаг ошибки в конфигурационном файле
|
|
|
|
|
flagErrorConfig = False
|
|
|
|
|
# Проверка на сеть
|
|
|
|
|
for data in ranges:
|
|
|
|
|
flagCorrect = False
|
|
|
|
|
if not data:
|
|
|
|
|
break
|
|
|
|
|
net, r = data
|
|
|
|
|
rpIPA = r[0].rpartition(".")[0]
|
|
|
|
|
rpIPB = r[1].rpartition(".")[0]
|
|
|
|
|
if rpIPA != rpIPB:
|
|
|
|
|
flagErrorConfig = True
|
|
|
|
|
break
|
|
|
|
|
if len(r) != 2:
|
|
|
|
|
flagErrorConfig = True
|
|
|
|
|
break
|
|
|
|
|
if rpIP == rpIPA:
|
|
|
|
|
try:
|
|
|
|
|
numA = int(r[0].rpartition(".")[2])
|
|
|
|
|
numB = int(r[1].rpartition(".")[2])
|
|
|
|
|
except:
|
|
|
|
|
flagErrorConfig = True
|
|
|
|
|
break
|
|
|
|
|
# ip найден в существующих сетях
|
|
|
|
|
if not flagFoundIpInNet:
|
|
|
|
|
flagFoundIpInNet = True
|
|
|
|
|
numA, numB = [max([numA,numB]), min([numA,numB])]
|
|
|
|
|
if numA > numB:
|
|
|
|
|
if numIP <= numA and numIP >= numB:
|
|
|
|
|
flagCorrect = True
|
|
|
|
|
|
|
|
|
|
break
|
|
|
|
|
else:
|
|
|
|
|
flagErrorConfig = True
|
|
|
|
|
break
|
|
|
|
|
# Проверка на статические хосты
|
|
|
|
|
if not flagCorrect:
|
|
|
|
|
# Если ip не найден в существующих сетях
|
|
|
|
|
if not flagFoundIpInNet:
|
|
|
|
|
flagError = True
|
|
|
|
|
if printErr:
|
|
|
|
|
self.printERROR(_("Can not found %s in networks") %ip+" " +\
|
|
|
|
|
_("in config file %s")%dhcpObj.nameConfigFile)
|
|
|
|
|
# Если ошибка в конфигурационном файле
|
|
|
|
|
elif flagErrorConfig:
|
|
|
|
|
flagError = True
|
|
|
|
|
if printErr:
|
|
|
|
|
self.printErrConfig(dhcpObj, net)
|
|
|
|
|
if not flagError:
|
|
|
|
|
staticIPs = getPar('fixed-address', dataHosts)
|
|
|
|
|
flagFoundHost = False
|
|
|
|
|
for data in staticIPs:
|
|
|
|
|
if not data:
|
|
|
|
|
break
|
|
|
|
|
hostname, stIP = data
|
|
|
|
|
if host == hostname:
|
|
|
|
|
flagFoundHost = True
|
|
|
|
|
break
|
|
|
|
|
if not flagFoundHost:
|
|
|
|
|
if printErr:
|
|
|
|
|
self.printERROR(\
|
|
|
|
|
_("Can not found %s in dynamic ip range")\
|
|
|
|
|
%ip+" "+_("in config file %s")%\
|
|
|
|
|
dhcpObj.nameConfigFile)
|
|
|
|
|
return (flagCorrect, flagError)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def isCorrectStaticIP(self, ip, dhcpObj=False):
|
|
|
|
|
"""Проверяет ip на существующие сети и диапазон динамических адресов"""
|
|
|
|
|
if not dhcpObj:
|
|
|
|
|