You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
calculate-utils-2.1-lib/pym/cl_base.py

1927 lines
80 KiB

#-*- 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
##############################################################################
_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__])
##############################################################################
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.getopt()
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()
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_path=cl_utils.getpathenv()
G_calcname="Calculate"
def __init__(self, objvar=None):
if objvar:
self._objvar=objvar
#Вернуть результат выполнения команды ОС
def __runos(self,cmd,ret_first=None):
res=None
res=os.popen(cmd).readlines()
if res:
if len(res)>1:
if ret_first:
return res[0]
return res
else:
return res[0].strip()
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=CDS",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',"CDS",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_root_tmp', "cn=ldaproot,%s"%Get('soft_ldap_base'),\
True)
Set('soft_ldap_rootpw_tmp',cl_utils.genpassword().strip(),True)
cstr='%s slappasswd -s %s -h %s'%\
(self.G_path,\
Get('soft_ldap_rootpw_tmp'),\
Get('soft_ldap_hash_encrypt')
)
res=cm(cstr)
if res:
Set('soft_ldap_rootpw_tmp_hash',res.strip(),True)
#постоянный пользователь root, прописываемый в базу при первой загрузке
#с одновременным удалением временного root-а
Set('soft_ldap_rootname',"ldapadmin",True)
Set('soft_ldap_root',"cn=%s,%s"%\
(Get('soft_ldap_rootname'),\
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_rootpw',rs.group(1),True)
if not Get('soft_ldap_rootpw') or\
Get('soft_ldap_rootpw')=='secret':
Set('soft_ldap_rootpw',cl_utils.genpassword().strip(),True)
cstr='%s slappasswd -s %s -h %s'%\
(self.G_path,\
Get('soft_ldap_rootpw'),\
Get('soft_ldap_hash_encrypt')\
)
res=cm(cstr)
if res:
Set('soft_ldap_rootpw_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_shr_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_shr_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 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'}
__implist=[]
def __init__(self, modname='Global'):
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
if not pvar.has_key('mode') or not pvar.has_key('type'):
return False
if pvar['mode']==None or pvar['type']==None:
return False
if pvar['mode'].upper() not in ['R','W']:
return false
return True
#установить значение переменной
def Set(self, vname, val, force=False):
self.__addVarValue(vname, val, force)
#получить значение переменной
def Get(self, vname, objformat=None):
return self.__getVarValue(vname, objformat)
def flServer(self, **args):
self.Set('setup_sys_shortname','CDS',True)
self.flGlobal()
if 'Server' in self.__implist:
return
self.__implist.append('Server')
objvar=DataVars("Server")
self.joinVars(objvar)
fillVars(self).fillLDAP(**args)
def flGlobal(self,**args):
if 'Global' in self.__implist:
return
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
self.__implist.append('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):
mode=self.Get(vname,True).v_mode
if mode=='w':
return True
else:
return False
#Получить значение переменной в чистом виде или в виде объекта
def __getVarValue(self, vname, objformat=None, printval=None):
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):
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
if self.__varslist[vname]['vtype']:
if type(val)!=self.__varslist[vname]['vtype']:
raise VarValueError(vname)
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
# Вернуть список переменных
# type_names - список типов, переменные которых необходимо вернуть
def getVars(self, type_names=None):
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.vtype,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()
print "The list of variables:"
print "var name".center(mlen_name),\
"Mode",\
"Type".center(mlen_type),\
"Value"
print cl_utils.fillstr("-",mlen_name),\
cl_utils.fillstr("-",mlen_mode),\
cl_utils.fillstr("-",mlen_type),\
cl_utils.fillstr("-",10)
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
print i.ljust(mlen_name),\
var[i].v_mode.lower().ljust(mlen_mode),\
str(var[i].v_type).ljust(mlen_type),\
":",\
p_val
print cl_utils.fillstr("-",mlen_name),\
cl_utils.fillstr("-",mlen_mode),\
cl_utils.fillstr("-",mlen_type),\
cl_utils.fillstr("-",10)
#объеденить два объекта с переменными
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():
if 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
##############################################################################