/*
* Copyright 2014 by SCSK Corporation.
*
* This file is part of PrimeCloud Controller(TM).
*
* PrimeCloud Controller(TM) is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* PrimeCloud Controller(TM) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with PrimeCloud Controller(TM). If not, see <http://www.gnu.org/licenses/>.
*/
package jp.primecloud.auto.zabbix.client;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jp.primecloud.auto.zabbix.ZabbixAccessor;
import jp.primecloud.auto.zabbix.model.host.Host;
import jp.primecloud.auto.zabbix.model.host.HostCreateParam;
import jp.primecloud.auto.zabbix.model.host.HostGetParam;
import jp.primecloud.auto.zabbix.model.host.HostUpdateParam;
import jp.primecloud.auto.zabbix.model.hostgroup.Hostgroup;
import jp.primecloud.auto.zabbix.model.hostinterface.Hostinterface;
import jp.primecloud.auto.zabbix.model.maintenance.Maintenance;
import jp.primecloud.auto.zabbix.model.template.Template;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
/**
* <p>
* Zabbix APIのHostを操作するためのクラスです。
* </p>
*
*/
public class HostClient {
protected ZabbixAccessor accessor;
protected JsonConfig defaultConfig;
/**
* コンストラクタです。
*
* @param accessor {@link ZabbixAccessor}
* @param defaultConfig デフォルトの{@link JsonConfig}
*/
public HostClient(ZabbixAccessor accessor, JsonConfig defaultConfig) {
this.accessor = accessor;
this.defaultConfig = defaultConfig;
}
/**
* ホスト情報を取得します。<br/>
* ホスト情報が存在しない場合、空のリストを返します。
*
* @param param {@link HostGetParam}
* @return 取得したホスト情報のリスト
*/
@SuppressWarnings("unchecked")
public List<Host> get(HostGetParam param) {
JSONObject params = JSONObject.fromObject(param, defaultConfig);
if (accessor.checkVersion("2.0") < 0) {
if (params.containsKey("selectGroups")) {
params.put("select_groups", params.remove("selectGroups"));
}
} else {
if (params.containsKey("output") && "extend".equals(params.getString("output"))) {
params.put("selectInterfaces", "extend");
}
}
JSONArray result = (JSONArray) accessor.execute("host.get", params);
JsonConfig config = defaultConfig.copy();
config.setCollectionType(List.class);
config.setRootClass(Host.class);
config.getClassMap().put("parenttemplates", Template.class);
config.getClassMap().put("groups", Hostgroup.class);
config.getClassMap().put("interfaces", Hostinterface.class);
config.getClassMap().put("maintenances", Maintenance.class);
List<Host> hosts = (List<Host>) JSONArray.toCollection(result, config);
// Zabbix 1.8用のインターフェースで2.0以降を操作できるようにするためのコード
if (accessor.checkVersion("2.0") >= 0) {
for (Host host : hosts) {
if (host.getInterfaces() != null && host.getInterfaces().size() > 0) {
Hostinterface hostinterface = host.getInterfaces().get(0);
host.setDns(hostinterface.getDns());
host.setIp(hostinterface.getIp());
host.setPort(hostinterface.getPort());
host.setUseip(hostinterface.getUseip());
}
}
}
// Zabbix 2.0以降用のインターフェースで1.8を操作できるようにするためのコード
else {
for (Host host : hosts) {
Hostinterface hostinterface = new Hostinterface();
hostinterface.setDns(host.getDns());
hostinterface.setIp(host.getIp());
hostinterface.setPort(host.getPort());
hostinterface.setUseip(host.getUseip());
hostinterface.setType(1);
hostinterface.setMain(1);
host.setInterfaces(Arrays.asList(hostinterface));
}
}
return hosts;
}
/**
* ホスト情報を作成します。<br/>
* host,groupsパラメータを必ず指定する必要があります。<br/>
* 既に存在するホストのhost,groupsを指定した場合、例外をスローします。
*
* @param param {@link HostCreateParam}
* @return 作成されたホスト情報のhostidのリスト
*/
@SuppressWarnings("unchecked")
public List<String> create(HostCreateParam param) {
if (param.getHost() == null || param.getHost().length() == 0) {
throw new IllegalArgumentException("host is required.");
}
if (param.getGroups() == null || param.getGroups().size() == 0) {
throw new IllegalArgumentException("groups is required.");
}
// Zabbix 1.8用のインターフェースで2.0以降を操作できるようにするためのコード
if (accessor.checkVersion("2.0") >= 0) {
if (param.getInterfaces() == null || param.getInterfaces().size() == 0) {
Hostinterface hostinterface = new Hostinterface();
hostinterface.setDns(param.getDns());
hostinterface.setIp((param.getIp() == null || param.getIp().length() == 0) ? "0.0.0.0" : param.getIp());
hostinterface.setPort((param.getPort() == null) ? 10050 : param.getPort());
hostinterface.setUseip((param.getUseip() == null) ? 0 : param.getUseip());
hostinterface.setType(1);
hostinterface.setMain(1);
param.setInterfaces(Arrays.asList(hostinterface));
param.setDns(null);
param.setIp(null);
param.setPort(null);
param.setUseip(null);
}
}
// Zabbix 2.0以降用のインターフェースで1.8を操作できるようにするためのコード
else {
if (param.getInterfaces() != null && param.getInterfaces().size() > 0) {
Hostinterface hostinterface = param.getInterfaces().get(0);
param.setDns(hostinterface.getDns());
param.setIp(hostinterface.getIp());
param.setPort(hostinterface.getPort());
param.setUseip(hostinterface.getUseip());
param.setInterfaces(null);
}
}
JSONObject params = JSONObject.fromObject(param, defaultConfig);
JSONObject result = (JSONObject) accessor.execute("host.create", params);
JSONArray hostids = result.getJSONArray("hostids");
JsonConfig config = defaultConfig.copy();
config.setCollectionType(List.class);
config.setRootClass(String.class);
return (List<String>) JSONArray.toCollection(hostids, config);
}
/**
* ホスト情報を更新します。<br/>
* hostidパラメータを必ず指定する必要があります。<br/>
* 存在しないhostidを指定した場合、例外をスローします。<br/>
* groupsに空リストを指定した場合、例外をスローします。
*
* @param param {@link HostUpdateParam}
* @return 更新したホスト情報のhostidのリスト
*/
@SuppressWarnings("unchecked")
public List<String> update(HostUpdateParam param) {
if (param.getHostid() == null) {
throw new IllegalArgumentException("hostid is required.");
}
if (param.getGroups() != null && param.getGroups().size() == 0) {
throw new IllegalArgumentException("groups must be null or not empty.");
}
// Zabbix 1.8用のインターフェースで2.0以降を操作できるようにするためのコード
if (accessor.checkVersion("2.0") >= 0) {
if (param.getDns() != null && param.getIp() != null) {
if (param.getInterfaces() == null || param.getInterfaces().size() == 0) {
// interfaceidを取得
String interfaceid = null;
{
HostGetParam hostGetParam = new HostGetParam();
hostGetParam.setHostids(Arrays.asList(param.getHostid()));
hostGetParam.setOutput("extend");
List<Host> hosts = get(hostGetParam);
if (hosts.size() > 0) {
Host host = hosts.get(0);
if (host.getInterfaces() != null && host.getInterfaces().size() > 0) {
interfaceid = host.getInterfaces().get(0).getInterfaceid();
}
}
}
Hostinterface hostinterface = new Hostinterface();
hostinterface.setInterfaceid(interfaceid);
hostinterface.setDns(param.getDns());
hostinterface.setHostid(param.getHostid());
hostinterface.setIp((param.getIp() == null || param.getIp().length() == 0) ? "0.0.0.0" : param
.getIp());
hostinterface.setPort((param.getPort() == null) ? 10050 : param.getPort());
hostinterface.setUseip((param.getUseip() == null) ? 0 : param.getUseip());
hostinterface.setType(1);
hostinterface.setMain(1);
param.setInterfaces(Arrays.asList(hostinterface));
param.setDns(null);
param.setIp(null);
param.setPort(null);
param.setUseip(null);
}
}
}
// Zabbix 2.0以降用のインターフェースで1.8を操作できるようにするためのコード
else {
if (param.getInterfaces() != null && param.getInterfaces().size() > 0) {
Hostinterface hostinterface = param.getInterfaces().get(0);
param.setDns(hostinterface.getDns());
param.setIp(hostinterface.getIp());
param.setPort(hostinterface.getPort());
param.setUseip(hostinterface.getUseip());
param.setInterfaces(null);
}
}
JSONObject params = JSONObject.fromObject(param, defaultConfig);
JSONObject result = (JSONObject) accessor.execute("host.update", params);
JSONArray hostids = result.getJSONArray("hostids");
JsonConfig config = defaultConfig.copy();
config.setCollectionType(List.class);
config.setRootClass(String.class);
return (List<String>) JSONArray.toCollection(hostids, config);
}
/**
* ホスト情報を削除します。<br/>
* hostidパラメータを必ず指定する必要があります。<br/>
* 存在しないhostidを指定した場合、例外をスローします。<br/>
*
* @param hostids 削除するホストIDのリスト
* @return 削除したホスト情報のhostidのリスト
*/
@SuppressWarnings("unchecked")
public List<String> delete(List<String> hostids) {
if (hostids == null || hostids.isEmpty()) {
throw new IllegalArgumentException("hostid is required.");
}
List<?> param;
if (accessor.checkVersion("3.0.0") < 0) {
List<Map<String, String>> list = new ArrayList<Map<String, String>>();
for (String hostid : hostids) {
Map<String, String> map = new HashMap<String, String>();
map.put("hostid", hostid);
list.add(map);
}
param = list;
} else {
param = hostids;
}
JSONArray params = JSONArray.fromObject(param, defaultConfig);
JSONObject result = (JSONObject) accessor.execute("host.delete", params);
JSONArray resultHostids = result.getJSONArray("hostids");
JsonConfig config = defaultConfig.copy();
config.setCollectionType(List.class);
config.setRootClass(String.class);
return (List<String>) JSONArray.toCollection(resultHostids, config);
}
}