diff --git a/pym/cl_base.py b/pym/cl_base.py index a980d38..1142f8d 100644 --- a/pym/cl_base.py +++ b/pym/cl_base.py @@ -228,8 +228,63 @@ class lang: 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.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 + +############################################################################### import cl_profile class iniParser(cl_profile._error): """Класс для работы с ini файлами @@ -240,6 +295,8 @@ class iniParser(cl_profile._error): self.iniFile = iniFile # права создаваемого ini-файла self.mode = 0644 + # Cоответствует ли формат файла нужному + self.checkIni = None def setMode(self, mode): """установка прав создаваемого ini-файла""" @@ -247,18 +304,20 @@ class iniParser(cl_profile._error): 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 + return "" FD = open(self.iniFile, "r") textIni = FD.read() FD.close() return textIni def writeIniFile(self, txtConfig): + 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+") FD.truncate(0) FD.seek(0) @@ -273,7 +332,7 @@ class iniParser(cl_profile._error): dictVar - словарь переменных """ textIni = self.openIniFile() - if textIni == False: + if not self.checkIniFile(textIni): return False # создаем объект типа samba и записываем в него содержимое ini-файла objIni = cl_profile.samba(textIni) @@ -290,6 +349,29 @@ class iniParser(cl_profile._error): self.writeIniFile(txtConfig) return True + def isEmptyFile(self, textIni): + """Является ли файл пустым""" + if not textIni.strip(): + return True + else: + return False + + def checkIniFile(self, textIni): + """Проверка на правильность формата файла""" + if self.checkIni == None: + # Ошибка + if textIni == False: + self.checkIni = False + return False + self.checkIni = True + # В файле есть данные + if not self.isEmptyFile(textIni): + objIni = cl_profile.samba(textIni) + xmlBody = objIni.docObj.getNodeBody() + if not xmlBody.firstChild: + self.checkIni = False + return self.checkIni + def delVar(self, strHeader, nameVar): """Удаляем переменную из ini файла""" delNameVar = "!%s" %(nameVar) @@ -307,7 +389,7 @@ class iniParser(cl_profile._error): def getVar(self, strHeader, nameVar): """Получаем значение переменной из ini-файла""" textIni = self.openIniFile() - if not textIni: + if not self.checkIniFile(textIni): return False # создаем объект типа samba и записываем в него содержимое ini-файла objIni = cl_profile.samba(textIni) @@ -323,7 +405,7 @@ class iniParser(cl_profile._error): def getAreaVars(self,strHeader): """Получаем все переменнные области из ini-файла""" textIni = self.openIniFile() - if not textIni: + if not self.checkIniFile(textIni): return False # создаем объект типа samba и записываем в него содержимое ini-файла objIni = cl_profile.samba(textIni) @@ -336,1822 +418,102 @@ class iniParser(cl_profile._error): 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 + def getAllSectionNames(self): + """Получаем все имена секций определенных в ini файле""" + textIni = self.openIniFile() + if not self.checkIniFile(textIni): + return False + # создаем объект типа samba и записываем в него содержимое ini-файла + objIni = cl_profile.samba(textIni) + # получаем ноду body + xmlBody = objIni.docObj.getNodeBody() + xmlNodes = objIni.docObj.getFieldsArea(xmlBody) + # Имена секций ini файла + namesSection = [] + for xmlNode in xmlNodes: + if xmlNode.tagName == "area": + nSect = objIni.docObj.getNameArea(xmlNode) + if nSect: + namesSection.append(nSect) + return namesSection -############################################################################### +############################################################################## -class objValue(object): +class var: '''Объект "Переменная окружения"''' - G_shr_path="/usr/calculate" - G_rshr_path="/var/calculate/remote" - G_path=cl_utils.getpathenv() - G_calcname="Calculate" - - # значение переменной окружения - __value = None + # название сервиса которому принадлежит переменная + #(Global, Builder, Client, Server итд) + service = None + # значение переменной + value = None # режим записи (атрибут mode) - v_mode="r" - # тип переменной (атрибут type) - v_type=() - # тип значения переменной (определяется по value) - v_vtype=None - # список допустимых значений переменных (select) - v_select=None + mode = "r" # переменная для внутреннего использования (official) - v_official=False - # печатаемое значение - v_printval=None - # переменная заполнена? - ее значение можно в последствии - # получить сразу из __value - __alreadyFill = False - # переменная была установлена методом Set - # ini файл, коммандная строка, внутри программы, - # значение по умолчанию - __wasSet = False - # переменная постоянно пересчитывается при обращении - __dynamicValue = False - # список переменных окружения, которые должные обновляться - # если изменилось значение этой переменной - # строится автоматически - __ichangethey = set([]) - # атрибут класса содержащий текущий стек вызовов get из переменных - # используется для построения зависимости переменных - __getstack = set([]) - - def isPure(self): - '''Переменная не установлена и не заполнялась''' - return not (self.__wasSet or self.__alreadyFill) - - def SetOutdated(self): - '''Устанавливает переменную в состояние устарела''' - self.__alreadyFill = False - - def SetDynamic(self, state=True): - '''Устанавливает переменную в состояние динамическая, - то есть если переменная не устанавливается в ручную, - то она постоянно пересчитывается''' - self.__dynamicValue = state - - #Вернуть результат выполнения команды ОС - def _runos(self,cmd,ret_first=None): - return cl_utils.runOsCommand(cmd, None, ret_first) - - def get_stack(self): - '''Получить значение атрибута класса''' - return self.__class__._objValue__getstack - - def set_stack(self, value): - '''Установить занчение атрибута класса''' - self.__class__._objValue__getstack = value - - '''Свойство содержащее стек вызовов''' - getstack = property( get_stack, set_stack ) - - def simpleget(self): - '''Метод заполения значения переменной''' - return self.__value - - def simpleset(self,value): - '''Метод установки значения переменной - Метод должен вернуть значение которое он устанавливает. - ''' - return value - - def indirectfilling(self,val): - '''Сторонняя установка значение, используется при установке значения - переменной из другой функции заполения''' - # значение устанавливаем, только в том случае, если переменная не - # установлена вручную - if not self.__wasSet: - # устанавливаем состояние переменной - заполнена - self.__alreadyFill = True - # если значение меняется - if val != self.__value: - # обнавляем все зависимые переменные - self.updatelinkvalue() - self.__value = val - - def getvalue(self): - '''Функция диспетчер вызова при обращении к значению переменной. - Если значение для нее не было установлено вручную, то оно - заполняется по своему алгоритму, попутно для всех переменных на - основе значений которые вычисляется занчение этой переменной строится - список зависимостей, после вычисления переменной при дальнейшем - обращении к ее значению - оно берется из переменной __value''' - # сохраняем текущий список вызовов get - это объекты, которые - # тоже должны изменить если эта переменная изменится - if self.getstack: - self.__ichangethey = self.__ichangethey.union(self.getstack) - # если переменная не заполненная и не установленная - if (self.__dynamicValue or - not self.__alreadyFill) and not self.__wasSet: - # устанавливаем флаг, что оно вычилсенно, для избежания - # бесконечных рекурсий - self.__alreadyFill = True - #помещаем себя в список переменных, которые вызывают get - self.getstack.add(self) - # вызываем метод заполения переменной - val = self.simpleget() - if self.__dynamicValue: - if val != self.__value: - self.updatelinkvalue() - self.__value = val - # удаляем себя из списка переменных вызывающих get - self.getstack.remove(self) - # возвращаем значение переменной либо вычисленное либо из "кэша" - return self.__value - - def updatelinkvalue(self): - '''Установить всем переменным, значение которых зависит от этой - состояние незаполнены''' - # пробегаем по всем переменных, которые зависят от этой переменной - for i in self.__ichangethey: - # пропускаем рекурсивный вызов - if i == self: - continue - # условия, чтобы обновление объектов не вошло в бесконечную - # рекурсию. Таким образом объекты будут оповещать - # другие объекты только в том случае если сами считают - # себя заполненными - if i._objValue__alreadyFill: - # устанавливаем им значение что заполение не вызывалось - # для обновления значения, если переменная установлена вручную - # то она не будет заполняться по условию __wasSet - i._objValue__alreadyFill = False - # сообщаем объекту, что он должен сообщить об изменениях - # объектам, которые от него значение ставили - i.updatelinkvalue() - - def setvalue(self,value): - # взводим флаг "переменная установлена вручную" - self.__wasSet = True - # если значение изменилось, то обновляем все зависимые переменные - if value != self.__value: - self.updatelinkvalue() - # вызов метода установки переменной - self.__value = self.simpleset(value) - - # связываем значение переменной окуржения с двумя функциями: заполнения - # и установки - v_value = property(getvalue,setvalue) - value = property(getvalue,setvalue) - - matching={'mode' :'v_mode', - 'type' :'v_type', - 'vtype' :'v_vtype', - 'value' :'v_value', - 'select' :'v_select', - 'official' :'v_official'} - - def __init__(self,**argv): - # перебираем все установленные атрибуты - dic = object.__getattribute__(self,'matching') - for atname,avalue in argv.items(): - # если это методы заполения и установки переменной, то - # связываем их с этой переменной - object.__setattr__(self,'_objValue__ichangethey',set([])) - if atname == 'Setself': - object.__setattr__(self,'simpleset',avalue.__get__(self)) - elif atname == 'Getself': - object.__setattr__(self,'simpleget',avalue.__get__(self)) - else: - if atname in dic: - atname = dic[atname] - object.__setattr__(self,atname,avalue) - - - def Set(self,name,value): - self.__ichangethey.add(self.Get(name,True)) - self.SetIndirect(name,value) - - def __getattribute__(self, instance): - '''Возвращаем None, при обращении к несуществующему атрибуту''' - dic = object.__getattribute__(self,'matching') - if instance in dic: - instance = dic[instance] - return object.__getattribute__(self, instance) - - def __setattr__(self, atname, value): - '''Метод добавляет псевдонимы к атрибутам, и следит, чтобы не были - добавлены дополнительные''' - if self.matching.has_key(atname): - object.__setattr__(self,self.matching[atname], value) - elif atname in self.__class__.__dict__: - object.__setattr__(self,atname, value) - else: - print _('not attribute') - -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 - - #Вернуть результат выполнения команды ОС - @classmethod - def __runos(cls,cmd,ret_first=None): - return cl_utils.runOsCommand(cmd, None, ret_first) - -#***************************************************************************** -#Заполнения переменных для Hardware -#***************************************************************************** - def get_hrd_pc_vendor(self): - '''Получим производителя PC''' - if os.path.exists('/sys/class/dmi/id/chassis_vendor'): - vendor= self._runos( - '%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' - return vendor - - def get_hrd_laptop_vendor(self): - '''Получим производителя ноутбука''' - cm = self._runos - if os.path.exists('/sys/class/dmi/id/board_name'): - s= self._runos( - '%s cat /sys/class/dmi/id/board_name | grep "Portable PC"'%\ - self.G_path) - if s: - return s.lower() - - def get_hrd_laptop_model(self): - '''Получить модель ноутбука''' - if self.Get('hrd_laptop_vendor'): - s=self._runos( - '%s cat /sys/class/dmi/id/product_name' % self.G_path) - if s: - return s - - def get_hrd_board_model(self): - '''Получить модель платы''' - if not self.Get('hrd_laptop_vendor'): - if os.path.exists('/sys/class/dmi/id/board_name'): - return self._runos('%s cat /sys/class/dmi/id/board_name' %\ - self.G_path) - else: - return "" - - def get_hrd_board_vendor(self): - '''Получить производителя платы''' - if not self.Get('hrd_laptop_vendor'): - if os.path.exists('/sys/class/dmi/id/board_vendor'): - return self._runos('%s cat /sys/class/dmi/id/board_vendor' %\ - self.G_path) - - def set_setup_march(self,value): - '''Установить архитектуру процессора''' - march=self._runos('%s uname -m' % self.G_path) - if march != value: - self.Set('dif_march', True) - return value - - def get_setup_march(self): - '''Получить архитектуру процессора''' - return self._runos('%s uname -m' % self.G_path) - - def get_setup_unmask(self): - '''Получить маску нестабильных файлов''' - march = self.Get('setup_march') - if march == 'i686': - return '~x86' - elif march == 'x86_64': - return '~amd64' - - def get_hrd_cpu_num(self): - '''Определить количество процессоров''' - 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 - return cpucnt - - def get_hrd_video_drv(self): - '''Определить драйвер видеокарты''' - nvdrv=('nVidia Aladdin TNT2','GeForce 6200','GeForce DDR',\ - 'GeForce2','GeForce4','Quadro2','Quadro4','RIVA TNT2','Vanta') - videoname = self.Get('hrd_video_name') - if type(videoname) == types.StringType: - if "Intel" in videoname: - return 'i810' - elif "nVidia" in videoname: - if videoname not in nvdrv: - return "nvidia" - else: - return "vesa" - elif "VMware" in videoname: - return "vmware" - return "vesa" - - def get_hrd_opengl_set(self): - '''Определить название для openglset''' - nvdrv=('nVidia Aladdin TNT2','GeForce 6200','GeForce DDR',\ - 'GeForce2','GeForce4','Quadro2','Quadro4','RIVA TNT2','Vanta') - videoname = self.Get('hrd_video_name') - if type(videoname) == types.StringType: - if "Intel" in videoname: - return 'xorg-x11' - elif "nVidia" in videoname: - if videoname not in nvdrv: - return "nvidia" - - def get_hrd_video_name(self): - '''Определить название видео карты''' - 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] - return model - elif re.search('(GeForce.+) nForce',video): - model="nVidia" - model+=re.search('(GeForce.+) nForce',video).groups()[0] - return model - else: - return "nVidia GeForce" - elif re.search('Intel', video): - res=re.search("Intel Corporation ([^\s]+)\s", video) - if res: - return "Intel "+res.groups()[0] - else: - return "Intel" - elif re.search('VMware', video): - return "VMware" - - def get_cmd_run_opengl(self): - '''Определить команду запуска opengl cmd_run_opengl''' - hrd_opengl_set = self.Get('hrd_opengl_set') - if hrd_opengl_set: - return "/usr/bin/eselect opengl set %s"%(self.Get('hrd_opengl_set')) - - def get_hrd_video_res(self): - '''Определить разрешение экрана hrd_video_res''' - xlog = "/var/log/Xorg.0.log" - def_res = "1024x768" - if 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] - return resol - elif re.search('Setting mode \"([0-9\@x]+)\"',sf): - res=re.search('Setting mode \"([0-9\@x]+)\"',sf).groups() - return res[0] - elif re.search('Virtual size is ([0-9\@x]+) ',sf): - res=re.search('Virtual size is ([0-9\@x]+) ',sf).groups() - return res[0] - elif re.search('Modeline "([0-9\@x]+)"',sf): - res=re.search('Modeline "([0-9\@x]+)"',sf).groups() - return res[0] - return def_res - - @classmethod - def findusbdevice(cls,devicename): - '''Функция поиска имени устройства в списке выводимом lsusb''' - cm = cls.__runos - res=cm('%s lsusb 2>/dev/null' % cls.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(devicename,val): - return True - - def get_hrd_usb_hp(self): - '''Узнать подключены ли Hewlett-Packard устройства''' - return fillVars.findusbdevice('Hewlett-Packard') - - def get_hrd_usb_bluetooth(self): - '''Узнать подключены ли Bluetooth устройства''' - return fillVars.findusbdevice('Bluetooth') - - def get_setup_path_install(self): - value_setup_pass = self.Get('setup_pass') - if value_setup_pass == 'builder': - return '/mnt/builder' - elif value_setup_pass == 'install': - return "/mnt/install" - else: - return '/' - -#***************************************************************************** -#Заполнение переменных для Builder -#***************************************************************************** - def get_setup_gentoo_mirrors(self): - '''Определить ссылки на исходинки программ''' - return "http://mirror.yandex.ru/gentoo-distfiles \ -http://distfiles.gentoo.org \ -http://distro.ibiblio.org/pub/linux/distributions/gentoo" - - def get_setup_gentoo_release(self): - return "2007.0" - - def get_setup_path_portagepkg(self): - portagepath="/usr/calculate/snapshots/" - if not os.path.exists(portagepath): - self._runos(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: - return "%sportage-%s.tar.bz2"%\ - (portagepath,last) - - def get_setup_path_stagepkg(self): - march=self.Get('setup_march') - stagepath="/usr/calculate/stages/" - if march=='i686': - val="stage3-i686-%s.tar.bz2"%(self.Get('setup_gentoo_release')) - if os.path.exists(stagepath+val): - return stagepath+val - elif march=='x86_64': - val="stage3-amd64-%s.tar.bz2" %(self.Get('setup_gentoo_release')) - if os.path.exists(stagepath+val): - return stagepath+val - - def get_setup_run_user(self): - 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 - return uval - - def get_setup_ata(self): - '''Сформировать хэш конвертации устаревшего формата 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 - return ata - - def fillBuilder(self): - G_path=Get('setup_path_env') - #--------------------------------------------------------------------- - # Определим запущенные сервисы 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) - -#***************************************************************************** -#Заполнение переменных для LDAP -#***************************************************************************** - @classmethod - def gethashfrom_slappasswd(cls,value_G_path,value_password, \ - value_encrypt): - cstr='%s slappasswd -s %s -h %s'%\ - (value_G_path, value_password, value_encrypt) - res=cls.__runos(cstr) - if res: - return res.strip() - - - def get_setup_path_profinstall(self): - profpath = '/usr/lib/calculate/calculate-server/profile' - if os.path.exists(profpath): - return [profpath] - - def get_setup_path_profuser(self): - profpath = '/var/calculate/profile/server' - if os.path.exists(profpath): - return [profpath] - - def get_soft_samba_domain(self): - return "CDS" - - def get_soft_ldap_root(self): - return "calculate" - - def get_soft_samba_netbios(self): - return "PDC-CDS" - - def get_soft_ldap_base(self): - return "dc=%s"%(self.Get('soft_ldap_root')) - - def get_soft_ldap_sevices_dn(self): - return "ou=%s,%s"\ - %(self.Get('soft_ldap_sevices_dn_name'), - self.Get('soft_ldap_base')) - - def get_soft_ldap_hash_encrypt(self): - return "{SSHA}" - - def get_soft_ldap_bindname(self): - return "proxyuser" - - def get_soft_ldap_bind(self): - return "cn=%s,%s"% (self.Get('soft_ldap_bindname'), - self.Get('soft_ldap_base')) - - def get_soft_ldap_bindpw(self): - return "calculate" - - def get_soft_ldap_bindpw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_bindpw'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_admin_tmp(self): - return "cn=ldaproot,%s"%self.Get('soft_ldap_base') - - def get_soft_ldap_adminpw_tmp(self): - return cl_utils.genpassword().strip() - - - def get_soft_ldap_adminpw_tmp_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_adminpw_tmp'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_adminname(self): - return "ldapadmin" - - def get_soft_ldap_admin(self): - return "cn=%s,%s"% (self.Get('soft_ldap_adminname'), - self.Get('soft_ldap_base')) - - def get_soft_ldap_adminpw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_adminpw'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_adminpw(self): - '''Заполнение переменной soft_ldap_adminpw - постоянный пользователь root, прописываемый в базу при первой загрузке - с одновременным удалением временного root-а - ''' - return cl_utils.genpassword().strip() - - def get_soft_ldap_admin_jabber_name(self): - return "Jabber" - - def get_soft_ldap_admin_jabber(self): - return "ou=Jabber,%s" % self.Get('soft_ldap_sevices_dn') - - def get_soft_ldap_admin_jabberpw(self): - return cl_utils.genpassword().strip() - - - def get_soft_ldap_admin_jabberpw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_admin_jabberpw'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_admin_unix_name(self): - return "Unix" - - def get_soft_ldap_admin_unix(self): - return "ou=Unix,%s" % self.Get('soft_ldap_sevices_dn') - - def get_soft_ldap_admin_unixpw(self): - return cl_utils.genpassword().strip() - - - def get_soft_ldap_admin_unixpw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_admin_unixpw'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_admin_samba_name(self): - return "Samba" - - def get_soft_ldap_admin_samba(self): - return "ou=Samba,%s" % self.Get('soft_ldap_sevices_dn') - - def get_soft_ldap_admin_sambapw(self): - return cl_utils.genpassword().strip() - - - def get_soft_ldap_admin_sambapw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_admin_sambapw'), - self.Get('soft_ldap_hash_encrypt')) - - def get_soft_ldap_admin_mail_name(self): - return "Mail" - - def get_soft_ldap_admin_mail(self): - return "ou=Mail,%s" % self.Get('soft_ldap_sevices_dn') - - def get_soft_ldap_admin_mailpw(self): - return cl_utils.genpassword().strip() - - def get_soft_ldap_admin_mailpw_hash(self): - return fillVars.gethashfrom_slappasswd(self.G_path, - self.Get('soft_ldap_admin_mailpw'), - self.Get('soft_ldap_hash_encrypt')) - -#***************************************************************************** -#Заполнение глобальных переменных -#***************************************************************************** - def get_setup_path_env(self): - '''Установка переменной setup_path_env''' - if not os.path.exists(self.G_shr_path): - print _("Not found Calculate dir") + ": " +self.G_shr_path - sys.exit(0) - if self.G_path: - return self.G_path - else: - print _("Not found path for execute commands") - sys.exit(0) - - def set_setup_installdev(self): - if re.search('^([a-z]+)([0-9]+)$',Get('setup_installdev')): - val=re.search('^([a-z]+)([0-9]+)$',Get('setup_installdev')) - if val: - vals=val.groups() - self.g_install_dev=vals[0] - self.g_install_num=vals[1] - return vals[0]+vals[1] - else: - print _("Incorrect partition") - sys.exit(0) - - def isroot(self): - '''Проверим пользователь, запустивший скрипт - root''' - if os.getegid()!=0: - print _("Only root can perform system installation") - sys.exit(0) - - def get_setup_sys_shortname(self): - '''Получить переменную короткого названия системы''' - path = '/etc/issue' - sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)""" - res=self._runos('%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=self.Get('setup_dist_ver') - for i in ver.keys(): - if ver[i]==issuename: - return i - spl=issuename.split(" ") - nname="" - if len(spl)>1: - for i in spl: - nname+=i[1] - return nname - else: - return issuename - return "CLD" - - def get_setup_sys_fullname(self): - '''Заполнить переменную с полным именем системы''' - ver = self.Get('setup_dist_ver') - sh_name = str(self.Get('setup_sys_shortname')) - if sh_name.upper() in ver: - return ver[sh_name.upper()] - else: - path='/etc/issue' - #если файл с версией системы найден, определим версию - sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)""" - res=self._runos('%s cat %s | grep "Welcome to "'%\ - (self.G_path, path)) - if res: - if re.search(sp,res): - vals=re.search(sp,res).groups() - return vals[0] - # TODO: значение по умолчанию для fullname если не удалось - # заполнить (например файл не открылся) - return "" - - def get_sys_linux_type(self): - '''Получить тип системы (настрольная/серверная)''' - if re.search('server',str(self.Get('setup_sys_fullname')), re.I): - return "server" - else: - return "desktop" - - def get_setup_name(self): - '''Установить имя установщика''' - return self.G_calcname+" "+self.Get('setup_ver') - - def get_cmd_exec_host(self): - '''Определить путь до запуска утилиты host (cmd_exec_host)''' - if not os.system("which host >/dev/null 2>&1"): - res=os.popen("which host").readlines() - return res[0].rstrip() - - def get_cmd_exec_nmap(self): - '''Определить путь до запуска утилиты nmap (cmd_exec_nmap)''' - if not os.system("which nmap >/dev/null 2>&1"): - res=os.popen("which nmap").readlines() - return res[0].rstrip() - - def get_sys_load(self): - ''' Установим значение load в значение ram в случае загрузки с - CD/DVD''' - if self._runos("""mount | grep "/dev/loop/0 on / type" """): - return "ram" - else: - return "" - - def get_net_host(self): - '''Считать имя компьютера net_host''' - hostname=self._runos("""%s hostname -s 2>&1"""%self.G_path) - #Set('net_host',hostname, True) - #упрощенный вариант, следует выполнять только если не указан домен - #в системе - if re.search("^hostname: ",hostname): - hostname=self._runos("""%s hostname 2>&1"""%self.G_path) - if re.search("^hostname: ",hostname): - return self.Get('setup_sys_shortname') - else: - if hostname=='livecd': - return self.Get('setup_sys_shortname') - return hostname - - def get_sys_domain(self): - ''' Определим домен''' - domain=self._runos("%s hostname -d 2>&1"%self.G_path) - if re.search("^hostname: ",domain): - return "local" - else: - return domain - - def get_net_gw(self): - '''Определить сетевой шлюз''' - route=self._runos("""%sroute -n | grep "^0.0.0.0" """%self.G_path) - route=re.split("\s+",route) - if route: - self.Set('net_gw_dev', route[7]) - return route[1] - - def get_net_gw_dev(self): - '''Определить сетевой адаптер для шлюза''' - route=self._runos("""%sroute -n | grep "^0.0.0.0" """%self.G_path) - route=re.split("\s+",route) - if route: - self.Set('net_gw', route[1]) - return route[7] - - @classmethod - def common_netfunc(cls, value_net_gw,value_net_gw_dev): - ''' Общие действия выполняемые для заполнения - шлюз, локальные интерфейсы, локальные сети, настройки - /etc/conf.d/net, сетевые устройства - net_conf, net_hosts_allow, net_networks - - Входные параметры: - value_net_gw значение переменной окружения net_gw - value_net_gw_dev значение переменной окружения net_gw_dev - ''' - cm = cls.__runos - 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==value_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 value_net_gw_dev and gateway_dhcp==0: - netconf+="\nroutes_%s=(\"default gw %s\" )"%\ - (value_net_gw_dev, value_net_gw) - n_key = nets.keys() - n_key.sort() - return gateway_dhcp, n_key, networks, host_allow, netconf - - def get_net_conf(self): - '''Получить конфигурацию сети''' - gateway_dhcp, n_key, networks, host_allow, netconf= \ - fillVars.common_netfunc(self.Get('net_gw'), - self.Get('net_gw_dev')) - self.Set('net_hosts_allow',host_allow) - self.Set('net_networks',networks) - if n_key: - self.Set('net_lan', n_key[0]) - return netconf - - def get_net_hosts_allow(self): - '''Получить список hosts_allow''' - gateway_dhcp, n_key, networks, host_allow, netconf= \ - fillVars.common_netfunc(self.Get('net_gw'), - self.Get('net_gw_dev')) - self.Set('net_networks',networks) - self.Set('net_conf',netconf) - if n_key: - self.Set('net_lan', n_key[0]) - return host_allow - - def get_net_networks(self): - '''Получить сети''' - gateway_dhcp, n_key, networks, host_allow, netconf= \ - fillVars.common_netfunc(self.Get('net_gw'), - self.Get('net_gw_dev')) - self.Set('net_hosts_allow',host_allow) - self.Set('net_conf',netconf) - if n_key: - self.Set('net_lan', n_key[0]) - return networks - - def get_net_lan(self): - '''Получить сетевой интерфейс''' - gateway_dhcp, n_key, networks, host_allow, netconf= \ - fillVars.common_netfunc(self.Get('net_gw'), - self.Get('net_gw_dev')) - self.Set('net_networks',networks) - self.Set('net_hosts_allow',host_allow) - self.Set('net_conf',netconf) - if n_key: - return n_key[0] - - def get_net_nfs(self): - '''Определить наличие сетевой файловой системы''' - sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM) - value_sys_domain = self.Get('sys_domain') - if self.Get('cmd_exec_host') and\ - value_sys_domain and\ - self._runos('%s nfs.%s | grep "has address"'%\ - (self.Get('cmd_exec_host'),\ - value_sys_domain)) and\ - sock.connect_ex(('nfs.%s' % value_sys_domain,2049))==0: - return 'nfs.%s' % value_sys_domain - - @classmethod - def commonproxyfunc(cls,value_cmd_exec_host, value_sys_domain): - ret_net_proxy = None - ret_net_proxy_port = None - if value_cmd_exec_host and value_sys_domain and \ - cls.__runos('%s proxy.%s | grep "has address"'% (value_cmd_exec_host, - value_sys_domain)): - ports=[3128,8080] - for port in ports: - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) - arg_addr=('proxy.%s'%value_sys_domain,port) - if sock.connect_ex(arg_addr)==0: - if not ret_net_proxy: - ret_net_proxy = 'proxy.%s'%value_sys_domain - if not ret_net_proxy_port: - ret_net_proxy_port = str(port) - return ret_net_proxy, ret_net_proxy_port - - def get_net_proxy(self): - '''Определить прокси-сервер''' - ret_net_proxy, ret_net_proxy_port = \ - fillVars.commonproxyfunc(self.Get('cmd_exec_host'), - self.Get('sys_domain')) - self.Set('net_proxy_port', ret_net_proxy_port) - return ret_net_proxy - - def get_net_proxy_port(self): - '''Определить порт прокси-сервера''' - ret_net_proxy, ret_net_proxy_port = \ - fillVars.commonproxyfunc(self.Get('cmd_exec_host'), - self.Get('sys_domain')) - self.Set('net_proxy', ret_net_proxy) - return ret_net_proxy_port - - def get_net_proxy_url(self): - '''Получить url прокси''' - if self.Get('net_proxy') and self.Get('net_proxy_port'): - return "http://%s:%s" % (self.Get('net_proxy'), - self.Get('net_proxy_port')) - - def get_net_ntp(self): - '''Определить наличие локального сервера времени - net_ntp - ''' - if self.Get('cmd_exec_host') and\ - self.Get('sys_domain') and\ - self._runos('%s ntp.%s | grep "has address"'%\ - (self.Get('cmd_exec_host'),\ - self.Get('sys_domain'))): - return 'ntp.%s'%self.Get('sys_domain') - else: - return 'ntp0.zenon.net' - - def get_net_cds(self): - '''Определить наличие CDS сервера - net_cds - ''' - if self.Get('sys_domain'): - return 'cds.%s' % self.Get('sys_domain') - else: - return 'cds' - - @classmethod - def commonsplitissue(cls): - '''Получить содержимое /etc/issue и разбить его согласно - регулярному выражению''' - sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)""" - if os.path.exists('/etc/issue'): - cline=""" """ - res=cls.__runos('%s cat /etc/issue | grep "Welcome to "'% - cls.G_path) - if res: - par=re.search(sp,res).groups() - res_n=par[1].split("-") - return par[1] - - def get_setup_os_current(self): - '''Получить название системы из под которой запущена программа''' - sp = """Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)""" - if os.path.exists('/etc/issue'): - cline=" " - res= self._runos('%s cat /etc/issue | grep "Welcome to "'% - self.G_path) - if res: - par = re.search(sp,res).groups() - if not par[0]: - return "Calculate" - return par[0] - if os.path.exists('/etc/gentoo-release'): - return "Gentoo Linux" - else: - return "Old Linux" - - def get_sys_patchcur(self): - '''Получить текущий sys''' - parone = fillVars.commonsplitissue() - if parone: - res_n = parone.split("-") - self.Set('sys_current_ver', res_n[0]) - if parone: - self.Set('setup_ospatchsplit',"-") - if len(res_n)>1: - return res_n[1] - else: - return 0 - - def get_sys_current_ver(self): - '''Получить текущий sys_current_ver''' - parone = fillVars.commonsplitissue() - if parone: - res_n = parone.split("-") - if parone: - self.Set('setup_ospatchsplit',"-") - if len(res_n)>1: - self.Set('sys_patchcur', res_n[1]) - return res_n[0] - - def get_setup_ospatchsplit(self): - '''Получить текущий setup_patchcur''' - parone = fillVars.commonsplitissue() - if parone: - res_n = parone.split("-") - self.Set('sys_current_ver', res_n[0]) - if len(res_n)>1: - self.Set('sys_pathcur', res_n[1]) - if parone: - return "-" - - def get_setup_mestitle(self): - '''Установить заголовок setup_mestitle - ''' - return "# " + _("Changed by")+ " " + self.G_calcname + " " + \ - self.Get('setup_ver') - - def get_setup_mesline(self): - '''Установить разделяющую линию setup_mesline - ''' - return "#"+"-"*78 - - def get_sys_loaddev(self): - '''Определить раздел с которого загрузились''' - for record in open('/proc/cmdline','rb').readlines(): - re_res=re.search('^root=\/dev\/([a-z]+[0-9]).*',record.strip()) - if re_res: - return re_res.group(1) - - def get_setup_installdev(self): - '''Определить устройство для установки''' - res = self.Get('sys_loaddev') - 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] - try: - g_load_num = int(g_load_num) - except: - return None - if g_load_num == 2: - if not os.path.exists("/dev/%s3"%g_load_dev): - print _("Incorrect partition") - sys.exit(0) - return g_load_dev + "3" - elif g_load_num == 3: - if not os.path.exists("/dev/%s3"%g_load_dev): - print _("Incorrect partition") - sys.exit(0) - return g_load_dev + "2" - - @classmethod - def splitdev2devnum(cls,devname): - '''Разбить устройство (sba1) на имя и номер''' - fstr="^([a-z]{3})([0-9]+)" - try: - # пытаемся получить две сооставляющие диска (назв, номер) - g_install_dev, g_install_num = \ - re.search(fstr, devname).groups() - return g_install_dev, g_install_num - except AttributeError: - return None,None - - def get_setup_formatfs(self): - '''Получить файловую систему на которую устанавливаем ОС''' - format="" - value_setup_path_install = self.Get('setup_path_install') - cstr="%s mkdir -p %s" % (self.G_path, value_setup_path_install) - self._runos(cstr) - # получаем диск на который ставим систему - g_install_dev, g_install_num = \ - fillVars.splitdev2devnum(self.Get('setup_installdev')) - if g_install_dev == None: - return None - # пытаемся подмонтировать раздел на который будем ставить ОС - cstr="%s mount /dev/%s%s %s &>/dev/null"\ - % (self.G_path,\ - g_install_dev,\ - g_install_num,\ - value_setup_path_install) - # если удалось (код возврата 0) - if not os.system(cstr): - # получаем из список подмонтированных файловых систем - # строку нашего раздела - cstr="%s mount | grep /dev/%s%s"\ - %(self.G_path,\ - g_install_dev,\ - g_install_num) - format=self._runos(cstr,True) - # отмонтируем ресурс - cstr="%s umount %s"%(self.G_path, value_setup_path_install) - os.system(cstr) - else: - # удалим директорию, так как раздел подмонтировать не удалось - cstr="%s rmdir %s"%(self.G_path, value_setup_path_install) -# os.system(cstr) - if format: - fses = ['reiserfs', 'xfs', 'ext3', 'ext2'] - for i in fses: - if re.search( ' %s ' % i, format.strip()): - return i - - mkfses = [ ('/sbin/mkfs.reiserfs', 'reiserfs'), - ('/sbin/mkfs.xfs', 'xfs'), - ('/sbin/mkfs.ext3', 'ext3'), - ('/sbin/mkfs.ext2', 'ext2') ] - for fspath, fsname in mkfses: - if os.path.exists(fspath): - return fsname - print _("Formatting utility not found") - sys.exit(0) - - def get_cmd_run_format(self): - '''Получить команду для форматирования''' - formatrun={"reiserfs":'"/sbin/mkfs.reiserfs -f"',\ - "xfs":"/sbin/mkfs.xfs -f",\ - "ext3":"/sbin/mkfs.ext3",\ - "ext2":"/sbin/mkfs.ext2"} - - if self.Get('setup_formatfs') in formatrun.keys() and\ - os.path.exists("/sbin/mkfs.%s"%(self.Get('setup_formatfs'))): - return formatrun[self.Get('setup_formatfs')] - - @classmethod - def commongrubfunc(cls, value_setup_installdev, value_sys_loaddev): - '''Общая функция для заполнения переменных 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" %(cls.G_path, sdir, dev) - val=cls.__runos(cstr) - if val: - if int(val[0].strip())==0: - grub_dev.append(dev.strip()) - grub_dev.sort() - num = 0 - grub_map = {} - g_install_dev, g_install_num = \ - fillVars.splitdev2devnum(value_setup_installdev) - g_load_dev, g_load_num = \ - fillVars.splitdev2devnum(value_sys_loaddev) - - value_boot_grub_setupdev = None - value_boot_grub_loaddev = None - for dev in grub_dev: - grub_map['hd'+str(num)]=dev - if g_install_dev==dev: - value_boot_grub_setupdev = 'hd'+str(num) - if g_load_dev==dev: - value_boot_grub_loaddev = 'hd'+str(num) - num+=1 - return value_boot_grub_setupdev, value_boot_grub_loaddev,\ - grub_map - - def get_boot_grub_loadnum(self): - '''Получить переменную boot_grub_loadnum''' - g_load_dev, g_load_num = \ - fillVars.splitdev2devnum(self.Get('sys_loaddev')) - if not g_load_num is None: - return str(int(g_load_num)-1) - - def get_boot_grub_setupnum(self): - '''Получить переменную boot_grub_loadnum''' - g_install_dev, g_install_num = \ - fillVars.splitdev2devnum(self.Get('setup_installdev')) - if not g_install_num is None: - return str(int(g_install_num)-1) - - def get_boot_grub_map(self): - '''Запонить переменную boot_grub_map''' - value_boot_grub_setupdev, value_boot_grub_loaddev, grub_map = \ - fillVars.commongrubfunc(self.Get('setup_installdev'), - self.Get('sys_loaddev')) - self.Set( "boot_grub_setupdev", value_boot_grub_setupdev) - self.Set( "boot_grub_loaddev", value_boot_grub_loaddev ) - return grub_map - - def get_boot_grub_setupdev(self): - '''Запонить переменную boot_grub_map''' - value_boot_grub_setupdev, value_boot_grub_loaddev, grub_map = \ - fillVars.commongrubfunc(self.Get('setup_installdev'), - self.Get('sys_loaddev')) - self.Set( "boot_grub_loaddev", value_boot_grub_loaddev ) - self.Set( "boot_grub_map", grub_map ) - return value_boot_grub_setupdev - - def get_boot_grub_loaddev(self): - '''Запонить переменную boot_grub_map''' - value_boot_grub_setupdev, value_boot_grub_loaddev, grub_map = \ - fillVars.commongrubfunc(self.Get('setup_installdev'), - self.Get('sys_loaddev')) - self.Set( "boot_grub_setupdev", value_boot_grub_setupdev) - self.Set( "boot_grub_map", grub_map ) - return value_boot_grub_loaddev - - def get_boot_devicemap(self): - '''Заполнить переменную boot_devicemap''' - g_grubmap = self.Get('boot_grub_map') - grubkeys = g_grubmap.keys() - grubkeys.sort() - devmap = "" - for dev in grubkeys: - devmap+="%s /dev/%s\n" % (dev, g_grubmap[dev]) - # заполняем переменную boot_devicemap_old псевдовручную - self._objValue__value = devmap.strip() - self.Get('boot_devicemap_old') - return devmap.strip() - - def get_boot_devicemap_old(self): - # псевдо заполнение, реализуется следующая логика - # объект при попытке его заполнить сразу ставит себе - # флаг, что он заполнен в ручную и не обновляется - # в последсвии, а значение он получает от первого - # заполнения boot_devicemap, в котором есть принудительный - # вызов заполнения - self._objValue__wasSet = True - return self.Get('boot_devicemap') - - def get_boot_grub_another(self): - ''' Считаем меню граба grub.conf для переноса настроек - boot_grub_another - ''' - if self.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" %\ - self.Get('setup_installdev') - if self.Get('setup_installdev') and\ - re.search(sstr,line): - skip+=1 - record+=line - if record and not skip: - config+=record - return config - else: - oldmarch=self._runos("%s uname -m"%self.G_path) - curos=None - if self.Get('sys_current_ver'): - curos=self.Get('sys_current_ver') - val ="\ntitle %s %s %s\n" %\ - (self.Get('setup_os_current'),\ - curos,\ - oldmarch.strip()) - val+="root (%s,%s)\n" %\ - (self.Get('boot_grub_loaddev'),\ - self.Get('boot_grub_loadnum')) - val+="kernel /boot/vmlinuz root=/dev/%s%s" %\ - (self.Get('load_dev'),\ - self.Get('load_num')) - return val - - def get_setup_set_mbr(self): - '''Установлена ли mbr - setup_set_mbr ?????? - ''' - return False - #if not Get('setup_set_mbr'): - # Set('setup_set_mbr',True,True) - #else: - # Set('setup_set_mbr',False,True) - - def get_sys_swap_dev(self): - ''' Определим раздел свопа sys_swap_dev ''' - res = self._runos('%s tail -n 1 /proc/swaps' % self.G_path) - if res: - return re.search('^\/dev\/([^\s]+)',res).group(1) - if self.Get('install_dev'): - scm='LANG=C fdisk -l /dev/%s 2>&1 | grep "Linux swap"' %\ - (self.Get('install_dev')) - res=self._runos(scm) - if res: - val=re.search('^\/dev\/([^\s]+)',res) - if val: - return val.group(1) - - def set_sys_swap_dev(self, value): - '''Если переменная задана с /dev - удаляем эту приставку к пути''' - res=re.search('^\/dev\/(.+)$',value) - if res: - val=res.group(1) - return val - else: - return value - - def get_sys_swap_line(self): - '''Заполнить переменную sys_swap_line''' - return '/dev/%s\tnone\t\tswap\tsw\t\t\t0 0'%self.Get('sys_swap_dev') - - @classmethod - def getdisk_fstab(cls, lines, param, value_sys_swap_dev): - '''Вернуть список переносимых путей при монтировании''' - 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'%value_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] - - @classmethod - def commonsysmount(cls, value_setup_installdev, value_sys_loaddev, \ - value_sys_swap_dev ): - if os.path.exists('/etc/fstab'): - f=open('/etc/fstab',"rb") - lines=f.readlines() - f.close() - g_install_dev, g_install_num = \ - cls.splitdev2devnum(value_setup_installdev) - g_load_dev, g_load_num = \ - cls.splitdev2devnum(value_sys_loaddev) - param_t={'load_dev':g_load_dev, - 'install_dev':g_install_dev, - 'load_num':g_load_num, - 'install_num':g_install_num} - res = cls.getdisk_fstab(lines, - param_t, value_sys_swap_dev) - return res - - def get_sys_mount_dev(self): - '''Заполнить переменную sys_mount_dev, а также sys_path_mounts, - sys_mount_line''' - res = fillVars.commonsysmount( self.Get('setup_installdev'), - self.Get('sys_loaddev'), self.Get('sys_swap_dev')) - if res: - if len(res[0])>0: - self.Set('sys_path_mounts', res[1]) - self.Set('sys_mount_line', res[2]) - return res[0] - - self.Set('sys_path_mounts', "") - self.Set('sys_mount_line', "") - return "" - - def get_sys_path_mounts(self): - '''Заполнить переменную sys_mount_dev, а также sys_path_mounts, - sys_mount_line''' - res = fillVars.commonsysmount( self.Get('setup_installdev'), - self.Get('sys_loaddev'), self.Get('sys_swap_dev')) - if res: - if len(res[0])>0: - self.Set('sys_mount_dev',res[0]) - self.Set('sys_mount_line', res[2]) - return res[1] - self.Set('sys_mount_dev',"") - self.Set('sys_mount_line', "") - return "" - - def get_sys_mount_line(self): - '''Заполнить переменную sys_mount_dev, а также sys_path_mounts, - sys_mount_line''' - res = fillVars.commonsysmount( self.Get('setup_installdev'), - self.Get('sys_loaddev'), self.Get('sys_swap_dev')) - if res: - if len(res[0])>0: - self.Set('sys_mount_dev',res[0]) - self.Set('sys_path_mounts', res[1]) - return res[2] - self.Set('sys_mount_dev',"") - self.Set('sys_path_mounts', "") - return "" - - def get_setup_linuxpkg(self): - '''Определим версию последнего доступного образа системы, - собираемого образа''' - # TODO: образы системы будут находится в другом месте - if os.path.exists("%s/share/linux"%(self.G_shr_path)) and\ - self.Get('sys_load')!='ram': - find="(%s\-.*\-%s\.tar\.lzma)" %\ - (self.Get('setup_sys_shortname').lower(),\ - self.Get('setup_march')) - scm=self.G_path+" find -L %s/share/linux"%(self.G_shr_path) - f_res=self._runos(scm) - if not isinstance(f_res, types.ListType): - f_res=[f_res] - retres = None - for i in f_res: - res=re.search('(%s)'%find, i.strip()) - if res: - retres = res.groups()[0] - return retres - elif self.Get('sys_load')=='ram' and os.path.exists('/mnt/livecd'): - self.Set('setup_linux_ver',self.Get('sys_current_ver')) - return "livecd" - - def get_setup_linux_ver(self): - ver = self.Get('setup_linuxpkg') - if ver == "livecd": - return self.Get('sys_current_ver') - if ver: - val=re.search('\-([\d\.]+)\-.*',ver) - if val: - return val.group(1) - - def get_setup_iso_name(self): - return "%s-%s-%s.iso" % (self.Get('setup_sys_shortname').lower(), - self.Get('setup_linux_ver'), self.Get('setup_march')) - - - def get_setup_path_patch(self): - '''Получить путь с списку патчей''' - if self.Get('sys_current_ver'): - if os.path.exists(self.G_rshr_path): - return self.G_rshr_path+"/patch" - - def get_sys_patchlast(self): - value_get_setup_patches = self.Get('setup_patches') - if value_get_setup_patches == None: - return None - else: - dcalculate=self.Get('setup_sys_shortname') - dlinuxver=self.Get('setup_linux_ver') - fstr="^%s\-%s\-([0-9]+)$"%(dcalculate,dlinuxver) - recomp = re.compile(fstr) - patchlast = 0 - for i in value_get_setup_patches: - res = recomp.search(i) - if not res: - continue - val = int(res.groups()[0]) - if patchlast < val: - patchlast = val - return patchlast - - def get_setup_patches(self): - g_patches = None - rdir = os.listdir(self.Get('setup_path_patch')) - value_sys_patchcur = self.Get('sys_patchcur') - if self.Get('sys_patchlast'): - value_sys_patchlast = self.Get('sys_patchlast') - else: - value_sys_patchlast = None - if g_patches is None: - g_patches = [] - patchlast = value_sys_patchlast - if not patchlast: - patchlast = 0 - dcalculate=self.Get('setup_sys_shortname') - dlinuxver=self.Get('setup_linux_ver') - for i in rdir: - fstr='^%s\-%s\-([0-9]+)$'%(dcalculate, dlinuxver) - res=re.search(fstr, i) - if not res: - continue - val=int(res.groups()[0]) - if not value_sys_patchcur: - value_sys_patchcur = 0 - if val > int(value_sys_patchcur): - g_patches.append(i) - if patchlast < val: - patchlast = val - value_sys_patchlast - self.Set('sys_patchlast', value_sys_patchlast) - return g_patches - - def get_setup_path_linuxpkg(self): - '''Получить путь к архивам систем''' - return "%s/share/linux"%(self.G_rshr_path) - - def get_setup_path_tmp(self): - '''Определить директорию временных файлов setup_path_tmp ''' - return '/tmp/calculate' - - def get_setup_makeopts(self): - '''Определить makeopts - setup_makeopts - ''' - if int(self.Get('hrd_cpu_num'))==1: - makecpu = 1 - else: - makecpu = int(self.Get('hrd_cpu_num'))+1 - return "-j%s"%makecpu - - def get_setup_path_portage(self): - '''Определить каталог portage setup_path_portage ''' - if os.path.exists('/usr/calculate/portage'): - return "/usr/calculate/portage" - - def get_setup_path_distfiles(self): - '''Определить каталог distfiles setup_path_distfiles ''' - if os.path.exists('/usr/calculate/distfiles'): - return "/usr/calculate/distfiles" - - def get_setup_path_pkg(self): - '''Определить каталог pkg - setup_path_pkg - ''' - pkgpath="/usr/calculate/packages/%s/%s/%s"%\ - (self.Get('setup_sys_shortname'),\ - self.Get('setup_linux_ver'),\ - self.Get('setup_march')) - if os.path.exists(pkgpath): - return pkgpath - - def get_cmd_run_emerge1(self): - '''Команда emerge с указанием OVERLAY и MAKEOPTS - cmd_run_emerge1 - ''' - if self.Get('setup_path_portage'): - return 'PORTDIR_OVERLAY="%s" MAKEOPTS="%s"'%\ - (self.Get('setup_path_portage'),\ - self.Get('setup_makeopts')) - - def get_cmd_run_emerge2(self): - '''cmd_run_emerge''' - return "" - - # от flGlobal - #packages=(G_inst_path+"/builder/packages",\ - #self.G_shr_path+"/builder/packages") - #Set('setup_path_constpkg',packages,True) - @classmethod - def getProfileList(cls, path, Get): - _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 "" - - #def get_setup_path_profuser(self): - #''' Определим профили установки или сборки''' - #prof=fillVars.getProfileList('/usr/calculate/profile/install/', - #self.Get) - #if prof: - #return prof - - def get_setup_path_profinst(self): - '''Определим профили установки''' - prof=fillVars.getProfileList('/usr/lib/calculate-install/profile', - self.Get) - if prof: - return prof - - -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 DataVars: + official = False + # количество вызовов метода заполнения + countFill = 0 + # объект в котором создан этот объект + parentObj = None + # запускать или нет метод заполнения + fillStart = True + # dynamic = True то переменная динамическая при повтороном запуске + # запускается метод заполнения + # метод заполнения не запускается только если fillStart = False + # (осторожно возможно зацикливание программы если методы заполнения + # переменных используют методы друг друга) + dynamic = False + + def __init__(self, parentObj): + # словарь зависимых переменных {имя:значение} + self.dependValues = {} + # тип переменной (атрибут type) + self.type = ('default') + # список допустимых значений переменных (select) + self.select = () + # объект который создал этот объект + self.parentObj = parentObj + + def is_update(self): + #Нужно ли перезапускать метод заполнения (если зависимые переменные + #обновились то нужно) + upd = False + for depVarName in self.dependValues.keys(): + value = self.parentObj.__getattribute__(depVarName).Get() + if self.dependValues[depVarName] != value: + self.dependValues[depVarName] =\ + self.parentObj.__getattribute__(depVarName).value + upd = True + break + return upd + + def Get(self): + """Получение значения переменной""" + if not self.fillStart: + return self.value + if self.dynamic: + self.value = self.Fill() + return self.value + if self.value == None: + if self.countFill>0: + return self.value + self.countFill += 1 + self.value = self.Fill() + if self.dependValues and self.is_update(): + self.countFill += 1 + self.value = self.Fill() + return self.value + + def Set(self, value): + """Запись значения переменной""" + self.value = value + return self.value + + def Fill(self): + """Заполнение переменной в далнейшем заменяем методом заполнения""" + return self.value + +class DataVars(object): + # добавляем пути к модулям если они не добавлены if not os.path.abspath(\ '/usr/lib/calculate/calculate-server/pym') in sys.path: sys.path.insert(0,os.path.abspath(\ @@ -2164,192 +526,242 @@ class DataVars: '/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', - 'Client':'cl_vars_client', + # Импортируемые модули - (раздел: модуль переменных, модуль заполнения + #переменных) + __modlist={'Global':('cl_vars','cl_fill'), + 'Server':('cl_vars_server','cl_fill_server'), + 'Builder':('cl_vars_builder','cl_fill_builder'), + 'Client':('cl_vars_client','cl_fill_client'), } + def __init__(self): + #self.t1 = fillVars() + #self.t1.Get = self.Get + #self.t1.Set = self.Set + # Для нахождения зависимостей переменных + self.__levelNumber = 0 + self.__LevelsVar = [] + # Для хранения импортированных модулей и объектов + #[(cекция,импортированный модуль переменных, объект заполнения),] + self._importList = [] + self._importData("Global") + + def _importData(self, section): + """Импортирует модули с переменными и модули с функциями заполнения + + section секция раздела (Global, Server, Client итд) + создает необходимые структуры данных + """ + if not section in self.__modlist.keys(): + print _("Unsupported section %s")%section + exit(1) + modVar = self.__modlist[section][0] + modFill = self.__modlist[section][1] + # Импортируем класс описания переменных и класс заполнения + try: + exec ("import %s" % (modVar)) + except ImportError, e: + print _("Error in import module %s")%modVar + print _("error") + ": " +str(e) + exit(1) + flagFindFillModule = True + try: + exec ("import %s" % (modFill)) + except ImportError, e: + if "No module named" in str(e): + flagFindFillModule = False + else: + print _("Error in import module %s")%modFill + print _("error") + ": " +str(e) + exit(1) + if flagFindFillModule: + # Создаем объект с методами заполнения переменных + exec("fillObj = %s.fillVars()" %modFill) + # Подключаем методы получения и записи переменных + fillObj.Get = self.Get + fillObj.Set = self.Set + else: + fillObj = False + # Заполняем self._importList + exec("self._importList.insert(0,(section,%s,fillObj))"%(modVar)) - def __init__(self, modsname='Global'): - '''Загрузка указанной конфигурации переменных. + def __findVarData(self, nameVar): + """Находит данные для создания объекта переменная в модулях и - Параметры: - modname - имя конфигурации (Global,Server,Builder) + объектах + """ + # Ищем переменную в модуле + dataVar = False + e = False + for section, moduleVar, fillobj in self._importList: + try: + exec("dataVar=moduleVar.Data.%s"%nameVar) + except AttributeError, e: + pass + if dataVar: + break + if dataVar == False: + print _("Not found variable %s")%nameVar + if e: + print _("error") + ": " +str(e) + exit(1) + dataVar['service'] = section + # Ищем метод в объекте методов заполнения + nameMethod = "get_" + nameVar + flagFindMetod = False + for section, moduleVar, fillobj in self._importList: + if fillobj: + if nameMethod in dir(fillobj): + flagFindMetod = True + method = fillobj.__getattribute__(nameMethod) + break + if flagFindMetod: + return (dataVar,method) + else: + return (dataVar,False) - Если в модуле конфигурации переменных будет неправильно указана одна из - переменных, то конфигурация сбрасывается и объект не будет содержать - ни одной переменной окружения. - ''' - self.__implist=[] - self.__varslist={} # хранит словарь близки по отошению к модулю - # конфигурации - self.__typelist=() - self.flVars = fillVars(self) - # проверка правильно указанного имени конфигурации переменных окружения - if type(modsname) == types.StringType: - modsname = [modsname] - for modname in modsname: - if modname and self.__modlist.has_key(modname): - self.initializemodules(modname) - else: - print _("Unsupported module vars") + ": %s"%(modname) - sys.exit(0) - - def initializemodules(self, modname): - '''Инициализация переменных DataVars, переменными из - файла модуля содержащего описание переменных''' - if modname in self.__implist: - return - self.__implist.append(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 - - if 'get_'+idnt in fillVars.__dict__: - vals['Getself'] = getattr(fillVars,'get_'+idnt) - if 'set_'+idnt in fillVars.__dict__: - vals['Setself'] = getattr(fillVars,'set_'+idnt) - - vals['Get'] = self.Get - vals['SetIndirect'] = self.__IndirectFilling - #оформляем значение переменной в виде объекта - objparam=objValue(**vals) - #инициализируем переменную - exec ("""self.%s=objparam"""%(idnt)) - - #проверить импортируемое значение - 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 __setAttributesVar(self, var ,nameVar, dict): + """Установка аттрибутов для созданного объекта var - def __IndirectFilling(self,vname,val): - '''Функция необходима для вызова функции непрямого заполнения - (когда при заполнении одной переменной происходит заполнение - другой переменной)''' - # если запрошенная переменная не найдена поднимаем исключение - # "ошибка имени переменной" - if not self.__varslist.has_key(vname): - raise VarNameError(vname) - # получаем текущую переменную в виде объекта - valobj=getattr(self, vname)#.__getVarValue(vname, True) - # если получить переменную не удалось - возврат провал - if valobj is False: - return False - # если среди типов переменных bool, то в случае пустого значения - # устанавливается значение False - if 'bool' in valobj.v_type: - if val is None: - val=False - valobj.indirectfilling(val) - # возвращаем "успех" + название аттрибута и его значение берется из словаря dict + """ + dict['type'] = nameVar.split('_') + if not set(dict.keys()) <= set(dir(var)): + print _("error initalize variable %s, incorrect data")%nameVar + exit(1) + for nameAttr in dict.keys(): + setattr(var,nameAttr, dict[nameAttr]) return True - def Set(self, vname, val, force=False): - '''Установить значение переменной окружения - - Параметры: - vname имя переменной - val значение переменной - force принудительная установка переменной на случай если установлен - режим только для чтения. - ''' - self.__addVarValue(vname, val, force) + def __Get(self, nameVar): + ret = None + self.__LevelsVar.append((self.__levelNumber, nameVar)) + self.__levelNumber += 1 + #nameMethod = "get_" + nameVar + if self.__dict__.has_key(nameVar): + ret = self.__getattribute__(nameVar).Get() + elif self.__findVarData(nameVar): + dictVar, methodFill =self.__findVarData(nameVar) + varobj = var(self) + # Устанавливаем аттрибуты + self.__setAttributesVar(varobj, nameVar, dictVar) + if methodFill: + varobj.Fill = methodFill + self.__setattr__(nameVar, varobj) + ret = self.__getattribute__(nameVar).Get() + else: + ret = None + self.__levelNumber -= 1 + if self.__levelNumber == 0 and\ + self.__getattribute__(nameVar).fillStart and\ + len(self.__LevelsVar)>1: + links = self.__getLinks(self.__LevelsVar) + for name in links.keys(): + #print name + for nameLink in links[name].keys(): + val = self.__getattribute__(nameLink).Get() + self.__getattribute__(name).dependValues[nameLink] = val + return ret - def Get(self, vname, objformat=None): - '''Получить значение переменной окружения + def Get(self, nameVar): + return self.__Get(nameVar) + + + def __Set(self, nameVar, value, force=False): + nameMethod = "get_" +nameVar + if not self.__dict__.has_key(nameVar) and self.__findVarData(nameVar): + dictVar, methodFill =self.__findVarData(nameVar) + varobj = var(self) + # Устанавливаем аттрибуты + self.__setAttributesVar(varobj, nameVar, dictVar) + if methodFill: + varobj.Fill = methodFill + self.__setattr__(nameVar, varobj) + if self.__dict__.has_key(nameVar): + if not force and "r" in getattr(self, nameVar).mode: + print _("Attempt to rewrite a variable for reading:%s")\ + %nameVar + return False + self.__getattribute__(nameVar).fillStart = False + return self.__getattribute__(nameVar).Set(value) + + def Set(self, nameVar, value, force=False): + return self.__Set(nameVar, value, force) + + def __frame(self, lVar): + """получить список областей зависимости переменных""" + data = [] + if not lVar: + return data + firstLevel = lVar[0][0] + for level, name in lVar[1:]: + if level> firstLevel: + data.append((level, name)) + else: + break + return data - Параметры: - vname имя получаемой переменной окружения - objformat если указан, то будет возвращено не значение переменной, а - объект, содержащий полную информацию о переменной окружения. + def __getLinks(self, lVar): + """Получить список переменных и от каких переменных они зависят - Возвращаемые значения: - Значение или объект запрашиваемой переменной окружения. - В случае неудачи возвращает 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' + на вход список [(уовень рекурсии, название переменной),] + """ + links = {} + frames = {} + levelLinks = {} + lVarFr = lVar + for level, name in lVar: + fr = self.__frame(lVarFr) + if not frames.has_key(name): + frames[name] = fr + levelLinks[name] = level+1 + lVarFr = lVarFr[1:] + for name in frames.keys(): + level = levelLinks[name] + fr = frames[name] + links[name] = {} + for lv, nm in fr: + if level == lv: + links[name][nm] = None + return links + + def __getPathCalculateIni(self): + """Получить пути до ini файлов""" + return self.Get('cl_env_path') + + def __getSection(self, vname): + """секция для записи в ini файл переменной + + vname - имя переменной + """ + if self.__dict__.has_key(vname): + if self.__dict__[vname].service == 'Global': + return 'calculate' + else: + return self.__dict__[vname].service.lower() - def __writeVarValue(self, vname, val): + def __writeVarValue(self, vname, val, location): '''Записать значение в calculate.ini Параметры: vname имя переменной val значение переменной + location расположение ini файла ('default', 'local', 'remote') Возвращаемые значение: True запись успешна False запись не удалсь ''' + # получаем все пути до ini файлов + calculate_ini = self.__getPathCalculateIni() # получаем полный путь до файла ini - name_calculate_ini = os.path.join(self.Get('setup_path_install'), - self.Get('sys_calculate_ini')) + if location == 'default': + name_calculate_ini = calculate_ini[2] + elif location == 'local': + name_calculate_ini = calculate_ini[1] + elif location == 'remote': + name_calculate_ini = calculate_ini[0] + else: + return False # извлекаем из полного имени файла путь onlydir = os.path.split(name_calculate_ini)[0] try: @@ -2359,24 +771,36 @@ class DataVars: os.makedirs(onlydir) except OSError (nerr,msg): print nerr, msg - return False + return False config = iniParser(name_calculate_ini) - header = self.__getCurrentHeaderName() + # Получаем секцию конфигурационного файла + header = self.__getSection(vname) return config.setVar(header,{vname: cl_utils.convertStrListDict(val)}) - def Write(self, vname, val, force=False): + def Write(self, vname, val, force=False, location='default'): '''Установить и записать значение переменной в ini файл Параметры: vname имя переменной val значение переменной force "принудительный режим" + location расположение ini файла ('default', 'local', 'remote') ''' - if self.__addVarValue(vname, val, force): - self.__writeVarValue(vname, val) + if self.__Set(vname, val, force): + self.__writeVarValue(vname, val, location) return True return False + def __getActiveSections(self): + """активные секции в ini файле""" + act_section = [] + for service,t,t in self._importList: + if service == "Global": + act_section.append('calculate') + else: + act_section.append(service.lower()) + return act_section + def flIniFile(self): '''Заместить значение переменных значениями из ини файла @@ -2384,262 +808,83 @@ class DataVars: True переменные считаны False файл не был обнаружен ''' - calculate_ini = [] - # получаем полный путь до удаленного файла ini - calculate_ini.append(os.path.join('/', - self.Get('sys_calculate_ini_remote'))) - # получаем полный путь до локального файла ini - calculate_ini.append(os.path.join('/', - self.Get('sys_calculate_ini_local'))) - # получаем полный путь до файла ini - calculate_ini.append(os.path.join('/', - self.Get('sys_calculate_ini'))) + calculate_ini = self.__getPathCalculateIni() + # активные секции (секции из которых будут использованы переменные) + act_section = self.__getActiveSections() + set_act_section = set(act_section) for name_calculate_ini in 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) + # получаем все секции из конфигурационного файла + allsect = config.getAllSectionNames() + if not allsect: + continue + # находим встречающиеся у обоих секции + act_sect = tuple(set(allsect)& set_act_section) + # получаем все переменные из всех секций + for section in act_sect: + allvars = config.getAreaVars(section) + #allvars = config.getAreaVars(self.__getCurrentHeaderName()) + if allvars == False: + return False + # принудительно переписать все переменные окружения + # полученные из ini + for (k,v) in allvars.items(): + k = k.encode("UTF-8") + v = v.encode("UTF-8") + self.Set(k, cl_utils.convertStrListDict(v), True) return True def flServer(self, **args): '''Заполнить конфигурацию переменных, для ldap''' # заполнить переменные окружения алгоритмом по умолнанию - self.addVars("Server") + self._importData("Server") def flClient(self, **args): '''Заполнить конфигурацию переменных, для клиента''' # заполнить переменные окружения алгоритмом по умолнанию - self.addVars("Client") + self._importData("Client") def flBuilder(self, **args): '''Заполнить конфигурацию переменных, для билдера''' self.Set('setup_pass','builder',True) # заполнить переменные окружения алгоритмом по умолнанию - self.addVars("Builder") + self._importData("Builder") def flInstall(self, **args): '''Заполнить конфигурацию переменных для инсталятора''' self.Set('setup_pass','install',True) - def flFromCmdParam(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.Get(key,True).v_mode: - return False - dict[key] = value - except VarNameError: - return False - - # установить параметры - for (k,v) in dict.items(): - if self.Set(k,v) == False: - return False - return True - - 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 - if 'get_'+vname in fillVars.__dict__: - objpar['Getself'] = getattr(fillVars,'get_'+vname) - if 'set_'+vname in fillVars.__dict__: - objpar['Setself'] = getattr(fillVars,'set_'+vname) - - objpar['Get'] = self.Get - objpar['Set'] = self.__IndirectFilling - 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)) - # возвращаем "успех" + #def defined(self, vname): + #if vname: + #if self.__dict__.has_key(vname): + #return True + #return False + def defined(self, 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] - # TODO: must test, was reconstructed - vals = {} - if 'get_'+i in fillVars.__dict__: - vals['Getself'] = getattr(fillVars,'get_'+i) - if 'set_'+i in fillVars.__dict__: - vals['Setself'] = getattr(fillVars,'set_'+i) - - vals['Get'] = self.Get - vals['Set'] = self.__IndirectFilling - nobj=objValue(v_mode=param['mode'],v_type=param['type'],v_value=None, **vals) - if type_names: - if not self.__checkType(val.v_type,type_names): - continue - ret[i]=nobj + ret = {} + for section, moduleVar, fillobj in self._importList: + dataVar=moduleVar.Data + dictVars = dir(dataVar) + for nameVar in dictVars: + if not "__" in nameVar: + if not (getattr(dataVar,nameVar).has_key("official") and\ + getattr(dataVar,nameVar)['official']): + self.Get(nameVar) + if type_names: + #type_names.sort() + varType =list(getattr(dataVar,nameVar)['type']) + #varType.sort() + #print type_names + #print varType + #print + if not set(type_names)<=set(varType): + continue + ret[nameVar] = getattr(self,nameVar) return ret #распечатать список переменных с значениями @@ -2652,61 +897,47 @@ class DataVars: 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 not '[' in var[i].v_mode: + #if len(str(j.type))>mlen_type: + #mlen_type=len(str(j.type)) + vtype=str(type(var[i].value)).split(" ")[1][1] + if not '[' in var[i].mode: if vtype in ['d','l']: - mode="[%s%s]"%(var[i].v_mode.lower(),vtype) + mode="[%s%s]"%(var[i].mode.lower(),vtype) else: - mode="[%s]"%(var[i].v_mode.lower()) - var[i].v_mode=mode + mode="[%s]"%(var[i].mode.lower()) + var[i].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) + cl_utils.fillstr("-",mlen_mode) + " " + cl_utils.fillstr("-",10) + #cl_utils.fillstr("-",mlen_type) + " " +\ print "The list of variables:" print "var name".center(mlen_name),\ - "Mode",\ - "Type".center(mlen_type),\ - "Value" + "Mode","Value" + #"Type".center(mlen_type),\ + 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: + #if var[i].value is None: + #continue + p_val=var[i].value + if var[i].official: continue - cl_utils.columnWrite( i, mlen_name, var[i].v_mode.lower(), - mlen_mode, str(var[i].v_type), mlen_type, p_val) + cl_utils.columnWrite( i, mlen_name, var[i].mode.lower(), + mlen_mode, + #str(var[i].type), + #mlen_type, + p_val) print br - - def addVars(self, objvars, force=False): - '''Добавить к списку переменных переменные из модуля. - - Параметры: - objvars "Server", "Global", "Builder" - ''' - self.initializemodules( objvars ) - - 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 ############################################################################## +class glob_attr: + """Глобальные аттрибуты для методов заполнения переменных""" + path_env = cl_utils.getpathenv() + + def _runos(self,cmd,ret_first=None): + """Вернуть результат выполнения команды ОС""" + return cl_utils.runOsCommand(cmd, None, ret_first) diff --git a/pym/cl_fill.py b/pym/cl_fill.py new file mode 100755 index 0000000..4e51308 --- /dev/null +++ b/pym/cl_fill.py @@ -0,0 +1,107 @@ +#-*- 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 re +import cl_utils +import cl_base + +class fillVars(object, cl_base.glob_attr): + + def get_os_net_domain(self): + ''' Определим домен''' + domain=self._runos("%s hostname -d 2>&1"%self.path_env) + if re.search("^hostname: ",domain): + return "local" + else: + return domain + + def get_os_linux_shortname(self): + '''Получить переменную короткого названия системы''' + path = '/etc/issue' + sp="""Welcome to \\\\n.\\\\O \(([a-zA-Z ]+) ([^\s\)]+)""" + res=self._runos('%scat %s | grep "Welcome to "'%\ + (self.path_env, path)) + dist_ver = {'CLD':"Calculate Linux Desktop", + 'CDS':"Calculate Directory Server", + 'AcoolA':"Calculate Web Server"} + if res: + if re.search(sp,res): + vals=re.search(sp,res).groups() + issuename=vals[0] + for i in dist_ver.keys(): + if dist_ver[i]==issuename: + return i + spl=issuename.split(" ") + nname="" + if len(spl)>1: + for i in spl: + nname+=i[1] + return nname + else: + return issuename + return "CLD" + + + def get_os_net_hostname(self): + '''Считать имя компьютера net_host''' + hostname=self._runos("""%s hostname -s 2>&1"""%self.path_env) + #Set('net_host',hostname, True) + #упрощенный вариант, следует выполнять только если не указан домен + #в системе + if re.search("^hostname: ",hostname): + hostname=self._runos("""%s hostname 2>&1"""%self.path_env) + if re.search("^hostname: ",hostname): + return self.Get('os_linux_shortname') + else: + if hostname=='livecd': + return self.Get('os_linux_shortname') + return hostname + + # Разрешенные сети (в данном случае все сети) + def get_os_net_allow(self): + """Разрешенные сети""" + 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':''} + networks="" + netInterfaces=cl_utils.getdirlist("/sys/class/net/") + for i in netInterfaces: + res=self._runos("/sbin/ifconfig %s"%i) + for j in res: + s_ip=re.search('addr:([0-9\.]+).+Bcast:.+Mask:([0-9\.]+)'\ + ,j) + if s_ip: + ip, netmask=s_ip.groups() + 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] + return networks diff --git a/pym/cl_profile.py b/pym/cl_profile.py index 5fcdf8b..429d11d 100644 --- a/pym/cl_profile.py +++ b/pym/cl_profile.py @@ -27,6 +27,7 @@ tr = cl_base.lang() tr.setLocalDomain('cl_lib') tr.setLanguage(sys.modules[__name__]) + class _error: # Здесь ошибки, если они есть error = [] @@ -1163,6 +1164,14 @@ class xmlDoc: else: return False + def getNameArea(self, xmlArea): + """Выдает имя области""" + xmlNameAreas = xpath.Evaluate('child::caption/name', xmlArea) + if xmlNameAreas and xmlNameAreas[0].firstChild: + return xmlNameAreas[0].firstChild.nodeValue + else: + return False + def xmlToText(self, xmlAreas, text): """Преобразует список XML областей в текст""" def getQuotesArea(xmlArea): @@ -1847,8 +1856,9 @@ class profile(_file, _terms): # Объект с переменными self.objVar = objVar # Базовая директория переноса профилей "/mnt/calculate" или "/" и.т.д - baseDir = self.objVar.Get("setup_path_install") - self._baseDir = os.path.split(baseDir)[0] + baseDir = self.objVar.Get("cl_root_path") + #self._baseDir = os.path.split(baseDir)[0] + self._baseDir = baseDir if self._baseDir == "/": self._baseDir = "" # Последняя часть директории профиля (имя сервиса: samba, mail) @@ -1951,21 +1961,10 @@ class profile(_file, _terms): def applyProfiles(self): """Применяет профили к конфигурационным файлам""" - if not self.objVar.defined("setup_path_profinstall"): - self.setError (_("not defined Var: ") + "setup_path_profinstall") - return False - dirsProfInstall = self.objVar.Get("setup_path_profinstall") - if not self.objVar.defined("setup_path_profuser"): - self.setError (_("not defined Var: ") + "setup_path_profuser") + if not self.objVar.defined("cl_profile_path"): + self.setError (_("not defined Var: ") + "cl_profile_path") return False - dirsProfUser = self.objVar.Get("setup_path_profuser") - # Получаем директории профиля - if dirsProfInstall and dirsProfUser: - dirsProfiles = dirsProfInstall + dirsProfUser - elif dirsProfInstall: - dirsProfiles = dirsProfInstall - elif dirsProfUser: - dirsProfiles = dirsProfUser + dirsProfiles = self.objVar.Get("cl_profile_path") if self._servDir: tmpDirsProfiles = [] for dirP in dirsProfiles: @@ -1997,7 +1996,7 @@ class profile(_file, _terms): listProfTitle = dirObj.baseDir.split("/")[-2:] profTitle = '"' + "/".join(listProfTitle) + '"' self.join(fileProfile, oldFile, - (self.objVar.Get("setup_name"),profTitle)) + (self.objVar.Get("cl_ver"),profTitle)) else: if self.getError(): print self.getError() @@ -3448,3 +3447,45 @@ class procmail(objShare): if isinstance(procmailObj, procmail): #print self.docObj.doc.toprettyxml() self.docObj.joinDoc(procmailObj.doc) + +class kde(samba): + """Класс для обработки конфигурационного файла типа kde + + """ + _comment = "#" + configName = "kde" + configVersion = "0.1" + reHeader = re.compile("^[\t ]*\[[^\[\]]+\].*\n",re.M) + reBody = re.compile(".+",re.M|re.S) + reComment = re.compile("\s*%s.*"%(_comment)) + reSeparator = re.compile("=") + sepFields = "\n" + reSepFields = re.compile(sepFields) + + def __init__(self,text): + samba.__init__(self,text) + + def join(self, kdeObj): + """Объединяем конфигурации""" + if isinstance(kdeObj, kde): + self.docObj.joinDoc(kdeObj.doc) + # Для добавления перевода строки между областями если его нет + #print self.docObj.body.toprettyxml() + xmlAreas = xpath.Evaluate("child::area", self.docObj.body) + if xmlAreas and len(xmlAreas)>1: + for xmlArea in xmlAreas[-1:]: + if xmlArea.previousSibling and\ + self.docObj.getTypeField(xmlArea.previousSibling) == "br": + continue + xmlFields = xpath.Evaluate("child::field", xmlArea) + if not (xmlFields and\ + (self.docObj.getTypeField(xmlFields[-1])=="br" or\ + self.docObj.getTypeField(xmlFields[-1])=="comment")): + if xmlArea.nextSibling: + parentNode = xmlArea.parentNode + nextNode = xmlArea.nextSibling + parentNode.insertBefore(\ + self.docObj.createField("br", + [],"",[], + False,False), + nextNode) diff --git a/pym/cl_vars.py b/pym/cl_vars.py index dd14962..5c83fad 100644 --- a/pym/cl_vars.py +++ b/pym/cl_vars.py @@ -19,396 +19,28 @@ # w-переназначается из командной строки # type - тип переменной состоит из двух элементов(что это и для чего # это) -# value - дефоултное значение переменной -# select - список допустимых значений переменной -# official - флаг того, что данная переменная служебная и не отображается -# при печати списка значений переменных -# printval - печатное значение переменной(значение выводимое при печати -# списка значений переменных) +# value - значение переменной class Data: - #старое значение файла grub_device.map - boot_devicemap_old={'mode':"r", - 'type':('conf','boot'), - } - #новое значение файла device.map - boot_devicemap= {'mode':"w", - 'type':('conf','boot'), - } - #альтернативные строчки загрузчика grub - boot_grub_another= {'mode':"r", - 'type':('conf','boot'), - } - #диск с которого загружена система в формате загрузчика grub - boot_grub_loaddev= {'mode':"r", - 'type':('param','boot'), - } - #раздел с которого загружена система в формате загрузчика grub - boot_grub_loadnum= {'mode':"r", - 'type':('param','boot'), - } - #диск для установки системы в формате загрузчика grub - boot_grub_setupdev={'mode':"r", - 'type':('param','boot'), - } - #раздел для установки системы в формате загрузчика grub - boot_grub_setupnum={'mode':"r", - 'type':('param','boot'), - } - #модель материнской платы - hrd_board_model= {'mode':"r", - 'type':('info','matherboard'), - } - #производитель материнской платы - hrd_board_vendor= {'mode':"r", - 'type':('info','matherboard'), - } - #количество процессоров на ПК - hrd_cpu_num= {'mode':"w", - 'type':('param','cpu'), - } - #количество процессоров на ПК - hrd_laptop_model= {'mode':"r", - 'type':('info','hardware'), - } - #производитель ноутбука - hrd_laptop_vendor= {'mode':"r", - 'type':('info','hardware'), - } - #обозначение видео карты для настроек OpenGL - hrd_opengl_set= {'mode':"r", - 'type':('param','video'), - } - #описание материнской платы - hrd_pc_vendor= {'mode':"r", - 'type':('info','matherboard'), - } - #видео драйвер - hrd_video_drv= {'mode':"w", - 'type':('param','video'), - } - #видео карта - hrd_video_name= {'mode':"r", - 'type':('info','video'), - } - #разрешение экрана - hrd_video_res= {'mode':"w", - 'type':('param','screen'), - } - #подключен USB Hewlett-Packard - hrd_usb_hp= {'mode':"w", - 'type':('info','hardware')} - #подключен USB Bluetooth - hrd_usb_bluetooth= {'mode':"w", - 'type':('info','hardware')} - #DNS имя сервера CDS - net_cds= {'mode':"w", - 'type':('param','lan'), - } - #сетевые настройки файла /etc/conf.d/net - net_conf= {'mode':"r", - 'type':('conf','lan'), - } - #сетевое устройство, через которое пакеты попадают на шлюз - net_gw_dev= {'mode':"r", - 'type':('param','network'), - } - #адрес шлюза - net_gw= {'mode':"w", - 'type':('param','lan'), - } - #имя компьютера - net_host= {'mode':"w", - 'type':('param','lan'), - } - #разрешенная сеть - net_hosts_allow= {'mode':"r", - 'type':('param','lan'), - } - #активное сетевое устройство (выбириется в порядке приоритета eth0-9, - #wlan0-9) - net_lan= {'mode':"r", - 'type':('param','lan'), - } - #текущая сеть - net_networks= {'mode':"r", - 'type':('conf','lan'), - } - #DNS имя NFS сервера - net_nfs= {'mode':"w", - 'type':('conf','lan'), - } - #DNS имя сервера времени# -# BD's definitions - net_ntp= {'mode':"w", - 'type':('conf','lan'), - } - #порт proxy сервера - net_proxy_port= {'mode':"w", - 'type':('param','lan'), - } - #строка для настройки proxy сервера - net_proxy_url= {'mode':"r", - 'type':('param','lan'), - } - #DNS имя proxy сервера - net_proxy= {'mode':"w", - 'type':('param','lan'), - } - #файловая система root раздела - setup_formatfs= {'mode':"w", - 'type':('param','install'), - } - #диск и раздел для установки - setup_installdev= {'mode':"w", - 'type':('param','install'), - } - #имя ISO-файла для создания загружаемого образа системы - setup_iso_name= {'mode':"r", - 'type':('param','install'), - } - #версия системы (в зависимости от операции - обновление установка, сборка) - setup_linux_ver= {'mode':"w", - 'type':('param','system'), - } - #имя tar-архива с образом устанавливаемой системы - setup_linuxpkg= {'mode':"r", - 'type':('param','install'), - } - #установлено в ram в случае, если установка профиля производится в RAM-диск - #(настройка сеанса CDROM) - setup_location= {'mode':"r", - 'type':('param','system'), - 'value':""} - #значение флага -j команды make - setup_makeopts= {'mode':"w", - 'type':('param','install'), - } - #архитектура процессора (в зависимости от операции - обновление установка, - #сборка) - setup_march= {'mode':"w", - 'type':('param','system'), - } - #имя и версия программы - setup_name= {'mode':"r", - 'type':('info','install'), - } - #название системы из-под которой запущена программа - setup_os_current= {'mode':"r", - 'type':('info','system'), - } - #этап запуска (установка, сборка или обновление) - setup_pass= {'mode':"r", - 'type':('param','install'), - } - #путь к директории с профилями - setup_path_profuser={'mode':"r", - 'type':('path','install'), - } - #путь к спискам пакетов для сборки новой системы - setup_path_constpkg={'mode':"r", - 'type':('path','install'), - } - #директория сборки новой системы - setup_path_constructor={'mode':"w", - 'type':('path','install'), - 'value':'/mnt/calculate'} - #путь к исходным файлам пакетов программ - setup_path_distfiles={'mode':"r", - 'type':('path','install'), - } - #пути переменной окружения PATH (изменяются в случае запуска программы на - #сильно измененной Linux системе) - setup_path_env= {'mode':"r", - 'type':('cmd','install'), - } - #путь к директории точки монтирования для установки новой системы - setup_path_install={'mode':"w", - 'type':('path','install')} - #путь к дистрибутивам - setup_path_linuxpkg={'mode':"r", - 'type':('path','install'), - } - #директория к патчам (выполняемым скриптам, содержащим определенные - #инструкции для внесения изменений в систему) - setup_path_patch= {'mode':"w", - 'type':('path','install'), - } - #путь к бинарным пакетам программ - setup_path_pkg= {'mode':"r", - 'type':('path','install'), - } - #путь к портежам - setup_path_portage={'mode':"r", - 'type':('path','install'), - } - #директория временных файлов - setup_path_tmp= {'mode':"w", - 'type':('path','install'), - } - #список накладываемых профилей при установке, наложении профилей - setup_path_profinstall= {'mode':"r", - 'type':('path','install'), - } - #флаг установки MBR записи для загрузки системы (по умолчанию установлен) - setup_set_mbr= {'mode':"w", - 'type':('bool','install'), - } - #имя сборки - setup_sys_fullname={'mode':"r", - 'type':('info','system'), - } - #короткое название системы (CLD) - setup_sys_shortname={'mode':"r", - 'type':('param','system'), - } - #emerge флаг размаскировки пакетов (меняется при установке, сборке, - #обновлении) - setup_unmask= {'mode':"r", - 'type':('param','install'), - } - #номер версии программы - setup_ver= {'mode':"r", - 'type':('param','install'), - 'value':"0.0.1 alpha 1"} - #версия загруженной системы - sys_current_ver= {'mode':"r", - 'type':('param','system'), - } - #домен - sys_domain= {'mode':"w", - 'type':('param','system'), - } - #тип операционной системы - sys_linux_type= {'mode':"r", - 'type':('param','system'), - } - # раздел, с которого загрузились - sys_loaddev= {'mode':"r", - 'type':('param','system')} - #носитель в значение ram в случае загрузки с CD_DVD - sys_load= {'mode':"r", - 'type':('param','system'), - } - #монтируемые диски (в т.ч. сетевые) в системе - sys_mount_dev= {'mode':"r", - 'type':('param','system'), - } - #дополнительные настройки монтируемых дисков файла /etc/fstab - sys_mount_line= {'mode':"r", - 'type':('param','system'), - } - #флаг переноса подключений из fstab - sys_set_movefstab= {'mode':"w", - 'type':('bool','system'), - 'value':True} - #раздел подкачки (swap) - sys_swap_dev= {'mode':"w", - 'type':('param','system'), - } - #строка инициализации swap-раздела файла /etc/fstab - sys_swap_line= {'mode':"r", - 'type':('conf','system'), - } - #----------------------------------------------------- - #Служебные переменные - #----------------------------------------------------- - # переменная флаг, архитектура указанная пользователем - # не совпадает с полученной из системы - dif_march= {'mode':"r", - 'type':('param','system'), - 'official':True} - #хэш доступных grub-у дисков - boot_grub_map= {'mode':"r", - 'type':('param','install'), - 'official':True} - #путь к программе host - cmd_exec_host= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #путь к программе nmap - cmd_exec_nmap= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #строка запуска emerge при сборке новой системы - cmd_run_emerge1= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #строка запуска emerge при сборке новой системы - cmd_run_emerge2= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #команда форматирования диска - cmd_run_format= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #команда инициализации OpenGL - cmd_run_opengl= {'mode':"r", - 'type':('cmd','install'), - 'official':True} - #хэш конвертации устаревшего формата hda на sda - setup_ata= {'mode':"r", - 'type':('param','install'), - 'official':False} - #версии сборок с сокращенным и полным именем - setup_dist_ver= {'mode':"r", - 'type':('param','system'), - 'value':{'CLD':"Calculate Linux Desktop", - 'CDS':"Calculate Directory Server", - 'CWS':"Calculate Web Server", - 'AcoolA':"Calculate Web Server"}, - 'official':True} - #версии сборок с сокращенным и полным именем - setup_path_other= {'mode':"r", - 'type':('param','system'), - 'value':{'profile':["/usr/calculate2/profile/", - "/usr/share/calculate/profile/"] - }, - 'official':True} - #разделительная линия в комментариях - setup_mesline= {'mode':"w", - 'type':('info','install'), - 'official':True} - #текст заголовка изменяемых конфигурационных файлов - setup_mestitle= {'mode':"w", - 'type':('info','install'), - 'official':True} - #символ разделителя версии и патча - setup_ospatchsplit={'mode':"r", - 'type':('param','install'), - 'official':True} - #список доступных патчей - setup_patches= {'mode':"r", - 'type':('param','system'), - 'official':True} - #номер патча текущей системы - sys_patchcur= {'mode':"r", - 'type':('param','system'), - 'official':True} - #номер последнего установленного патча - sys_patchlast= {'mode':"r", - 'type':('param','system'), - 'official':True} - #директории точек монтирования в системе - sys_path_mounts= {'mode':"r", - 'type':('path','system'), - 'official':True} - #номер прохода при наложении профиля - setup_pass_parser= {'mode':"r", - 'type':('param','install'), - 'official':True} - #путь к файлу calculate.ini - sys_calculate_ini= {'mode':"r", - 'type':('path','system'), - 'official':True, - 'value':'etc/calculate/calculate.env'} - #локальный путь к файлу calculate.ini - sys_calculate_ini_local= {'mode':"r", - 'type':('path','system'), - 'official':True, - 'value':'var/calculate/setup/calculate.env'} - #Удаленный путь к файлу calculate.ini - sys_calculate_ini_remote= {'mode':"r", - 'type':('path','system'), - 'official':True, - 'value':'var/calculate/remote/setup/calculate.env'} + + ##имя компьютера + #net_host + os_net_hostname = {'mode':"w"} + + ##текущая сеть + # разрешенные сети + #net_networks + os_net_allow = {} + + ##короткое название системы (CLD) + #setup_sys_shortname + os_linux_shortname={} + + ##домен + #sys_domain + os_net_domain = {'mode':"w"} + + # Пути к ini файлам + cl_env_path = {'value':['/var/calculate/remote/calculate.env', + '/var/calculate/calculate.env', + '/etc/calculate/calculate.env']}