|
|
|
@ -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)
|
|
|
|
|