21.4. LMIShell の使用

LMIShell はインタラクティブクライアントかつ非インタラクティブインタープリターで、OpenPegasus CIMOM が提供する CIM オブジェクトにアクセスするために使用できます。Python インタープリターに基づいていますが、CIM オブジェクトとの対話のための追加の関数およびクラスも実装します。

21.4.1. LMIShell の開始、使用、終了

Python インタープリターと同様に、LMIShell はLMIShell スクリプトでインタラクティブクライアントまたは非インタラクティブインタープリターとして使用できます。

インタラクティブモードでの LMIShell の開始

インタラクティブモードで LMIShell インタープリターを開始するには、lmishell コマンドを引数なしで実行します。
lmishell
デフォルトでは、LMIShell は CIMOM との接続確立を試みる際に、サーバー側の証明書を認証局のトラストストアに対して確認します。この確認を無効にするには、lmishell コマンドを --noverify オプションまたは -n オプションとともに実行します。
lmishell --noverify

Tab Completion (タブ入力) の使用

インタラクティブモードでの実行時には、LMIShell インタープリターでは Tab キーを使用した基本的なプログラミング構造体や CIM オブジェクトの入力が可能になります。これにはネームスペース、クラス、メソッド、およびオブジェクト属性が含まれます。

履歴閲覧

