LINUX.ORG.RU

проконсультируйте по коду

 


0

1

В питоне не шарю. Вот тут в строке 18 https://github.com/Bcfg2/bcfg2/blob/maint/src/lib/Bcfg2/Client/Tools/Portage.py . Как можно проверить определено ли значение в поле 'version' списка (а у этого спсика имя есть?) и если определено, как получить его значение для дальнейшей проверки?

ЗЫ.. Таки придется учить питон...(

Смотри класс PkgTool https://github.com/Bcfg2/bcfg2/blob/maint/src/lib/Bcfg2/Client/Tools/__init__.py . Командная строка формируется в строке 427. Конкретно, оно получает список пакетов и потом формирует команду «emerge ={package}-{version}» для каждого из пакетов.

Т.е. там где ты показываешь (строка 18) ничего не происходит, это просто темплейт комманды.

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

А мне как раз и надо определить темплейт команды в зависимости от занчения version. Например, в Portage.py изменение 18 строки на

 pkgtool = ('emerge %s', ('%s', ['name']))

делает то, что мне надо, но как видно, тут не ведется обработка значения version. Или я не прав?

Т.е. хочется что было

if version exist  or version != "auto":
    pkgtool = ('emerge %s', ('=%s-%s', ['name', 'version']))
else:
    pkgtool = ('emerge %s', ('%s', ['name']))
    
  
macumazan ★★
() автор топика
Ответ на: комментарий от macumazan

А что есть packages? Можешь дать ссылку на то где описана структура этого дела? Я так понимаю, это список пакетов, но в каком формате там описаны пакеты...

true_admin ★★★★★
()
Ответ на: комментарий от true_admin

Я наверное не совсем понял вопроса, но в целом это выглядит так. На сервере конфигураций есть плагин Pkgmgr ( https://github.com/Bcfg2/bcfg2/blob/maint/src/lib/Bcfg2/Server/Plugins/Pkgmgr.py ). Есть файл его конфигурации

<PackageList type='ebuild' priority='0'>
  <Package name='net-misc/sipcalc' version="auto" type='ebuild'/> 
</PackageList>

В реале в shell, установка пакета 'net-misc/sipcalc' возможна с указанием версии явно

emerge =net-misc/sipcalc-'version'

и по хорошему с параметром auto, который означает установку самой старшей доступной версии пакета.

emerge net-misc/sipcalc

А вот сейчас при значении auto это выглядит так

!!! '=net-misc/sipcalc-auto' is not a valid package atom.

Т.е. видно, что конкатенация при значении auto как-то не в тему, как и знак =.

macumazan ★★
() автор топика
Последнее исправление: macumazan (всего исправлений: 1)
Ответ на: комментарий от macumazan

Код у этой штуки весьма слабенький, увы. В общем, тебе надо в class Portage добавить метод плюс пару импортов. Ворнинг: код писал вслепую в терминале.

from __future__ import print_function
from functools import partial
achtung = partial(print, file=sys.stderr)
import sys

class Portage(blah-blah-blah):
...
    def _get_package_command(self, packages):
        # скажи авторам чтобы не делали такие структуры данных
        emergetpl = self.pkgtool[0]
        pkgtpl = self.pkgtool[1][0]
        fields = self.pkgtool[1][1]
        cmds = []
        for pkg in package:
          try:
            cmd = pkgtpl % tuple(pkg.get(f) for f in fields)
            cmds += [cmd]
          except Exception as err:
            achtung("OMG! Exception! Emergency parachute deployed!" \
                  "\nThe error was:", err)
            achtung("Activating dirty hack")
            cmds += [pkg.get("name")]
        return emergetpl % " ".join(cmds)

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.