From e47cc954eec98fe06f11634f7c55f944072818c3 Mon Sep 17 00:00:00 2001 From: asamoukin Date: Tue, 16 Sep 2008 13:26:53 +0000 Subject: [PATCH] git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@183 c91db197-33c1-4113-bf15-f8a5c547ca64 --- pym/cl_base.py | 60 ++++++++++++ pym/cl_profile.py | 226 ++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 246 insertions(+), 40 deletions(-) diff --git a/pym/cl_base.py b/pym/cl_base.py index a21b570..c6d5b77 100644 --- a/pym/cl_base.py +++ b/pym/cl_base.py @@ -836,6 +836,12 @@ http://distro.ibiblio.org/pub/linux/distributions/gentoo" #---------------------------------------------------------------------- #базовый суффикс Set('soft_ldap_base',"dc=%s"%(Get('soft_ldap_root')),True) + #-------------------------------------------------------------------- + # DN всех сервисов + #-------------------------------------------------------------------- + Set("soft_ldap_sevices_dn","ou=%s,%s"\ + %(Get('soft_ldap_sevices_dn_name'),Get('soft_ldap_base')), + True) #алгоритм шифрования паролей Set('soft_ldap_hash_encrypt',"{SSHA}",True) #пользовательский доступ к базе с доступом только для чтения @@ -889,6 +895,60 @@ http://distro.ibiblio.org/pub/linux/distributions/gentoo" res=cm(cstr) if res: Set('soft_ldap_adminpw_hash',res.strip(),True) + + #Cервис Unix + self.__fillServiceDN('Unix', + 'soft_ldap_admin_unix_name', + 'soft_ldap_admin_unix', + 'soft_ldap_admin_unixpw', + 'soft_ldap_admin_unixpw_hash') + #Cервис Samba + self.__fillServiceDN('Samba', + 'soft_ldap_admin_samba_name', + 'soft_ldap_admin_samba', + 'soft_ldap_admin_sambapw', + 'soft_ldap_admin_sambapw_hash') + #Cервис Mail + self.__fillServiceDN('Mail', + 'soft_ldap_admin_mail_name', + 'soft_ldap_admin_mail', + 'soft_ldap_admin_mailpw', + 'soft_ldap_admin_mailpw_hash') + + + + def __fillServiceDN(self, dnName, varName, varDN, varPwd, varPwdHash): + """Заполняет переменные сервиса + + dnName - название сервиса в LDAP (Unix,Samba и.т. д) + varName - переменная сервиса в LDAP (Unix,Samba и.т. д) + varService - переменная (полный DN cервиса) + varPwd - переменная пароль сервиса + varPwdHash - переменная хеш пароля сервиса + На вход подаем название сервиса, DN сервиса относительно DN сервисов и + соответствующие названия переменных и они заполняются + нужными значениями + """ + obj=self._objvar + if not obj: + return False + #сокращенные имена для вызовов + cm=self.__runos + Get=obj.Get + Set=obj.Set + Set(varName, dnName, True) + Set(varDN, "ou=%s,%s" %(dnName,Get('soft_ldap_sevices_dn')), + True) + Set(varPwd,cl_utils.genpassword().strip(),True) + cstr='%s slappasswd -s %s -h %s'%\ + (self.G_path,\ + Get(varPwd),\ + Get('soft_ldap_hash_encrypt') + ) + res=cm(cstr) + if res: + Set(varPwdHash,res.strip(),True) + #***************************************************************************** #Заполнение глобальных переменных #***************************************************************************** diff --git a/pym/cl_profile.py b/pym/cl_profile.py index 11d4943..9963f26 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -293,6 +293,42 @@ class objShare: """Общий клас для объектов, наследуем """ + + def createFieldTerm(self, name, value, quote, docObj): + """Создание поля переменная - значение + + при создании поля проверяется первый символ названия переменной + и добавляется тег action + "!" - drop удаляет + "+" - join добавляет + "-" - replace заменяет + """ + fieldAction = False + if name: + if name[0] == "!" or name[0] == "-" or name[0] == "+": + qnt = self.removeSymbolTerm(quote) + fieldXML = docObj.createField("var",[qnt], + name[1:], [value], + False, False) + if name[0] == "!": + fieldAction = "drop" + elif name[0] == "+": + fieldXML.setAttribute("type", "seplist") + fieldAction = "join" + else: + fieldXML = docObj.createField("var", + [quote.replace("\n","")], + name, [value], + False, False) + else: + fieldXML = docObj.createField("var", + [quote.replace("\n","")], + name, [value], + False, False) + if fieldAction: + docObj.setActionField(fieldXML, fieldAction) + return fieldXML + def removeSymbolTerm(self, text): """Удаляет первый символ названия переменной в строке @@ -1180,7 +1216,8 @@ class xmlDoc: xmlValues = xpath.Evaluate('child::value',xmlField) if xmlValues: for node in xmlValues: - vals.append(node.firstChild.nodeValue) + if node.firstChild: + vals.append(node.firstChild.nodeValue) return vals def getActionArea(self, xmlArea): @@ -2130,8 +2167,8 @@ class profile(_file, _terms): if (objHeadNew.typeAppend == "replace" or\ objHeadNew.typeAppend == "before" or\ objHeadNew.typeAppend == "after") and\ - (objHeadNew.fileType != "bin" or\ - objHeadNew.fileType != "raw"): + not (objHeadNew.fileType == "bin" or\ + objHeadNew.fileType == "raw"): try: exec ("objProfNew=%s(self.newProfile)"%\ (objHeadNew.fileType)) @@ -2694,42 +2731,6 @@ class named(objShare): docObj.setActionArea(areaXML, areaAction) return areaXML - - def createFieldTerm(self, name, value, quote, docObj): - """Создание поля переменная - значение - - при создании поля проверяется первый символ названия переменной - и добавляется тег action - "!" - drop удаляет - "+" - join добавляет - "-" - replace заменяет - """ - fieldAction = False - if name: - if name[0] == "!" or name[0] == "-" or name[0] == "+": - qnt = self.removeSymbolTerm(quote) - fieldXML = docObj.createField("var",[qnt], - name[1:], [value], - False, False) - if name[0] == "!": - fieldAction = "drop" - elif name[0] == "+": - fieldXML.setAttribute("type", "seplist") - fieldAction = "join" - else: - fieldXML = docObj.createField("var", - [quote.replace("\n","")], - name, [value], - False, False) - else: - fieldXML = docObj.createField("var", - [quote.replace("\n","")], - name, [value], - False, False) - if fieldAction: - docObj.setActionField(fieldXML, fieldAction) - return fieldXML - def createXML(self, areas, rootNode, docObj): """Создаем из массивов областей XML""" for i in areas: @@ -2759,6 +2760,8 @@ class named(objShare): False, False) areaXML.appendChild(fieldXMLBr) else: + if not f: + continue fields = self.splitToFields(f) for field in fields: if field.name != False: @@ -3297,4 +3300,147 @@ class ldap(samba): docObj.clearTmpFields() z += 1 #print docObj.doc.toprettyxml() - return docObj \ No newline at end of file + return docObj + +class dovecot(named): + """Класс для обработки конфигурационного файла типа dovecot + + """ + _comment = "#" + configName = "dovecot" + configVersion = "0.1" + __openArea = "{" + __closeArea = "[ \t]*\}[ \t]*" + sepFields = "\n" + reOpen = re.compile(__openArea) + reClose = re.compile(__closeArea) + reCloseArea = re.compile(__closeArea + "\s*\Z") + reComment = re.compile("[ \t]*%s" %(_comment)) + reSepFields = re.compile(sepFields) + # разделитель названия и значения переменной + reSeparator = re.compile("\s*=\s*") + + def __init__(self, text): + named.__init__(self,text) + + def addBrArea(self, xmlArea): + """Добавляем перевод строки если его нет в конец области""" + xmlFields = xpath.Evaluate("child::field", xmlArea) + if xmlFields and not (\ + self.docObj.getTypeField(xmlFields[-1]) == "br" or\ + self.docObj.getTypeField(xmlFields[-1]) == "comment" + ): + xmlArea.appendChild(self.docObj.createField("br", + [],"",[], + False,False)) + xmlAreas = xpath.Evaluate("child::area", xmlArea) + for area in xmlAreas: + self.addBrArea(area) + + def join(self, dovecotObj): + """Объединяем конфигурации""" + if isinstance(dovecotObj, dovecot): + #print self.docObj.doc.toprettyxml() + self.docObj.joinDoc(dovecotObj.doc) + # Для добавления перевода строки перед закрывающим тегом + # конфигурационного файла + self.addBrArea(self.docObj.body) + + +class procmail(objShare): + """Класс для обработки конфигурационного файла типа procmail + + """ + _comment = "#" + configName = "procmail" + configVersion = "0.1" + sepFields = "\n" + reComment = re.compile("[ \t]*%s" %(_comment)) + reSepFields = re.compile(sepFields) + # разделитель названия и значения переменной + reSeparator = re.compile("=") + def __init__(self, text): + self.text = text + self.docObj = self.textToXML() + # Создаем поля-массивы + self.doc = self.docObj.doc + + def setDataField(self, txtLines, endtxtLines): + """Создаем список объектов с переменными""" + class fieldData: + def __init__(self): + self.name = False + self.value = False + self.comment = False + self.br = False + fields = [] + field = fieldData() + z = 0 + for k in txtLines: + textLine = k + endtxtLines[z] + z += 1 + findComment = self.reComment.search(textLine) + if not textLine.strip(): + field.br = textLine + fields.append(field) + field = fieldData() + elif findComment: + field.comment = textLine + fields.append(field) + field = fieldData() + else: + pars = textLine.strip() + nameValue = self.reSeparator.split(pars) + if len(nameValue) == 2: + name = nameValue[0] + value = nameValue[1].replace(self.sepFields,"") + field.name = name.replace(" ","").replace("\t","") + field.value = value + field.br = textLine + fields.append(field) + field = fieldData() + return fields + + def textToXML(self): + docObj = xmlDoc() + docObj.createDoc(self.configName, self.configVersion) + if self.text: + nodeBody = docObj.getNodeBody() + fields = self.splitToFields(self.text) + for field in fields: + if field.name != False: + fieldXML = self.createFieldTerm(field.name, + field.value, + field.br, docObj) + nodeBody.appendChild(fieldXML) + if field.br[-1] == "\n": + fieldXMLBr = docObj.createField("br",[], + "",[], + False, False) + nodeBody.appendChild(fieldXMLBr) + elif field.comment != False: + fieldXML = docObj.createField("comment", + [field.comment], + "", [], + False, False) + nodeBody.appendChild(fieldXML) + elif field.br != False: + brText = field.br.replace("\n","") + if brText: + fieldXML = docObj.createField('br', + [brText], + "", [], + False, False) + else: + fieldXML = docObj.createField('br', + [], + "", [], + False, False) + nodeBody.appendChild(fieldXML) + return docObj + + def join(self, procmailObj): + """Объединяем конфигурации""" + if isinstance(procmailObj, procmail): + #print self.docObj.doc.toprettyxml() + self.docObj.joinDoc(procmailObj.doc) \ No newline at end of file