デフォルトでは、LMIShell はユーザーがインタラクティブプロンプトで入力したすべてのコマンドを ~/.lmishell_history ファイルに保存します。これにより、コマンド履歴が閲覧でき、インタラクティブモードで入力した行をプロンプトで再度入力することなく再使用できます。コマンド履歴で後ろに戻るには 上向き矢印 キーか Ctrl+p のキーの組み込み合わせを押します。コマンド履歴で前に進むには、下向き矢印 キーか Ctrl+n のキーの組み合わせを押します。
LMIShell は、増分逆検索もサポートします。コマンド履歴で特定の行を探すには、Ctrl+r を押してからコマンドの一部を入力します。以下に例を示します。
> (reverse-i-search)`connect': c = connect("server.example.com", "pegasus")
コマンド履歴を削除するには、以下のように clear_history() 機能を使用します。
clear_history()
コマンド履歴に保存される行数は、~/.lmishellrc 設定ファイルの history_length オプションの値を変更することで設定できます。さらに、同じ設定ファイルの history_file オプションの値を変更することで、履歴ファイルの場所を変えることができます。たとえば、履歴ファイルの場所を ~/.lmishell_history に設定し、最大 1000 行を保存するように LMIShell を設定するには、以下の行を ~/.lmishellrc ファイルに追加します。
history_file = "~/.lmishell_history"
history_length = 1000

例外処理

デフォルトでは、LMIShell インタープリターはすべての例外を処理し、戻り値を使用します。すべての例外をコードで処理するためにこの動作を無効にするには、以下のように use_exceptions() 関数を使用します。
use_exceptions()
自動例外処理を再度有効にするには、以下を使用します。
use_exception(False)
例外処理を永続的に無効にするには、~/.lmishellrc 設定ファイルの use_exceptions オプションを True に変更します。
use_exceptions = True

一時的なキャッシュの設定

デフォルト設定では、LMIShell 接続オブジェクトは一時的なキャッシュを使用して CIM クラス名および CIM クラスを保存し、ネットワーク通信を減らします。この一時的なキャッシュを削除するには、以下のように clear_cache() メソッドを使用します。
object_name.clear_cache()
object_name を接続オブジェクトの名前に置き換えます。
特定の接続オブジェクトの一時的なキャッシュを無効にするには、以下のように use_cache() メソッドを使用します。
object_name.use_cache(False)
再度これを有効にするには、以下を使用します。
object_name.use_cache(True)
接続オブジェクトの一時的なキャッシュを永続的に無効にするには、~/.lmishellrc 設定ファイルの use_cache オプションを False に変更します。
use_cache = False

LMIShell の終了

LMIShell インタープリターを終了してシェルプロンプトに戻るには、Ctrl+d のキーの組み合わせを押すか、以下のように quit() 関数を発行します。
quit()
~]$

LMIShell スクリプトの実行

LMIShell スクリプトを実行するには、以下のように lmishell コマンドを実行します。
lmishell file_name
file_name をスクリプト名に置き換えます。この実行の後に LMIShell スクリプトを検査するには、--interact または -i のコマンドラインオプションも指定します。
lmishell --interact file_name
LMIShell スクリプトのファイル拡張子は、.lmi が適切です。

21.4.2. CIMOM への接続

LMIShell では、同一システムにローカルで実行している CIMOM、またはネットワーク経由でアクセス可能なリモートマシンの CIMOM に接続できます。

リモートの CIMOM への接続

リモートの CIMOM が提供する CIM オブジェクトにアクセスするには、以下のように connect() 関数を使用して接続オブジェクトを作成します。
connect(host_name, user_name[, password])
host_name を管理システムのホスト名に、user_name をそのシステム上で実行中の OpenPegasus CIMOM に接続許可されているユーザー名に、password をユーザーのパスワードに置き換えます。パスワードを省略すると、LMIShell によりパスワードの入力が求められます。この関数は LMIConnection オブジェクトを返します。

例21.1 リモートの CIMOM への接続

server.example.com 上で実行中の OpenPegasus CIMOM にユーザー pegasus として接続するには、インタラクティブプロンプトに以下のコマンドを入力します。
c = connect("server.example.com", "pegasus")
password:
>

ローカルの CIMOM への接続

LMIShell では、Unix ソケットを使用することでローカルの CIMOM に接続できます。この種の接続では、LMIShell インタープリターを root ユーザーとして実行し、/var/run/tog-pegasus/cimxml.socket ソケットが存在する必要があります。
ローカルの CIMOM が提供する CIM オブジェクトにアクセスするには、以下のように connect() 関数を使用して接続オブジェクトを作成します。
connect(host_name)
host_namelocalhost127.0.0.1、または ::1 のいずれかで置き換えます。関数は LMIConnection オブジェクトか None を返します。

例21.2 ローカルの CIMOM への接続

localhost 上で実行中の OpenPegasus CIMOM に root ユーザーとして接続するには、インタラクティブプロンプトに以下のコマンドを入力します。
c = connect("localhost")
>

CIMOM への接続の確認

connect() 関数は、LMIConnection オブジェクト、または接続が確立されないと None を返します。さらに、connect() 関数が接続確立に失敗すると、標準エラー出力にエラーメッセージを出力します。
CIMOM への接続が正常に確立されたことを確認するには、以下のように isinstance() 関数を使用します。
isinstance(object_name, LMIConnection)
object_name を接続オブジェクト名に置き換えます。この関数は、object_nameLMIConnection オブジェクトの場合は True を、それ以外の場合は False を返します。

例21.3 CIMOM への接続の確認

例21.1「リモートの CIMOM への接続」 で作成した c 変数に LMIConnection オブジェクトが含まれていることを確認するには、インタラクティブプロンプトに以下のコマンドを入力します。
isinstance(c, LMIConnection)
True
>
または、cNone でないことを確認することもできます。
c is None
False
>

21.4.3. ネームスペースの使用

LMIShell ネームスペースは、利用可能なクラスを組織化する自然な方法を提供し、他のネームスペースおよびクラスへの階層的なアクセスポイントとして機能します。root ネームスペースは、接続オブジェクトの最初のエントリーポイントです。

利用可能なネームスペースの一覧表示

利用可能なネームスペースの一覧を表示するには、以下のように print_namespaces() メソッドを使用します。
object_name.print_namespaces()
object_name を、検査するオブジェクト名に置き換えます。このメソッドは、利用可能なネームスペースを標準出力に出力します。
利用可能なネームスペース一覧を取得するには、オブジェクト属性 namespaces にアクセスします。
object_name.namespaces
これは文字列の一覧を返します。

例21.4 利用可能なネームスペースの一覧表示

例21.1「リモートの CIMOM への接続」 で作成した c 接続オブジェクトの root ネームスペースオブジェクトを検査するには、インタラクティブプロンプトに以下のコマンドを入力します。
c.root.print_namespaces()
cimv2
interop
PG_InterOp
PG_Internal
>
このネームスペースの一覧を変数 root_namespaces に割り当てるには、以下を入力します。
root_namespaces = c.root.namespaces
>

ネームスペースオブジェクトへのアクセス

特定のネームスペースオブジェクトにアクセスするには、以下の構文を使用します。
object_name.namespace_name
object_name を検査するオブジェクト名に置き換え、namespace_name をアクセスするネームスペース名に置き換えます。これは LMINamespace オブジェクトを返します。

例21.5 ネームスペースオブジェクトへのアクセス

例21.1「リモートの CIMOM への接続」 で作成した c 接続オブジェクトの cimv2 ネームスペースにアクセスするには、インタラクティブプロンプトに以下のコマンドを入力します。
ns = c.root.cimv2

21.4.4. クラスの使用

LMIShell クラスは、CIMOM が提供するクラスを表します。これらのプロパティー、メソッド、インスタンス、インスタンス名、および ValueMap プロパティーにアクセスしたりこれらを一覧表示したりでき、ドキュメンテーションストリングを出力したり、新たなインスタンスやインスタンス名を作成できます。

利用可能なクラスの一覧表示

特定のネームスペースで利用可能なクラスを一覧表示するには、以下のように print_classes() メソッドを使用します。
namespace_object.print_classes()
namespace_object を検査するネームスペースオブジェクトに置き換えます。このメソッドは、利用可能なクラスを標準出力に出力します。
利用可能なクラス一覧を取得するには、classes() メソッドを使用します。
namespace_object.classes()
このメソッドは文字列の一覧を返します。

例21.6 利用可能なクラスの一覧表示

例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを検査して利用可能なクラスを一覧表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
ns.print_classes()
CIM_CollectionInSystem
CIM_ConcreteIdentity
CIM_ControlledBy
CIM_DeviceSAPImplementation
CIM_MemberOfStatusCollection
...
>
このクラスの一覧を変数 cimv2_classes に割り当てるには、以下を入力します。
cimv2_classes = ns.classes()
>

クラスオブジェクトへのアクセス

CIMOM が提供する特定のクラスオブジェクトにアクセスするには、以下の構文を使用します。
namespace_object.class_name
namespace_object を、検査するネームスペースオブジェクト名にに置き換え、class_name を、アクセスするクラス名に置き換えます。

例21.7 クラスオブジェクトへのアクセス

例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトの LMI_IPNetworkConnection クラスにアクセスし、これを変数 cls に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
cls = ns.LMI_IPNetworkConnection
>

クラスオブジェクトの検査

すべてのクラスオブジェクトには、その名前と所属するネームスペースに関する情報、および詳細なクラスのドキュメンテーションが保存されています。特定のクラスオブジェクトの名前を取得するには、以下の構文を使用します。
class_object.classname
class_object を、検査するクラスオブジェクト名に置き換えます。これは、オブジェクト名を表す文字列を返します。
クラスオブジェクトが所属するネームスペースに関する情報を取得するには、以下を使用します。
class_object.namespace
これは、ネームスペースを表す文字列を返します。
詳細なクラスのドキュメンテーションを表示するには、以下のように doc() メソッドを使用します。
class_object.doc()

例21.8 クラスオブジェクトの検査

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトを検査して、その名前と対応するネームスペースを表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.classname
'LMI_IPNetworkConnection'
> cls.namespace
'root/cimv2'
>
クラスのドキュメンテーションにアクセスするには、以下を入力します。
cls.doc()
Class: LMI_IPNetworkConnection
    SuperClass: CIM_IPNetworkConnection
    [qualifier] string UMLPackagePath: 'CIM::Network::IP'

    [qualifier] string Version: '0.1.0'
...

利用可能なメソッドの一覧表示

特定のクラスオブジェクトで利用可能なメソッドの一覧を表示するには、以下のように print_methods() メソッドを使用します。
class_object.print_methods()
class_object を、検査するクラスオブジェクト名に置き換えます。このメソッドは、利用可能なメソッドを標準出力に出力します。
利用可能なメソッド一覧を取得するには、methods() メソッドを使用します。
class_object.methods()
このメソッドは文字列の一覧を返します。

例21.9 利用可能なメソッドの一覧表示

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトを検査して利用可能なメソッドの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.print_methods()
RequestStateChange
>
このメソッドの一覧を変数 service_methods に割り当てるには、以下を入力します。
service_methods = cls.methods()
>

利用可能なプロパティーの一覧表示

特定のクラスオブジェクトで利用可能なプロパティーの一覧を表示するには、以下のように print_properties() メソッドを使用します。
class_object.print_properties()
class_object を、検査するクラスオブジェクト名に置き換えます。このメソッドは、利用可能なプロパティーを標準出力に出力します。
利用可能なプロパティー一覧を取得するには、properties() メソッドを使用します。
class_object.properties()
このメソッドは文字列の一覧を返します。

例21.10 利用可能なプロパティーの一覧表示

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトを検査して利用可能なすべてのプロパティーの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.print_properties()
RequestedState
HealthState
StatusDescriptions
TransitioningToState
Generation
...
>
このクラス一覧を変数 service_properties に割り当てるには、以下を入力します。
service_properties = cls.properties()
>

ValueMap プロパティーの一覧表示と閲覧

CIM クラスには、Managed Object Format (MOF) 定義で ValueMap プロパティー が含まれる場合があります。ValueMap プロパティーには定数値が含まれ、これはメソッドを呼び出す場合や戻り値をチェックする場合に便利なものです。
特定のクラスオブジェクトの利用可能な ValueMap プロパティーの一覧を表示するには、以下のように print_valuemap_properties() メソッドを使用します。
class_object.print_valuemap_properties()
class_object を、検査するクラスオブジェクト名に置き換えます。このメソッドは、利用可能な ValueMap プロパティーを標準出力に出力します。
利用可能な ValueMap プロパティーの一覧を取得するには、valuemap_properties() メソッドを使用します。
class_object.valuemap_properties()
このメソッドは文字列の一覧を返します。

例21.11 ValueMap プロパティーの一覧表示

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトを検査して、利用可能な ValueMap プロパティーの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.print_valuemap_properties()
RequestedState
HealthState
TransitioningToState
DetailedStatus
OperationalStatus
...
>
この ValueMap プロパティー一覧を変数 service_valuemap_properties に割り当てるには、以下を入力します。
service_valuemap_properties = cls.valuemap_properties()
>
特定の ValueMap プロパティーにアクセスするには、以下の構文を使用します。
class_object.valuemap_propertyValues
valuemap_property を、アクセスする ValueMap プロパティー名に置き換えます。
利用可能な定数値の一覧を表示するには、以下のように print_values() メソッドを使用します。
class_object.valuemap_propertyValues.print_values()
このメソッドは、名前の付いた利用可能な定数値を標準出力に出力します。また、values() メソッドを使用して利用可能な定数値の一覧を取得することもできます。
class_object.valuemap_propertyValues.values()
このメソッドは文字列の一覧を返します。

例21.12 ValueMap プロパティーへのアクセス

例21.11「ValueMap プロパティーの一覧表示」 では、ValueMap プロパティー RequestedState について説明しました。このプロパティーを検査して、利用可能な定数値の一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.RequestedStateValues.print_values()
Reset
NoChange
NotApplicable
Quiesce
Unknown
...
>
この定数値の一覧を変数 requested_state_values に割り当てるには、以下を入力します。
requested_state_values = cls.RequestedStateValues.values()
>
特定の定数値にアクセスするには、以下の構文を使用します。
class_object.valuemap_propertyValues.constant_value_name
constant_value_name を、定数値の名前を置き換えます。また、以下のように value() メソッドを使用することもできます。
class_object.valuemap_propertyValues.value("constant_value_name")
特定の定数値の名前を確認するには、value_name() メソッドを使用します。
class_object.valuemap_propertyValues.value_name("constant_value")
このメソッドは文字列を返します。

例21.13 定数値へのアクセス

例21.12「ValueMap プロパティーへのアクセス」 では、RequestedState プロパティーが定数値 Reset を提供していました。この名前の定数値にアクセスするには、インタラクティブプロンプトに以下のコマンドを入力します。
cls.RequestedStateValues.Reset
11
> cls.RequestedStateValues.value("Reset")
11
>
この定数値の名前を確認するには、以下を入力します。
cls.RequestedStateValues.value_name(11)
u'Reset'
>

CIMClass オブジェクトの取り込み

クラスメソッドの多くは CIMClass オブジェクトへのアクセスを必要としません。呼び出されたメソッドがこのオブジェクトを実際に必要とする場合に限り、LMIShell が CIMOM からオブジェクトを取り込むのはこのためです。CIMClass オブジェクトを手動で取り込むには、以下のように fetch() メソッドを使用します。
class_object.fetch()
class_object を、クラスオブジェクト名に置き換えます。CIMClass オブジェクトへのアクセスを必要とするメソッドは、これを自動的に取り込むことに注意してください。

21.4.5. インスタンスの使用

LMIShell インスタンスは、CIMOM が提供するインスタンスを表します。プロパティーの取得や設定、メソッドの一覧表示や呼び出し、ドキュメンテーション文字列の表示、関連オブジェクト一覧の取得、修正されたオブジェクトの CIMOM へのプッシュ、CIMOM から個別インスタンスの削除が行えます。

インスタンスへのアクセス

特定のクラスオブジェクトの利用可能なインスタンスをすべて取得するには、以下のように instances() メソッドを使用します。
class_object.instances()
class_object を、検査するクラスオブジェクト名に置き換えます。このメソッドは、LMIInstance オブジェクトの一覧を返します。
クラスオブジェクトの最初のインスタンスにアクセスするには、first_instance() メソッドを使用します。
class_object.first_instance()
このメソッドは、LMIInstance オブジェクトを返します。
instances() および first_instance() は、インスタンスの一覧を表示したり、最初のインスタンスを返したりするほかにも、オプションの引数をサポートして結果をフィルターすることもできます。
class_object.instances(criteria)
class_object.first_instance(criteria)
criteria を、鍵と値のペアで構成される辞書に置き換えます。この鍵はインスタンスプロパティーを表し、値はこのプロパティーの必要な値を表します。

例21.14 インスタンスへのアクセス

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトの最初のインスタンスで、eth0 と同等の ElementName プロパティーがあるものを見つけ、これを変数 device に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
device = cls.first_instance({"ElementName": "eth0"})
>

インスタンスの検査

すべてのインスタンスオブジェクトには、そのクラス名と所属するネームスペースに関する情報、およびプロパティーと値に関する詳細なドキュメンテーションが保存されています。さらに、インスタンスオブジェクトを使用すると、一意の ID オブジェクトを検索できます。
特定のインスタンスオブジェクトのクラス名を取得するには、以下の構文を使用します。
instance_object.classname
instance_object を、検査するインスタンスオブジェクト名に置き換えます。これは、クラス名を表す文字列を返します。
インスタンスオブジェクトが所属するネームスペースに関する情報を取得するには、以下を使用します。
instance_object.namespace
これは、ネームスペースを表す文字列を返します。
インスタンスオブジェクト用に一意の ID オブジェクトを検索するには、以下を使用します。
instance_object.path
これは、LMIInstanceName オブジェクトを返します。
最後に、詳細なドキュメンテーションを表示するには、以下のように doc() メソッドを使用します。
instance_object.doc()

例21.15 インスタンスの検査

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトを検査して、そのクラス名と対応するネームスペースを表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.classname
u'LMI_IPNetworkConnection'
> device.namespace
'root/cimv2'
>
インスタンスオブジェクトのドキュメンテーションにアクセスするには、以下を入力します。
device.doc()
Instance of LMI_IPNetworkConnection
    [property] uint16 RequestedState = '12'

    [property] uint16 HealthState

    [property array] string [] StatusDescriptions
...

新規インスタンスの作成

いくつかの CIM プロバイダーでは、特定のクラスオブジェクトの新規インスタンスを作成できます。クラスオブジェクトの新規インスタンスを作成するには、以下のように create_instance() メソッドを使用します。
class_object.create_instance(properties)
class_object をクラスオブジェクト名に、properties を鍵と値のペアで構成される辞書に置き換えます。この鍵はインスタンスプロパティーを表し、値はプロパティーの値を表します。このメソッドは、LMIInstance オブジェクトを返します。

例21.16 新規インスタンスの作成

LMI_Group クラスはシステムグループを表し、LMI_Account クラスは管理システム上のユーザーアカウントを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用して、システムグループ pegasus と、ユーザー lmishell-user 用にこれら 2 つのクラスのインスタンスを作成し、そのインスタンスを group 変数および user 変数に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
group = ns.LMI_Group.first_instance({"Name" : "pegasus"})user = ns.LMI_Account.first_instance({"Name" : "lmishell-user"})
>
lmishell-user ユーザー用に LMI_Identity クラスのインスタンスを取得するには、以下を入力します。
identity = user.first_associator(ResultClass="LMI_Identity")
>
LMI_MemberOfGroup クラスは、システムグループのメンバーシップを表します。LMI_MemberOfGroup クラスを使用して lmishell-userpegasus グループに追加するには、以下のようにこのクラスの新規インスタンスを作成します。
ns.LMI_MemberOfGroup.create_instance({
...     "Member" : identity.path,
...     "Collection" : group.path})
LMIInstance(classname="LMI_MemberOfGroup", ...)
>

個別インスタンスの削除

CIMOM から特定のインスタンスを削除するには、以下のように delete() メソッドを使用します。
instance_object.delete()
instance_object を、削除するインスタンスオブジェクト名に置き換えます。このメソッドはブール値を返します。インスタンスを削除すると、そのプロパティーとメソッドにはアクセスできなくなることに注意してください。

例21.17 個別インスタンスの削除

LMI_Account クラスは、管理システム上のユーザーアカウントを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用して、ユーザー lmishell-user 用に LMI_Account クラスのインスタンスを作成し、それを変数 user に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
user = ns.LMI_Account.first_instance({"Name" : "lmishell-user"})
>
このインスタンスを削除して、システムから lmishell-user を取り除くには、以下を入力します。
user.delete()
True
>

利用可能なプロパティーの一覧表示とアクセス

特定のインスタンスオブジェクトの利用可能なプロパティーの一覧を表示するには、以下のように print_properties() メソッドを使用します。
instance_object.print_properties()
instance_object を、検査するインスタンスオブジェクト名に置き換えます。このメソッドは、利用可能なプロパティーを標準出力に出力します。
利用可能なプロパティー一覧を取得するには、properties() メソッドを使用します。
instance_object.properties()
このメソッドは文字列の一覧を返します。

例21.18 利用可能なプロパティーの一覧表示

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトを検査して、利用可能なプロパティーの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.print_properties()
RequestedState
HealthState
StatusDescriptions
TransitioningToState
Generation
...
>
このプロパティーの一覧を変数 device_properties に割り当てるには、以下を入力します。
device_properties = device.properties()
>
特定のプロパティーの現在の値を取得するには、以下の構文を使用します。
instance_object.property_name
property_name を、アクセスするプロパティー名に置き換えます。
特定のプロパティーの値を修正するには、以下のように値を割り当てます。
instance_object.property_name = value
value を、プロパティーの新たな値に置き換えます。CIMOM への変更を伝達するには、push() メソッドも実行する必要があることに注意してください。
instance_object.push()
このメソッドは、戻り値、戻り値のパラメーター、およびエラー文字列で構成される 3 項目タプルを返します。

例21.19 個別プロパティーへのアクセス

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトを検査して、プロパティー SystemName の値を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.SystemName
u'server.example.com'
>

利用可能なメソッドの一覧表示と使用

特定のインスタンスオブジェクトの利用可能なメソッド一覧を表示するには、以下のように print_methods() メソッドを使用します。
instance_object.print_methods()
instance_object を、検査するインスタンスオブジェクト名に置き換えます。このメソッドは、利用可能なメソッドを標準出力に出力します。
利用可能なメソッド一覧を取得するには、methods() メソッドを使用します。
instance_object.methods()
このメソッドは文字列の一覧を返します。

例21.20 利用可能なメソッドの一覧表示

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトを検査して利用可能なメソッドの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.print_methods()
RequestStateChange
>
これらメソッドの一覧を変数 network_device_methods に割り当てるには、以下を入力します。
network_device_methods = device.methods()
>
特定のメソッドを呼び出すには、以下の構文を使用します。
instance_object.method_name(
    parameter=value,
    ...)
instance_object を、使用するインスタンスオブジェクト名に、method_name を、呼び出すメソッド名に、parameter を、設定するパラメーター名に、value を、このパラメーターの値に置き換えます。メソッドは、戻り値、戻り値のパラメーター、およびエラー文字列で構成される 3 項目タプルを返します。

重要

LMIInstance オブジェクトは、自動的にそのコンテンツ (プロパティー、メソッド、修飾子など) を更新しません。自動的に更新するようにするには、以下のように refresh() メソッドを使用します。

例21.21 メソッドの使用

PG_ComputerSystem クラスはシステムを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用してこのクラスのインスタンスを作成し、これを変数 sys に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
sys = ns.PG_ComputerSystem.first_instance()
>
LMI_AccountManagementService クラスは、システム内でユーザーおよびグループの管理を可能にするメソッドを実装します。このクラスのインスタンスを作成して変数 acc に割り当てるには、以下を使用します。
acc = ns.LMI_AccountManagementService.first_instance()
>
システムに lmishell-user という名前の新規ユーザーを作成するには、以下のように CreateAccount() メソッドを使用します。
acc.CreateAccount(Name="lmishell-user", System=sys)
LMIReturnValue(rval=0, rparams=NocaseDict({u'Account': LMIInstanceName(classname="LMI_Account"...), u'Identities': [LMIInstanceName(classname="LMI_Identity"...), LMIInstanceName(classname="LMI_Identity"...)]}), errorstr='')
LMIShell は、同期メソッド呼び出しをサポートします。このメソッドを使用すると、LMIShell は対応するジョブオブジェクトがその状態を finished に変更するまで待機し、その後にこのジョブの戻り値パラメーターを返します。特定のメソッドが以下のいずれかのクラスのオブジェクトを返す場合、LMIShell は同期メソッド呼び出しを実行できます。
  • LMI_StorageJob
  • LMI_SoftwareInstallationJob
  • LMI_NetworkJob
LMIShell は、最初に、待機メソッドに indication を使用します。それが失敗すると、代わりにポーリングメソッドを使います。
同期メソッド呼び出しを実行するには、以下の構文を使用します。
instance_object.Syncmethod_name(
    parameter=value,
    ...)
instance_object を、使用するインスタンスオブジェクト名に、method_name を、呼び出すメソッド名に、parameter を、設定するパラメーター名に、そして value をこのパラメーターの値に置き換えます。すべての同期メソッドには、その名前に Sync 接頭辞があり、ジョブの戻り値、ジョブの戻り値のパラメーター、およびジョブのエラー文字列で構成される 3 項目タプルを返します。
また、LMIShell がポーリングメソッドのみを使用するように強制することもできます。これを行うには、以下のように PreferPolling パラメーターを指定します。
instance_object.Syncmethod_name(
    PreferPolling=True
    parameter=value,
    ...)

ValueMap パラメーターの一覧表示と閲覧

CIM メソッドには、Managed Object Format (MOF) 定義で ValueMap パラメーター が含まれる場合があります。ValueMap パラメーターには定数値が含まれます。
特定メソッドで利用可能な ValueMap パラメーターの一覧を表示するには、以下のように print_valuemap_parameters() メソッドを使用します。
instance_object.method_name.print_valuemap_parameters()
instance_object を、検査するインスタンスオブジェクト名に置き換え、method_name を、検査するメソッド名に置き換えます。このメソッドは、利用可能な ValueMap パラメーターを標準出力に出力します。
利用可能な ValueMap パラメーターの一覧を取得するには、valuemap_parameters() メソッドを使用します。
instance_object.method_name.valuemap_parameters()
このメソッドは文字列の一覧を返します。

例21.22 ValueMap パラメーターの一覧表示

例21.21「メソッドの使用」 で作成した acc インスタンスオブジェクトを検査して、CreateAccount() メソッドで利用可能な ValueMap パラメーターの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
acc.CreateAccount.print_valuemap_parameters()
CreateAccount
>
この ValueMap パラメーターの一覧を変数 create_account_parameters に割り当てるには、以下を入力します。
create_account_parameters = acc.CreateAccount.valuemap_parameters()
>
特定の ValueMap パラメーターにアクセスするには、以下の構文を使用します。
instance_object.method_name.valuemap_parameterValues
valuemap_parameter を、アクセスする ValueMap パラメーター名に置き換えます。
利用可能な定数値の一覧を表示するには、以下のように print_values() メソッドを使用します。
instance_object.method_name.valuemap_parameterValues.print_values()
このメソッドは、名前の付いた利用可能な定数値を標準出力に出力します。また、values() メソッドを使用して利用可能な定数値の一覧を取得することもできます。
instance_object.method_name.valuemap_parameterValues.values()
このメソッドは文字列の一覧を返します。

例21.23 ValueMap パラメーターへのアクセス

例21.22「 ValueMap パラメーターの一覧表示」 では、ValueMap パラメーター CreateAccount について説明しました。このパラメーターを検査して利用可能な定数値の一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
acc.CreateAccount.CreateAccountValues.print_values()
Operationunsupported
Failed
Unabletosetpasswordusercreated
Unabletocreatehomedirectoryusercreatedandpasswordset
Operationcompletedsuccessfully
>
この定数値の一覧を変数 create_account_values に割り当てるには、以下を入力します。
create_account_values = acc.CreateAccount.CreateAccountValues.values()
>
特定の定数値にアクセスするには、以下の構文を使用します。
instance_object.method_name.valuemap_parameterValues.constant_value_name
constant_value_name を、定数値の名前を置き換えます。また、以下のように value() メソッドを使用することもできます。
instance_object.method_name.valuemap_parameterValues.value("constant_value_name")
特定の定数値の名前を確認するには、value_name() メソッドを使用します。
instance_object.method_name.valuemap_parameterValues.value_name("constant_value")
このメソッドは文字列を返します。

例21.24 定数値へのアクセス

例21.23「ValueMap パラメーターへのアクセス」 では、CreateAccount ValueMap パラメーターが定数値 Failed を提供していました。この名前の定数値にアクセスするには、インタラクティブプロンプトに以下のコマンドを入力します。
acc.CreateAccount.CreateAccountValues.Failed
2
> acc.CreateAccount.CreateAccountValues.value("Failed")
2
>
この定数値の名前を確認するには、以下を入力します。
acc.CreateAccount.CreateAccountValues.value_name(2)
u'Failed'
>

インスタンスオブジェクトの更新

LMIShell が使用するローカルオブジェクトは、CIMOM 側での CIM オブジェクトを表し、このオブジェクトが LMIShell のオブジェクトと連携中に変更されると、古くなる場合があります。特定のインスタンスオブジェクトのプロパティーとメソッドを更新するには、以下のように refresh() メソッドを使用します。
instance_object.refresh()
instance_object を、更新するオブジェクト名に置き換えます。このメソッドは、戻り値、戻り値のパラメーター、およびエラー文字列で構成される 3 項目タプルを返します。

例21.25 インスタンスオブジェクトの更新

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトのプロパティーとメソッドを更新するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.refresh()
LMIReturnValue(rval=True, rparams=NocaseDict({}), errorstr='')
>

MOF 表現の表示

インスタンスオブジェクトの MOF (Managed Object Format) 表現を表示するには、以下のように tomof() メソッドを使用します。
instance_object.tomof()
instance_object を、検査するインスタンスオブジェクト名に置き換えます。このメソッドは、オブジェクトの MOF 表現を標準出力に出力します。

例21.26 MOF 表現の表示

例21.14「インスタンスへのアクセス」 で作成した device インスタンスオブジェクトの MOF 表現を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device.tomof()
instance of LMI_IPNetworkConnection {
        RequestedState = 12;
        HealthState = NULL;
        StatusDescriptions = NULL;
        TransitioningToState = 12;
...

21.4.6. インスタンス名の使用

LMIShell インスタンス名は、プライマリーキーとその値のセットを持つオブジェクトです。この種類のオブジェクトは、インスタンスを正確に識別します。

インスタンス名へのアクセス

CIMInstance オブジェクトは CIMInstanceName オブジェクトにより識別されます。利用可能なインスタンス名オブジェクトの一覧を取得するには、以下のように instance_names() メソッドを使用します。
class_object.instance_names()
class_object を、検査するクラスオブジェクト名に置き換えます。このメソッドは、LMIInstanceName オブジェクトの一覧を返します。
クラスオブジェクトの最初のインスタンス名オブジェクトにアクセスするには、first_instance_name() メソッドを使用します。
class_object.first_instance_name()
このメソッドは、LMIInstanceName オブジェクトを返します。
instance_names()first_instance_name() は、インスタンス名オブジェクトの一覧を表示したり、最初のインスタンス名オブジェクトを返したりするほかにも、オプションの引数をサポートして結果をフィルターすることもできます。
class_object.instance_names(criteria)
class_object.first_instance_name(criteria)
criteria を、鍵と値のペアで構成される辞書で置き換えます。この鍵は鍵プロパティーを表し、値はこの鍵プロパティーの必要な値を表します。

例21.27 インスタンス名へのアクセス

例21.7「クラスオブジェクトへのアクセス」 で作成した cls クラスオブジェクトの最初のインスタンス名で、 eth0 と同等の Name 鍵プロパティーがあるものを見つけ、これを変数 device_name に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
device_name = cls.first_instance_name({"Name": "eth0"})
>

インスタンス名の検査

すべてのインスタンス名オブジェクトには、そのクラス名と、所属するネームスペースに関する情報が保存されています。
特定のインスタンス名オブジェクトのクラス名を取得するには、以下の構文を使用します。
instance_name_object.classname
instance_name_object を、検査するインスタンス名オブジェクトの名前に置き換えます。これは、クラス名を表す文字列を返します。
インスタンス名オブジェクトが所属するネームスペースに関する情報を取得するには、以下を使用します。
instance_name_object.namespace
これは、ネームスペースを表す文字列を返します。

例21.28 インスタンス名の検査

例21.27「インスタンス名へのアクセス」 で作成した device_name インスタンス名オブジェクトを検査して、そのクラス名と対応するネームスペースを表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device_name.classname
u'LMI_IPNetworkConnection'
> device_name.namespace
'root/cimv2'
>

新規インスタンス名の作成

LMIShell では、リモートオブジェクトのプライマリーキーがすべて分かっている場合に、新規のラップ済み CIMInstanceName オブジェクトを作成して、このインスタンス名オブジェクトを使用して、インスタンスオブジェクト全体を取得することができるようになります。
クラスオブジェクトの新規インスタンス名を作成するには、以下のように new_instance_name() メソッドを使用します。
class_object.new_instance_name(key_properties)
class_object をクラスオブジェクト名に置き換え、key_properties を、鍵と値のペアで構成される辞書に置き換えます。この鍵は鍵プロパティーを表し、値は鍵プロパティーの値を表します。このメソッドは、LMIInstanceName オブジェクトを返します。

例21.29 新規インスタンス名の作成

LMI_Account クラスは、管理システムのユーザーアカウントを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用して、管理システムの lmishell-user ユーザーを表す LMI_Account クラスの新規インスタンス名を作成するには、インタラクティブプロンプトに以下のコマンドを入力します。
instance_name = ns.LMI_Account.new_instance_name({
...     "CreationClassName" : "LMI_Account",
...     "Name" : "lmishell-user",
...     "SystemCreationClassName" : "PG_ComputerSystem",
...     "SystemName" : "server"})
>

鍵プロパティーの一覧表示とアクセス

特定のインスタンス名オブジェクトの利用可能な鍵プロパティーの一覧を表示するには、以下のように print_key_properties() メソッドを使用します。
instance_name_object.print_key_properties()
instance_name_object を、検査するインスタンス名オブジェクトの名前に置き換えます。このメソッドは、利用可能な鍵プロパティーを標準出力に出力します。
利用可能な鍵プロパティーの一覧を取得するには、key_properties() メソッドを使用します。
instance_name_object.key_properties()
このメソッドは文字列の一覧を返します。

例21.30 利用可能な鍵プロパティーの一覧表示

例21.27「インスタンス名へのアクセス」 で作成した device_name インスタンス名オブジェクトを検査して、利用可能な鍵プロパティーの一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device_name.print_key_properties()
CreationClassName
SystemName
Name
SystemCreationClassName
>
この鍵プロパティーの一覧を変数 device_name_properties に割り当てるには、以下を入力します。
device_name_properties = device_name.key_properties()
>
特定の鍵プロパティーの現在の値を取得するには、以下の構文を使用します。
instance_name_object.key_property_name
key_property_name をアクセスする鍵プロパティー名に置き換えます。

例21.31 個別の鍵プロパティーへのアクセス

例21.27「インスタンス名へのアクセス」 で作成した device_name インスタンス名オブジェクトを検査して、鍵プロパティー SystemName の値を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
device_name.SystemName
u'server.example.com'
>

インスタンス名のインスタンスへの変換

インスタンス名はインスタンスに変換できます。これを行うには、以下のように to_instance() メソッドを使用します。
instance_name_object.to_instance()
instance_name_object を、変換するインスタンス名オブジェクトの名前に置き換えます。このメソッドは、LMIInstance オブジェクトを返します。

例21.32 インスタンス名のインスタンスへの変換

例21.27「インスタンス名へのアクセス」 で作成した device_name インスタンス名オブジェクトをインスタンスオブジェクト変換して、変数 device に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
device = device_name.to_instance()
>

21.4.7. 関連するオブジェクトの使用

Common Information Model は、管理オブジェクト間の関係を定義します。

関連するインスタンスへのアクセス

特定のインスタンスオブジェクトに関連するオブジェクトの一覧を取得するには、以下のように associators() メソッドを使用します。
instance_object.associators(
    AssocClass=class_name,
    ResultClass=class_name,
    ResultRole=role,
    IncludeQualifiers=include_qualifiers,
    IncludeClassOrigin=include_class_origin,
    PropertyList=property_list)
特定のインスタンスオブジェクトに関連する最初のオブジェクトにアクセスするには、first_associator() メソッドを使用します。
instance_object.first_associator(
    AssocClass=class_name,
    ResultClass=class_name,
    ResultRole=role,
    IncludeQualifiers=include_qualifiers,
    IncludeClassOrigin=include_class_origin,
    PropertyList=property_list)
instance_object を、検査するインスタンスオブジェクト名に置き換えます。以下のパラメーターを指定すると結果をフィルターにかけられます。
  • AssocClass: 返される各オブジェクトは、このクラスまたはそのサブクラスの 1 つのインスタンスを通してソースオブジェクトに関連付けられている必要があります。デフォルト値は None です。
  • ResultClass: 返される各オブジェクトは、このクラスのインスタンスかそのサブクラスの 1 つのインスタンスである必要があります。または、このクラスもしくはそのサブクラスの 1 つである必要があります。デフォルト値は None です。
  • Role: 返される各オブジェクトは、ソースオブジェクトが特定の役割を果たす関連付けでソースオブジェクトと関連付けられている必要があります。ソースオブジェクトを参照する関連付けクラス内のプロパティー名は、このパラメーターの値と合致する必要があります。デフォルト値は None です。
  • ResultRole: 返される各オブジェクトは、返されるオブジェクトが特定の役割を果たす関連付けでソースオブジェクトと関連付けられている必要があります。返されるオブジェクトを参照する関連付けクラス内のプロパティー名は、このパラメーターの値と合致する必要があります。デフォルト値は None です。
他のパラメーターは以下のとおりです。
  • IncludeQualifiers: 応答に各オブジェクトのすべての修飾子 (オブジェクトおよび返されたすべてのプロパティー上の修飾子を含む) を QUALIFIER 要素として含めるかどうかを示すブール値。デフォルト値は False です。
  • IncludeClassOrigin: 返された各オブジェクトで適切なすべての要素に CLASSORIGIN 属性が存在すべきかどうかを示すブール値。デフォルト値は False です。
  • PropertyList: このリストのメンバーは 1 つ以上のプロパティー名を定義します。返されたオブジェクトには、このリストにないプロパティーの要素が含まれません。PropertyList が空の場合、返されるオブジェクトにはプロパティーが含まれません。None の場合は、追加のフィルタリングは定義されません。デフォルト値は None です。

例21.33 関連するインスタンスへのアクセス

LMI_StorageExtent クラスは、システム内で利用可能なブロックデバイスを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用して、ブロックデバイス /dev/vda 用に LMI_StorageExtent クラスのインスタンスを作成し、これを変数 vda に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
vda = ns.LMI_StorageExtent.first_instance({
...     "DeviceID" : "/dev/vda"})
>
このブロックデバイスにおけるディスクパーティションの一覧を取得して、これを変数 vda_partitions に割り当てるには、以下のように associators() メソッドを使用します。
vda_partitions = vda.associators(ResultClass="LMI_DiskPartition")

関連するインスタンス名へのアクセス

特定のインスタンスオブジェクトで関連するインスタンス名の一覧を取得するには、以下のように associator_names() メソッドを使用します。
instance_object.associator_names(
    AssocClass=class_name,
    ResultClass=class_name,
    Role=role,
    ResultRole=role)
特定のインスタンスオブジェクトで最初に関連するインスタンス名にアクセスするには、first_associator_name() メソッドを使用します。
instance_object.first_associator_name(
    AssocClass=class_object,
    ResultClass=class_object,
    Role=role,
    ResultRole=role)
instance_object を、検査するインスタンスオブジェクト名に置き換えます。以下のパラメーターを指定すると結果をフィルターにかけられます。
  • AssocClass: 返される名前によりオブジェクトが識別されます。このオブジェクトは、このクラス、またはそのいずれかのサブクラスのインスタンスを通してソースオブジェクトに関連付けられている必要があります。デフォルト値は None です。
  • ResultClass: 返されるそれぞれの名前はオブジェクトを識別します。このオブジェクトは、このクラス、またはそのいずれかのサブクラスのインスタンスである必要があります。もしくは、このクラスまたはそのいずれかのサブクラスである必要があります。デフォルト値は None です。
  • Role: 返される名前によりオブジェクトが識別されます。このオブジェクトは、ソースオブジェクトが特定の役割を果たす関連付けでソースオブジェクトと関連付けられている必要があります。ソースオブジェクトを参照する関連付けクラス内のプロパティー名は、このパラメーターの値と合致する必要があります。デフォルト値は None です。
  • ResultRole: 返される名前によりオブジェクトが識別されます。このオブジェクトは、返された名前オブジェクトが特定の役割を果たす関連付けでソースオブジェクトと関連付けられている必要があります。返されたオブジェクトを参照する関連付けクラス内のプロパティー名は、このパラメーターの値と合致する必要があります。デフォルト値は None です。

例21.34 関連するインスタンス名へのアクセス

例21.33「関連するインスタンスへのアクセス」 で作成した vda インスタンスオブジェクトを使用して、その関連するインスタンス名の一覧を取得し、変数 vda_partitions に割り当てるには、以下を入力します。
vda_partitions = vda.associator_names(ResultClass="LMI_DiskPartition")
>

21.4.8. 関連付けオブジェクトの使用

Common Information Model は管理オブジェクト間の関係を定義します。関連付けオブジェクトは、他の 2 つのオブジェクト間の関係を定義します。

関連付けインスタンスへのアクセス

特定のターゲットオブジェクトを参照する関連付けオブジェクトの一覧を取得するには、以下のように references() メソッドを使用します。
instance_object.references(
    ResultClass=class_name,
    Role=role,
    IncludeQualifiers=include_qualifiers,
    IncludeClassOrigin=include_class_origin,
    PropertyList=property_list)
特定のターゲットオブジェクトを参照する最初の関連付けオブジェクトにアクセスするには、first_reference() メソッドを使用します。
instance_object.first_reference(
...     ResultClass=class_name,
...     Role=role,
...     IncludeQualifiers=include_qualifiers,
...     IncludeClassOrigin=include_class_origin,
...     PropertyList=property_list)
>
instance_object を、検査するインスタンスオブジェクト名に置き換えます。以下のパラメーターを指定すると結果をフィルターにかけられます。
  • ResultClass: 返される各オブジェクトは、このクラス、またはそのいずれかのサブクラスのインスタンスである必要があります。もしくは、このクラスまたはそのいずれかのサブクラスである必要があります。デフォルト値は None です。
  • Role: 返される各オブジェクトは、このパラメーターの値に合致する名前を持つプロパティーでターゲットオブジェクトを参照する必要があります。デフォルト値は None です。
他のパラメーターは以下のとおりです。
  • IncludeQualifiers: 応答に、QUALIFIER 要素として各オブジェクト (オブジェクト、および返されるすべてのプロパティー上の修飾子を含む) を追加するどうかを示すブール値。デフォルト値は False です。
  • IncludeClassOrigin: 返される各オブジェクトで適切な全要素に CLASSORIGIN 属性が存在すべきかどうかを示すブール値。デフォルト値は False です。
  • PropertyList: このリストのメンバーは 1 つ以上のプロパティー名を定義します。返されたオブジェクトは、このリストにないプロパティーには要素を含めません。PropertyList が空の場合、返されるオブジェクトにはプロパティーが含まれません。None の場合、追加のフィルタリングは定義されません。デフォルト値は None です。

例21.35 関連付けインスタンスへのアクセス

LMI_LANEndpoint クラスは、特定のネットワークインターフェースデバイスに関連付けられる通信エンドポイントを表します。例21.5「ネームスペースオブジェクトへのアクセス」 で作成した ns ネームスペースオブジェクトを使用して、ネットワークインターフェースデバイス eth0 用に LMI_LANEndpoint クラスのインスタンスを作成し、これを変数 lan_endpoint に割り当てるには、インタラクティブプロンプトに以下のコマンドを入力します。
lan_endpoint = ns.LMI_LANEndpoint.first_instance({
...     "Name" : "eth0"})
>
LMI_BindsToLANEndpoint オブジェクトを参照する最初の関連付けオブジェクトにアクセスし、これを変数 bind に割り当てるには、以下を入力します。
bind = lan_endpoint.first_reference(
...     ResultClass="LMI_BindsToLANEndpoint")
>
これで Dependent プロパティーを使用して、対応するネットワークインターフェースデバイスの IP アドレスを表す依存 LMI_IPProtocolEndpoint クラスにアクセスすることができます。
ip = bind.Dependent.to_instance()print ip.IPv4Address
192.168.122.1
>

関連付けインスタンス名へのアクセス

特定のインスタンスオブジェクトの関連付けインスタンス名の一覧を取得するには、以下のように reference_names() メソッドを使用します。
instance_object.reference_names(
    ResultClass=class_name,
    Role=role)
特定のインスタンスオブジェクトの最初の関連付けインスタンスにアクセスするには、first_reference_name() メソッドを使用します。
instance_object.first_reference_name(
    ResultClass=class_name,
    Role=role)
instance_object を、検査するインスタンスオブジェクト名に置き換えます。以下のパラメーターを指定すると結果をフィルターにかけられます。
  • ResultClass: 返される名前により、このクラス、またはそのいずれかのサブクラスのインスタンスを識別します。もしくは、このクラスまたはそのいずれかのサブクラスを識別します。デフォルト値は None です。
  • Role: 返される各オブジェクトは、このパラメーターの値に合致する名前を持つプロパティーでターゲットインスタンスを参照するオブジェクトを識別します。デフォルト値は None です。

例21.36 関連付けインスタンス名へのアクセス

例21.35「関連付けインスタンスへのアクセス」 で作成した lan_endpoint インスタンスオブジェクトを使用して、LMI_BindsToLANEndpoint オブジェクトを参照する最初の関連付けインスタンス名にアクセスし、これを変数 bind に割り当てるには、以下を入力します。
bind = lan_endpoint.first_reference_name(
...     ResultClass="LMI_BindsToLANEndpoint")
これで Dependent プロパティーを使用して、対応するネットワークインターフェースデバイスの IP アドレスを表す依存 LMI_IPProtocolEndpoint クラスにアクセスすることができます。
ip = bind.Dependent.to_instance()print ip.IPv4Address
192.168.122.1
>

21.4.9. Indication の使用

Indication は、データにおける特定の変化に反応して発生する特有のイベントへのリアクションです。LMIShell は、indication をサブスクライブしてこのようなイベント対応を受信できます。

Indication のサブスクライブ

indication をサブスクライブするには、以下のように subscribe_indication() メソッドを使用します。
connection_object.subscribe_indication(
    QueryLanguage="WQL",
    Query='SELECT * FROM CIM_InstModification',
    Name="cpu",
    CreationNamespace="root/interop",
    SubscriptionCreationClassName="CIM_IndicationSubscription",
    FilterCreationClassName="CIM_IndicationFilter",
    FilterSystemCreationClassName="CIM_ComputerSystem",
    FilterSourceNamespace="root/cimv2",
    HandlerCreationClassName="CIM_IndicationHandlerCIMXML",
    HandlerSystemCreationClassName="CIM_ComputerSystem",
    Destination="http://host_name:5988")
別の方法では、以下のように、このメソッド呼び出しの短いバージョンを使用することもできます。
connection_object.subscribe_indication(
    Query='SELECT * FROM CIM_InstModification',
    Name="cpu",
    Destination="http://host_name:5988")
connection_object を接続オブジェクトに置き換え、host_name を、indication を配信するシステムのホスト名に置き換えます。
デフォルトでは、LMIShell インタープリターが作成したすべてのサブスクリプションは、インタープリターの終了時に自動的に削除されます。この動作を変更するには、Permanent=True キーワードパラメーターを subscribe_indication() メソッド呼び出しに渡します。これで、LMIShell がサブスクリプションを削除しなくなります。

例21.37 Indication のサブスクライブ

例21.1「リモートの CIMOM への接続」 で作成した c 接続オブジェクトを使用して、cpu という名前の indication をサブスクライブするには、インタラクティブプロンプトに以下のコマンドを入力します。
c.subscribe_indication(
...     QueryLanguage="WQL",
...     Query='SELECT * FROM CIM_InstModification',
...     Name="cpu",
...     CreationNamespace="root/interop",
...     SubscriptionCreationClassName="CIM_IndicationSubscription",
...     FilterCreationClassName="CIM_IndicationFilter",
...     FilterSystemCreationClassName="CIM_ComputerSystem",
...     FilterSourceNamespace="root/cimv2",
...     HandlerCreationClassName="CIM_IndicationHandlerCIMXML",
...     HandlerSystemCreationClassName="CIM_ComputerSystem",
...     Destination="http://server.example.com:5988")
LMIReturnValue(rval=True, rparams=NocaseDict({}), errorstr='')
>

サブスクライブしている indication の一覧表示

サブスクライブしている indication の一覧を表示するには、以下のように print_subscribed_indications() メソッドを使用します。
connection_object.print_subscribed_indications()
connection_object を、検査する接続オブジェクト名に置き換えます。このメソッドは、サブスクライブしている indication を標準出力に出力します。
サブスクライブしている indication の一覧を取得するには、subscribed_indications() メソッドを使用します。
connection_object.subscribed_indications()
このメソッドは文字列の一覧を返します。

例21.38 サブスクライブしている indication の一覧表示

例21.1「リモートの CIMOM への接続」 で作成した c 接続オブジェクトを検査し、サブスクライブしている indication の一覧を表示するには、インタラクティブプロンプトに以下のコマンドを入力します。
c.print_subscribed_indications()
>
この indication の一覧を変数 indications に割り当てるには、以下を入力します。
indications = c.subscribed_indications()
>

Indication のサブスクライブ解除

デフォルトでは、LMIShell インタープリターが作成したすべてのサブスクリプションは、インタープリターの終了時に自動的に削除されます。これより前に個別のサブスクリプションを削除するには、以下のように unsubscribe_indication() メソッドを使用します。
connection_object.unsubscribe_indication(indication_name)
connection_object を、検査する接続オブジェクト名に置き換え、indication_name を、削除する indication の名前に置き換えます。
すべてのサブスクリプションを削除するには、unsubscribe_all_indications() メソッドを使用します。
connection_object.unsubscribe_all_indications()

例21.39 Indication のサブスクライブ解除

例21.1「リモートの CIMOM への接続」 で作成した c 接続オブジェクトを使用して、例21.37「Indication のサブスクライブ」 で作成した indication のサブスクライブを解除するには、インタラクティブプロンプトに以下のコマンドを入力します。
c.unsubscribe_indication('cpu')
LMIReturnValue(rval=True, rparams=NocaseDict({}), errorstr='')
>

Indication ハンドラーの実装

subscribe_indication() メソッドを使用すると、indication を配信するシステムのホスト名を指定できます。以下の例では、indication ハンドラーの実装方法を示します。
def handler(ind, arg1, arg2, **kwargs):
...     exported_objects = ind.exported_objects()
...     do_something_with(exported_objects)listener = LmiIndicationListener("0.0.0.0", listening_port)listener.add_handler("indication-name-XXXXXXXX", handler, arg1, arg2, **kwargs)listener.start()
>
ハンドラーの最初の引数は LmiIndication オブジェクトで、これには indication がエクスポートしたメソッドとオブジェクトの一覧が含まれます。他のパラメーターはユーザー固有なので、ハンドラーをリスナーに追加する際にこれらの引数を指定する必要があります。
上記の例では、add_handler() メソッド呼び出しは、8 つの X 文字の特別な文字列を使用しています。この文字は、ハンドラー名が競合しないように、リスナーが生成するランダムな文字列に置き換えられます。ランダムな文字列を使用するには、indication リスナーを最初に開始し、次に indication をサブスクライブします。そうすることで、ハンドラーオブジェクトの Destination プロパティーに、schema://host_name/random_string の値が含まれます。

例21.40 Indication ハンドラーの実装

以下のスクリプトでは、192.168.122.1 にある管理システムを監視し、新規ユーザーアカウントの作成時に常に indication_callback() 関数を呼び出すハンドラーの書き込み方法を示しています。
#!/usr/bin/lmishell

import sys
from time import sleep
from lmi.shell.LMIUtil import LMIPassByRef
from lmi.shell.LMIIndicationListener import LMIIndicationListener

# These are passed by reference to indication_callback
var1 = LMIPassByRef("some_value")
var2 = LMIPassByRef("some_other_value")

def indication_callback(ind, var1, var2):
    # Do something with ind, var1 and var2
    print ind.exported_objects()
    print var1.value
    print var2.value

c = connect("hostname", "username", "password")

listener = LMIIndicationListener("0.0.0.0", 65500)
unique_name = listener.add_handler(
    "demo-XXXXXXXX",     # Creates a unique name for me
    indication_callback, # Callback to be called
    var1,                # Variable passed by ref
    var2                 # Variable passed by ref
)

listener.start()

print c.subscribe_indication(
    Name=unique_name,
    Query="SELECT * FROM LMI_AccountInstanceCreationIndication WHERE SOURCEINSTANCE ISA LMI_Account",
    Destination="192.168.122.1:65500"
)

try:
    while True:
        sleep(60)
except KeyboardInterrupt:
    sys.exit(0)

21.4.10. 使用例

本セクションでは、OpenLMI パッケージで配布される様々な CIM プロバイダーの例を示します。本セクションのすべての例で、以下の 2 つの変数定義を使用します。
c = connect("host_name", "user_name", "password")
ns = c.root.cimv2
host_name を、管理システムのホスト名に置き換え、user_name を、そのシステムで実行している OpenPegasus CIMOM への接続が許可されているユーザー名に置き換え、password を、ユーザーのパスワードに置き換えます。

OpenLMI サービスプロバイダーの使用

openlmi-service パッケージは、システムサービスの管理用に CIM プロバイダーをインストールします。以下の例では、この CIM プロバイダーを使用して利用可能なシステムサービスの一覧を表示する方法と、そのサービスの開始、停止、有効化、および無効化を行う方法を示しています。

例21.41 利用可能なサービスの一覧表示

管理システムで利用可能なすべてのサービスと、そのサービスの開始 (TRUE) または (FALSE) に関する情報、およびステータス文字列を一覧表示するには、以下のコードスニペットを使用します。
for service in ns.LMI_Service.instances():
    print "%s:\t%s" % (service.Name, service.Status)
デフォルトで有効になっているサービスのみを一覧表示するには、以下のコードスニペットを使用します。
cls = ns.LMI_Service
for service in cls.instances():
    if service.EnabledDefault == cls.EnabledDefaultValues.Enabled:
        print service.Name
有効なサービスの場合は、EnabledDefault プロパティーの値が 2 と等しくなり、無効なサービスの場合は 3 と等しくなることに注意してください。
cups サービスに関する情報を表示するには、以下を使用します。
cups = ns.LMI_Service.first_instance({"Name": "cups.service"})
cups.doc()

例21.42 サービスの起動と停止

cups サービスを起動して現行ステータスを確認するには、以下のコードスニペットを使用します。
cups = ns.LMI_Service.first_instance({"Name": "cups.service"})
cups.StartService()
print cups.Status
cups.StopService()
print cups.Status

例21.43 サービスの有効化および無効化

cups サービスを有効または無効にして、EnabledDefault プロパティーを表示するには、以下のコードスニペットを使用します。
cups = ns.LMI_Service.first_instance({"Name": "cups.service"})
cups.TurnServiceOff()
print cups.EnabledDefault
cups.TurnServiceOn()
print cups.EnabledDefault

OpenLMI ネットワーキングプロバイダーの使用

openlmi-networking パッケージは、ネットワーキング用の CIM プロバイダーをインストールします。以下の例では、この CIM プロバイダーを使用して特定のポート番号に関連付けられた IP アドレスを一覧表示する方法、新規接続を作成する方法、静的 IP アドレスを設定する方法、および接続をアクティブ化する方法を説明しています。

例21.44 特定のポート番号に関連付けられている IP アドレスの一覧表示

eth0 ネットワークインターフェースに関連付けられている IP アドレスの一覧を表示するには、以下のコードスニペットを使用します。
device = ns.LMI_IPNetworkConnection.first_instance({'ElementName': 'eth0'})
for endpoint in device.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_IPProtocolEndpoint"):
    if endpoint.ProtocolIFType == ns.LMI_IPProtocolEndpoint.ProtocolIFTypeValues.IPv4:
        print "IPv4: %s/%s" % (endpoint.IPv4Address, endpoint.SubnetMask)
    elif endpoint.ProtocolIFType == ns.LMI_IPProtocolEndpoint.ProtocolIFTypeValues.IPv6:
        print "IPv6: %s/%d" % (endpoint.IPv6Address, endpoint.IPv6SubnetPrefixLength)
このコードスニペットは、指定した LMI_IPNetworkConnection クラスに関連付けられた LMI_IPProtocolEndpoint クラスを使用します。
デフォルトのゲートウェイを表示するには、以下のコードスニペットを使用します。
for rsap in device.associators(AssocClass="LMI_NetworkRemoteAccessAvailableToElement", ResultClass="LMI_NetworkRemoteServiceAccessPoint"):
    if rsap.AccessContext == ns.LMI_NetworkRemoteServiceAccessPoint.AccessContextValues.DefaultGateway:
        print "Default Gateway: %s" % rsap.AccessInfo
デフォルトのゲートウェイは、AccessContext プロパティーが DefaultGateway と等しい LMI_NetworkRemoteServiceAccessPoint インスタンスで表されます。
DNS サーバーの一覧を取得するには、以下のようにオブジェクトモデルをトラバースする必要があります。
  1. LMI_NetworkSAPSAPDependency を使用して、指定した LMI_IPNetworkConnection に関連付けられた LMI_IPProtocolEndpoint インスタンスを取得する。
  2. LMI_DNSProtocolEndpoint インスタンスに同一の関連付けを使用する。
LMI_NetworkRemoteAccessAvailableToElement で関連付けられている DNS サーバーと同等の AccessContext プロパティーを持つ LMI_NetworkRemoteServiceAccessPoint インスタンスには、 AccessInfo プロパティーに DNS サーバーのアドレスがあります。
RemoteServiceAccessPath の取得には他のパスもあり、エントリーは重複可能です。以下のコードスニペットは、set() 関数を使用して DNS サーバーから重複エントリーを削除します。
dnsservers = set()
for ipendpoint in device.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_IPProtocolEndpoint"):
    for dnsedpoint in ipendpoint.associators(AssocClass="LMI_NetworkSAPSAPDependency", ResultClass="LMI_DNSProtocolEndpoint"):
        for rsap in dnsedpoint.associators(AssocClass="LMI_NetworkRemoteAccessAvailableToElement", ResultClass="LMI_NetworkRemoteServiceAccessPoint"):
            if rsap.AccessContext == ns.LMI_NetworkRemoteServiceAccessPoint.AccessContextValues.DNSServer:
                dnsservers.add(rsap.AccessInfo)
print "DNS:", ", ".join(dnsservers)

例21.45 新規接続の作成および静的 IP アドレスの設定

eth0 ネットワークインターフェースで静的 IPv4 とステートレスの IPv6 設定を作成するには、以下のコードスニペットを使用します。
capability = ns.LMI_IPNetworkConnectionCapabilities.first_instance({ 'ElementName': 'eth0' })
result = capability.LMI_CreateIPSetting(Caption='eth0 Static',
        IPv4Type=capability.LMI_CreateIPSetting.IPv4TypeValues.Static,
        IPv6Type=capability.LMI_CreateIPSetting.IPv6TypeValues.Stateless)
setting = result.rparams["SettingData"].to_instance()
for settingData in setting.associators(AssocClass="LMI_OrderedIPAssignmentComponent"):
    if setting.ProtocolIFType == ns.LMI_IPAssignmentSettingData.ProtocolIFTypeValues.IPv4:
        # Set static IPv4 address
        settingData.IPAddresses = ["192.168.1.100"]
        settingData.SubnetMasks = ["255.255.0.0"]
        settingData.GatewayAddresses = ["192.168.1.1"]
        settingData.push()
このコードスニペットは、LMI_CreateIPSetting() メソッドを LMI_IPNetworkConnectionCapabilities のインスタンス上で呼び出すことで、新規設定を作成します。これは、LMI_IPNetworkConnectionElementCapabilitiesLMI_IPNetworkConnection に関連付けられています。また、push() メソッドを使用して設定の修正も行います。

例21.46 接続のアクティブ化

設定をネットワークインターフェースに適用するには、LMI_IPConfigurationService クラスの ApplySettingToIPNetworkConnection() メソッドを呼び出します。このメソッドは非同期で、ジョブを返します。以下のコードスニペットでは、このメソッドを同期で呼び出す方法を示しています。
setting = ns.LMI_IPAssignmentSettingData.first_instance({ "Caption": "eth0 Static" })
port = ns.LMI_IPNetworkConnection.first_instance({ 'ElementName': 'ens8' })
service = ns.LMI_IPConfigurationService.first_instance()
service.SyncApplySettingToIPNetworkConnection(SettingData=setting, IPNetworkConnection=port, Mode=32768)
Mode パラメーターは、設定の適用方法に影響を与えます。このパラメーターで最もよく使われる値は、以下のとおりです。
  • 1: 設定を直ちに適用し、自動アクティブ化します。
  • 2: 設定を自動アクティブ化しますが、すぐには適用しません。
  • 4: 切断して自動アクティブ化を無効にします。
  • 5: 設定状態を変更せず、自動アクティブ化のみを無効にします。
  • 32768: 設定を適用します。
  • 32769: 切断します。

OpenLMI ストレージプロバイダーの使用

openlmi-storage パッケージは、ストレージ管理用の CIM プロバイダーをインストールします。以下の例では、この CIM プロバイダーを使用したボリュームグループおよび論理ボリュームの作成、ファイルシステムの構築およびマウント、システムが認知するブロックデバイスの一覧表示の方法を説明します。
c および ns の変数に加え、以下の例では下記の変数定義を使用します。
MEGABYTE = 1024*1024
storage_service = ns.LMI_StorageConfigurationService.first_instance()
filesystem_service = ns.LMI_FileSystemConfigurationService.first_instance()

例21.47 ボリュームグループの作成

/dev/myGroup/ にあり、3 つのメンバーがありデフォルトの拡張サイズが 4 MB の新規ボリュームグループを作成するには、以下のコードスニペットを使用します。
# Find the devices to add to the volume group
# (filtering the CIM_StorageExtent.instances()
# call would be faster, but this is easier to read):
sda1 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sda1"})
sdb1 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sdb1"})
sdc1 = ns.CIM_StorageExtent.first_instance({"Name": "/dev/sdc1"})

# Create a new volume group:
(ret, outparams, err) = storage_service.SyncCreateOrModifyVG(
        ElementName="myGroup",
        InExtents=[sda1, sdb1, sdc1])
vg = outparams['Pool'].to_instance()
print "VG", vg.PoolID, \
        "with extent size", vg.ExtentSize, \
        "and",  vg.RemainingExtents, "free extents created."

例21.48 論理ボリュームの作成

サイズが 100 MB の論理ボリューム 2 つを作成するには、以下のコードスニペットを使用します。
# Find the volume group:
vg = ns.LMI_VGStoragePool.first_instance({"Name": "/dev/mapper/myGroup"})

# Create the first logical volume:
(ret, outparams, err) = storage_service.SyncCreateOrModifyLV(
        ElementName="Vol1",
        InPool=vg,
        Size=100 * MEGABYTE)
lv = outparams['TheElement'].to_instance()
print "LV", lv.DeviceID, \
        "with", lv.BlockSize * lv.NumberOfBlocks,\
        "bytes created."

# Create the second logical volume:
(ret, outparams, err) = storage_service.SyncCreateOrModifyLV(
        ElementName="Vol2",
        InPool=vg,
        Size=100 * MEGABYTE)
lv = outparams['TheElement'].to_instance()
print "LV", lv.DeviceID, \
        "with", lv.BlockSize * lv.NumberOfBlocks, \
        "bytes created."

例21.49 ファイルシステムの作成

例21.48「論理ボリュームの作成」 の論理ボリューム lvext3 ファイルシステムを作成するには、以下のコードスニペットを使用します。
(ret, outparams, err) = filesystem_service.SyncLMI_CreateFileSystem(
        FileSystemType=filesystem_service.LMI_CreateFileSystem.FileSystemTypeValues.EXT3,
        InExtents=[lv])

例21.50 ファイルシステムのマウント

例21.49「ファイルシステムの作成」 で作成したファイルシステムをマウントするには、以下のコードスニペットを使用します。
# Find the file system on the logical volume:
fs = lv.first_associator(ResultClass="LMI_LocalFileSystem")

mount_service = ns.LMI_MountConfigurationService.first_instance()
(rc, out, err) = mount_service.SyncCreateMount(
     FileSystemType='ext3',
     Mode=32768, # just mount
     FileSystem=fs,
     MountPoint='/mnt/test',
     FileSystemSpec=lv.Name)

例21.51 ブロックデバイスの一覧表示

システムが認識するブロックデバイスの一覧を表示するには、以下のコードスニペットを使用します。
devices = ns.CIM_StorageExtent.instances()
for device in devices:
    if lmi_isinstance(device, ns.CIM_Memory):
        # Memory and CPU caches are StorageExtents too, do not print them
        continue
    print device.classname,
    print device.DeviceID,
    print device.Name,
    print device.BlockSize*device.NumberOfBlocks

OpenLMI ハードウェアプロバイダーの使用

openlmi-hardware パッケージは、ハードウェアを監視するための CIM プロバイダーをインストールします。以下の例では、この CIM プロバイダーを使用して CPU、メモリーモジュール、PCI デバイス、およびマシンの製造元およびモデルに関する情報を取得する方法を説明します。

例21.52 CPU 情報の表示

CPU 名、プロセッサーコア数、ハードウェアスレッド数などの基本的な CPU 情報を表示するには、以下のコードスニペットを使用します。
cpu = ns.LMI_Processor.first_instance()
cpu_cap = cpu.associators(ResultClass="LMI_ProcessorCapabilities")[0]
print cpu.Name
print cpu_cap.NumberOfProcessorCores
print cpu_cap.NumberOfHardwareThreads

例21.53 メモリー情報の表示

メモリーモジュールの個別サイズなどの基本情報を表示するには、以下のコードスニペットを使用します。
mem = ns.LMI_Memory.first_instance()
for i in mem.associators(ResultClass="LMI_PhysicalMemory"):
    print i.Name

例21.54 シャーシ情報の表示

製造元やモデルなどのマシンの基本情報を表示するには、以下のコードスニペットを使用します。
chassis = ns.LMI_Chassis.first_instance()
print chassis.Manufacturer
print chassis.Model

例21.55 PCI デバイスの一覧表示

システムが認識する PCI デバイスの一覧を表示するには、以下のコードスニペットを使用します。
for pci in ns.LMI_PCIDevice.instances():
    print pci.Name