Pull to refresh

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

Reading time 4 min
Views 2K
В процессе работы с 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, хоть на него и заточена.

Не рекомендуется для применения на продакшн серверах.
Tags:
Hubs:
+10
Comments 8
Comments Comments 8

Articles