あっきぃ日誌

鉄道ブログのような技術系ブログのようななにか

iLO2の情報をphpで扱う(How to get HP iLO's information by php)

iLO2のデータをphpで拾ってなんかやろうかと思ったので、なんとなく組んでみました。情報の取得はSSH経由で、文字をゴリゴリパースするアバウトなやり方ですが、こんな感じで取得できるようにしました。

Array
(
    [name] => ProLiant ML350 G6
    [number] => XXXXXXXXXX
    [product_id] => XXXXXX-XXX
    [oemhp_server_name] => XXX
    [enabledstate] => enabled
    [oemhp_powerreg] => dynamic
    [processor_number] => 4
    [pstate_number] => 5
    [oemhp_pwrcap] => not set
    [oemhp_pwrmode] => Not Supported
    [oemhp_PresentPower] => 130 Watts
    [oemhp_AveragePower] => 129 Watts
    [oemhp_MaxPower] => 215 Watts
    [oemhp_MinPower] => 129 Watts
    [warning_type] => warnings disabled
    [warning_threshold] => warnings disabled
    [warning_duration] => warnings disabled
    [oemhp_power_micro_ver] => 2.9
    [licensed] => yes
)

ソースはこちら。ただ、PECLからssh2というパッケージをダウンロード・インストールする必要があります。ssh2のインストール方法は適宜ググってください。

<?php
	$ip   = '';
	$user = '';
	$pass = '';

	$connection = ssh2_connect($ip, 22);
	if (!ssh2_auth_password($connection, $user, $pass)) {
		die('Authentication Failed...');
	}
	$stream = ssh2_exec($connection, 'show system1');
	stream_set_blocking($stream, true);
// (2011.6.21追記: $streamの処理方法を変更)
// (freadの行を削除)
//	$data = fread($stream, 4096);
// (追記ここから)
	$data = stream_get_contents($stream);
	fclose($stream);
// (追記ここまで)

	$data = explode("\n", $data);
	$flag = 0;
	$out = array();
	foreach($data as $line) {
		$line = preg_replace('/(\x1B\x5BD)/', '', $line);	/* HP's bug? */
		$line = trim($line);
		if ($line == 'Properties') {
			$flag = 1;
			continue;
		} else if ($line == 'Verbs') {
			$flag = 0;
			break;
		}
		if ($flag) {
			if ($line == 'An iLO 2 License key is required.') {
				$out['licensed'] = 'no';
			} else {
				$line = explode("=", $line);
				$out[trim($line[0])] = trim($line[1]);
			}
		}
	}
	if (!isset($out['licensed'])) {
		$out['licensed'] = 'yes';
	}
	
	// おこのみで好きにしてください
	print_r($out);
?>

[licensed]は独自拡張です。これはライセンスがない時に途中で出力される「An iLO 2 License key is required.」というメッセージに対処するついでに付けたものですが、ssh2_execで別途「show map1」コマンドを実行してやれば詳細なライセンス情報が取得可能です。
ちなみに、iLO3に対して実行したら、うまく情報が拾えませんでした。ターミナルでコマンド叩いてみた限りではコマンドも同じように見えたんだけどなぁ。
(2011.6.21追記)ソースを改良しました。$streamからデータを取る時にfread()ではなく、stream_get_contents()を使うようにしました。これでiLO3でも取得できるようになりました。やったー。

RIBCL

iLOには、こうしてSSHで拾った情報を頑張ってパースしなくても、RIBCLというXMLでやりとりするAPIがあります。が、こちらはちょっと扱いにくかったです。適宜ググってください。サンプルはPerlのみです。PHPで組んでみた例はどこかのフォーラムにありましたが、出力があまりにもデータとして扱いにくくて泣きました(嘘)。

単純にターミナルでSSHログインして情報を見る方法

ハイクにメモ程度に書いたらブクマついたのでここでも書いておこう。

  • すべての情報を取得表示
> show system1
    • 特定のプロパティの取得(最新の消費電力の例。このパラメータの取得はAdvancedライセンスが必要)
> show system1 oemhp_PresentPower
    • Targetsの値は/をつけてディレクトリ風に扱う(ドライブの状況を取得する例。)
> show system1/drives

蛇足

これ会社のブログに書こうと思ったんだけど、向こうはソースとか入れるとレイアウトがアレになるのでこちらに。って、レイアウト作ったの俺じゃん!(`ω´;)