【バグ】2.0.13 にて api の hostgroup.get でメンテナンスを絡めた取得をすると不正確な値が得られる

http://www.zabbix.jp/node/2616

のスレッドでも触れていた api の maintenance.get 周辺挙動について、いろいろ調べていたところ、
hostgroup.get 内に別の不具合を見つけたので報告します

#英語力があれば本家へ報告するのですが‥(汗)

2.0.13 にて確認しています
2.2系・2.4については、手元にすぐ試せる環境がないため未確認です。
どなたか確認できる環境がある方、追試戴ければ幸甚です

https://www.zabbix.com/documentation/2.0/manual/appendix/api/hostgroup/get

にある hostgroup.get APIに関する不具合です

同一のホストグループGroupAに対して、複数のメンテナンスMaintenanceX、MaintenanceYを設定した状況下で、
'hostgroup.get' API に対して、'output'パラメータを'extend' として
'maintenanceids' パラメータに、MaintenanceXのmaintenanceidと、MaintenanceYのmaintenanceidを
両方とも指定して呼び出した場合、応答として得られるホストグループ情報の中に「maintenances」として
ID情報が戻ってくるはずなのですが、複数あるうちの1つ(どれになるかは不定)しか、値が得られません

バグは frontends/php/api/classes/CHostGroup.php 内、445行目付近


// maintenanceids
if (isset($group['maintenanceid'])) {
if (!isset($result[$group['groupid']]['maintenanceid'])) {
$result[$group['groupid']]['maintenances'] = array();
}
$result[$group['groupid']]['maintenances'][] = array('maintenanceid' => $group['maintenanceid']);
unset($group['maintenanceid']);
}

が誤っており、下記のようにするのが正しいかと思われます
配列の maintenances という要素が存在していなければ初期化‥としなければいけないところ
maintenanceid という要素をチェックして、必ずクリアしてしまっているため、結果的に
maintenances として得られるのは「最後の1つ」となるようです

たった1行の修正なのですが‥(汗)


// maintenanceids
if (isset($group['maintenanceid'])) {
if (!isset($result[$group['groupid']]['maintenances'])) {
$result[$group['groupid']]['maintenances'] = array();
}
$result[$group['groupid']]['maintenances'][] = array('maintenanceid' => $group['maintenanceid']);
unset($group['maintenanceid']);
}

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー fripper の写真

2.2.6 および 2.4.0 / 2.4.1-rc1 にてソースコードレベルでの確認をしたところ、
2.2.6 では同様の問題を抱えたままのようです

2.4.x 系については、API 処理内部のソースコード構造が大きく変わっており、
同様の不具合が起きそうな様子は見られませんでした

ユーザー fripper の写真

ヘタな英語ですが、本家のバグトラッキングに投稿しました

https://support.zabbix.com/browse/ZBX-8852

本修正を望む方、ぜひ Vote を!!

ユーザー KAZ の写真
fripperさん

2.0系と2.2系のパッチ作って投稿してみては…A(^^;

後、英語私も苦手ですがソースコード書いて「ここ」って書いた方が伝わりいいかと。
こんな感じで
// maintenanceids
if (isset($group['maintenanceid'])) {
//	if (!isset($result[$group['groupid']]['maintenanceid'])) {    // <-- here!
	if (!isset($result[$group['groupid']]['maintenances'])) {     // <-- here! 
		$result[$group['groupid']]['maintenances'] = array();
	}
	$result[$group['groupid']]['maintenances'][] = array('maintenanceid' => $group['maintenanceid']);
	unset($group['maintenanceid']);
}
ユーザー fripper の写真

ご指摘ありがとうございます。

昨夜直接お伝えしましたが、一応リプライをば。

当該バグ報告について、patch を作成・投稿します

本日現時点で投稿済のパッチは、フォーマット的にイマイチなので、
もう少しTraditional なフォーマットの patch を作成しなおして、
本家開発メンバーの方々に確認して頂きやすいよう、再投稿する予定です