【バグ】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 - 投稿数: 495
2.2.6 および 2.4.0 / 2.4.1-rc1 にてソースコードレベルでの確認をしたところ、
2.2.6 では同様の問題を抱えたままのようです
2.4.x 系については、API 処理内部のソースコード構造が大きく変わっており、
同様の不具合が起きそうな様子は見られませんでした
fripper - 投稿数: 495
ヘタな英語ですが、本家のバグトラッキングに投稿しました
https://support.zabbix.com/browse/ZBX-8852
本修正を望む方、ぜひ Vote を!!
KAZ - 投稿数: 1085
2.0系と2.2系のパッチ作って投稿してみては…A(^^;
後、英語私も苦手ですがソースコード書いて「ここ」って書いた方が伝わりいいかと。
こんな感じで
fripper - 投稿数: 495
ご指摘ありがとうございます。
昨夜直接お伝えしましたが、一応リプライをば。
当該バグ報告について、patch を作成・投稿します
本日現時点で投稿済のパッチは、フォーマット的にイマイチなので、
もう少しTraditional なフォーマットの patch を作成しなおして、
本家開発メンバーの方々に確認して頂きやすいよう、再投稿する予定です