|
|
|
@ -49,7 +49,6 @@ class ldapFunction(cl_profile._error):
|
|
|
|
|
def __ldapConnect(self, dnUser, password):
|
|
|
|
|
"""Соединение с LDAP сервером"""
|
|
|
|
|
conLdap = ldap.initialize('ldap://localhost')
|
|
|
|
|
print dnUser, password
|
|
|
|
|
conLdap.simple_bind_s(dnUser, password)
|
|
|
|
|
return conLdap
|
|
|
|
|
|
|
|
|
@ -76,7 +75,7 @@ Version = "calculate-server 0.0.1"
|
|
|
|
|
tr = cl_base.lang()
|
|
|
|
|
tr.setLanguage(sys.modules[__name__])
|
|
|
|
|
|
|
|
|
|
class cl_ldap(cl_profile._error):
|
|
|
|
|
class cl_ldap(cl_profile._error, cl_profile.xmlShare):
|
|
|
|
|
|
|
|
|
|
def getChapterNumber(self,NameChapter):
|
|
|
|
|
# Показать номер раздела по его имени
|
|
|
|
@ -89,15 +88,17 @@ class cl_ldap(cl_profile._error):
|
|
|
|
|
|
|
|
|
|
def __init__(self, cmdName):
|
|
|
|
|
# ini файл
|
|
|
|
|
self.iniFile = "/etc/calculate/calculate.ini"
|
|
|
|
|
self.iniFile = "/etc/calculate2/calculate.ini"
|
|
|
|
|
|
|
|
|
|
self.cmdName = cmdName
|
|
|
|
|
# Удаляем ненужный аттрибут класса cl_profile.xmlShare
|
|
|
|
|
self._createElement = False
|
|
|
|
|
delattr(self, "_createElement")
|
|
|
|
|
|
|
|
|
|
self.shortOpt = []
|
|
|
|
|
self.cmdName = cmdName
|
|
|
|
|
#короткие опции командной строки
|
|
|
|
|
self.longOpt = []
|
|
|
|
|
self.shortOpt = []
|
|
|
|
|
#длинные опции командной строки
|
|
|
|
|
|
|
|
|
|
self.longOpt = []
|
|
|
|
|
#optEnd = ""
|
|
|
|
|
#if "user" in self.cmdName and not "mod" in self.cmdName:
|
|
|
|
|
#optEnd = _("user")
|
|
|
|
@ -150,6 +151,12 @@ class cl_ldap(cl_profile._error):
|
|
|
|
|
'helpChapter':_("Options"),
|
|
|
|
|
'help':_("input user password")
|
|
|
|
|
},
|
|
|
|
|
{'progAccess':(6,),
|
|
|
|
|
'chortOption':"f",
|
|
|
|
|
'longOption':"force",
|
|
|
|
|
'helpChapter':_("Options"),
|
|
|
|
|
'help':_("forced setup service")
|
|
|
|
|
},
|
|
|
|
|
# Services
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" ldap \t\t\tldap " + servName + "\n"
|
|
|
|
@ -157,33 +164,33 @@ class cl_ldap(cl_profile._error):
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" samba \t\tsamba " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" mail \t\t\tmail " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" ftp \t\t\tftp " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" proxy \t\tproxy " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" radius \t\tradius " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" jabber \t\tjabber " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" addressbook \t\taddressbook " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" dhcp \t\t\tdhcp " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" named \t\tnamed " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
{'helpChapter':_("Services"),
|
|
|
|
|
'help':" wiki \t\t\twiki " + servName + "\n"
|
|
|
|
|
},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" mail \t\t\tmail " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" ftp \t\t\tftp " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" proxy \t\tproxy " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" radius \t\tradius " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" jabber \t\tjabber " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" addressbook \t\taddressbook " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" dhcp \t\t\tdhcp " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" named \t\tnamed " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
##{'helpChapter':_("Services"),
|
|
|
|
|
##'help':" wiki \t\t\twiki " + servName + "\n"
|
|
|
|
|
##},
|
|
|
|
|
# Informative output
|
|
|
|
|
{'chortOption':"h",
|
|
|
|
|
'longOption':"help",
|
|
|
|
@ -439,40 +446,43 @@ _("in the system") + ".\n"
|
|
|
|
|
self.setError(_("Not found ini file:")) + "\n " + self.iniFile
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
def createIniFile(self):
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def setParamIniFile(self, name, value):
|
|
|
|
|
"""Записываем новый параметр в ini файл"""
|
|
|
|
|
if os.access(self.iniFile, os.F_OK):
|
|
|
|
|
FD = open (self.iniFile)
|
|
|
|
|
lines = FD.read().splitlines()
|
|
|
|
|
FD.close()
|
|
|
|
|
dictParam = {}
|
|
|
|
|
newLines = []
|
|
|
|
|
for par in lines:
|
|
|
|
|
n ,v = par.split("=")
|
|
|
|
|
if not dictParam.has_key(n.strip()):
|
|
|
|
|
dictParam[n.strip()] = v.strip()
|
|
|
|
|
newLines.append((n.strip(),v.strip(),par))
|
|
|
|
|
if dictParam.has_key(name):
|
|
|
|
|
i = 0
|
|
|
|
|
for n,v,l in newLines:
|
|
|
|
|
if n == name:
|
|
|
|
|
newLines[i] = (name, value, name + "=" + value)
|
|
|
|
|
break
|
|
|
|
|
i += 1
|
|
|
|
|
else:
|
|
|
|
|
newLines.append((name, value, name + "=" + value))
|
|
|
|
|
if newLines:
|
|
|
|
|
FD = open (self.iniFile, "w")
|
|
|
|
|
FD.truncate(0)
|
|
|
|
|
FD.seek(0)
|
|
|
|
|
for n,v,l in newLines[:-1]:
|
|
|
|
|
FD.write(l+"\n")
|
|
|
|
|
FD.write(newLines[-1][2])
|
|
|
|
|
FD.close()
|
|
|
|
|
return True
|
|
|
|
|
# Если ini файл не существует создаем его
|
|
|
|
|
if not os.access(self.iniFile, os.F_OK):
|
|
|
|
|
self.createIniFile()
|
|
|
|
|
FD = open (self.iniFile)
|
|
|
|
|
lines = FD.read().splitlines()
|
|
|
|
|
FD.close()
|
|
|
|
|
dictParam = {}
|
|
|
|
|
newLines = []
|
|
|
|
|
for par in lines:
|
|
|
|
|
n ,v = par.split("=")
|
|
|
|
|
if not dictParam.has_key(n.strip()):
|
|
|
|
|
dictParam[n.strip()] = v.strip()
|
|
|
|
|
newLines.append((n.strip(),v.strip(),par))
|
|
|
|
|
if dictParam.has_key(name):
|
|
|
|
|
i = 0
|
|
|
|
|
for n,v,l in newLines:
|
|
|
|
|
if n == name:
|
|
|
|
|
newLines[i] = (name, value, name + "=" + value)
|
|
|
|
|
break
|
|
|
|
|
i += 1
|
|
|
|
|
else:
|
|
|
|
|
self.setError(_("Not found ini file:")) + "\n " + self.iniFile
|
|
|
|
|
return False
|
|
|
|
|
newLines.append((name, value, name + "=" + value))
|
|
|
|
|
if newLines:
|
|
|
|
|
FD = open (self.iniFile, "w")
|
|
|
|
|
FD.truncate(0)
|
|
|
|
|
FD.seek(0)
|
|
|
|
|
for n,v,l in newLines[:-1]:
|
|
|
|
|
FD.write(l+"\n")
|
|
|
|
|
FD.write(newLines[-1][2])
|
|
|
|
|
FD.close()
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def delParamIniFile(self, name):
|
|
|
|
|
"""Удаляет параметр из ini файла"""
|
|
|
|
@ -526,18 +536,21 @@ _("in the system") + ".\n"
|
|
|
|
|
fout, fin = popen2.popen2(cmdStrProg)
|
|
|
|
|
fin.close()
|
|
|
|
|
textLine = fout.readline()
|
|
|
|
|
fout.read()
|
|
|
|
|
fout.close()
|
|
|
|
|
return textLine
|
|
|
|
|
|
|
|
|
|
def printRight(self, right):
|
|
|
|
|
"""Переводит курсор на позицию right справа от края консоли
|
|
|
|
|
def printRight(self, offsetLeft, offsetRight):
|
|
|
|
|
"""Добавляет необходимое количество пробелов:
|
|
|
|
|
|
|
|
|
|
количество пробелов = (ширина консоли - offsetLeft - offsetRight)
|
|
|
|
|
"""
|
|
|
|
|
s = struct.pack("HHHH", 0, 0, 0, 0)
|
|
|
|
|
fd_stdout = sys.stdout.fileno()
|
|
|
|
|
x = fcntl.ioctl(fd_stdout, termios.TIOCGWINSZ, s)
|
|
|
|
|
#(rows, cols, x pixels, y pixels)
|
|
|
|
|
cols = struct.unpack("HHHH", x)[1]
|
|
|
|
|
for i in range(cols-right):
|
|
|
|
|
for i in range(cols - offsetLeft - offsetRight):
|
|
|
|
|
sys.stdout.write(" ")
|
|
|
|
|
|
|
|
|
|
def colorPrint(self,attr,fg,bg,string):
|
|
|
|
@ -588,16 +601,100 @@ _("in the system") + ".\n"
|
|
|
|
|
lst.append(bg)
|
|
|
|
|
sys.stdout.write("\033[%sm%s\033[0m" %(";".join(lst),string))
|
|
|
|
|
|
|
|
|
|
def greenPrint(self, string):
|
|
|
|
|
"""Печатает зеленое сообщение"""
|
|
|
|
|
def greenBrightPrint(self, string):
|
|
|
|
|
"""Печатает яркое зеленое сообщение"""
|
|
|
|
|
self.colorPrint("1","32","",string)
|
|
|
|
|
|
|
|
|
|
def bluePrint(self, string):
|
|
|
|
|
"""Печатает фиолетовое сообщение"""
|
|
|
|
|
def blueBrightPrint(self, string):
|
|
|
|
|
"""Печатает яркое cинее сообщение"""
|
|
|
|
|
self.colorPrint("1","34","",string)
|
|
|
|
|
|
|
|
|
|
def setupLdapServer(self):
|
|
|
|
|
"""Начальная настройка Ldap сервиса"""
|
|
|
|
|
def redBrightPrint(self, string):
|
|
|
|
|
"""Печатает яркое красное сообщение"""
|
|
|
|
|
self.colorPrint("1","31","",string)
|
|
|
|
|
|
|
|
|
|
def brPrint(self):
|
|
|
|
|
sys.stdout.write("\n")
|
|
|
|
|
|
|
|
|
|
def lenString(self, string):
|
|
|
|
|
"""Получаем длинну строки"""
|
|
|
|
|
stringUnicode = self._toUNICODE(string)
|
|
|
|
|
lenString = len(stringUnicode)
|
|
|
|
|
return lenString
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def defaultPrint(self, string):
|
|
|
|
|
sys.stdout.write(string)
|
|
|
|
|
|
|
|
|
|
def printLine(self, argL, argR):
|
|
|
|
|
"""Печатает справа и слева консоли цветные сообщения"""
|
|
|
|
|
#Допустимые цвета
|
|
|
|
|
colorDict = {\
|
|
|
|
|
# цвет по умолчанию
|
|
|
|
|
'':self.defaultPrint,
|
|
|
|
|
# ярко зеленый
|
|
|
|
|
'greenBr':self.greenBrightPrint,
|
|
|
|
|
# ярко голубой
|
|
|
|
|
'blueBr':self.blueBrightPrint,
|
|
|
|
|
# ярко красный
|
|
|
|
|
'redBr':self.redBrightPrint,
|
|
|
|
|
}
|
|
|
|
|
# cмещение от левого края консоли
|
|
|
|
|
offsetL = 0
|
|
|
|
|
for color,leftString in argL:
|
|
|
|
|
offsetL += self.lenString(leftString)
|
|
|
|
|
if colorDict.has_key(color):
|
|
|
|
|
# печатаем и считаем смещение
|
|
|
|
|
colorDict[color](leftString)
|
|
|
|
|
else:
|
|
|
|
|
colorDict[''](leftString)
|
|
|
|
|
# cмещение от правого края консоли
|
|
|
|
|
offsetR = 0
|
|
|
|
|
for color,rightString in argR:
|
|
|
|
|
offsetR += self.lenString(rightString)
|
|
|
|
|
# Добавляем пробелы
|
|
|
|
|
self.printRight(offsetL, offsetR)
|
|
|
|
|
for color,rightString in argR:
|
|
|
|
|
if colorDict.has_key(color):
|
|
|
|
|
# печатаем и считаем смещение
|
|
|
|
|
colorDict[color](rightString)
|
|
|
|
|
else:
|
|
|
|
|
colorDict[''](rightString)
|
|
|
|
|
|
|
|
|
|
def printNotOK(self, string):
|
|
|
|
|
"""Вывод на печать в случае сбоя"""
|
|
|
|
|
self.printLine((('greenBr',' * '),
|
|
|
|
|
('',string),
|
|
|
|
|
),
|
|
|
|
|
(('blueBr','['),
|
|
|
|
|
('redBr',' !! '),
|
|
|
|
|
('blueBr',']'),
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
def printOK(self, string):
|
|
|
|
|
"""Вывод на печать в случае успеха"""
|
|
|
|
|
self.printLine((('greenBr',' * '),
|
|
|
|
|
('',string),
|
|
|
|
|
),
|
|
|
|
|
(('blueBr','['),
|
|
|
|
|
('greenBr',' ok '),
|
|
|
|
|
('blueBr',']'),
|
|
|
|
|
)
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def setupLdapServer(self, options):
|
|
|
|
|
"""Начальная настройка LDAP сервиса"""
|
|
|
|
|
# Принудительная установка
|
|
|
|
|
forceOptions = False
|
|
|
|
|
if "f" in options:
|
|
|
|
|
forceOptions = True
|
|
|
|
|
# В случае если сервер установлен
|
|
|
|
|
if self.getParamIniFile("setup_LDAP") == "yes" and\
|
|
|
|
|
not forceOptions:
|
|
|
|
|
print _("LDAP server is configured")
|
|
|
|
|
return True
|
|
|
|
|
# Проверим запущен ли ldap
|
|
|
|
|
if self.getRunService("ldap"):
|
|
|
|
|
print _("The LDAP service is running")
|
|
|
|
@ -607,10 +704,11 @@ _("in the system") + ".\n"
|
|
|
|
|
LDAP in backup directory")
|
|
|
|
|
print "3. " + _("Restart the program")
|
|
|
|
|
return True
|
|
|
|
|
self.setParamIniFile("setup_LDAP","no")
|
|
|
|
|
clVars = cl_base.DataVars()
|
|
|
|
|
clVars.flServer()
|
|
|
|
|
# Для тестовых целей устанавливаем директорию инсталяции
|
|
|
|
|
clVars.Set("setup_path_install","/tmp/test1/")
|
|
|
|
|
#clVars.Set("setup_path_install","/tmp/test1/")
|
|
|
|
|
# Устанавливаем переменную (говорит о том что первый проход)
|
|
|
|
|
clVars.Set("setup_pass_parser","1",True)
|
|
|
|
|
# Cоздаем объект профиль устанавливая директорию ldap для
|
|
|
|
@ -619,31 +717,19 @@ LDAP in backup directory")
|
|
|
|
|
# Объединяем профили
|
|
|
|
|
clProf.applyProfiles()
|
|
|
|
|
# Удаляем предыдущую базу данных
|
|
|
|
|
print _("Remove previons Ldap Database ...")
|
|
|
|
|
self.execProg("rm -rf /var/lib/openldap-data/*")
|
|
|
|
|
self.printOK(_("Remove previons LDAP Database ..."))
|
|
|
|
|
# Запускаем LDAP сервер
|
|
|
|
|
textLine = self.execProg("/etc/init.d/slapd start")
|
|
|
|
|
ldifFile = "/usr/lib/calculate/calculate-server/ldif/ldap_base.ldif"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#self.printRight(6)
|
|
|
|
|
#self.bluePrint("[")
|
|
|
|
|
#self.greenPrint(" ok ")
|
|
|
|
|
#self.bluePrint("]")
|
|
|
|
|
#print
|
|
|
|
|
|
|
|
|
|
if "ok" in textLine:
|
|
|
|
|
print "LDAP start OK"
|
|
|
|
|
self.printOK(_("LDAP start ..."))
|
|
|
|
|
else:
|
|
|
|
|
print "Error Ldap start"
|
|
|
|
|
self.printNotOK(_("LDAP start ..."))
|
|
|
|
|
return False
|
|
|
|
|
baseLdif = self.createLdif(ldifFile, clVars)
|
|
|
|
|
#print baseLdif
|
|
|
|
|
print clVars.Get("soft_ldap_admin")
|
|
|
|
|
#rootTmpDn = clVars.Get("soft_ldap_root_tmp")
|
|
|
|
|
#print clVars.Get("soft_ldap_rootpw_tmp")
|
|
|
|
|
#print clVars.Get("soft_ldap_rootpw_tmp_hash")
|
|
|
|
|
print clVars.Get("soft_ldap_adminpw")
|
|
|
|
|
#clVars.printVars()
|
|
|
|
|
ldapObj = ldapFunction(clVars.Get("soft_ldap_admin_tmp"),
|
|
|
|
|
clVars.Get("soft_ldap_adminpw_tmp"))
|
|
|
|
@ -651,15 +737,26 @@ LDAP in backup directory")
|
|
|
|
|
ldapObj.ldapAdd(baseLdif)
|
|
|
|
|
if ldapObj.getError():
|
|
|
|
|
print _("LDAP Error") + ": " + ldapObj.getError()
|
|
|
|
|
return False
|
|
|
|
|
self.printOK(_("Add ldif file ..."))
|
|
|
|
|
# Удаляем временного пользователя root из конфигурационного файла
|
|
|
|
|
clVars.Set("setup_pass_parser","2",True)
|
|
|
|
|
clProf.applyProfiles()
|
|
|
|
|
# Перезапускаем LDAP сервер
|
|
|
|
|
textLine = self.execProg("/etc/init.d/slapd restart")
|
|
|
|
|
if "ok" in textLine:
|
|
|
|
|
self.printOK(_("LDAP restart ..."))
|
|
|
|
|
else:
|
|
|
|
|
self.printNotOK(_("LDAP restart ..."))
|
|
|
|
|
return False
|
|
|
|
|
self.setParamIniFile("setup_LDAP","yes")
|
|
|
|
|
#print clVars.Get("soft_ldap_admin")
|
|
|
|
|
#print clVars.Get("soft_ldap_adminpw")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#self.setParamIniFile("test","param")
|
|
|
|
|
#
|
|
|
|
|
#self.setParamIniFile("test1","param1")
|
|
|
|
|
#self.delParamIniFile("test1")
|
|
|
|
|
#self.delParamIniFile("test")
|
|
|
|
|