Add template function env()

develop
Самоукин Алексей 14 years ago
parent 63cbc852ca
commit 2af5057795

@ -30,7 +30,7 @@ tr.setLanguage(sys.modules[__name__])
class var: class var:
'''Объект "Переменная окружения"''' '''Объект "Переменная окружения"'''
# название сервиса которому принадлежит переменная # название сервиса которому принадлежит переменная
#(Global, Builder, Client, Server итд) #(Main, Builder, Client итд)
service = None service = None
# значение переменной # значение переменной
value = "" value = ""
@ -66,10 +66,10 @@ class var:
#обновились то нужно) #обновились то нужно)
upd = False upd = False
for depVarName in self.dependValues.keys(): for depVarName in self.dependValues.keys():
value = self.parentObj.__getattribute__(depVarName).Get() value = getattr(self.parentObj, depVarName).Get()
if self.dependValues[depVarName] != value: if self.dependValues[depVarName] != value:
self.dependValues[depVarName] =\ self.dependValues[depVarName] =\
self.parentObj.__getattribute__(depVarName).value getattr(self.parentObj, depVarName).value
upd = True upd = True
break break
return upd return upd
@ -108,7 +108,7 @@ class DataVars(object):
# Импортируемые модули - (раздел: модуль переменных, модуль заполнения # Импортируемые модули - (раздел: модуль переменных, модуль заполнения
#переменных) #переменных)
__modlist={'Global':('cl_vars','cl_fill')} __modlist={'Main':('cl_vars','cl_fill')}
def __init__(self): def __init__(self):
# Для нахождения зависимостей переменных # Для нахождения зависимостей переменных
self.__levelNumber = 0 self.__levelNumber = 0
@ -116,14 +116,14 @@ class DataVars(object):
# Для хранения импортированных модулей и объектов # Для хранения импортированных модулей и объектов
#[(cекция,импортированный модуль переменных, объект заполнения),] #[(cекция,импортированный модуль переменных, объект заполнения),]
self._importList = [] self._importList = []
self.importData("Global") self.importData("Main")
# Переменные которые нужно записать # Переменные которые нужно записать
self.varsNeedWritten = [] self.varsNeedWritten = []
def importData(self, section, modlist=[]): def importData(self, section, modlist=[]):
"""Импортирует модули с переменными и модули с функциями заполнения """Импортирует модули с переменными и модули с функциями заполнения
section секция раздела (Global, Server, Client итд) section секция раздела (Main, Client итд)
создает необходимые структуры данных создает необходимые структуры данных
""" """
if modlist: if modlist:
@ -190,7 +190,7 @@ class DataVars(object):
for section, moduleVar, fillobj in self._importList: for section, moduleVar, fillobj in self._importList:
if fillobj and hasattr(fillobj, nameMethod): if fillobj and hasattr(fillobj, nameMethod):
flagFindMetod = True flagFindMetod = True
method = fillobj.__getattribute__(nameMethod) method = getattr(fillobj, nameMethod)
break break
if flagFindMetod: if flagFindMetod:
return (dataVar,method) return (dataVar,method)
@ -215,8 +215,8 @@ class DataVars(object):
self.__LevelsVar.append((self.__levelNumber, nameVar)) self.__LevelsVar.append((self.__levelNumber, nameVar))
self.__levelNumber += 1 self.__levelNumber += 1
#nameMethod = "get_" + nameVar #nameMethod = "get_" + nameVar
if self.__dict__.has_key(nameVar): if hasattr(self, nameVar):
ret = self.__getattribute__(nameVar).Get() ret = getattr(self, nameVar).Get()
elif self.__findVarData(nameVar): elif self.__findVarData(nameVar):
dictVar, methodFill =self.__findVarData(nameVar) dictVar, methodFill =self.__findVarData(nameVar)
varobj = var(self) varobj = var(self)
@ -224,17 +224,17 @@ class DataVars(object):
self.__setAttributesVar(varobj, nameVar, dictVar) self.__setAttributesVar(varobj, nameVar, dictVar)
if methodFill: if methodFill:
varobj.Fill = methodFill varobj.Fill = methodFill
self.__setattr__(nameVar, varobj) setattr(self, nameVar, varobj)
ret = self.__getattribute__(nameVar).Get() ret = getattr(self, nameVar).Get()
self.__levelNumber -= 1 self.__levelNumber -= 1
if self.__levelNumber == 0 and\ if self.__levelNumber == 0 and\
self.__getattribute__(nameVar).fillStart and\ getattr(self, nameVar).fillStart and\
len(self.__LevelsVar)>1: len(self.__LevelsVar)>1:
links = self.__getLinks(self.__LevelsVar) links = self.__getLinks(self.__LevelsVar)
for name in links.keys(): for name in links.keys():
for nameLink in links[name].keys(): for nameLink in links[name].keys():
val = self.__getattribute__(nameLink).Get() val = getattr(self, nameLink).Get()
self.__getattribute__(name).dependValues[nameLink] = val getattr(self, name).dependValues[nameLink] = val
if self.__levelNumber == 0: if self.__levelNumber == 0:
self.__LevelsVar = [] self.__LevelsVar = []
return ret return ret
@ -244,22 +244,22 @@ class DataVars(object):
def __Set(self, nameVar, value, force=False): def __Set(self, nameVar, value, force=False):
nameMethod = "get_" +nameVar nameMethod = "get_" + nameVar
if not self.__dict__.has_key(nameVar) and self.__findVarData(nameVar): if not hasattr(self, nameVar) and self.__findVarData(nameVar):
dictVar, methodFill =self.__findVarData(nameVar) dictVar, methodFill =self.__findVarData(nameVar)
varobj = var(self) varobj = var(self)
# Устанавливаем аттрибуты # Устанавливаем аттрибуты
self.__setAttributesVar(varobj, nameVar, dictVar) self.__setAttributesVar(varobj, nameVar, dictVar)
if methodFill: if methodFill:
varobj.Fill = methodFill varobj.Fill = methodFill
self.__setattr__(nameVar, varobj) setattr(self, nameVar, varobj)
if self.__dict__.has_key(nameVar): if hasattr(self, nameVar):
if not force and "r" in getattr(self, nameVar).mode: if not force and "r" in getattr(self, nameVar).mode:
print _("Attempt to rewrite a variable for reading") +": %s"\ print _("Attempt to rewrite a variable for reading") +": %s"\
%nameVar %nameVar
return False return False
self.__getattribute__(nameVar).fillStart = False getattr(self, nameVar).fillStart = False
return self.__getattribute__(nameVar).Set(value) return getattr(self, nameVar).Set(value)
def Set(self, nameVar, value, force=False): def Set(self, nameVar, value, force=False):
return self.__Set(nameVar, value, force) return self.__Set(nameVar, value, force)
@ -338,11 +338,8 @@ storage of variables templates")%location
vname - имя переменной vname - имя переменной
""" """
if self.__dict__.has_key(vname): if hasattr(self, vname):
if self.__dict__[vname].service == 'Global': return getattr(self, vname).service.lower()
return 'calculate'
else:
return self.__dict__[vname].service.lower()
def __writeVarValue(self, vname, val, location, header): def __writeVarValue(self, vname, val, location, header):
'''Записать значение в calculate.ini '''Записать значение в calculate.ini
@ -351,7 +348,7 @@ storage of variables templates")%location
vname имя переменной vname имя переменной
val значение переменной val значение переменной
location расположение ini файла ('default', 'local', 'remote') location расположение ini файла ('default', 'local', 'remote')
header раздел ini файла ('client', 'server', 'calculate') header раздел ini файла ('client', 'server', 'main')
Возвращаемые значение: Возвращаемые значение:
True запись успешна True запись успешна
@ -415,7 +412,7 @@ storage of variables templates")%location
val значение переменной val значение переменной
force "принудительный режим" force "принудительный режим"
location расположение ini файла ('default', 'local', 'remote') location расположение ini файла ('default', 'local', 'remote')
header раздел ini файла ('client', 'server', 'calculate') header раздел ini файла ('client', 'server', 'main')
''' '''
if self.__Set(vname, val, force)!= False: if self.__Set(vname, val, force)!= False:
if not val.strip(): if not val.strip():
@ -441,12 +438,37 @@ storage of variables templates")%location
"""активные секции в ini файле""" """активные секции в ini файле"""
act_section = [] act_section = []
for service,t,t in self._importList: for service,t,t in self._importList:
if service == "Global": act_section.append(service.lower())
act_section.append('calculate')
else:
act_section.append(service.lower())
return act_section return act_section
def GetIniVar(self, section_dot_nameVar):
"""Получить значение переменной из конфигурационного файла
section_dot_nameVar - "имя_секции.имя_переменной_профиля"
"""
calculate_ini_files = self.Get('cl_env_path')
section, spl, name_var = section_dot_nameVar.rpartition(".")
if section and name_var:
pass
elif name_var:
section = "main"
else:
print _("error Datavars.GetIniVar: empty section")
return False
# Значение переменной в env файлах
valueVar = ""
for name_calculate_ini in calculate_ini_files:
# проверить сущестование ini файла
if os.path.exists(name_calculate_ini):
# получить объект настроенный на ini
config = iniParser(name_calculate_ini)
# получаем значение переменной из секции
value = config.getVar(section, name_var)
if value is False:
return False
valueVar = value
return valueVar.encode("UTF-8")
def flIniFile(self): def flIniFile(self):
'''Заместить значение переменных значениями из ини файлов '''Заместить значение переменных значениями из ини файлов

