#-*- 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