Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
240 строки
10 KiB
240 строки
10 KiB
#-*- coding: utf-8 -*-
|
|
|
|
# Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
__version__ = "2.2.0.0"
|
|
__app__ = "calculate-ldap"
|
|
|
|
import os, sys
|
|
|
|
from server.utils import dialogYesNo
|
|
from cl_print import color_print
|
|
|
|
from cl_ldap_api import serviceAPI, shareVars
|
|
from cl_template import template
|
|
from server.services import services
|
|
from server.ldap import iniLdapParser, ldapFunction, shareldap
|
|
from server.utils import genSleep
|
|
from cl_utils import removeDir, _error, appendProgramToEnvFile,\
|
|
removeProgramToEnvFile
|
|
|
|
from cl_lang import lang
|
|
lang().setLanguage(sys.modules[__name__])
|
|
|
|
class ldapService(shareVars, shareldap):
|
|
"""Методы севисa Ldap"""
|
|
# Базовый ldif файл
|
|
ldifFileBase = '/usr/lib/calculate-2.2/calculate-ldap/ldif/base.ldif'
|
|
apiFile = '/usr/lib/calculate-2.2/calculate-ldap/pym/cl_ldap_api.py'
|
|
APIObj = serviceAPI()
|
|
servObj = services()
|
|
|
|
def applyTemplates(self):
|
|
"""Apply templates"""
|
|
clTempl = template(self.clVars)
|
|
dirsFiles = clTempl.applyTemplates()
|
|
if clTempl.getError():
|
|
self.printERROR(clTempl.getError().strip())
|
|
return False
|
|
else:
|
|
return dirsFiles
|
|
|
|
def removeLdapDatabase(self):
|
|
"""Удаляем предыдущую базу данных"""
|
|
pathDatabase = "/var/lib/openldap-data"
|
|
if os.path.exists(pathDatabase) and os.listdir(pathDatabase):
|
|
if os.system("rm /var/lib/openldap-data/* &>/dev/null") !=0:
|
|
self.printERROR("Can't remove /var/lib/openldap-data/*")
|
|
return False
|
|
return True
|
|
|
|
if os.path.exists(pathDatabase) and os.listdir(pathDatabase):
|
|
removeDir(pathDatabase)
|
|
self.printOK(_("Erased LDAP Database") + " ...")
|
|
return True
|
|
|
|
def connectLdapServer(self):
|
|
"""Соединяемся с LDAP сервером
|
|
|
|
используем DN и пароль временного админстратора
|
|
"""
|
|
# Если раннее была ошибка то выходим
|
|
if self.getError():
|
|
self.printERROR (_("ERROR") + ": " +\
|
|
self.getError().strip())
|
|
return False
|
|
tmpDn = self.clVars.Get("ld_temp_dn")
|
|
tmpPw = self.clVars.Get("ld_temp_pw")
|
|
ldapObj = ldapFunction(tmpDn, tmpPw)
|
|
# Генератор задержек
|
|
wait = genSleep()
|
|
while ldapObj.getError():
|
|
try:
|
|
# Задержка
|
|
wait.next()
|
|
except StopIteration:
|
|
break
|
|
# Очистка ошибки
|
|
_error.error = []
|
|
ldapObj = ldapFunction(tmpDn, tmpPw)
|
|
self.ldapObj = ldapObj
|
|
self.conLdap = ldapObj.conLdap
|
|
if ldapObj.getError():
|
|
# Удаляем одинаковые ошибки
|
|
listError = []
|
|
for e in ldapObj.error:
|
|
if not e in listError:
|
|
listError.append(e)
|
|
_error.error = listError
|
|
self.printERROR(_("Can not connected to LDAP server"))
|
|
return False
|
|
return True
|
|
|
|
def installProg(self):
|
|
'''Install this program'''
|
|
apiDict = self.clVars.Get("cl_api")
|
|
apiDict.update({__app__:self.apiFile})
|
|
self.clVars.Write("cl_api", force=True)
|
|
if not appendProgramToEnvFile(__app__, self.clVars):
|
|
self.printERROR(_("Can not save '%s'") %__app__ + " " +\
|
|
_("to %s") %self.clVars.Get("cl_env_path")[0])
|
|
return False
|
|
self.printOK(_("Save install variables"))
|
|
return True
|
|
|
|
def uninstallProg(self):
|
|
'''Uninstall this program'''
|
|
apiDict = self.clVars.Get("cl_api")
|
|
if __app__ in apiDict:
|
|
apiDict.pop(__app__)
|
|
self.clVars.Write("cl_api", force=True)
|
|
if not removeProgramToEnvFile(__app__, self.clVars):
|
|
self.printERROR(_("Can not remove '%s' to %s")%(__app__,
|
|
self.clVars.Get("cl_env_path")[0]))
|
|
return False
|
|
self.printOK(_("Delete install variables"))
|
|
return True
|
|
|
|
def setup(self, force=False):
|
|
"""Настройка LDAP сервиса (создание дерева)"""
|
|
# Принудительная установка
|
|
if self.clVars.Get("sr_ldap_set") == "on" and not force:
|
|
self.printWARNING (_("WARNING") + ": " +\
|
|
_("LDAP server is configured")+ ".")
|
|
return True
|
|
if not force:
|
|
# предупреждение при выполнении этой программы будут изменены
|
|
# конфигурационные файлы и база данных сервиса LDAP а также
|
|
# конфигурационные файлы установленных сервисов
|
|
self.printWARNING (_("WARNING") + ": " +\
|
|
_("Executing of the program will change") + " " +\
|
|
_("the configuration files and database of LDAP service")+\
|
|
".")
|
|
# если вы готовы продолжить работу программы нажмите Y если нет n
|
|
messDialog = \
|
|
_("If you are ready to continue executing the program")+", "+\
|
|
_("input 'yes'") +", "+ _("if not 'no'")
|
|
if not dialogYesNo(messDialog):
|
|
return True
|
|
else:
|
|
# делаем backup
|
|
# Проверим запущен ли ldap
|
|
if not self.APIObj.isStart():
|
|
# Запускаем LDAP сервер
|
|
if not self.APIObj.start():
|
|
return False
|
|
#if not self.backupServer():
|
|
#return False
|
|
if self.APIObj.isRunlevel():
|
|
# Удаляем из автозапуска демона
|
|
if not self.APIObj.delRunlevel():
|
|
return False
|
|
# Останавливаем все установленные сервисы
|
|
if not self.servObj.stopAllServices():
|
|
return False
|
|
# Останавливаем LDAP
|
|
if self.APIObj.isStart():
|
|
self.APIObj.stop()
|
|
# Удаляем из автозагрузки все установленные сервисы
|
|
if not self.servObj.delRunlevelAllServices():
|
|
return False
|
|
# Удаляем из крона скрипт для чистки удаленых пользователей
|
|
# создаем объект репликации
|
|
#objRepl = servRepl()
|
|
#if not objRepl.cronReplicationOFF():
|
|
#return False
|
|
# Удаляем из share файл .replrun
|
|
#if not self.servSambaObj.delReplFile(self.clVars):
|
|
#return False
|
|
# Удаляем переменные
|
|
if not self.servObj.delVarsFromAllServices():
|
|
return False
|
|
# Получим путь к ldap файлу
|
|
ldapParser = iniLdapParser()
|
|
ldapFile = ldapParser.nameIniFile
|
|
# Удаляем ldap файл
|
|
if os.path.exists(ldapFile):
|
|
os.remove(ldapFile)
|
|
self.clVars.Write("sr_ldap_set", "off",force=True)
|
|
self.clVars.Set("sr_ldap_set", "on", force=True)
|
|
self.clVars.Set("cl_ldap_setup_action","up", force=True)
|
|
# Первый проход
|
|
self.clVars.Set("cl_pass_step", "1", True)
|
|
if self.applyTemplates() is False:
|
|
self.printERROR(_("Can not apply templates") + ":" + " " +\
|
|
_("first pass"))
|
|
return False
|
|
# Удаляем старую базу данных
|
|
if not self.removeLdapDatabase():
|
|
return False
|
|
# Запускаем LDAP сервер
|
|
if not self.APIObj.start():
|
|
return False
|
|
# Соединяемся с LDAP временным пользователем
|
|
if not self.connectLdapServer():
|
|
return False
|
|
# Получаем текст нужного ldif-a
|
|
baseLdif = self.createLdif(self.ldifFileBase)
|
|
# Если нет ошибок при соединении применяем ldif
|
|
if not self.ldapObj.getError():
|
|
self.ldapObj.ldapAdd(baseLdif)
|
|
if self.ldapObj.getError():
|
|
print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
|
|
return False
|
|
self.printOK(_("Added ldif file") + " ...")
|
|
# Второй проход,
|
|
# удаляем временного пользователя root из конфигурационного файла
|
|
self.clVars.Set("cl_pass_step","2",True)
|
|
if self.applyTemplates() is False:
|
|
self.printERROR(_("Can not apply profiles") +":"+ _("second pass"))
|
|
return False
|
|
# Перезапускаем LDAP сервер
|
|
if not self.APIObj.restart():
|
|
return False
|
|
# Записываем данные администратора сервера
|
|
ldapParser.setVar("admin",
|
|
{"DN":self.clVars.Get("ld_admin_dn"),
|
|
"PASS":self.clVars.Get("ld_admin_pw")})
|
|
# Устанавливаем автозапуск демона
|
|
if not self.APIObj.addRunlevel():
|
|
return False
|
|
# Записываем переменные для пользователя
|
|
#clientVars = ["ur_organization", "ur_signature"]
|
|
#if not self.saveVarsClient(clientVars):
|
|
#return False
|
|
self.clVars.Write("sr_ldap_set","on",force=True)
|
|
self.printOK(_("LDAP service configured") + " ...")
|
|
return True
|