@ -21,6 +21,8 @@ import filecmp
import pwd, grp import pwd, grp
import cl_datavars import cl_datavars
import cl_overriding import cl_overriding
from cl_ldap import ldapUser
class clLocale: class clLocale:
lang = { lang = {
@ -209,7 +211,12 @@ def getdirlist(s_path):
dir_list=fdir.common_dirs dir_list=fdir.common_dirs
return dir_list return dir_list
class fillVars(object, cl_datavars.glob_attr): class fillVars(cl_datavars.glob_attr):
# Объект данных из LDAP
_ldapUserObject = False
# Данные о пользователе из LDAP
_ldapUserData = {}
def get_cl_env_path(self): def get_cl_env_path(self):
'''Пути к env файлам''' '''Пути к env файлам'''
@ -443,15 +450,15 @@ class fillVars(object, cl_datavars.glob_attr):
slpRootDev = rootDev.split("/dev/") slpRootDev = rootDev.split("/dev/")
if len(slpRootDev) == 2: if len(slpRootDev) == 2:
rDev = slpRootDev[1] rDev = slpRootDev[1]
devLines = self._runos("ls -la /dev/disk/by-id/", None, devLines = os.listdir("/dev/disk/by-id")
{"LANG":"C"}) for name in devLines:
if not devLines: path = os.path.join("/dev/disk/by-id", name)
return "" if os.path.islink(path):
if type(devLines) == types.ListType: if rDev in os.readlink(path) and "usb-" in name:
for line in devLines:
if rDev in line and "usb-" in line:
rootType = "usb-hdd" rootType = "usb-hdd"
break break
if not devLines:
return ""
if rootType == "ram": if rootType == "ram":
rootType = "hdd" rootType = "hdd"
return rootType return rootType
@ -641,7 +648,7 @@ class fillVars(object, cl_datavars.glob_attr):
except: except:
return "" return ""
return groupName return groupName
def get_ur_fullname(self): def get_ur_fullname(self):
"""Полное имя пользователя""" """Полное имя пользователя"""
userName = self.Get('ur_login') userName = self.Get('ur_login')
@ -651,4 +658,40 @@ class fillVars(object, cl_datavars.glob_attr):
fullName = pwd.getpwnam(userName).pw_gecos fullName = pwd.getpwnam(userName).pw_gecos
except: except:
return "" return ""
return fullName return fullName
def getLdapUserObject(self):
"""Объект данных из LDAP"""
if not self._ldapUserObject:
self._ldapUserObject = ldapUser()
return self._ldapUserObject
def getUserInfo(self):
"""Получение информации о пользователе из LDAP"""
userName = self.Get('ur_login')
if userName:
if userName in self._ldapUserData:
return self._ldapUserData[userName]
else:
ldapObj = self.getLdapUserObject()
userInfo = ldapObj.getUserLdapInfo(userName)
if userInfo:
self._ldapUserData[userName] = userInfo
return userInfo
return {}
def get_ur_jid(self):
"""Jabber id пользователя"""
userInfo = self.getUserInfo()
userJID = ""
if userInfo:
userJID = userInfo["jid"]
return userJID
def get_ur_mail(self):
"""Почтовый адрес пользователя"""
userInfo = self.getUserInfo()
userMail = ""
if userInfo:
userMail = userInfo["mail"]
return userMail

@ -56,3 +56,116 @@ class ldapFun(_error):
return False return False
return result_set return result_set
class ldapUser(_error):
"""Получение данных для пользователя из LDAP"""
# Данные из /etc/ldap.conf
_dictData = {}
# Объект LDAP
ldapObj = False
# Подключение к LDAP
conLdap = False
def getServerDataUser(self, bindData=False):
"""Получение данных из /etc/ldap.conf"""
fileName = "/etc/ldap.conf"
getStrList = lambda x: reduce(lambda x,y: [x,y.upper()],([x]*2))
data = [("host",'host'),
("usersDN",'nss_base_passwd'),
("groupsDN",'nss_base_group')]
if bindData:
data += [("bindDn",'binddn'), ("bindPw",'bindpw')]
workData = map(lambda x: (x[0],getStrList(x[1]),len(x[1])), data)
namesData = map(lambda x: x[0], data)
dictData = {}
splList = (" ", "\t")
try:
for line in open(fileName):
for name, keys, lenKey in workData:
if not name in dictData.keys() and\
filter(lambda x: line.startswith(x), keys) and\
len(line)>lenKey:
spl = line[lenKey]
if spl in splList:
if not name in dictData:
dictData[name] = []
if name == "usersDN":
dictData[name].append(line.rpartition(spl)[2].\
partition('?')[0].strip())
else:
dictData[name].append(line.rpartition(spl)[2].\
strip())
except:
self.setError(_("Can not open %s")%fileName)
return False
if set(dictData.keys()) == set(namesData):
return dictData
else:
return {}
def getUserLdapInfo(self, userName):
"""Выдаем информацию о пользователе из LDAP"""
if not "bindDn" in self._dictData:
# Получаем информацию из /etc/ldap.conf
retData = self.getServerDataUser(bindData=True)
if retData:
self._dictData = retData
else:
return {}
bindDn = self._dictData["bindDn"][0]
bindPw = self._dictData["bindPw"][0]
host = self._dictData["host"][0]
usersDN = self._dictData["usersDN"][0]
groupsDNs = self._dictData["groupsDN"]
# Соединяемся с LDAP
if not self.ldapConnect(bindDn, bindPw, host):
return False
searchUser = self.ldapObj.ldapSearch(usersDN, ldap.SCOPE_ONELEVEL,
"uid=%s" %userName, None)
if not searchUser:
return False
uid = False
gid = False
fullName = ""
mail = ""
jid = ""
group = ""
if 'uidNumber' in searchUser[0][0][1]:
uid = searchUser[0][0][1]['uidNumber'][0]
if 'gidNumber' in searchUser[0][0][1]:
gid = searchUser[0][0][1]['gidNumber'][0]
for groupDN in groupsDNs:
searchGroup = self.ldapObj.ldapSearch(groupDN,
ldap.SCOPE_ONELEVEL,
"gidNumber=%s" %gid, ['cn'])
if searchGroup:
group = searchGroup[0][0][1]['cn'][0]
break
if 'cn' in searchUser[0][0][1]:
fullName = searchUser[0][0][1]['cn'][0]
if 'mail' in searchUser[0][0][1]:
mail = searchUser[0][0][1]['mail'][0]
if 'registeredAddress' in searchUser[0][0][1]:
jid = searchUser[0][0][1]['registeredAddress'][0]
if 'homeDirectory' in searchUser[0][0][1]:
home = searchUser[0][0][1]['homeDirectory'][0]
if uid and gid:
return {"uid":uid,
"gid":gid,
"fullName":fullName,
"mail":mail,
"jid":jid,
"home":home,
"group":group}
else:
return {}
def ldapConnect(self, bindDn, bindPw, host):
"""Подключение к LDAP"""
if not self.ldapObj:
ldapObj = ldapFun(bindDn, bindPw, host)
if ldapObj.getError():
return False
# Устанавливаем у объекта соединение и объект LDAP функций
self.ldapObj = ldapObj
self.conLdap = ldapObj.conLdap
return True

@ -2246,6 +2246,7 @@ class templateFunction(_error, _shareTemplate, _shareTermsFunction):
# Текст функции шаблона # Текст функции шаблона
functText = "" functText = ""
def __init__(self, objVar): def __init__(self, objVar):
# Если не определен словарь функций шаблона # Если не определен словарь функций шаблона
#print "dict", templateFunction.__dict__.items() #print "dict", templateFunction.__dict__.items()
@ -2285,6 +2286,8 @@ class templateFunction(_error, _shareTemplate, _shareTermsFunction):
self.fileConfigIni = os.path.join(self.pathConfigIni,"ini.env") self.fileConfigIni = os.path.join(self.pathConfigIni,"ini.env")
# Словарь времен модификации env файлов # Словарь времен модификации env файлов
self.timeConfigsIni = {} self.timeConfigsIni = {}
# Словарь хранения переменых полученных функцией env() из env файлов
self.valuesVarEnv = {}
def equalTerm(self, term, localVars): def equalTerm(self, term, localVars):
"""Метод для вычисления выражения""" """Метод для вычисления выражения"""
@ -2835,6 +2838,32 @@ class templateFunction(_error, _shareTemplate, _shareTermsFunction):
textTemplateTmp[resS.end():] textTemplateTmp[resS.end():]
return textTemplateTmp return textTemplateTmp
def funcEnv(self, funArgv, resS, localVars, textTemplateTmp):
"""Функция шаблона env(), выдает значение переменной из env файлов
"""
terms = funArgv.replace(" ","").split(",")
if len(terms) != 1:
self.printErrTemplate()
cl_overriding.exit(1)
nameVar = terms[0]
replace = ''
if nameVar in self.valuesVarEnv:
replace = self.valuesVarEnv[nameVar]
else:
# Получаем значение из env файлов
value = self.objVar.GetIniVar(nameVar)
if value is False:
self.printErrTemplate()
errMsg = self.getError()
if errMsg:
print errMsg
cl_overriding.exit(1)
self.valuesVarEnv[nameVar] = value
replace = value
textTemplateTmp = textTemplateTmp[:resS.start()] + replace +\
textTemplateTmp[resS.end():]
return textTemplateTmp
def printErrTemplate(self): def printErrTemplate(self):
"""Печать ошибки при обработке функций шаблона""" """Печать ошибки при обработке функций шаблона"""
print _("error in template %s")%self.nameTemplate print _("error in template %s")%self.nameTemplate

@ -20,6 +20,8 @@
# type - тип переменной состоит из двух элементов(что это и для чего # type - тип переменной состоит из двух элементов(что это и для чего
# это) # это)
# value - значение переменной # value - значение переменной
# official - флаг того, что данная переменная служебная и не отображается
# при печати списка значений переменных
class Data: class Data:
@ -110,17 +112,28 @@ class Data:
os_linux_ver = {} os_linux_ver = {}
#Логин пользователя #Логин пользователя
ur_login = {'mode':"w"} ur_login = {'mode':"r"}
#Название группы пользователя #Название группы пользователя
ur_group = {'mode':"w"} ur_group = {'mode':"r", 'official':True}
#Полное имя пользователя #Полное имя пользователя
ur_fullname = {'mode':"w"} ur_fullname = {'mode':"r", 'official':True}
# Действие программы # Действие программы
# profile - генерация профиля пользователя # profile - генерация профиля пользователя
# install / uninstall - установка и удаление программы # install / uninstall - установка и удаление программы
# domain / undomain - ввод и вывод из домена # domain / undomain - ввод и вывод из домена
cl_pass_action = {'mode':"w"} cl_pass_action = {'mode':"w"}
# Jabber ID пользователя
ur_jid = {'mode':"r", 'official':True}
# Почтовый адрес пользователя
ur_mail = {'mode':"r", 'official':True}
# Переменные устанавливаемые сервером для клиента
# ip или имя домена (под управлением calculate-server)
cl_remote_host = {'mode':'w', 'official':True}

Loading…
Cancel
Save