|
|
#-*- coding: utf-8 -*-
|
|
|
|
|
|
#Copyright 2008 Calculate Pack, http://www.calculate-linux.ru
|
|
|
#
|
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
# You may obtain a copy of the License at
|
|
|
#
|
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
|
#
|
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
# See the License for the specific language governing permissions and
|
|
|
# limitations under the License.
|
|
|
|
|
|
import gettext
|
|
|
import os
|
|
|
import getopt
|
|
|
import sys
|
|
|
##############################################################################
|
|
|
import re
|
|
|
import copy
|
|
|
import types
|
|
|
import string
|
|
|
#import os
|
|
|
import filecmp
|
|
|
import ConfigParser
|
|
|
import time
|
|
|
import socket
|
|
|
#import sys
|
|
|
import random
|
|
|
import string
|
|
|
import cl_utils
|
|
|
import cl_devices
|
|
|
import imp
|
|
|
##############################################################################
|
|
|
|
|
|
_expand_lang = gettext._expand_lang
|
|
|
|
|
|
|
|
|
def __findFileMO(domain, localedir=None, languages=None, all=0):
|
|
|
# Модифицинрованный метод модуля gettext ищет файл перевода
|
|
|
if localedir is None:
|
|
|
localedir = _default_localedir
|
|
|
if languages is None:
|
|
|
languages = []
|
|
|
for envar in ('LANGUAGE', 'LC_ALL', 'LC_MESSAGES', 'LANG'):
|
|
|
val = os.environ.get(envar)
|
|
|
if val:
|
|
|
languages = val.split(':')
|
|
|
break
|
|
|
if 'C' not in languages:
|
|
|
languages.append('C')
|
|
|
# now normalize and expand the languages
|
|
|
nelangs = []
|
|
|
for lang in languages:
|
|
|
for nelang in _expand_lang(lang):
|
|
|
if nelang not in nelangs:
|
|
|
nelangs.append(nelang)
|
|
|
# select a language
|
|
|
if all:
|
|
|
result = []
|
|
|
else:
|
|
|
result = None
|
|
|
for lang in nelangs:
|
|
|
if lang == 'C':
|
|
|
break
|
|
|
mofile = os.path.join(localedir, '%s_%s.mo' % (domain,lang))
|
|
|
if os.path.exists(mofile):
|
|
|
if all:
|
|
|
result.append(mofile)
|
|
|
else:
|
|
|
return mofile
|
|
|
return result
|
|
|
|
|
|
gettext.find = __findFileMO
|
|
|
|
|
|
class GlobalParam(type):
|
|
|
""" Метакласс для глобальных параметров
|
|
|
"""
|
|
|
def __init__(cls, *args):
|
|
|
cls.GP = []
|
|
|
cls.GP.append("")
|
|
|
|
|
|
class lang:
|
|
|
"""Класс многоязыковой поддержки lang для перевода сообщений программ на
|
|
|
другие языки.
|
|
|
|
|
|
Типичное использование:
|
|
|
import sys
|
|
|
import lang
|
|
|
|
|
|
# язык сообщений английский
|
|
|
tr = lang.lang(en)
|
|
|
# язык определяется системой
|
|
|
#tr = lang.lang()
|
|
|
|
|
|
#Установка домена переводаldap
|
|
|
# в последующем можно не использовать - задается глобально
|
|
|
tr.setGlobalDomain('calc')
|
|
|
# задается локально для одного файла
|
|
|
#tr.setLocalDomain('calc')
|
|
|
|
|
|
# Установка метода перевода для текущего модуля
|
|
|
tr.setLanguage(sys.modules[__name__])
|
|
|
|
|
|
Где:
|
|
|
tr -- объект перевода
|
|
|
'en' -- язык выводимых сообщений
|
|
|
sys.modules[__name__] -- модуль сообщения которого переводятся
|
|
|
calc - домен перевода - имя файла перевода без расширения
|
|
|
|
|
|
Если файл перевода не найден то сообщения не переводятся
|
|
|
Если в модуле сообщения которого переводим, экспортируются другие модули то
|
|
|
они тоже переводятся.
|
|
|
|
|
|
По умолчанию директория в которой находятся переводы: 'lang/i18h' относительно
|
|
|
исполняемого файла названия файлов перевода совпадают с названиями модулей
|
|
|
если не определен методом setDomainTranslate() - домен перевода.
|
|
|
"""
|
|
|
__metaclass__ = GlobalParam
|
|
|
def __init__(self,l=''):
|
|
|
self.nameDomain = self.GP[0]
|
|
|
#self.nameDomain = ''
|
|
|
""" Название файла перевода (Домен) если используется 1 файл перевода
|
|
|
"""
|
|
|
self.__catalog = os.path.abspath('/usr/share/calculate/i18n')
|
|
|
""" Путь к каталогу переводов (в этом каталоге
|
|
|
ru_RU/LC_MESSAGES в котором файл перевода)
|
|
|
"""
|
|
|
env = os.environ
|
|
|
if l == "" and env.has_key('LANG'):
|
|
|
l = env['LANG'].split('.')[0].split("_")[0]
|
|
|
""" Определение языка """
|
|
|
self.__modnames = {}
|
|
|
""" Словарь переведенных модулей
|
|
|
ключ --- имя модуля
|
|
|
значение --- был ли модуль переведен (1 или 0)
|
|
|
"""
|
|
|
self.__l = l
|
|
|
"""Язык перевода для всех модулей"""
|
|
|
|
|
|
def __translate(self,message):
|
|
|
"""Метод translate возвращает полученное значение без
|
|
|
изменеsmfprjadnwний"""
|
|
|
return message
|
|
|
|
|
|
def setLanguage(self,module):
|
|
|
""" Установка языка перевода для модуля module.
|
|
|
|
|
|
параметр --- экспортируемый модуль python
|
|
|
если в этом модуле экспортируются другие модули
|
|
|
то язык устанавливается и для них
|
|
|
Метод запускается после экспорта модуля который будем переводить
|
|
|
"""
|
|
|
t = vars(module)
|
|
|
for i in dir(module):
|
|
|
q = str(t[i])
|
|
|
if 'module' in q and not '__' in i and not '/usr/lib' in q\
|
|
|
and not 'built-in' in q :
|
|
|
mod = vars(module)[i]
|
|
|
self.__setLang(mod)
|
|
|
return self.__setLang(module)
|
|
|
|
|
|
def __setLang(self,module):
|
|
|
""" Установка языка перевода для модуля module.
|
|
|
|
|
|
В случае нахождения файла перевода возвращает истину.
|
|
|
Во всех случаях устанавливает метод перевода для модуля.
|
|
|
Если нет файла перевода метод перевода возвращает то же
|
|
|
значение что получает
|
|
|
"""
|
|
|
if module.__name__ in self.__modnames.keys():
|
|
|
return True
|
|
|
|
|
|
if self.nameDomain == '':
|
|
|
if module.__name__ == "__main__":
|
|
|
nameDomain = module.__file__.split('.')[0]
|
|
|
else:
|
|
|
nameDomain = module.__name__
|
|
|
else:
|
|
|
nameDomain = self.nameDomain
|
|
|
|
|
|
if self.__l == 'en':
|
|
|
module._ = self.__translate
|
|
|
ret = 1
|
|
|
else:
|
|
|
la = []
|
|
|
la.append(self.__l)
|
|
|
if gettext.find(nameDomain,self.__catalog,la):
|
|
|
"""Если найден словарь то инициализируем переводчик"""
|
|
|
transl = gettext.translation(nameDomain\
|
|
|
,self.__catalog,la)
|
|
|
module._ = transl.ugettext
|
|
|
ret = 1
|
|
|
else:
|
|
|
module._ = self.__translate
|
|
|
ret = 0
|
|
|
self.__modnames[module.__name__] = ret
|
|
|
return ret
|
|
|
|
|
|
def getTranslatorByName(self,namemodule):
|
|
|
""" Метод который по имени модуля определяет, был ли модуль с этим
|
|
|
именем переведен
|
|
|
"""
|
|
|
if self.__modnames.has_key(namemodule):
|
|
|
return self.__modnames[namemodule]
|
|
|
return 0
|
|
|
|
|
|
def setGlobalDomain(self, nameDomain):
|
|
|
""" Метод для установки домена перевода (глобально для всех файлов)
|
|
|
"""
|
|
|
self.GP[0] = nameDomain
|
|
|
self.nameDomain = self.GP[0]
|
|
|
return True
|
|
|
|
|
|
def setLocalDomain(self, nameDomain):
|
|
|
""" Метод для установки домена перевода (локально для одного файла)
|
|
|
"""
|
|
|
self.nameDomain = nameDomain
|
|
|
return True
|
|
|
|
|
|
##############################################################################
|
|
|
# Перевод модуля на другой язык
|
|
|
tr = lang()
|
|
|
tr.setLocalDomain('cl_lib')
|
|
|
tr.setLanguage(sys.modules[__name__])
|
|
|
##############################################################################
|
|
|
import cl_profile
|
|
|
class iniParser(cl_profile._error):
|
|
|
"""Класс для работы с ini файлами
|
|
|
|
|
|
"""
|
|
|
def __init__(self, iniFile):
|
|
|
# название ini файла
|
|
|
self.iniFile = iniFile
|
|
|
# права создаваемого ini-файла
|
|
|
self.mode = 0644
|
|
|
|
|
|
def setMode(self, mode):
|
|
|
"""установка прав создаваемого ini-файла"""
|
|
|
self.mode = mode
|
|
|
|
|
|
def openIniFile(self):
|
|
|
if not os.path.exists(self.iniFile):
|
|
|
fd = os.open(self.iniFile, os.O_CREAT)
|
|
|
os.close(fd)
|
|
|
os.chmod(self.iniFile, self.mode)
|
|
|
if not os.path.exists(self.iniFile):
|
|
|
self.setError(_("Unable to create file") + ": " + self.iniFile)
|
|
|
return False
|
|
|
FD = open(self.iniFile, "r")
|
|
|
textIni = FD.read()
|
|
|
FD.close()
|
|
|
return textIni
|
|
|
|
|
|
def writeIniFile(self, txtConfig):
|
|
|
FD = open(self.iniFile, "r+")
|
|
|
FD.truncate(0)
|
|
|
FD.seek(0)
|
|
|
FD.write(txtConfig)
|
|
|
FD.close()
|
|
|
|
|
|
def setVar(self, strHeader, dictVar):
|
|
|
"""Заменяет или добавляет область и переменные
|
|
|
|
|
|
Добавляет область в ini-файл или объединяет с существующей
|
|
|
strHeader - имя области
|
|
|
dictVar - словарь переменных
|
|
|
"""
|
|
|
textIni = self.openIniFile()
|
|
|
if textIni == False:
|
|
|
return False
|
|
|
# создаем объект типа samba и записываем в него содержимое ini-файла
|
|
|
objIni = cl_profile.samba(textIni)
|
|
|
# создаем текст в формате samba из строки заголовка и
|
|
|
# словаря переменных области
|
|
|
txtConfig = objIni.createTxtConfig(strHeader, dictVar)
|
|
|
# создаем объект типа samba и записываем в него текст
|
|
|
objIniAdd = cl_profile.samba(txtConfig)
|
|
|
# объединяем объекты для получения результирующего текста
|
|
|
objIni.join(objIniAdd)
|
|
|
# получаем текст
|
|
|
txtConfig = objIni.getConfig().encode("UTF-8")
|
|
|
# записываем его в ini файл
|
|
|
self.writeIniFile(txtConfig)
|
|
|
return True
|
|
|
|
|
|
def delVar(self, strHeader, nameVar):
|
|
|
"""Удаляем переменную из ini файла"""
|
|
|
delNameVar = "!%s" %(nameVar)
|
|
|
dictVar = {delNameVar:"del"}
|
|
|
res = self.setVar(strHeader, dictVar)
|
|
|
return res
|
|
|
|
|
|
def delArea(self, strHeader):
|
|
|
"""Удаляем область из ini файла"""
|
|
|
delStrHeader = "!%s" %(strHeader)
|
|
|
dictVar = {"del":"del"}
|
|
|
res = self.setVar(delStrHeader, dictVar)
|
|
|
return res
|
|
|
|
|
|
def getVar(self, strHeader, nameVar):
|
|
|
"""Получаем значение переменной из ini-файла"""
|
|
|
textIni = self.openIniFile()
|
|
|
if not textIni:
|
|
|
return False
|
|
|
# создаем объект типа samba и записываем в него содержимое ini-файла
|
|
|
objIni = cl_profile.samba(textIni)
|
|
|
# получаем ноду body
|
|
|
xmlBody = objIni.docObj.getNodeBody()
|
|
|
# находим в области переменную
|
|
|
res = objIni.docObj.getAreaFieldValues(strHeader, nameVar, xmlBody)
|
|
|
if res == False:
|
|
|
return None
|
|
|
else:
|
|
|
return res
|
|
|
|
|
|
def getAreaVars(self,strHeader):
|
|
|
"""Получаем все переменнные области из ini-файла"""
|
|
|
textIni = self.openIniFile()
|
|
|
if not textIni:
|
|
|
return False
|
|
|
# создаем объект типа samba и записываем в него содержимое ini-файла
|
|
|
objIni = cl_profile.samba(textIni)
|
|
|
# получаем ноду body
|
|
|
xmlBody = objIni.docObj.getNodeBody()
|
|
|
# если находим область то выдаем словарем все переменные иначе False
|
|
|
res = objIni.docObj.getAreaFields(strHeader, xmlBody)
|
|
|
if res == False:
|
|
|
return {}
|
|
|
else:
|
|
|
return res
|
|
|
|
|
|
##############################################################################
|
|
|
|
|
|
class opt:
|
|
|
def __init__(self,shortOpt,longOpt = []):
|
|
|
""" Длинные и короткие опции командной строки допустимые в программе
|
|
|
a - короткая опция
|
|
|
>program -a
|
|
|
|
|
|
a: - короткая опциия со значением
|
|
|
>program -a 10
|
|
|
|
|
|
a:: - короткая опциия у которой может быть или не быть значение
|
|
|
>program -a
|
|
|
>program -a 15
|
|
|
|
|
|
"ha:" - значение параметра shortOpt
|
|
|
две опции h - без значения, a - со значением
|
|
|
|
|
|
help - длинная опция без значения
|
|
|
test= - длинная опция со значением
|
|
|
|
|
|
["help","test="] - значение парамера longOpt
|
|
|
>program -a
|
|
|
две опции help - без значения, test - со значением
|
|
|
"""
|
|
|
self.shortOpt = shortOpt
|
|
|
self.longOpt = longOpt
|
|
|
self.sysArgv = sys.argv[1:]
|
|
|
|
|
|
def getopt(self):
|
|
|
try:
|
|
|
opts, args = getopt.getopt(self.sysArgv,self.shortOpt,self.longOpt)
|
|
|
except getopt.GetoptError:
|
|
|
self.handlerErrOpt()
|
|
|
sys.exit(1)
|
|
|
for option, value in opts:
|
|
|
if len(option) == 2:
|
|
|
option = option[1:]
|
|
|
else:
|
|
|
option = option[2:]
|
|
|
self.handlerOpt(option,value)
|
|
|
for param in args:
|
|
|
self.handlerParam(param)
|
|
|
|
|
|
def handlerErrOpt(self):
|
|
|
# Обработчик в случае неправильных параметров
|
|
|
pass
|
|
|
|
|
|
def handlerOpt(self,option,value):
|
|
|
# Обработчик (параметр значение)
|
|
|
pass
|
|
|
|
|
|
def handlerParam(self,param):
|
|
|
# Обработчик хвостов (значение)
|
|
|
pass
|
|
|
|
|
|
###############################################################################
|
|
|
class fillVars:
|
|
|
G_shr_path="/usr/calculate"
|
|
|
G_rshr_path="/var/calculate/remote"
|
|
|
G_path=cl_utils.getpathenv()
|
|
|
G_calcname="Calculate"
|
|
|
|
|
|
def __init__(self, objvar=None):
|
|
|
if objvar:
|
|
|
self._objvar=objvar
|
|
|
|
|
|
#Вернуть результат выполнения команды ОС
|
|
|
def __runos(self,cmd,ret_first=None):
|
|
|
return cl_utils.runOsCommand(cmd, None, ret_first)
|
|
|
|
|
|
def __getinifile(self,fname,def_sect):
|
|
|
s=ConfigParser.ConfigParser()
|
|
|
try:
|
|
|
s.read(fname)
|
|
|
return s
|
|
|
except ConfigParser.MissingSectionHeaderError:
|
|
|
f=open(fname,"rb")
|
|
|
s.add_section(def_sect)
|
|
|
for i in f.readlines():
|
|
|
t=i.strip().split('=',1)
|
|
|
if len(t)==1:
|
|
|
s.set(def_sect,t[0],None)
|
|
|
elif len(t)>=2:
|
|
|
s.set(def_sect,t[0],t[1])
|
|
|
else:
|
|
|
print 'Error parsing ini file'
|
|
|
return s
|
|
|
|
|
|
def __getini(self, param):
|
|
|
inipath="/etc/calculate/calculate.ini"
|
|
|
if os.path.exists(inipath):
|
|
|
def_sect='default'
|
|
|
par=self.__getinifile(inipath,def_sect)
|
|
|
if par:
|
|
|
res={}
|
|
|
for i in par.options(def_sect):
|
|
|
res[i]=par.get(def_sect, i)
|
|
|
if res:
|
|
|
if res.has_key(param):
|
|
|
return res[param]
|
|
|
else:
|
|
|
return None
|
|
|
else:
|
|
|
return None
|
|
|
else:
|
|
|
return None
|
|
|
|
|
|
#вернуть список переносимых путей при монтировании
|
|
|
def __getdisk_fstab(self, obj, lines, param):
|
|
|
g_load_dev=param['load_dev']
|
|
|
g_install_dev=param['install_dev']
|
|
|
Get=obj.Get
|
|
|
mount_dev=[]
|
|
|
mount_dir=[]
|
|
|
mount_line=[]
|
|
|
sch1='^\s*(\/dev\/[^\s]+)\s+([^\s]+)\s+([^\s]+)\s+\
|
|
|
([^\s]+)\s+([0-9])\s+([0-9])\s*$'
|
|
|
sch2='^\s*([A-Za-z0-9\.]+:[^\s]+)\s+([^\s]+)\s+\
|
|
|
([^\s]+)\s+([^\s]+)\s+([0-9])\s+ ([0-9])\s*$'
|
|
|
sch3='^\s*(\/[^\s]+)\s+(\/[^\s]+)\s+([^\s]+)\s+\
|
|
|
(bind)\s+([0-9])\s+([0-9])\s*$'
|
|
|
for line in lines:
|
|
|
if re.search('^\s*#',line):
|
|
|
continue
|
|
|
res=re.search(sch1,line)
|
|
|
if not res:
|
|
|
res=re.search(sch2,line)
|
|
|
if not res:
|
|
|
res=re.search(sch3,line)
|
|
|
if res:
|
|
|
vals=res.groups()
|
|
|
if vals[0]=='/dev/%s%s'%(param['load_dev'],\
|
|
|
param['load_num']):
|
|
|
continue
|
|
|
if vals[0]=='/dev/%s%s'%(param['install_dev'],\
|
|
|
param['install_num']):
|
|
|
continue
|
|
|
res2=re.search('%s'%Get('sys_swap_dev'),vals[0])
|
|
|
if res2:
|
|
|
continue
|
|
|
res2=re.search('^\/dev\/loop[0-9]$',vals[0])
|
|
|
if res2:
|
|
|
continue
|
|
|
mount_dev.append(vals[0])
|
|
|
mount_dir.append(vals[1])
|
|
|
val3=" ".join(vals[2:])
|
|
|
mount_line.append(val3)
|
|
|
return [mount_dev,mount_dir,mount_line]
|
|
|
|
|
|
|
|
|
#*****************************************************************************
|
|
|
#Заполнение переменных для Hardware
|
|
|
#*****************************************************************************
|
|
|
def __fillHardware(self):
|
|
|
obj=self._objvar
|
|
|
cm=self.__runos
|
|
|
Get=obj.Get
|
|
|
Set=obj.Set
|
|
|
#---------------------------------------------------------------------
|
|
|
# Получим производителя оборудования
|
|
|
# $data{vendor}, $data{laptop}, $data{laptop_model}
|
|
|
# $data{board_model}, $data{board_vendor}
|
|
|
#---------------------------------------------------------------------
|
|
|
if os.path.exists('/sys/class/dmi/id/chassis_vendor'):
|
|
|
vendor=cm('%s cat /sys/class/dmi/id/chassis_vendor' % self.G_path)
|
|
|
if re.search('^\s+$',vendor) or\
|
|
|
re.search('Chassis Manufacture',vendor):
|
|
|
vendor='Chassis Manufacture'
|
|
|
Set('hrd_pc_vendor',vendor,True)
|
|
|
if os.path.exists('/sys/class/dmi/id/board_name'):
|
|
|
s=cm('%s cat /sys/class/dmi/id/board_name | grep "Portable PC"' % \
|
|
|
self.G_path)
|
|
|
if s:
|
|
|
Set('hrd_laptop_vendor',s.lower,True)
|
|
|
s=cm('%s cat /sys/class/dmi/id/product_name' % self.G_path)
|
|
|
if s:
|
|
|
Set('hrd_laptop_model',s,True)
|
|
|
elif os.path.exists('/sys/class/dmi/id/board_vendor'):
|
|
|
if os.path.exists('/sys/class/dmi/id/board_name'):
|
|
|
bmodel=cm('%s cat /sys/class/dmi/id/board_name' %\
|
|
|
self.G_path)
|
|
|
else:
|
|
|
bmodel=''
|
|
|
bvendor=cm('%s cat /sys/class/dmi/id/board_vendor' %\
|
|
|
self.G_path)
|
|
|
Set('hrd_board_model',bmodel, True)
|
|
|
Set('hrd_board_vendor',bvendor, True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Получим архитектуру процессора, файл stage, маску нестабильных файлов
|
|
|
# $data{march}, $data{stage}, $data{unmask}
|
|
|
#----------------------------------------------------------------------
|
|
|
march=cm('%s uname -m' % self.G_path)
|
|
|
if Get('setup_march') and (Get('setup_march')!=march):
|
|
|
Set('dif_march',True,True)
|
|
|
elif not Get('setup_march'):
|
|
|
Set('setup_march',march,True)
|
|
|
march=Get('setup_march')
|
|
|
if march=='i686':
|
|
|
Set('setup_unmask',"~x86",True)
|
|
|
elif march=='x86_64':
|
|
|
Set('setup_unmask',"~amd64",True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим кодичество процессоров
|
|
|
# $data{cpus}
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('hrd_cpu_num'):
|
|
|
cpucnt=0
|
|
|
if os.path.exists('/proc/cpuinfo'):
|
|
|
for record in open('/proc/cpuinfo','rb').readlines():
|
|
|
try:
|
|
|
param, pval=record.split(":")
|
|
|
except:
|
|
|
continue
|
|
|
if param.strip()=='processor':
|
|
|
cpucnt+=1
|
|
|
Set('hrd_cpu_num',cpucnt)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим видеоадаптер
|
|
|
# $data{video}, $data{video_drv}
|
|
|
#----------------------------------------------------------------------
|
|
|
suppdrv=("nvidia", "i810", "vesa", "vmware")
|
|
|
nvdrv=('nVidia Aladdin TNT2','GeForce 6200','GeForce DDR',\
|
|
|
'GeForce2','GeForce4','Quadro2','Quadro4','RIVA TNT2','Vanta')
|
|
|
cards=cl_devices.Video().getcards()
|
|
|
if cards:
|
|
|
video=cards[0]
|
|
|
if re.search('GeForce',video) or \
|
|
|
re.search('nVidia',video):
|
|
|
if re.search('\[([^\]]+)\]',video):
|
|
|
model="nVidia "+re.search('\[([^\]]+)\]',video).groups()[0]
|
|
|
Set('hrd_video_name',model,True)
|
|
|
elif re.search('(GeForce.+) nForce',video):
|
|
|
model="nVidia"
|
|
|
model+=re.search('(GeForce.+) nForce',video).groups()[0]
|
|
|
Set('hrd_video_name',model,True)
|
|
|
else:
|
|
|
Set('hrd_video_name',"nVidia GeForce",True)
|
|
|
video=Get('hrd_video_name')
|
|
|
if video not in nvdrv:
|
|
|
if not Get('hrd_video_drv'):
|
|
|
Set('hrd_video_drv','nvidia',True)
|
|
|
if not Get('hrd_opengl_set'):
|
|
|
Set('hrd_opengl_set','nvidia',True)
|
|
|
else:
|
|
|
if not Get('hrd_video_drv'):
|
|
|
Set('hrd_video_drv','vesa',True)
|
|
|
elif re.search('Intel', video):
|
|
|
res=re.search("Intel Corporation ([^\s]+)\s")
|
|
|
if res:
|
|
|
model="Intel "+res.groups()[0]
|
|
|
else:
|
|
|
model="Intel"
|
|
|
if not Get('hrd_video_drv'):
|
|
|
Set('hrd_video_drv','i810',True)
|
|
|
if not Get('hrd_opengl_set'):
|
|
|
Set('hrd_opengl_set','xorg-x11',True)
|
|
|
elif re.search('VMware', video):
|
|
|
if not Get('hrd_video_drv'):
|
|
|
Set('hrd_video_drv','vmware',True)
|
|
|
else:
|
|
|
if not Get('hrd_video_drv'):
|
|
|
Set('hrd_video_drv','vesa',True)
|
|
|
if Get('hrd_opengl_set') and not Get('cmd_run_opengl'):
|
|
|
val="/usr/bin/eselect opengl set %s"%(Get('hrd_opengl_set'))
|
|
|
Set('cmd_run_opengl',val,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим разрешение экрана
|
|
|
# $data{resolution}
|
|
|
#---------------------------------------------------------------------
|
|
|
xlog = "/var/log/Xorg.0.log"
|
|
|
def_res = "1024x768"
|
|
|
if not Get('hrd_video_res') and os.path.exists(xlog):
|
|
|
f=open(xlog, "rb")
|
|
|
sf=f.read()
|
|
|
f.close()
|
|
|
fstr="Virtual screen size determined to be ([0-9]+)\s*x\s*([0-9]+)"
|
|
|
if re.search(fstr, sf):
|
|
|
res=re.search(fstr, sf).groups()
|
|
|
resol=res[0]+"x"+res[1]
|
|
|
Set('hrd_video_res',resol,True)
|
|
|
elif re.search('Setting mode \"([0-9\@x]+)\"',sf):
|
|
|
res=re.search('Setting mode \"([0-9\@x]+)\"',sf).groups()
|
|
|
Set('hrd_video_res',res[0],True)
|
|
|
elif re.search('Virtual size is ([0-9\@x]+) ',sf):
|
|
|
res=re.search('Virtual size is ([0-9\@x]+) ',sf).groups()
|
|
|
Set('hrd_video_res',res[0],True)
|
|
|
elif re.search('Modeline "([0-9\@x]+)"',sf):
|
|
|
res=re.search('Modeline "([0-9\@x]+)"',sf).groups()
|
|
|
Set('hrd_video_res',res[0],True)
|
|
|
else:
|
|
|
Set('hrd_video_res',def_res,True)
|
|
|
if not Get('hrd_video_res'):
|
|
|
Set('hrd_video_res',def_res,True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим USB устройства
|
|
|
# $data{usb_*}
|
|
|
#----------------------------------------------------------------------
|
|
|
res=cm('%s lsusb 2>/dev/null' % self.G_path)
|
|
|
sstr='^Bus [0-9]+ Device [0-9]+: ID [0-9a-f]+:[0-9a-f]+ ([^\s].+)$'
|
|
|
if res:
|
|
|
for i in res:
|
|
|
sres=re.search(sstr,i)
|
|
|
if sres:
|
|
|
val=sres.group(1)
|
|
|
if re.search('Hewlett-Packard',val):
|
|
|
Set('hrd_usb_hp', True, True)
|
|
|
elif re.search('Bluetooth', val):
|
|
|
Set('hrd_usb_bluetooth', True, True)
|
|
|
|
|
|
#*****************************************************************************
|
|
|
#Заполнение переменных для Builder
|
|
|
#*****************************************************************************
|
|
|
def fillBuilder(self):
|
|
|
obj=self._objvar
|
|
|
cm=self.__runos
|
|
|
Get=obj.Get
|
|
|
Set=obj.Set
|
|
|
getini=self.__getini
|
|
|
G_path=Get('setup_path_env')
|
|
|
Set('setup_path_install',"/mnt/builder",True)
|
|
|
#Set('setup_pass','builder',True)
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим ссылки на исходники программ
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('setup_gentoo_mirrors'):
|
|
|
val="http://mirror.yandex.ru/gentoo-distfiles \
|
|
|
http://distfiles.gentoo.org \
|
|
|
http://distro.ibiblio.org/pub/linux/distributions/gentoo"
|
|
|
Set('setup_gentoo_mirrors',val,True)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Версию портежей
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('setup_gentoo_release'):
|
|
|
Set('setup_gentoo_release',"2007.0",True)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим наличие stage, portage
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('setup_path_portagepkg'):
|
|
|
portagepath="/usr/calculate/snapshots/"
|
|
|
if not os.path.exists(portagepath):
|
|
|
cm(self.G_path+" mkdir "+portagepath)
|
|
|
else:
|
|
|
rdir=os.listdir(portagepath)
|
|
|
last=0
|
|
|
for i in rdir:
|
|
|
res=re.search('^portage\-([0-9]+)\.tar\.bz2$',i)
|
|
|
if not res:
|
|
|
continue
|
|
|
else:
|
|
|
if int(res.groups()[0])>last:
|
|
|
last=int(res.groups()[0])
|
|
|
if last:
|
|
|
Set('setup_path_portagepkg', "%sportage-%s.tar.bz2"%\
|
|
|
(portagepath,last),True)
|
|
|
#----------------------------------------------------------------------
|
|
|
# путь к stages
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('setup_path_stagepkg'):
|
|
|
march=Get('setup_march')
|
|
|
stagepath="/usr/calculate/stages/"
|
|
|
if march=='i686':
|
|
|
val="stage3-i686-%s.tar.bz2"%s(Get('setup_gentoo_release'))
|
|
|
if os.path.exists(stagepath+val):
|
|
|
Set('setup_path_stagepkg',stagepath+val,True)
|
|
|
elif march=='x86_64':
|
|
|
val="stage3-amd64-%s.tar.bz2" %(Get('setup_gentoo_release'))
|
|
|
if os.path.exists(stagepath+val):
|
|
|
Set('setup_path_stagepkg',stagepath+val,True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Команда создания учетных записей пользователей
|
|
|
#----------------------------------------------------------------------
|
|
|
try:
|
|
|
f=open('/etc/passwd')
|
|
|
PASSWD=f.readlines()
|
|
|
f.close()
|
|
|
except:
|
|
|
print "Error opening file: passwd"
|
|
|
try:
|
|
|
f=open('/etc/group')
|
|
|
GROUP=f.readlines()
|
|
|
f.close()
|
|
|
except:
|
|
|
print "Error opening file: group"
|
|
|
if PASSWD:
|
|
|
uval=""
|
|
|
for pline in PASSWD:
|
|
|
user=[i.strip() for i in pline.split(":")]
|
|
|
#извлечем пользователей, добавленных после установки системы
|
|
|
if int(user[2])>=500 and\
|
|
|
int(user[2])<6500 and\
|
|
|
int(user[2])!=99:
|
|
|
grp=""
|
|
|
for gline in GROUP:
|
|
|
group=[i.strip() for i in gline.split(":")]
|
|
|
gusers=None
|
|
|
if group[-1]:
|
|
|
gusers=group[-1].split(",")
|
|
|
if gusers:
|
|
|
if user[0] in gusers:
|
|
|
if not grp:
|
|
|
grp=group[0]
|
|
|
else:
|
|
|
grp=grp+","+group[0]
|
|
|
groups=""
|
|
|
if grp:
|
|
|
groups="--groups "+grp
|
|
|
val="\n/usr/sbin/useradd --uid %s --gid %s --home-dir %s"%\
|
|
|
(user[2],user[3],user[5])
|
|
|
val+=" --shell %s %s %s" %\
|
|
|
(user[6], groups, user[0])
|
|
|
uval+=val
|
|
|
Set('setup_run_user',uval,True)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим запущенные сервисы CDS
|
|
|
#---------------------------------------------------------------------
|
|
|
for i in ('ldap','mail','ftp'):
|
|
|
if getini("up.%s"%i)=="on":
|
|
|
Set('sys_set_%s'%i,True,True)
|
|
|
else:
|
|
|
Set('sys_set_%s'%i,False,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Сформируем хэш конвертации устаревшего формата hda на sda
|
|
|
#---------------------------------------------------------------------
|
|
|
dev_list=cl_devices.block_dev()
|
|
|
disks={'removable':[],'sata':[],'ata':[]}
|
|
|
for dev in dev_list.get_listdev():
|
|
|
if dev_list.isremovable(dev):
|
|
|
val=disks['removable']
|
|
|
disks['removable']=val+[dev]
|
|
|
else:
|
|
|
if dev[:2]=='sd':
|
|
|
val=disks['sata']
|
|
|
disks['sata']=val+[dev]
|
|
|
else:
|
|
|
val=disks['ata']
|
|
|
disks['ata']=val+[dev]
|
|
|
sata=None
|
|
|
ata={}
|
|
|
if len(disks['ata'])>0:
|
|
|
devs=[]
|
|
|
devkey=disks['sata']; devkey.sort()
|
|
|
devs+=devkey
|
|
|
devkey=disks['ata']; devkey.sort()
|
|
|
devs+=devkey
|
|
|
devkey=disks['removable']; devkey.sort()
|
|
|
devs+=devkey
|
|
|
for i in devs:
|
|
|
if not sata:
|
|
|
sata='sda'
|
|
|
else:
|
|
|
val=re.search('sd([a-z])',i)
|
|
|
if val:
|
|
|
val=val.groups()[0]
|
|
|
else:
|
|
|
val=re.search('sd([a-z])',sata).groups()[0]
|
|
|
sata='sd'+(chr(ord(val)+1))
|
|
|
ata[i]=sata
|
|
|
Set('setup_ata',ata,True)
|
|
|
|
|
|
#*****************************************************************************
|
|
|
#Заполнение переменных для LDAP
|
|
|
#*****************************************************************************
|
|
|
def fillLDAP(self):
|
|
|
obj=self._objvar
|
|
|
if not obj:
|
|
|
return False
|
|
|
#сокращенные имена для вызовов
|
|
|
cm=self.__runos
|
|
|
Get=obj.Get
|
|
|
Set=obj.Set
|
|
|
getini=self.__getini
|
|
|
prinst=['/usr/lib/calculate/calculate-server/profile']
|
|
|
pruser=['/usr/calculate/profile/server']
|
|
|
if not os.path.exists(prinst[0]):
|
|
|
prinst=''
|
|
|
if not os.path.exists(pruser[0]):
|
|
|
pruser=''
|
|
|
Set('setup_path_install','/',True)
|
|
|
Set('setup_path_profinstall',\
|
|
|
prinst,True)
|
|
|
Set('setup_path_profuser',\
|
|
|
pruser,True)
|
|
|
#переменные необходимые для работы
|
|
|
g_hostname=Get('net_host')
|
|
|
g_domain=Get('sys_domain')
|
|
|
#--------------------------------------------------------------------
|
|
|
# Настройки PDC
|
|
|
#--------------------------------------------------------------------
|
|
|
Set('soft_samba_domain',"CDS",True)
|
|
|
Set('soft_samba_netbios',"PDC-CDS",True)
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим путь к LDAP-записям пользователей
|
|
|
#----------------------------------------------------------------------
|
|
|
#базовый суффикс
|
|
|
Set('soft_ldap_base',"dc=%s"%(Get('soft_ldap_root')),True)
|
|
|
#алгоритм шифрования паролей
|
|
|
Set('soft_ldap_hash_encrypt',"{SSHA}",True)
|
|
|
#пользовательский доступ к базе с доступом только для чтения
|
|
|
Set('soft_ldap_bindname',"proxyuser",True)
|
|
|
Set('soft_ldap_bind',"cn=%s,%s"%\
|
|
|
(Get('soft_ldap_bindname'),\
|
|
|
Get('soft_ldap_base'))\
|
|
|
,True)
|
|
|
Set('soft_ldap_bindpw',"calculate",True)
|
|
|
val="%s slappasswd -s %s -h %s"%\
|
|
|
(self.G_path,\
|
|
|
Get('soft_ldap_bindpw'),\
|
|
|
Get('soft_ldap_hash_encrypt'))
|
|
|
res=cm(val)
|
|
|
if res:
|
|
|
Set('soft_ldap_bindpw_hash',res,True)
|
|
|
#временный пользователь root для инициализации базы данных
|
|
|
Set('soft_ldap_admin_tmp', "cn=ldaproot,%s"%Get('soft_ldap_base'),\
|
|
|
True)
|
|
|
Set('soft_ldap_adminpw_tmp',cl_utils.genpassword().strip(),True)
|
|
|
cstr='%s slappasswd -s %s -h %s'%\
|
|
|
(self.G_path,\
|
|
|
Get('soft_ldap_adminpw_tmp'),\
|
|
|
Get('soft_ldap_hash_encrypt')
|
|
|
)
|
|
|
res=cm(cstr)
|
|
|
if res:
|
|
|
Set('soft_ldap_adminpw_tmp_hash',res.strip(),True)
|
|
|
#постоянный пользователь root, прописываемый в базу при первой загрузке
|
|
|
#с одновременным удалением временного root-а
|
|
|
Set('soft_ldap_adminname',"ldapadmin",True)
|
|
|
Set('soft_ldap_admin',"cn=%s,%s"%\
|
|
|
(Get('soft_ldap_adminname'),\
|
|
|
Get('soft_ldap_base')\
|
|
|
),True)
|
|
|
if os.path.exists('/etc/smbldap-tools/smbldap_bind.conf'):
|
|
|
cstr='%s cat /etc/smbldap-tools/smbldap_bind.conf | grep masterPw'\
|
|
|
% self.G_path
|
|
|
res=cm(cstr)
|
|
|
rs=re.search('[^=]+="(.+)"',res.strip())
|
|
|
if rs:
|
|
|
Set('soft_ldap_adminpw',rs.group(1),True)
|
|
|
if not Get('soft_ldap_adminpw') or\
|
|
|
Get('soft_ldap_adminpw')=="secret":
|
|
|
Set('soft_ldap_adminpw',cl_utils.genpassword().strip(),True)
|
|
|
cstr='%s slappasswd -s %s -h %s'%\
|
|
|
(self.G_path,\
|
|
|
Get('soft_ldap_adminpw'),\
|
|
|
Get('soft_ldap_hash_encrypt')\
|
|
|
)
|
|
|
res=cm(cstr)
|
|
|
if res:
|
|
|
Set('soft_ldap_adminpw_hash',res.strip(),True)
|
|
|
#*****************************************************************************
|
|
|
#Заполнение глобальных переменных
|
|
|
#*****************************************************************************
|
|
|
def fillGlobal(self):
|
|
|
obj=self._objvar
|
|
|
cm=self.__runos
|
|
|
Get=obj.Get
|
|
|
Set=obj.Set
|
|
|
getini=self.__getini
|
|
|
#получим путь для выполнения команд
|
|
|
if self.G_path:
|
|
|
Set('setup_path_env',self.G_path,True)
|
|
|
else:
|
|
|
print "Not found path for execute commands"
|
|
|
sys.exit(0)
|
|
|
if not os.path.exists(self.G_shr_path):
|
|
|
print "Not found Calculate dir: %s"%self.G_shr_path
|
|
|
sys.exit(0)
|
|
|
#**********************************************
|
|
|
#checkerrors
|
|
|
#**********************************************
|
|
|
g_install_dev=""
|
|
|
g_install_num=""
|
|
|
if Get('setup_installdev') and\
|
|
|
re.search('^([a-z]+)([0-9]+)$',Get('setup_installdev')):
|
|
|
val=re.search('^([a-z]+)([0-9]+)$',Get('setup_installdev'))
|
|
|
if val:
|
|
|
vals=val.groups()
|
|
|
g_install_dev=vals[0]
|
|
|
g_install_num=vals[1]
|
|
|
Set('setup_installdev',vals[0]+vals[1],True)
|
|
|
if Get('setup_installdev') and\
|
|
|
(not g_install_dev or\
|
|
|
not g_install_num or\
|
|
|
not os.path.exists('/dev/%s%s'%\
|
|
|
(g_install_dev,\
|
|
|
g_install_num))):
|
|
|
print "Incorrect partition"
|
|
|
sys.exit(0)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Проверим id пользователя, запустившего скрипт
|
|
|
#---------------------------------------------------------------------
|
|
|
if os.getegid()!=0:
|
|
|
print "Only root can perform system installation"
|
|
|
sys.exit(0)
|
|
|
|
|
|
if Get('setup_sys_shortname'):
|
|
|
sh_name=Get('setup_sys_shortname')
|
|
|
ver=Get('setup_dist_ver')
|
|
|
if ver.has_key(sh_name.upper()):
|
|
|
Set('setup_sys_fullname',ver[sh_name.upper()],True)
|
|
|
if not Get('setup_sys_shortname'):
|
|
|
#Set('setup_pass','install',True)
|
|
|
path='/etc/issue'
|
|
|
#если файл с версией системы найден, определим версию
|
|
|
sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)"""
|
|
|
res=cm('%scat %s | grep "Welcome to "'%\
|
|
|
(self.G_path,\
|
|
|
path))
|
|
|
if res:
|
|
|
if re.search(sp,res):
|
|
|
vals=re.search(sp,res).groups()
|
|
|
issuename=vals[0]
|
|
|
ver=Get('setup_dist_ver')
|
|
|
for i in ver.keys():
|
|
|
if ver[i]==issuename:
|
|
|
Set('setup_sys_shortname',i,True)
|
|
|
Set('setup_sys_fullname',ver[i],True)
|
|
|
break
|
|
|
#если имя не определено, но оно новое и мы его уже
|
|
|
#передали параметром --configure
|
|
|
if not Get('setup_sys_shortname'):
|
|
|
Set('setup_sys_fullname',issuename,True)
|
|
|
spl=issuename.split(" ")
|
|
|
nname=""
|
|
|
if len(spl)>1:
|
|
|
for i in spl:
|
|
|
nname+=i[1]
|
|
|
Set('setup_sys_shortname',nname,True)
|
|
|
else:
|
|
|
Set('setup_sys_shortname',issuename,True)
|
|
|
#устанавливаемая или собираемая система по умолчанию
|
|
|
if not Get('setup_sys_shortname'):
|
|
|
Set('setup_sys_shortname',"CLD",True)
|
|
|
val=Get('setup_dist_ver')['CLD']
|
|
|
Set('setup_sys_fullname',val,True)
|
|
|
#----------------------------------------------------------------------
|
|
|
# Получим тип системы
|
|
|
#----------------------------------------------------------------------
|
|
|
if re.search('server',Get('setup_sys_fullname')):
|
|
|
Set('sys_linux_type','server',True)
|
|
|
else:
|
|
|
Set('sys_linux_type','desktop',True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
#одетектим устройства
|
|
|
self.__fillHardware()
|
|
|
#---------------------------------------------------------------------
|
|
|
Set('setup_name',self.G_calcname+" "+Get('setup_ver'),True)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Выполним проверки доступности необходимых программ и определим пути
|
|
|
# exec_host, exec_nmap
|
|
|
#---------------------------------------------------------------------
|
|
|
if not os.system("which host >/dev/null 2>&1"):
|
|
|
res=os.popen("which host").readlines()
|
|
|
Set('cmd_exec_host',res[0].rstrip(),True)
|
|
|
if not os.system("which nmap >/dev/null 2>&1"):
|
|
|
res=os.popen("which nmap").readlines()
|
|
|
Set('cmd_exec_nmap',res[0].rstrip(),True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Установим значение переменной в ram, в случае если установка профиля
|
|
|
# производится в оперативную память (настройка сеанса CDROM), а также
|
|
|
# load - носитель в значение ram в случае загрузки с CD/DVD
|
|
|
#---------------------------------------------------------------------
|
|
|
Set('sys_load',"", True)
|
|
|
if cm("""mount | grep "/dev/loop/0 on / type" """):
|
|
|
Set('sys_load',"ram", True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Считаем имя компьютера
|
|
|
#---------------------------------------------------------------------
|
|
|
if Get('net_host') is None:
|
|
|
hostname=cm("""%s hostname -s 2>&1"""%self.G_path)
|
|
|
Set('net_host',hostname, True)
|
|
|
#упрощенный вариант, следует выполнять только если не указан домен
|
|
|
#в системе
|
|
|
if re.search("^hostname: ",hostname):
|
|
|
hostname=cm("""%s hostname 2>&1"""%self.G_path)
|
|
|
if re.search("^hostname: ",hostname):
|
|
|
Set('net_host',Get('setup_sys_shortname'), True)
|
|
|
else:
|
|
|
if hostname=='livecd':
|
|
|
Set('net_host',Get('setup_sys_shortname'), True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим домен
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('sys_domain'):
|
|
|
domain=cm("%s hostname -d 2>&1"%self.G_path)
|
|
|
Set('sys_domain',domain, True)
|
|
|
if re.search("^hostname: ",domain):
|
|
|
Set('sys_domain',"local", True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим сетевые настройки:
|
|
|
# шлюз, локальные интерфейсы, локальные сети, настройки
|
|
|
#/etc/conf.d/net,
|
|
|
# сетевые устройства
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('net_gw'):
|
|
|
Set('net_conf',"",True)
|
|
|
Set('net_hosts_allow',"",True)
|
|
|
Set('net_networks',"",True)
|
|
|
route=cm("""%sroute -n | grep "^0.0.0.0" """%self.G_path)
|
|
|
route=re.split("\s+",route)
|
|
|
if route:
|
|
|
Set('net_gw', route[1],True)
|
|
|
Set('net_gw_dev', route[7],True)
|
|
|
net={'255.255.0.0':'/16',\
|
|
|
'255.255.255.0':'/24',\
|
|
|
'255.255.255.128':'/25',\
|
|
|
'255.255.255.252':'/30',\
|
|
|
'255.255.255.255':''}
|
|
|
netpath='/sys/class/net/'
|
|
|
nets={}
|
|
|
net_if=cl_utils.getdirlist(netpath)
|
|
|
for i in net_if:
|
|
|
if i=='lo':
|
|
|
continue
|
|
|
res=cm("cat %s%s/operstate"%(netpath,i))
|
|
|
if res=='up':
|
|
|
nets[i]=True
|
|
|
elif res=='down':
|
|
|
nets[i]=False
|
|
|
else:
|
|
|
nets[i]=None
|
|
|
ip={}
|
|
|
host_allow=""
|
|
|
networks=""
|
|
|
netconf=""
|
|
|
gateway_dhcp=0
|
|
|
dev_open=0
|
|
|
for i in nets.keys():
|
|
|
res=cm("/sbin/ifconfig %s"%i)
|
|
|
#res=cm("ifconfig %s"%i)
|
|
|
sline=""""""
|
|
|
for j in res:
|
|
|
s_ip=re.search('addr:([0-9\.]+).+Bcast:.+Mask:([0-9\.]+)'\
|
|
|
,j)
|
|
|
if s_ip:
|
|
|
ip, netmask=s_ip.groups()
|
|
|
host_allow+=ip+net[netmask]+""
|
|
|
ipd=ip
|
|
|
ip=ip.split('.');
|
|
|
if ip[0]=='10' or\
|
|
|
(ip[0]=='172' and int(ip[1])>=16 and int(ip[1])<=31)or\
|
|
|
(ip[0]=='192' and ip[1]=='168'):
|
|
|
if netmask=='255.255.255.255':
|
|
|
networks+=ip+" "
|
|
|
elif netmask=='255.255.255.252':
|
|
|
networks+=ip[0]+"."+ip[1]+"."+ip[2]+"."+"252"+\
|
|
|
net[netmask]
|
|
|
elif netmask=='255.255.255.128':
|
|
|
networks+=ip[0]+"."+ip[1]+"."+ip[2]+"."+"128"+\
|
|
|
net[netmask]
|
|
|
elif netmask=='255.255.255.0':
|
|
|
networks+=ip[0]+"."+ip[1]+"."+ip[2]+"."+"0"+\
|
|
|
net[netmask]
|
|
|
elif netmask=='255.255.0.0':
|
|
|
networks+=ip[0]+"."+ip[1]+".0.0"+net[netmask]
|
|
|
#определим получен ли IP через DHCP
|
|
|
#print host_allow,networks
|
|
|
if not os.path.exists(\
|
|
|
'/var/lib/dhcpcd/dhcpcd-%s.info'%i) and\
|
|
|
not (os.path.exists(\
|
|
|
'/var/lib/dhcp/dhclient.leases') and \
|
|
|
cm('grep %s /var/lib/dhcp/dhclient.leases'%i)):
|
|
|
netconf+="\nconfig_%s=(\"%s\")"%(i,ipd\
|
|
|
+net[netmask])
|
|
|
else:
|
|
|
netconf+="\nconfig_%s=(\"dhcp\")"%(i)
|
|
|
if i==Get('net_gw_dev'):
|
|
|
gateway_dhcp+=1
|
|
|
nets[i]=True
|
|
|
else:
|
|
|
netconf+="\nconfig_%s=(\"%s%s\")"%(i,\
|
|
|
ipd,net[netmask])
|
|
|
dev_open=1
|
|
|
netconf+="\nmodules_eth0=( \"!plug\" )"
|
|
|
if dev_open==0:
|
|
|
nets[i]=False
|
|
|
if Get('net_gw_dev') and gateway_dhcp==0:
|
|
|
netconf+="\nroutes_%s=(\"default gw %s\" )"%\
|
|
|
(Get('net_gw_dev'), Get('net_gw'))
|
|
|
n_key=nets.keys()
|
|
|
n_key.sort()
|
|
|
if n_key:
|
|
|
Set('net_lan',n_key[0],True)
|
|
|
tval=Get('net_networks')
|
|
|
Set('net_networks',tval+networks,True)
|
|
|
tval=Get('net_hosts_allow')
|
|
|
Set('net_hosts_allow',tval+host_allow,True)
|
|
|
tval=Get('net_conf')
|
|
|
Set('net_conf',tval+netconf,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим сетевые сервисы
|
|
|
#---------------------------------------------------------------------
|
|
|
#определим прокси-сервер
|
|
|
if Get('cmd_exec_host') and\
|
|
|
Get('sys_domain') and\
|
|
|
cm('%s proxy.%s | grep "has address"'%\
|
|
|
(Get('cmd_exec_host'), \
|
|
|
Get('sys_domain'))):
|
|
|
ports=[3128,8080]
|
|
|
for port in ports:
|
|
|
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
arg_addr=('proxy.%s'%Get('sys_domain'),port)
|
|
|
if sock.connect_ex(arg_addr)==0:
|
|
|
if not Get('net_proxy'):
|
|
|
Set('net_proxy','proxy.%s'%Get('sys_domain'),True)
|
|
|
if not Get('net_proxy_port'):
|
|
|
Set('net_proxy_port',str(port),True)
|
|
|
if not Get('net_proxy_url'):
|
|
|
val="http://%s:%s"%\
|
|
|
(Get('net_proxy'),\
|
|
|
Get('net_proxy_port'))
|
|
|
Set('net_proxy_url',val,True)
|
|
|
|
|
|
#определим наличие сетевой файловой системы
|
|
|
sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
|
|
if Get('cmd_exec_host') and\
|
|
|
not Get('net_nfs') and\
|
|
|
Get('sys_domain') and\
|
|
|
cm('%s nfs.%s | grep "has address"'%\
|
|
|
(Get('cmd_exec_host'),\
|
|
|
Get('sys_domain'))) and\
|
|
|
sock.connect_ex(('nfs.%s'%Get('sys_domain'),2049))==0:
|
|
|
Set('net_nfs','nfs.%s'%Get('sys_domain'),True)
|
|
|
|
|
|
#определим наличие локального сервера времени
|
|
|
if not Get('net_ntp'):
|
|
|
if Get('cmd_exec_host') and\
|
|
|
Get('sys_domain') and\
|
|
|
cm('%s ntp.%s | grep "has address"'%\
|
|
|
(Get('cmd_exec_host'),\
|
|
|
Get('sys_domain'))):
|
|
|
Set('net_ntp','ntp.%s'%Get('sys_domain'),True)
|
|
|
else:
|
|
|
Set('net_ntp','ntp0.zenon.net',True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим наличие сервера CDS
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('net_cds'):
|
|
|
if Get('sys_domain'):
|
|
|
Set('net_cds','cds.%s'%Get('sys_domain'),True)
|
|
|
else:
|
|
|
Set('net_cds','cds',True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Получим версию обновляемой, наличие обновлений, название
|
|
|
# устанавливаемой системы
|
|
|
#---------------------------------------------------------------------
|
|
|
sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)"""
|
|
|
if os.path.exists('/etc/issue'):
|
|
|
cline=""" """
|
|
|
res=cm('%s cat /etc/issue | grep "Welcome to "'%self.G_path)
|
|
|
if res:
|
|
|
par=re.search(sp,res).groups()
|
|
|
Set('setup_os_current',par[0],True)
|
|
|
res_n=par[1].split("-")
|
|
|
patch=""
|
|
|
osn=""
|
|
|
if len(res_n)>1:
|
|
|
patch=res_n[1]
|
|
|
Set('sys_patchcur',patch,True)
|
|
|
Set('sys_current_ver',res_n[0],True)
|
|
|
if not par[0]:
|
|
|
Set('setup_os_current','Calculate',True)
|
|
|
if par[1]:
|
|
|
Set('setup_ospatchsplit',"-",True)
|
|
|
elif os.path.exists('/etc/gentoo-release'):
|
|
|
Set('setup_os_current',"Gentoo Linux",True)
|
|
|
else:
|
|
|
Set('setup_os_current',"Old Linux",True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Заголовок изменённых файлов
|
|
|
#---------------------------------------------------------------------
|
|
|
#Changed by installator
|
|
|
if not Get('setup_mestitle'):
|
|
|
val='# Изменено %s %s' % (self.G_calcname, Get('setup_ver'))
|
|
|
Set('setup_mestitle',val,True)
|
|
|
if not Get('setup_mesline'):
|
|
|
val="#------------------------------------------------------------\
|
|
|
------------------"
|
|
|
Set('setup_mesline',val,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим диск, с которого загружена система
|
|
|
#---------------------------------------------------------------------
|
|
|
for record in open('/proc/cmdline','rb').readlines():
|
|
|
re_res=re.search('^root=\/dev\/([a-z]+[0-9]).*',record.strip())
|
|
|
if re_res:
|
|
|
res=re_res.group(1)
|
|
|
break
|
|
|
g_load_dev=""
|
|
|
g_load_num=""
|
|
|
if res:
|
|
|
fstr="^([a-z]{3})([0-9]+)"
|
|
|
fres=re.search(fstr, res)
|
|
|
if fres:
|
|
|
vals=fres.groups()
|
|
|
g_load_dev=vals[0]
|
|
|
g_load_num=vals[1]
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим диск и номер раздела для установки
|
|
|
#---------------------------------------------------------------------
|
|
|
#выберем альтернативный диск для установки
|
|
|
if not Get('setup_installdev') and\
|
|
|
getini('install.from'):
|
|
|
res=getini('install.from')
|
|
|
Set('setup_installdev',res,True)
|
|
|
val=re.search('^([a-z]+)([0-9]+)$',res)
|
|
|
if val:
|
|
|
vals=val.groups()
|
|
|
g_install_dev=vals[0]
|
|
|
g_install_num=vals[1]
|
|
|
elif not Get('setup_installdev') and\
|
|
|
not g_install_dev and\
|
|
|
not g_install_num and\
|
|
|
g_load_dev:
|
|
|
g_install_dev=g_load_dev
|
|
|
if int(g_load_num)==2:
|
|
|
g_install_num=3
|
|
|
elif int(g_load_num)==3:
|
|
|
g_install_num=2
|
|
|
Set('setup_installdev',g_install_dev+\
|
|
|
str(g_install_num),True)
|
|
|
#проверим на существование диска
|
|
|
if not os.path.exists("/dev/%s"%Get('setup_installdev')):
|
|
|
print "Incorrect partition"
|
|
|
sys.exit(0)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Выберем доступную утилиту форматирования
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('setup_formatfs'):
|
|
|
#попытаемся подмонтировать, чтобы получить информацию о
|
|
|
#файловом формате
|
|
|
format=""
|
|
|
cstr="%s mkdir -p %s" % (self.G_path, Get('setup_path_install'))
|
|
|
cm(cstr)
|
|
|
cstr="%s mount /dev/%s%s %s &>/dev/null"\
|
|
|
% (self.G_path,\
|
|
|
g_install_dev,\
|
|
|
g_install_num,\
|
|
|
Get('setup_path_install'))
|
|
|
if not os.system(cstr):
|
|
|
cstr="%s mount | grep /dev/%s%s"\
|
|
|
%(self.G_path,\
|
|
|
g_install_dev,\
|
|
|
g_install_num)
|
|
|
format=cm(cstr,True)
|
|
|
cstr="%s umount %s"%(self.G_path, Get('setup_path_install'))
|
|
|
os.system(cstr)
|
|
|
else:
|
|
|
cstr="%s rmdir %s"%(self.G_path, Get('setup_path_install'))
|
|
|
os.system(cstr)
|
|
|
if format:
|
|
|
fs=None
|
|
|
if re.search(' reiserfs ',format.strip()):
|
|
|
fs='reiserfs'
|
|
|
elif re.search(' xfs ',format.strip()):
|
|
|
fs='xfs'
|
|
|
elif re.search(' ext3 ',format.strip()):
|
|
|
fs='ext3'
|
|
|
elif re.search(' ext2 ',format.strip()):
|
|
|
fs='ext2'
|
|
|
Set('setup_formatfs',fs,True)
|
|
|
|
|
|
formatrun={"reiserfs":'"/sbin/mkfs.reiserfs -f"',\
|
|
|
"xfs":"/sbin/mkfs.xfs -f",\
|
|
|
"ext3":"/sbin/mkfs.ext3",\
|
|
|
"ext2":"/sbin/mkfs.ext2"}
|
|
|
|
|
|
if Get('setup_formatfs') in formatrun.keys() and\
|
|
|
os.path.exists("/sbin/mkfs.%s"%(Get('setup_formatfs'))):
|
|
|
val=formatrun[Get('setup_formatfs')]
|
|
|
Set('cmd_run_format',val,True)
|
|
|
else:
|
|
|
if os.path.exists('/sbin/mkfs.reiserfs'):
|
|
|
Set('setup_formatfs','reiserfs',True)
|
|
|
elif os.path.exists('/sbin/mkfs.xfs'):
|
|
|
Set('setup_formatfs','xfs',True)
|
|
|
elif os.path.exists('/sbin/mkfs.ext3'):
|
|
|
Set('setup_formatfs','ext3',True)
|
|
|
elif os.path.exists('/sbin/mkfs.ext2'):
|
|
|
Set('setup_formatfs','ext2',True)
|
|
|
else:
|
|
|
print "Formatting utility not found"
|
|
|
sys.exit(0)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Хэш доступных grub-у дисков, диск и раздел для установки в grub
|
|
|
#---------------------------------------------------------------------
|
|
|
sdir="/sys/block/"
|
|
|
ldir=cl_utils.getdirlist(sdir)
|
|
|
grub_dev=[]
|
|
|
#определим неизвлекаемые устройства
|
|
|
if ldir:
|
|
|
for dev in ldir:
|
|
|
if re.search('^(sd|hd)',dev):
|
|
|
cstr="%s cat %s%s/removable" %(self.G_path,\
|
|
|
sdir,\
|
|
|
dev)
|
|
|
val=cm(cstr)
|
|
|
if val:
|
|
|
if int(val[0].strip())==0:
|
|
|
grub_dev.append(dev.strip())
|
|
|
grub_dev.sort()
|
|
|
num=0
|
|
|
grub_map={}
|
|
|
for dev in grub_dev:
|
|
|
grub_map['hd'+str(num)]=dev
|
|
|
if g_install_dev==dev:
|
|
|
Set('boot_grub_setupdev','hd'+str(num),True)
|
|
|
if g_load_dev==dev:
|
|
|
Set('boot_grub_loaddev','hd'+str(num),True)
|
|
|
num+=1
|
|
|
g_grub_map=grub_map
|
|
|
if g_install_num:
|
|
|
install_num=int(g_install_num)-1
|
|
|
Set('boot_grub_setupnum',str(install_num),True)
|
|
|
if g_load_num:
|
|
|
load_num=int(g_load_num)-1
|
|
|
Set('boot_grub_loadnum',load_num,True)
|
|
|
Set('boot_grub_map',g_grub_map,True)
|
|
|
#---------------------------------------------------------------------
|
|
|
# Диски файла devicemap для grub-а
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('boot_devicemap'):
|
|
|
grubmap=g_grub_map
|
|
|
grubkeys=grubmap.keys()
|
|
|
grubkeys.sort()
|
|
|
devmap=""
|
|
|
for dev in grubkeys:
|
|
|
devmap+="%s /dev/%s\n" % (dev, grubmap[dev])
|
|
|
Set('boot_devicemap',devmap.strip(),True)
|
|
|
#Скопируем карту устройств для установки граба. Новая карта на libata
|
|
|
#может отличаться
|
|
|
Set('boot_devicemap_old',Get('boot_devicemap'),True)
|
|
|
|
|
|
#--------------------------------------------------------------------
|
|
|
# Считаем меню граба grub.conf для переноса настроек
|
|
|
#--------------------------------------------------------------------
|
|
|
if Get('sys_load')!='ram':
|
|
|
grub="/boot/grub/grub.conf"
|
|
|
if os.path.exists(grub):
|
|
|
f=open(grub,"rb")
|
|
|
fstr=f.readlines()
|
|
|
f.close()
|
|
|
config=""
|
|
|
record=""
|
|
|
skip=None
|
|
|
for line in fstr:
|
|
|
if re.search('^\s*title[\s|=]+',line):
|
|
|
if record and not skip:
|
|
|
config+=record
|
|
|
record=line
|
|
|
skip=0
|
|
|
else:
|
|
|
if re.search('[^\s]', line) and record:
|
|
|
sstr="^\s*kernel .*root=\/dev\/%s" %\
|
|
|
Get('setup_installdev')
|
|
|
if Get('setup_installdev') and\
|
|
|
re.search(sstr,line):
|
|
|
skip+=1
|
|
|
record+=line
|
|
|
if record and not skip:
|
|
|
config+=record
|
|
|
Set('boot_grub_another',config,True)
|
|
|
else:
|
|
|
oldmarch=cm("%s uname -m"%self.G_path)
|
|
|
curos=None
|
|
|
if Get('sys_current_ver'):
|
|
|
curos=Get('sys_current_ver')
|
|
|
val ="\ntitle %s %s %s\n" %\
|
|
|
(Get('setup_os_current'),\
|
|
|
curos,\
|
|
|
oldmarch.strip())
|
|
|
val+="root (%s,%s)\n" %\
|
|
|
(Get('boot_grub_loaddev'),\
|
|
|
Get('boot_grub_loadnum'))
|
|
|
val+="kernel /boot/vmlinuz root=/dev/%s%s" %\
|
|
|
(Get('load_dev'),\
|
|
|
Get('load_num'))
|
|
|
Set('boot_grub_another',val,True)
|
|
|
|
|
|
if not Get('setup_set_mbr'):
|
|
|
Set('setup_set_mbr',True,True)
|
|
|
else:
|
|
|
Set('setup_set_mbr',False,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим раздел свопа
|
|
|
# $data{swap}
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('sys_swap_dev'):
|
|
|
res=cm('%s tail -n 1 /proc/swaps' % self.G_path)
|
|
|
if res:
|
|
|
val=re.search('^\/dev\/([^\s]+)',res).group(1)
|
|
|
Set('sys_swap_dev',val,True)
|
|
|
elif Get('sys_swap_dev'):
|
|
|
res=re.search('^\/dev\/(.+)$',Get('sys_swap_dev'))
|
|
|
if res:
|
|
|
val=res.group(1)
|
|
|
Set('sys_swap_dev',val,True)
|
|
|
if not Get('sys_swap_dev') and Get('install_dev'):
|
|
|
scm='LANG=C fdisk -l /dev/%s 2>&1 | grep "Linux swap"' %\
|
|
|
(Get('install_dev'))
|
|
|
res=cm(scm)
|
|
|
if res:
|
|
|
val=re.search('^\/dev\/([^\s]+)',res)
|
|
|
if val:
|
|
|
Set('sys_swap_dev',val.group(1),True)
|
|
|
if Get('sys_swap_dev'):
|
|
|
val='/dev/%s\tnone\t\tswap\tsw\t\t\t0 0'%(Get('sys_swap_dev'))
|
|
|
Set('sys_swap_line',val,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# С текущей системы определим дополнительные монтируемые диски
|
|
|
# (в том числе сетевые), пути монтирования
|
|
|
#---------------------------------------------------------------------
|
|
|
if os.path.exists('/etc/fstab'):
|
|
|
f=open('/etc/fstab',"rb")
|
|
|
lines=f.readlines()
|
|
|
f.close()
|
|
|
param_t={'load_dev':g_load_dev,'install_dev':g_install_dev,\
|
|
|
'load_num':g_load_num,'install_num':g_install_num}
|
|
|
res=self.__getdisk_fstab(obj, lines, param_t)
|
|
|
if len(res[0])>0:
|
|
|
Set('sys_mount_dev',res[0],True)
|
|
|
Set('sys_path_mounts',res[1],True)
|
|
|
Set('sys_mount_line',res[2],True)
|
|
|
else:
|
|
|
Set('sys_mount_dev',"",True)
|
|
|
Set('sys_path_mounts',"",True)
|
|
|
Set('sys_mount_line',"",True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим версию последнего доступного образа системы, либо версию
|
|
|
# собираемого образа, имя файла с образом, имя ISO-файла, который можно
|
|
|
# собрать
|
|
|
#---------------------------------------------------------------------
|
|
|
#установка системы
|
|
|
if os.path.exists("%s/linux"%(self.G_shr_path)) and\
|
|
|
Get('sys_load')!='ram':
|
|
|
find="(%s\-.*\-%s\.tar\.bz2)" %\
|
|
|
(Get('setup_sys_shortname').lower(),\
|
|
|
Get('setup_march'))
|
|
|
scm=self.G_path+" find -L %s/linux"%(self.G_shr_path)
|
|
|
f_res=cm(scm)
|
|
|
if not isinstance(f_res, types.ListType):
|
|
|
f_res=[f_res]
|
|
|
for i in f_res:
|
|
|
res=re.search('(%s)'%find, i.strip())
|
|
|
if res:
|
|
|
ver=res.groups()[0]
|
|
|
linux=Get('setup_linuxpkg')
|
|
|
if not linux:
|
|
|
Set('setup_linuxpkg',ver,True)
|
|
|
ver=Get('setup_linuxpkg')
|
|
|
if ver:
|
|
|
val=re.search('\-([\d\.]+)\-.*',ver)
|
|
|
if val:
|
|
|
Set('setup_linux_ver',val.group(1),True)
|
|
|
if not Get('setup_iso_name'):
|
|
|
val="%s-%s-%s.iso" % (Get('setup_sys_shortname').lower(),
|
|
|
Get('setup_linux_ver'), Get('setup_march'))
|
|
|
Set('setup_iso_name',val,True)
|
|
|
elif Get('sys_load')=='ram' and os.path.exists('/mnt/livecd'):
|
|
|
Set('setup_linux_ver',Get('sys_current_ver'), True)
|
|
|
Set('setup_linuxpkg','livecd', True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Пути к архиву образа
|
|
|
#---------------------------------------------------------------------
|
|
|
#пути к архивам систем
|
|
|
Set('setup_path_linuxpkg',"%s/linux"%(self.G_rshr_path),True)
|
|
|
#----------------------------------------------------------------------
|
|
|
# Определим и проверим директорию установки, директорию временных
|
|
|
#файлов
|
|
|
#----------------------------------------------------------------------
|
|
|
if not Get('setup_path_tmp'):
|
|
|
Set('setup_path_tmp','/tmp/calculate',True)
|
|
|
if not Get('setup_path_install'):
|
|
|
Set('setup_path_install',"/mnt/install",True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Получим список доступных патчей
|
|
|
#----------------------------------------------------------------------
|
|
|
g_patches=None
|
|
|
if Get('sys_current_ver'):
|
|
|
if not Get('setup_path_patch'):
|
|
|
val=self.G_rshr_path+"/patch"
|
|
|
Set('setup_path_patch',val,True)
|
|
|
if not Get('sys_patchlast'):
|
|
|
Set('sys_patchlast',Get('sys_patchcur'),True)
|
|
|
if not os.path.exists(Get('setup_path_patch')):
|
|
|
print "Not found patch dir: %s"%(Get('setup_path_patch'))
|
|
|
#sys.exit(0)
|
|
|
else:
|
|
|
rdir=os.listdir(Get('setup_path_patch'))
|
|
|
if not g_patches:
|
|
|
g_patches=[]
|
|
|
patchlast=Get('sys_patchlast')
|
|
|
if not patchlast:
|
|
|
patchlast=0
|
|
|
for i in rdir:
|
|
|
dcalculate=Get('setup_sys_shortname')
|
|
|
dlinuxver=Get('setup_linux_ver')
|
|
|
fstr='^%s\-%s\-([0-9]+)$'%(dcalculate, dlinuxver)
|
|
|
res=re.search(fstr, i)
|
|
|
if not res:
|
|
|
continue
|
|
|
val=int(res.groups()[0])
|
|
|
if not Get('sys_patchcur'):
|
|
|
Set('sys_patchcur',0, True)
|
|
|
if val > int(Get('sys_patchcur')):
|
|
|
g_patches.append(i)
|
|
|
if patchlast < val:
|
|
|
Set('sys_patchlast',val,True)
|
|
|
Set('setup_patches',g_patches,True)
|
|
|
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим переменные окружения emerge и команду запуска emerge
|
|
|
#---------------------------------------------------------------------
|
|
|
if not Get('setup_makeopts'):
|
|
|
makecpu=""
|
|
|
if int(Get('hrd_cpu_num'))==1:
|
|
|
makecpu=1
|
|
|
else:
|
|
|
makecpu=int(Get('hrd_cpu_num'))+1
|
|
|
Set('setup_makeopts',"-j%s"%makecpu,True)
|
|
|
if not Get('setup_path_portage'):
|
|
|
if os.path.exists('/usr/calculate/portage'):
|
|
|
Set('setup_path_portage',"/usr/calculate/portage",True)
|
|
|
if not Get('setup_path_distfiles'):
|
|
|
if os.path.exists('/usr/calculate/distfiles'):
|
|
|
Set('setup_path_distfiles',"/usr/calculate/distfiles",True)
|
|
|
if not Get('setup_path_pkg'):
|
|
|
pkgpath="/usr/calculate/packages/%s/%s/%s"%\
|
|
|
(Get('setup_sys_shortname'),\
|
|
|
Get('setup_linux_ver'),\
|
|
|
Get('setup_march'))
|
|
|
if os.path.exists(pkgpath):
|
|
|
Set('setup_path_pkg',pkgpath,True)
|
|
|
if Get('setup_path_portage'):
|
|
|
Set('cmd_run_emerge1','PORTDIR_OVERLAY="%s" MAKEOPTS="%s"'%\
|
|
|
(Get('setup_path_portage'),\
|
|
|
Get('setup_makeopts')),\
|
|
|
True)
|
|
|
Set('cmd_run_emerge2',"",True)
|
|
|
|
|
|
#----------------------------------------------------------------------
|
|
|
# Пути к директориям пакетов сборки
|
|
|
#----------------------------------------------------------------------
|
|
|
#packages=(G_inst_path+"/builder/packages",\
|
|
|
#self.G_shr_path+"/builder/packages")
|
|
|
#Set('setup_path_constpkg',packages,True)
|
|
|
|
|
|
def fillInstall(self):
|
|
|
#---------------------------------------------------------------------
|
|
|
# Определим профили установки или сборки
|
|
|
#---------------------------------------------------------------------
|
|
|
prof=self.getProfileList('/usr/calculate/profile/install/')
|
|
|
if prof:
|
|
|
self._objvar.Set('setup_path_profuser',prof,True)
|
|
|
prof=self.getProfileList('/usr/lib/calculate-install/profile/')
|
|
|
if prof:
|
|
|
self._objvar.Set('setup_path_profinst',prof,True)
|
|
|
|
|
|
def fillFromCmdParam(self,s):
|
|
|
'''Заполнить переменные окружения посредством параметра командной
|
|
|
строки.
|
|
|
|
|
|
Параметры:
|
|
|
s строка вида <параметра>=<значение>[:<пар>=<знач>]
|
|
|
|
|
|
Возвращаемые значения:
|
|
|
True строка правильная и все параметры установлены
|
|
|
False строка неправильная или запрошены на установку параметры
|
|
|
"только для чтения"
|
|
|
'''
|
|
|
dict = {}
|
|
|
# разбирать входящую строку с параметрами и устанавливить в словарь
|
|
|
# (проверка на корректный синтаксис)
|
|
|
for par in s.split(':'):
|
|
|
try:
|
|
|
parts = par.split('=')
|
|
|
# проверить, что бы части состояли из 2 частей
|
|
|
if len(parts) != 2:
|
|
|
return False
|
|
|
key, value = parts
|
|
|
# проверить что бы все параметры были доступны для записи
|
|
|
if 'r' in self._objvar.Get(key,True).v_mode:
|
|
|
return False
|
|
|
dict[key] = value
|
|
|
except VarNameError:
|
|
|
return False
|
|
|
|
|
|
# установить параметры
|
|
|
for (k,v) in dict.items():
|
|
|
if self._objvar.Set(k,v) == False:
|
|
|
return False
|
|
|
return True
|
|
|
|
|
|
|
|
|
def getProfileList(self, path):
|
|
|
obj=self._objvar
|
|
|
Get=obj.Get
|
|
|
Set=obj.Set
|
|
|
_ex=os.path.exists
|
|
|
profPath=path
|
|
|
if not os.path.exists(profPath):
|
|
|
return ""
|
|
|
else:
|
|
|
Prof_gr1=[]
|
|
|
Prof_gr2=''
|
|
|
Prof_gr3=''
|
|
|
listProf=cl_utils.getdirlist(profPath)
|
|
|
#создадим список профилей в порядке их наложения
|
|
|
#профили 1*, сборки и для имени хоста
|
|
|
ver=Get('setup_dist_ver')
|
|
|
re_ver="|".join(ver.keys())
|
|
|
i=0
|
|
|
for i in xrange(len(listProf)):
|
|
|
el=listProf[i]
|
|
|
if re.search('^[0-9]+[^\.]\w+',el):
|
|
|
listProf[i]=''
|
|
|
Prof_gr1.append(profPath+el)
|
|
|
elif re.search('^(%s)$'%re_ver,el):
|
|
|
if el==Get('setup_sys_shortname'):
|
|
|
Prof_gr2=profPath+el
|
|
|
listProf[i]=''
|
|
|
elif re.search(\
|
|
|
'^[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}\.[0-9]{,3}$',el):
|
|
|
if Get('net_hosts_allow').split('/')[0]==el:
|
|
|
Prof_gr3=profPath+el
|
|
|
listProf[i]=''
|
|
|
i+=1
|
|
|
#профили для DNS зоны
|
|
|
sdn=Get('sys_domain').split(".")
|
|
|
sdn.reverse()
|
|
|
Prof_gr4=[]
|
|
|
i=0
|
|
|
for i in xrange(len(sdn)):
|
|
|
if i==0:
|
|
|
el=sdn[i]
|
|
|
else:
|
|
|
el=sdn[i]+"."+el
|
|
|
j=0
|
|
|
if el in listProf:
|
|
|
Prof_gr4.append(profPath+el)
|
|
|
listProf.remove(el)
|
|
|
#профиль для ip компьютера
|
|
|
pcip=str(Get('net_host'))
|
|
|
if pcip in listProf:
|
|
|
Prof_gr4.append(profPath+pcip)
|
|
|
listProf.remove(pcip)
|
|
|
#компонуем профили
|
|
|
Prof_gr1.sort()
|
|
|
if Prof_gr2:
|
|
|
Prof_gr1+=[Prof_gr2]
|
|
|
if len(Prof_gr4)>0:
|
|
|
Prof_gr1+=Prof_gr4
|
|
|
if Prof_gr3:
|
|
|
Prof_gr1+=[Prof_gr3]
|
|
|
if len(Prof_gr1)>0:
|
|
|
return Prof_gr1
|
|
|
else:
|
|
|
return ""
|
|
|
|
|
|
|
|
|
|
|
|
class CLError(Exception):
|
|
|
def __init__(self, value):
|
|
|
self.value=value
|
|
|
def __str__(self):
|
|
|
return repr(self.msg+self.value)
|
|
|
|
|
|
class VarNameError(CLError):
|
|
|
msg="Incorrect name of a variable: "
|
|
|
|
|
|
class VarValueError(CLError):
|
|
|
msg="Incorrect value of a variable: "
|
|
|
|
|
|
|
|
|
|
|
|
class objValue:
|
|
|
v_mode="r"
|
|
|
v_type=()
|
|
|
v_vtype=None
|
|
|
v_value=None
|
|
|
v_select=None
|
|
|
v_official=False
|
|
|
v_printval=None
|
|
|
|
|
|
def __init__(self,**args):
|
|
|
for atname,avalue in args.items():
|
|
|
self.__setattr__(atname,avalue)
|
|
|
|
|
|
def __getattribute__(self, instance):
|
|
|
try:
|
|
|
return object.__getattribute__(self, instance)
|
|
|
except:
|
|
|
return None
|
|
|
|
|
|
def __setattr__(self, atname, value):
|
|
|
matching={'mode' :'v_mode',
|
|
|
'type' :'v_type',
|
|
|
'vtype' :'v_vtype',
|
|
|
'value' :'v_value',
|
|
|
'select' :'v_select',
|
|
|
'official' :'v_official'}
|
|
|
if matching.has_key(atname):
|
|
|
self.__dict__[matching[atname]]=value
|
|
|
return
|
|
|
if not self.__class__.__dict__.has_key(atname):
|
|
|
print 'not attribute'
|
|
|
else:
|
|
|
self.__dict__[atname]=value
|
|
|
|
|
|
class DataVars:
|
|
|
if not os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-server/pym') in sys.path:
|
|
|
sys.path.insert(0,os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-server/pym'))
|
|
|
if not os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-lib/pym') in sys.path:
|
|
|
sys.path.insert(0,os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-lib/pym'))
|
|
|
if not os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-builder/pym') in sys.path:
|
|
|
sys.path.insert(0,os.path.abspath(\
|
|
|
'/usr/lib/calculate/calculate-builder/pym'))
|
|
|
sys.path.insert(0,os.path.abspath('/home/okovalenko/Home/Calculate\
|
|
|
/pvars'))
|
|
|
__modlist={'Global':'cl_vars',
|
|
|
'Server':'cl_vars_server',
|
|
|
'Builder':'cl_vars_builder'}
|
|
|
|
|
|
def __init__(self, modname='Global'):
|
|
|
'''Загрузка указанной конфигурации переменных.
|
|
|
|
|
|
Параметры:
|
|
|
modname - имя конфигурации (Global,Server,Builder)
|
|
|
|
|
|
Если в модуле конфигурации переменных будет неправильно указана одна из
|
|
|
переменных, то конфигурация сбрасывается и объект не будет содержать
|
|
|
ни одной переменной окружения.
|
|
|
'''
|
|
|
self.__implist=[]
|
|
|
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))
|
|
|
#проходимся по переменным класса и готовим объект
|
|
|
for idnt in obj.__dict__:
|
|
|
#отбрасываем служебные переменные
|
|
|
if re.search("\__.*",idnt):
|
|
|
continue
|
|
|
#получаем значение переменной
|
|
|
exec("vals=obj.%s"%idnt)
|
|
|
#если значение переменной некорректно то убиваем все окружение
|
|
|
#и вываливаемся с пустым объектом
|
|
|
if self.__checkVarsValue(vals)==False:
|
|
|
msg='The variable: %s in the module: %s is incorrectly\
|
|
|
described' % (idnt, modname)
|
|
|
raise CLError(msg)
|
|
|
del(self)
|
|
|
return
|
|
|
# получаем тип значений по умолчанию (проверяем, чтобы
|
|
|
# это была либо словарь либо список в противном случае
|
|
|
# тип является не заданным
|
|
|
if vals.has_key('value'):
|
|
|
if isinstance(vals['value'], types.ListType) or\
|
|
|
isinstance(vals['value'], types.DictType):
|
|
|
vtype=type(vals['value'])
|
|
|
else:
|
|
|
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)
|
|
|
#инициализируем переменную
|
|
|
exec ("""self.%s=objparam"""%(idnt))
|
|
|
else:
|
|
|
print "Unsupported module vars: %s"%(modname)
|
|
|
sys.exit(0)
|
|
|
|
|
|
#проверить импортируемое значение
|
|
|
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 __getCurrentHeaderName(self):
|
|
|
'''Получить рабочую секцию ини файла.'''
|
|
|
if 'Server' in self.__implist:
|
|
|
return 'calculate-server'
|
|
|
elif 'Builder' in self.__implist:
|
|
|
return 'calculate-builder'
|
|
|
elif 'Install' in self.__implist:
|
|
|
return 'calculate-install'
|
|
|
else:
|
|
|
return 'default'
|
|
|
|
|
|
def __writeVarValue(self, vname, val):
|
|
|
'''Записать значение в calculate.ini
|
|
|
|
|
|
Параметры:
|
|
|
vname имя переменной
|
|
|
val значение переменной
|
|
|
|
|
|
Возвращаемые значение:
|
|
|
True запись успешна
|
|
|
False запись не удалсь
|
|
|
'''
|
|
|
# получаем полный путь до файла ini
|
|
|
name_calculate_ini = os.path.join(self.Get('setup_path_install'),
|
|
|
self.Get('sys_calculate_ini'))
|
|
|
# извлекаем из полного имени файла путь
|
|
|
onlydir = os.path.split(name_calculate_ini)[0]
|
|
|
try:
|
|
|
# проверяем чтобы путь до ини файла существовал
|
|
|
if not os.path.exists(onlydir):
|
|
|
# создаем его если отсутствует
|
|
|
os.makedirs(onlydir)
|
|
|
except OSError (nerr,msg):
|
|
|
print nerr, msg
|
|
|
return False
|
|
|
config = iniParser(name_calculate_ini)
|
|
|
header = self.__getCurrentHeaderName()
|
|
|
return config.setVar(header,{vname: cl_utils.convertStrListDict(val)})
|
|
|
|
|
|
def Write(self, vname, val, force=False):
|
|
|
'''Установить и записать значение переменной в ini файл
|
|
|
|
|
|
Параметры:
|
|
|
vname имя переменной
|
|
|
val значение переменной
|
|
|
force "принудительный режим"
|
|
|
'''
|
|
|
if self.__addVarValue(vname, val, force):
|
|
|
self.__writeVarValue(vname, val)
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
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 flIniFile(self,**args):
|
|
|
'''Заместить значение переменных значениями из ини файла
|
|
|
|
|
|
Возвращаемые значения:
|
|
|
True переменные считаны
|
|
|
False файл не был обнаружен
|
|
|
'''
|
|
|
# получить полный путь до файла ini
|
|
|
name_calculate_ini = os.path.join('/',self.Get('sys_calculate_ini'))
|
|
|
# проверить сущестование ini файла
|
|
|
if os.path.exists(name_calculate_ini):
|
|
|
# получить объект настроенный на ini
|
|
|
config = iniParser(name_calculate_ini)
|
|
|
# получить все переменные из рабочей секции
|
|
|
allvars = config.getAreaVars(self.__getCurrentHeaderName())
|
|
|
if allvars == False:
|
|
|
return False
|
|
|
# принудительно переписать все переменные окружения
|
|
|
# полученные из ini
|
|
|
for (k,v) in allvars.items():
|
|
|
self.Set(k, cl_utils.convertStrListDict(v), True)
|
|
|
return True
|
|
|
else:
|
|
|
return False
|
|
|
|
|
|
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()
|
|
|
# проверить не заполнялись ли переменные "инсталляционным" алгоритмом
|
|
|
if 'Install' in self.__implist:
|
|
|
return
|
|
|
# в список загруженных переменных добавить значение Install
|
|
|
self.__implist.append('Install')
|
|
|
# заполнить полученную конфигурацию алгоритмом для инсталлятора
|
|
|
fillVars(self).fillInstall(**args)
|
|
|
|
|
|
def flFromCmdParam(self, s ):
|
|
|
'''Заполнить переменные окружения посредством параметра командной
|
|
|
строки.
|
|
|
|
|
|
Параметры:
|
|
|
s строка вида <параметра>=<значение>[:<пар>=<знач>]
|
|
|
|
|
|
Возвращаемые значения:
|
|
|
True строка правильная и все параметры установлены
|
|
|
False строка неправильная или запрошены на установку параметры
|
|
|
"только для чтения"
|
|
|
'''
|
|
|
# заполнить полученную конфигурацию парметрами из командной строки
|
|
|
return fillVars(self).fillFromCmdParam(s)
|
|
|
|
|
|
def isRewrite(self, vname):
|
|
|
'''Доступна ли переменная для изменения
|
|
|
|
|
|
Параметры:
|
|
|
vname имя переменной
|
|
|
|
|
|
Возвращаемые занчения:
|
|
|
True переменная доступна для перезаписи
|
|
|
Flase переменная не доступна для перезаписи
|
|
|
'''
|
|
|
mode=self.Get(vname,True).v_mode
|
|
|
if mode=='w':
|
|
|
return True
|
|
|
else:
|
|
|
return False
|
|
|
|
|
|
#Получить значение переменной в чистом виде или в виде объекта
|
|
|
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
|
|
|
else:
|
|
|
return val
|
|
|
except:
|
|
|
#если переменная не инициализирована
|
|
|
if objformat:
|
|
|
#если режим возврата в виде объекта
|
|
|
par=self.__varslist[vname]
|
|
|
objpar=par
|
|
|
#objpar['value']=None
|
|
|
obj=objValue(**objpar)
|
|
|
if obj:
|
|
|
return obj
|
|
|
return False
|
|
|
|
|
|
#установить значение переменной
|
|
|
#не даем переписывать значения переменной у которых режим "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):
|
|
|
'''Проверить входит ли тип в указанный список типов
|
|
|
|
|
|
Параметры:
|
|
|
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:
|
|
|
val=None
|
|
|
exec ("val=self.%s"%i)
|
|
|
if type_names:
|
|
|
if not self.__checkType(val.v_type,type_names):
|
|
|
continue
|
|
|
ret[i]=val
|
|
|
except:
|
|
|
param=self.__varslist[i]
|
|
|
nobj=objValue(param['mode'],param['type'], None)
|
|
|
if type_names:
|
|
|
if not self.__checkType(val.v_type,type_names):
|
|
|
continue
|
|
|
ret[i]=nobj
|
|
|
return ret
|
|
|
|
|
|
#распечатать список переменных с значениями
|
|
|
def printVars(self,type_names=None):
|
|
|
var=None
|
|
|
var=self.getVars(type_names)
|
|
|
mlen_name=0;
|
|
|
mlen_type=0;
|
|
|
mlen_mode=0;
|
|
|
for i,j in var.items():
|
|
|
if len(i)>mlen_name:
|
|
|
mlen_name=len(i)
|
|
|
if len(str(j.v_type))>mlen_type:
|
|
|
mlen_type=len(str(j.v_type))
|
|
|
vtype=str(type(var[i].v_value)).split(" ")[1][1]
|
|
|
if vtype in ['d','l']:
|
|
|
mode="[%s%s]"%(var[i].v_mode.lower(),vtype)
|
|
|
else:
|
|
|
mode="[%s]"%(var[i].v_mode.lower())
|
|
|
var[i].v_mode=mode
|
|
|
if len(mode)>mlen_mode:
|
|
|
mlen_mode=len(mode)
|
|
|
plist=var.keys()
|
|
|
plist.sort()
|
|
|
br = cl_utils.fillstr("-",mlen_name) + " " +\
|
|
|
cl_utils.fillstr("-",mlen_mode) + " " +\
|
|
|
cl_utils.fillstr("-",mlen_type) + " " +\
|
|
|
cl_utils.fillstr("-",10)
|
|
|
|
|
|
print "The list of variables:"
|
|
|
print "var name".center(mlen_name),\
|
|
|
"Mode",\
|
|
|
"Type".center(mlen_type),\
|
|
|
"Value"
|
|
|
|
|
|
print br
|
|
|
for i in plist:
|
|
|
if var[i].v_value is None and var[i].v_printval is None:
|
|
|
continue
|
|
|
elif var[i].v_printval is None:
|
|
|
p_val=var[i].v_value
|
|
|
else:
|
|
|
p_val=var[i].v_printval
|
|
|
if var[i].v_official:
|
|
|
continue
|
|
|
cl_utils.columnWrite( i, mlen_name, var[i].v_mode.lower(),
|
|
|
mlen_mode, str(var[i].v_type), mlen_type, p_val)
|
|
|
print br
|
|
|
|
|
|
#объеденить два объекта с переменными
|
|
|
def joinVars(self, objvars, force=False):
|
|
|
#Принимаем на вход только экземпляры текущего класса
|
|
|
if not isinstance(objvars, DataVars):
|
|
|
raise CLError('The object of incorrect type is transferred')
|
|
|
#Делаем копию текущего объекта и дальше работаем с копией
|
|
|
old_self=copy.deepcopy(self)
|
|
|
for var in objvars.__varslist.keys():
|
|
|
#если нет режима замещения то вываливаемся
|
|
|
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)
|
|
|
if val:
|
|
|
old_self.__addVarValue(var,val.v_value, True)
|
|
|
#если все успешно тогда вносим изменения
|
|
|
self.__dict__=old_self.__dict__
|
|
|
|
|
|
def defined(self, vname):
|
|
|
if vname:
|
|
|
if self.__dict__.has_key(vname):
|
|
|
return True
|
|
|
return False
|
|
|
|
|
|
#вернуть список переменных с параметрами
|
|
|
def getVarsList(self):
|
|
|
vlist=self.__varslist.keys()
|
|
|
vlist.sort()
|
|
|
return vlist
|
|
|
##############################################################################
|