git-svn-id: http://svn.calculate.ru/calculate2/calculate-lib/trunk@72 c91db197-33c1-4113-bf15-f8a5c547ca64

develop
mhiretskiy 16 years ago
parent 17f71fc1c0
commit 089f635725

@ -33,6 +33,7 @@ import random
import string
import cl_utils
import cl_devices
import imp
##############################################################################
_expand_lang = gettext._expand_lang
@ -1652,11 +1653,22 @@ class DataVars:
__implist=[]
def __init__(self, modname='Global'):
self.__varslist={}
'''Загрузка указанной конфигурации переменных.
Параметры:
modname - имя конфигурации (Global,Server,Builder)
Если в модуле конфигурации переменных будет неправильно указана одна из
переменных, то конфигурация сбрасывается и объект не будет содержать
ни одной переменной окружения.
'''
self.__varslist={} # хранит словарь близки по отошению к модулю
# конфигурации
self.__typelist=()
# проверка правильно указанного имени конфигурации переменных окружения
if modname and self.__modlist.has_key(modname):
modname=self.__modlist[modname]
#импортируем модуль с переменными
# импортирем модуль с переменными окружения
exec ("import %s" % (modname))
#создаем экземпляр импортированного модуля
exec ("obj=%s.Data" %(modname))
@ -1675,7 +1687,9 @@ class DataVars:
raise CLError(msg)
del(self)
return
#добавляем имя переменной в общий список
# получаем тип значений по умолчанию (проверяем, чтобы
# это была либо словарь либо список в противном случае
# тип является не заданным
if vals.has_key('value'):
if isinstance(vals['value'], types.ListType) or\
isinstance(vals['value'], types.DictType):
@ -1684,11 +1698,16 @@ class DataVars:
vtype=None
else:
vtype=None
#добавляем имя переменной в общий список
self.__varslist[idnt]={}
# переносим атрибуты переменной в общий список, при этом
# исключаем значение по умолчанию
for p,val in vals.items():
if p=='value':
continue
self.__varslist[idnt][p]=val
# заместо значение по умолчанию устанавливаем атрибут тип
# переменной
self.__varslist[idnt]['vtype']=vtype
#оформляем значение переменной в виде объекта
objparam=objValue(**vals)
@ -1700,60 +1719,114 @@ class DataVars:
#проверить импортируемое значение
def __checkVarsValue(self, pvar):
''' Проверить атрибут на допустмость содержания'''
if pvar is None:
return False
#обязательные значения полей для переменной
# содержимое переменно словарь
if not isinstance(pvar, types.DictType):
return False
# в словаре присутствуют атрибуты mode, type
if not pvar.has_key('mode') or not pvar.has_key('type'):
return False
# mode, type заданы
if pvar['mode']==None or pvar['type']==None:
return False
# содержимое mode допусткает r или w
if pvar['mode'].upper() not in ['R','W']:
return false
return True
#установить значение переменной
def Set(self, vname, val, force=False):
'''Установить значение переменной окружения
Параметры:
vname имя переменной
val значение переменной
force принудительная установка переменной на случай если установлен
режим только для чтения.
'''
self.__addVarValue(vname, val, force)
#получить значение переменной
def Get(self, vname, objformat=None):
'''Получить значение переменной окружения
Параметры:
vname имя получаемой переменной окружения
objformat если указан, то будет возвращено не значение переменной, а
объект, содержащий полную информацию о переменной окружения.
Возвращаемые значения:
Значение или объект запрашиваемой переменной окружения.
В случае неудачи возвращает False
'''
return self.__getVarValue(vname, objformat)
def flServer(self, **args):
'''Заполнить конфигурацию переменных, используемую для настройки
сервера.
'''
self.Set('setup_sys_shortname','CDS',True)
# заполнить переменные окружения алгоритмом по умолнанию
self.flGlobal()
# проверить не заполнялись ли переменные "серверным" алгоритмом
if 'Server' in self.__implist:
return
# в список загруженных переменных добавить значение Server
self.__implist.append('Server')
# получить конфигурацию переменных окружения Server
objvar=DataVars("Server")
# объединить конфигурацию по умолчанию с конфигурацией для сервера
self.joinVars(objvar)
#print objvar.getVarsList()
# заполнить полученную конфигурацию алгоритмом для сервера
fillVars(self).fillLDAP(**args)
def flGlobal(self,**args):
'''Заполнить конфигурацию переменные, по общему алгоритму'''
# проверить не заполнялись ли переменные общим алгоритмом
if 'Global' in self.__implist:
return
# в список загруженных переменных добавить значение Global
self.__implist.append('Global')
# заполнить переменные окружения общим алгоритмом
fillVars(self).fillGlobal(**args)
def flBuilder(self, **args):
'''Заполнить конфигурацию переменных, для билдера'''
self.Set('setup_pass','builder',True)
# заполнить переменные окружения алгоритмом по умолнанию
self.flGlobal()
# проверить не заполнялись ли переменные "серверным" алгоритмом
if 'Builder' in self.__implist:
return
# в список загруженных переменных добавить значение Global
self.__implist.append('Builder')
# получить конфигурацию переменных окружения Builder
objvar=DataVars("Builder")
# объединить конфигурацию по умолчанию с конфигурацией для сервера
self.joinVars(objvar)
# заполнить полученную конфигурацию алгоритмом для билдера
fillVars(self).fillBuilder(**args)
def flInstall(self, **args):
'''Заполнить конфигурацию переменных для инсталятора'''
self.Set('setup_pass','install',True)
# заполнить переменные окружения алгоритмом по умолнанию
self.flGlobal()
# заполнить полученную конфигурацию алгоритмом для инсталлятора
fillVars(self).fillInstall(**args)
def isRewrite(self, vname):
'''Доступна ли переменная для изменения
Параметры:
vname имя переменной
Возвращаемые занчения:
True переменная доступна для перезаписи
Flase переменная не доступна для перезаписи
'''
mode=self.Get(vname,True).v_mode
if mode=='w':
return True
@ -1762,12 +1835,26 @@ class DataVars:
#Получить значение переменной в чистом виде или в виде объекта
def __getVarValue(self, vname, objformat=None, printval=None):
'''Получить значение переменной в чистом виде или в виде объекта.
Параметры:
vname имя переменной окружения
objformat флаг "вернуть в виде объекта"
printval флаг "вернуть значение для печати"
Возвращаемые значения:
Значение переменной/ значение в виде объекта.
В случае если переменная неинициализирована и возврат осуществляется
в виде значение вернется False
'''
if not vname in self.__varslist.keys():
raise VarNameError(vname)
try:
#если переменная уже инициализирована
exec ("val=self.%s"%(vname))
# если нужно вернуть значение
if objformat is None:
# если нужно вернуть выводимое значение
if printval:
return val.v_printval
return val.v_value
@ -1789,41 +1876,90 @@ class DataVars:
#не даем переписывать значения переменной у которых режим "r"
#но можно перезаписать в режиме force=True
def __addVarValue(self, vname, val, force=False, printval=None):
'''Установить значение переменной, не давать переписывать значение
переменной у которых режим 'r'(только для чтения), если не включен
принудительный режим
Параметры:
vname имя переменной окружения
val устанавливаемое значение переменной
force принудительный режим, при True можно изменить пременные
"только для чтения"
printval если нужно изменить значение для вывода
Возвращаемые значения:
True значение установлено
False значение не установлено (провал)
'''
# если запрошенная переменная не найдена поднимаем исключение
# "ошибка имени переменной"
if not self.__varslist.has_key(vname):
raise VarNameError(vname)
# получаем текущую переменную в виде объекта
valobj=self.__getVarValue(vname, True)
# если получить переменную не удалось - возврат провал
if valobj is False:
return False
# если переменная "только для чтения" и не включен принудительный режим
# вывести предупреждающее сообщение и вернуть провал
if valobj.v_mode=="r" and force==False:
print "Attempt to rewrite a variable for reading: %s"%vname
return False
# если тип значений поддерживаемых для этой переменной не совпадает
# с устанавливаемым, то поднимаем исключение "ошибка значения"
# тип None означает, что поддерживается любой тип
if self.__varslist[vname]['vtype']:
if type(val)!=self.__varslist[vname]['vtype']:
raise VarValueError(vname)
# если среди типов переменных bool, то в случае пустого значения
# устанавливается значение False
if 'bool' in valobj.v_type:
if val is None:
val=False
# если меняем значение для печати
if printval:
valobj.v_printval=val
# если меняем значение переменной
else:
valobj.v_value=val
# устанавливаем новое значение для переменной окружения
exec("self.%s=valobj"%(vname))
# возвращаем "успех"
return True
#проверить входит ли тип в указанный список типов
def __checkType(self, tvar, tcheck):
lvar=len(tcheck)
flag=0
for i in tvar:
if i in tcheck:
flag+=1
if flag !=lvar:
return False
return True
'''Проверить входит ли тип в указанный список типов
Параметры:
tvar сравниваемый список
tcheck проверяемый список
Возвращаемые значение:
True Успех
False Провал
'''
# для сравнения используем объект множество и сравниваем пересечения
return set(tcheck) == set(tcheck).intersection(tvar)
# lvar=len(tcheck)
# flag=0
# for i in tvar:
# if i in tcheck:
# flag+=1
# if flag !=lvar:
# return False
# return True
# Вернуть список переменных
# type_names - список типов, переменные которых необходимо вернуть
def getVars(self, type_names=None):
'''Получить список переменных всех, или указанного типа
Параметры:
type_names список типов переменных для указания фильтра
Возвращаемые параметры:
Словарь с переменными.
'''
ret={}
for i in self.__varslist.keys():
try:
@ -1837,15 +1973,8 @@ class DataVars:
param=self.__varslist[i]
nobj=objValue(param['mode'],param['type'], None)
if type_names:
# Заменено Хирецким М.А. так как vtype содержит python тип
# перемнной, а фильтр вероятнее всего использует для
# фильтрации по типу использования переменных которые
# содержатся в v_type
if not self.__checkType(val.v_type,type_names):
continue
# if not self.__checkType(val.vtype,type_names):
# continue
# Конец замены
ret[i]=nobj
return ret
@ -1908,9 +2037,8 @@ class DataVars:
old_self=copy.deepcopy(self)
for var in objvars.__varslist.keys():
#если нет режима замещения то вываливаемся
if var in old_self.__dict__.keys():
if force==False:
raise CLError('Duplication of a variable: %s'% var)
if var in old_self.__dict__.keys() and force==False:
raise CLError('Duplication of a variable: %s'% var)
else:
old_self.__varslist[var]=objvars.__varslist[var]
val=objvars.__getVarValue(var, True)

Loading…
Cancel
Save