Обработка XML конфигурации Citrix XenServer 5.6 Free напрямую

    В процессе работы с XenServer можно менять его конфигурацию разными способами.
    Начиная от графической утилиты XenCenter и консольной команды xe заканчивая прямым вмешательством в XML конфиг.
    Вот о последнем и хотелось бы с вами поговорить.

    Далеко не все желаемые действия можно произвести штатными утилитами. Но меняя конфигурацию напрямую, можно сделать все.
    Проанализировав содержимое файла /var/xapi/state.db вы сможете вносить даже изменения, не предусмотренные производителем или лицензией.



    Как вы наверное знаете, центр API для XenServer это демоны xapi.

    Их моторика, с точки зрения хранения конфигурации выглядит следующим образом:
    1. Старт XAPI
    2. Загрузка XML state.db в память
    3. Работа ( в это время все изменения происходят в памяти)
    4. Остановка XAPI
    5. Запись в XML state.db

    Поскольку, XAPI рубит несанкционированные изменения «на ходу», то действия лучше производить напрямую с файлом, остановив для этого сервис xapi.
    Но тут вступают в силу несколько «НО».
    Самое большое НО,- неудобство обработки файла средствами vi и других редакторов.
    НО вторичное, но от того не менее проблемное: Для XenServer критичен порядок следования аттрибутов в XML. Поэтому стандартные парсинг-методы отпадают.

    Для удобного поиска и изменения параметров в этом файле я создал утилитку xmlsh.py

    При помощи ее можно передвигаться по XML файлу как по дереву директорий и изменять необходимые параметры. В плане реализации, она представляет собой небольшой командный интерпритатор, знающие такие командочки как ls, cd, set, и.т.д. Полный список получается командой help.

    Надеюсь, администраторам XenServer понравится данная утилита.

    Ну а теперь вернемся именно к «ненормальному программированию».
    За время создания утилиты я столкнулся с массой «идеологических» сложностей.
    И прежде всего то, как реализована на питоне обработка XML. Поскольку мы ограничены версией 2.4 (на XenServer) то у нас в распоряжении 2 библиотеки: dom/minidom и ElementTree.
    Одна из них имеет удобное наследование а вторая прозрачную системы парсинга, позволяющую переопределить основные методы для имплементации «OrderedDict» (Зачем? Об этом далее).
    Таким образом, мне пришлось использовать обе:
    minidom используется как основа «динамического перемещения» и отображения содержимого.
    ElementTree используется только для редактирования и записи файла.
    Все это вынужденная мера из-за зависимости XenServer от порядка аттрибутов в теге (что есть, кстати говоря, несоблюдение стандарта).

    Таким образом, чтобы заставить ElementTree вести себя «неадекватно» понадобились следующие переопределения:

    if(ver[0]=="2"):
    #Ordered atributes tree building for Python 2.4
        def _start(self, tag, attrib_in):
            fixname = self._fixname
            tag = fixname(tag)
            attrib = odict()
            for key, value in attrib_in.items():
                attrib[fixname(key)] = self._fixtext(value)
            return self._target.start(tag, attrib)
     
        def _start_list(self, tag, attrib_in):
            fixname = self._fixname
            tag = fixname(tag)
            attrib = odict()
            if attrib_in:
                for i in range(0len(attrib_in)2):
                    attrib[fixname(attrib_in[i])] = attrib_in[i+1]
            return self._target.start(tag, attrib)
    #Replace base function with mine
        etree.XMLTreeBuilder._start_list = _start_list
        etree.XMLTreeBuilder._strt = _start


    Главное изменение в этих двух методах: мы заменяем стандартный dict на odict, позволяющий нам запоминать последовательность внесения элементов в список.
    Вторичное изменение вы можете проглядеть по коду ниже: подмена функции
    etree.ElementTree._write=_write
    и подмена метода
    etree._escape_attrib = _escape_attrib
    Таким образом, мы обеспечили «корректную» некорректную обработку нашего XML файла.
    Так как в Python 2.4 на XenServer отсутствует класс OrderedDict, то мы возьмем его с собой целиком.
    В остальном и целом, — обычная алгоритмика.

    Надеюсь, эта маленькая утилитка найдет у вас применение. Благо обрабатывать она может не только state.db, хоть на него и заточена.

    Не рекомендуется для применения на продакшн серверах.
    • +10
    • 1,8k
    • 8
    Поделиться публикацией

    Похожие публикации

    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 8

      0
      не поверите, но я как раз вчера ковырял этот файл, чтобы выяснить, до какого именно раздела на lvm диске мне нужно добраться. Теперь, когда uuid раздела мне известен, остается вопрос доступа к этому разделу без средств xenserver.
        +1
        По опыту для выполнения большинства действий с головой хватает упомянутой команды xe, благо у нее довольно дружелюбный к unix-way интерфейс. Расскажите, для каких задач понадобилось редактировать xml конфиг напрямую?
          0
          В основном он необходим для быстрого поиска необходимых параметров и связей между ними.
          Изменения, в частности, вносились для изменения роли субъектов.
          +1
          Ничего сумашедшего. Более того, в xapi есть баг с переносом мастера SR, так что смена RO атрибутов у pbd — почти штатный функционал.
            0
            Обратите внимание на внесенные изменения в библиотеку сElementTree.
            Реализация XML парсера для Python 2.4 реализующего упорядоченное хранение аттрибутов.
          • НЛО прилетело и опубликовало эту надпись здесь
              0
              Элемент внутри тэга "<row" критичных к тому, что бы первым шел «ref=» и закрывающим был "_ref".
              При парсинге стандартными библиотеками, перед тем как сохранить XML выполняется функция sort().
              После этого xapi не стартует, — в логах видно то, что он не получает ожидаемые атрибуты.
                0
                Но спасибо за наводку. По факту да, получился парсер S-exp.
                Плюсом то, что довольно универсальный.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое