You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

240 lines
10 KiB

  1. #-*- coding: utf-8 -*-
  2. # Copyright 2008-2010 Mir Calculate Ltd. http://www.calculate-linux.org
  3. #
  4. # Licensed under the Apache License, Version 2.0 (the "License");
  5. # you may not use this file except in compliance with the License.
  6. # You may obtain a copy of the License at
  7. #
  8. # http://www.apache.org/licenses/LICENSE-2.0
  9. #
  10. # Unless required by applicable law or agreed to in writing, software
  11. # distributed under the License is distributed on an "AS IS" BASIS,
  12. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. # See the License for the specific language governing permissions and
  14. # limitations under the License.
  15. __version__ = "2.2.0.0"
  16. __app__ = "calculate-ldap"
  17. import os, sys
  18. from server.utils import dialogYesNo
  19. from cl_print import color_print
  20. from cl_ldap_api import serviceAPI, shareVars
  21. from cl_template import template
  22. from server.services import services
  23. from server.ldap import iniLdapParser, ldapFunction, shareldap
  24. from server.utils import genSleep
  25. from cl_utils import removeDir, _error, appendProgramToEnvFile,\
  26. removeProgramToEnvFile
  27. from cl_lang import lang
  28. lang().setLanguage(sys.modules[__name__])
  29. class ldapService(shareVars, shareldap):
  30. """Методы севисa Ldap"""
  31. # Базовый ldif файл
  32. ldifFileBase = '/usr/lib/calculate-2.2/calculate-ldap/ldif/base.ldif'
  33. apiFile = '/usr/lib/calculate-2.2/calculate-ldap/pym/cl_ldap_api.py'
  34. APIObj = serviceAPI()
  35. servObj = services()
  36. def applyTemplates(self):
  37. """Apply templates"""
  38. clTempl = template(self.clVars)
  39. dirsFiles = clTempl.applyTemplates()
  40. if clTempl.getError():
  41. self.printERROR(clTempl.getError().strip())
  42. return False
  43. else:
  44. return dirsFiles
  45. def removeLdapDatabase(self):
  46. """Удаляем предыдущую базу данных"""
  47. pathDatabase = "/var/lib/openldap-data"
  48. if os.path.exists(pathDatabase) and os.listdir(pathDatabase):
  49. if os.system("rm /var/lib/openldap-data/* &>/dev/null") !=0:
  50. self.printERROR("Can't remove /var/lib/openldap-data/*")
  51. return False
  52. return True
  53. if os.path.exists(pathDatabase) and os.listdir(pathDatabase):
  54. removeDir(pathDatabase)
  55. self.printOK(_("Erased LDAP Database") + " ...")
  56. return True
  57. def connectLdapServer(self):
  58. """Соединяемся с LDAP сервером
  59. используем DN и пароль временного админстратора
  60. """
  61. # Если раннее была ошибка то выходим
  62. if self.getError():
  63. self.printERROR (_("ERROR") + ": " +\
  64. self.getError().strip())
  65. return False
  66. tmpDn = self.clVars.Get("ld_temp_dn")
  67. tmpPw = self.clVars.Get("ld_temp_pw")
  68. ldapObj = ldapFunction(tmpDn, tmpPw)
  69. # Генератор задержек
  70. wait = genSleep()
  71. while ldapObj.getError():
  72. try:
  73. # Задержка
  74. wait.next()
  75. except StopIteration:
  76. break
  77. # Очистка ошибки
  78. _error.error = []
  79. ldapObj = ldapFunction(tmpDn, tmpPw)
  80. self.ldapObj = ldapObj
  81. self.conLdap = ldapObj.conLdap
  82. if ldapObj.getError():
  83. # Удаляем одинаковые ошибки
  84. listError = []
  85. for e in ldapObj.error:
  86. if not e in listError:
  87. listError.append(e)
  88. _error.error = listError
  89. self.printERROR(_("Can not connected to LDAP server"))
  90. return False
  91. return True
  92. def installProg(self):
  93. '''Install this program'''
  94. apiDict = self.clVars.Get("cl_api")
  95. apiDict.update({__app__:self.apiFile})
  96. self.clVars.Write("cl_api", force=True)
  97. if not appendProgramToEnvFile(__app__, self.clVars):
  98. self.printERROR(_("Can not save '%s'") %__app__ + " " +\
  99. _("to %s") %self.clVars.Get("cl_env_path")[0])
  100. return False
  101. self.printOK(_("Save install variables"))
  102. return True
  103. def uninstallProg(self):
  104. '''Uninstall this program'''
  105. apiDict = self.clVars.Get("cl_api")
  106. if __app__ in apiDict:
  107. apiDict.pop(__app__)
  108. self.clVars.Write("cl_api", force=True)
  109. if not removeProgramToEnvFile(__app__, self.clVars):
  110. self.printERROR(_("Can not remove '%s' to %s")%(__app__,
  111. self.clVars.Get("cl_env_path")[0]))
  112. return False
  113. self.printOK(_("Delete install variables"))
  114. return True
  115. def setup(self, force=False):
  116. """Настройка LDAP сервиса (создание дерева)"""
  117. # Принудительная установка
  118. if self.clVars.Get("sr_ldap_set") == "on" and not force:
  119. self.printWARNING (_("WARNING") + ": " +\
  120. _("LDAP server is configured")+ ".")
  121. return True
  122. if not force:
  123. # предупреждение при выполнении этой программы будут изменены
  124. # конфигурационные файлы и база данных сервиса LDAP а также
  125. # конфигурационные файлы установленных сервисов
  126. self.printWARNING (_("WARNING") + ": " +\
  127. _("Executing of the program will change") + " " +\
  128. _("the configuration files and database of LDAP service")+\
  129. ".")
  130. # если вы готовы продолжить работу программы нажмите Y если нет n
  131. messDialog = \
  132. _("If you are ready to continue executing the program")+", "+\
  133. _("input 'yes'") +", "+ _("if not 'no'")
  134. if not dialogYesNo(messDialog):
  135. return True
  136. else:
  137. # делаем backup
  138. # Проверим запущен ли ldap
  139. if not self.APIObj.isStart():
  140. # Запускаем LDAP сервер
  141. if not self.APIObj.start():
  142. return False
  143. #if not self.backupServer():
  144. #return False
  145. if self.APIObj.isRunlevel():
  146. # Удаляем из автозапуска демона
  147. if not self.APIObj.delRunlevel():
  148. return False
  149. # Останавливаем все установленные сервисы
  150. if not self.servObj.stopAllServices():
  151. return False
  152. # Останавливаем LDAP
  153. if self.APIObj.isStart():
  154. self.APIObj.stop()
  155. # Удаляем из автозагрузки все установленные сервисы
  156. if not self.servObj.delRunlevelAllServices():
  157. return False
  158. # Удаляем из крона скрипт для чистки удаленых пользователей
  159. # создаем объект репликации
  160. #objRepl = servRepl()
  161. #if not objRepl.cronReplicationOFF():
  162. #return False
  163. # Удаляем из share файл .replrun
  164. #if not self.servSambaObj.delReplFile(self.clVars):
  165. #return False
  166. # Удаляем переменные
  167. if not self.servObj.delVarsFromAllServices():
  168. return False
  169. # Получим путь к ldap файлу
  170. ldapParser = iniLdapParser()
  171. ldapFile = ldapParser.nameIniFile
  172. # Удаляем ldap файл
  173. if os.path.exists(ldapFile):
  174. os.remove(ldapFile)
  175. self.clVars.Write("sr_ldap_set", "off",force=True)
  176. self.clVars.Set("sr_ldap_set", "on", force=True)
  177. self.clVars.Set("cl_ldap_setup_action","up", force=True)
  178. # Первый проход
  179. self.clVars.Set("cl_pass_step", "1", True)
  180. if self.applyTemplates() is False:
  181. self.printERROR(_("Can not apply templates") + ":" + " " +\
  182. _("first pass"))
  183. return False
  184. # Удаляем старую базу данных
  185. if not self.removeLdapDatabase():
  186. return False
  187. # Запускаем LDAP сервер
  188. if not self.APIObj.start():
  189. return False
  190. # Соединяемся с LDAP временным пользователем
  191. if not self.connectLdapServer():
  192. return False
  193. # Получаем текст нужного ldif-a
  194. baseLdif = self.createLdif(self.ldifFileBase)
  195. # Если нет ошибок при соединении применяем ldif
  196. if not self.ldapObj.getError():
  197. self.ldapObj.ldapAdd(baseLdif)
  198. if self.ldapObj.getError():
  199. print _("LDAP Error") + ": " + self.ldapObj.getError().strip()
  200. return False
  201. self.printOK(_("Added ldif file") + " ...")
  202. # Второй проход,
  203. # удаляем временного пользователя root из конфигурационного файла
  204. self.clVars.Set("cl_pass_step","2",True)
  205. if self.applyTemplates() is False:
  206. self.printERROR(_("Can not apply profiles") +":"+ _("second pass"))
  207. return False
  208. # Перезапускаем LDAP сервер
  209. if not self.APIObj.restart():
  210. return False
  211. # Записываем данные администратора сервера
  212. ldapParser.setVar("admin",
  213. {"DN":self.clVars.Get("ld_admin_dn"),
  214. "PASS":self.clVars.Get("ld_admin_pw")})
  215. # Устанавливаем автозапуск демона
  216. if not self.APIObj.addRunlevel():
  217. return False
  218. # Записываем переменные для пользователя
  219. #clientVars = ["ur_organization", "ur_signature"]
  220. #if not self.saveVarsClient(clientVars):
  221. #return False
  222. self.clVars.Write("sr_ldap_set","on",force=True)
  223. self.printOK(_("LDAP service configured") + " ...")
  224. return True