XenServerでの作業中に、さまざまな方法で構成を変更できます。
XenCenterグラフィカルユーティリティおよび
xeコンソールコマンドから開始し、XML構成への直接介入で終了します。
それは後者についてであり、私はあなたと話をしたいと思います。
通常のユーティリティでは、必要なすべてのアクションを実行できるわけではありません。 ただし、構成を直接変更することで、すべてを実行できます。
/var/xapi/state.dbファイルの内容を分析した後、メーカーまたはライセンスから提供されていない変更を加えることもできます。
ご存知のとおり、XenServerのAPIセンターは
xapiデーモンです。
ストレージ構成の観点から見たそれらの運動性は次のとおりです。
1. XAPIを起動します
2. XML state.dbをメモリにロードする
3.作業(この時点で、すべての変更はメモリで発生します)
4. XAPIを停止します
5. XML state.dbへの書き込み
XAPIは「移動中」に不正な変更をカットするため、ファイルに対して直接アクションを実行し、そのために
xapiサービスを停止することをお
勧めします。
しかし、ここでいくつかの「しかし」が発効します。
最大のBUTは、
viやその他のエディターを使用したファイル処理の不便さです。
しかし、セカンダリですが、それほど問題ではありません。XenServerの場合、XMLの属性の順序は重要です。 したがって、標準の解析方法はなくなります。
このファイルのパラメーターを簡単に検索して変更するために、xmlsh.py
ユーティリティを作成しました
これを使用すると、XMLファイルをディレクトリツリーとしてナビゲートし、必要なパラメーターを変更できます。 実装に関しては、ls、cd、setなどのコマンドを知っている小さなコマンドインタープリターです。 helpコマンドで完全なリストが取得されます。
XenServer管理者がこのユーティリティを気に入ってくれることを願っています。
それでは、「異常なプログラミング」に戻りましょう。
ユーティリティの作成中に、多くの「イデオロギー」の問題に遭遇しました。
そしてまず、Python XML処理がどのように実装されているか。 バージョン2.4(XenServer)に制限されているため、自由に使用できる2つのライブラリがあります:dom / minidomとElementTree。
そのうちの1つには便利な継承があり、もう1つには「OrderedDict」を実装するための主要なメソッドを再定義できる透過的な構文解析システムがあります(理由は後で説明します)。
だから私は両方を使用しなければなりませんでした:
minidomは、動的な移動とコンテンツ表示の基盤として使用されます。
ElementTreeは、ファイルの編集と記録にのみ使用されます。
これはすべて、XenServerがタグ内の属性の順序に依存しているために必要な手段です(これは、偶然、標準に準拠していません)。
したがって、ElementTreeを「不適切に」動作させるには、次のオーバーライドが必要でした。
if ( ver [ 0 ] == "2" ) :
#Python 2.4用の属性ツリー構築を注文しました
def _start ( self 、tag、attrib_in ) :
fixname = self ._fixname
tag = fixname ( tag )
attrib = odict ( )
キーの場合、 attrib_inの値。 アイテム ( ) :
attrib [ fixname ( key ) ] = self ._fixtext ( value )
self ._targetを返します。 開始 (タグ、attrib )
def _start_list ( self 、tag、attrib_in ) :
fixname = self ._fixname
tag = fixname ( tag )
attrib = odict ( )
attrib_inの場合 :
for iの範囲 ( 0 、 len ( attrib_in ) 、 2 ) :
attrib [ fixname ( attrib_in [ i ] ) ] = attrib_in [ i + 1 ]
self ._targetを返します。 開始 (タグ、attrib )
#基本関数を私のものに置き換える
etree。 XMLTreeBuilder ._start_list = _start_list
etree。 XMLTreeBuilder ._strt = _start
これら2つのメソッドの主な変更点は、標準のdictをodictに置き換えることです。これにより、リストに要素を追加する順序を覚えることができます。
次のコードで二次的な変更を確認できます。関数置換
etree.ElementTree._write=_write
およびメソッドの置換
etree._escape_attrib = _escape_attrib
したがって、XMLファイルの「正しい」誤った処理を保証しました。
XenServer上のPython 2.4にはOrderedDictクラスがないため、全体として使用します。
それ以外の場合、通常のアルゴリズム。
この小さなユーティリティがあなたのためのアプリケーションを見つけることを願っています。 幸いなことに、state.dbだけでなく、投獄されていても処理できます。
実動サーバーでの使用は推奨されません。