/*
* 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.process.zabbix;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import jp.primecloud.auto.exception.AutoException;
import jp.primecloud.auto.util.MessageUtils;
import jp.primecloud.auto.zabbix.ZabbixClient;
import jp.primecloud.auto.zabbix.model.application.Application;
import jp.primecloud.auto.zabbix.model.application.ApplicationGetParam;
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.hostgroup.HostgroupCreateParam;
import jp.primecloud.auto.zabbix.model.hostgroup.HostgroupGetParam;
import jp.primecloud.auto.zabbix.model.item.Item;
import jp.primecloud.auto.zabbix.model.item.ItemGetParam;
import jp.primecloud.auto.zabbix.model.item.ItemUpdateParam;
import jp.primecloud.auto.zabbix.model.proxy.Proxy;
import jp.primecloud.auto.zabbix.model.proxy.ProxyGetParam;
import jp.primecloud.auto.zabbix.model.template.Template;
import jp.primecloud.auto.zabbix.model.template.TemplateGetParam;
/**
* <p>
* TODO: クラスコメントを記述
* </p>
*
*/
public class ZabbixProcessClient {
protected Log log = LogFactory.getLog(getClass());
protected ZabbixClient zabbixClient;
public ZabbixProcessClient(ZabbixClient zabbixClient) {
this.zabbixClient = zabbixClient;
}
public ZabbixClient getZabbixClient() {
return zabbixClient;
}
public Proxy getProxy(String proxyName) {
ProxyGetParam param = new ProxyGetParam();
Map<String, List<Object>> filter = new HashMap<String, List<Object>>();
filter.put("host", Arrays.asList((Object)proxyName));
param.setFilter(filter);
param.setOutput("extend");
List<Proxy> proxies = zabbixClient.proxy().get(param);
if (proxies.isEmpty()) {
log.info(MessageUtils.getMessage("IPROCESS-100334", proxyName));
return null;
}
return proxies.get(0);
}
public Host getHost(String hostid) {
HostGetParam param = new HostGetParam();
param.setHostids(Arrays.asList(hostid));
param.setOutput("extend");
List<Host> hosts = zabbixClient.host().get(param);
// API実行結果チェック
if (hosts.size() == 0) {
// ホストが存在しない場合
throw new AutoException("EPROCESS-000402", hostid);
} else if (hosts.size() > 1) {
// ホストを複数参照できた場合
AutoException exception = new AutoException("EPROCESS-000403", hostid);
exception.addDetailInfo("result=" + hosts);
throw exception;
}
return hosts.get(0);
}
public String createHost(String hostname, String fqdn, List<Hostgroup> hostgroups,
Boolean status, Boolean userIp, String ip, String proxyHostid) {
HostCreateParam param = new HostCreateParam();
param.setHost(hostname);
param.setGroups(hostgroups);
param.setDns(fqdn);
param.setPort(10050);
if (status != null) {
param.setStatus(status ? 0 : 1); // 有効の場合は0、無効の場合は1
}
if (userIp != null) {
param.setUseip(userIp ? 1: 0); // DNSの場合は0、IPの場合は1
param.setIp(StringUtils.isEmpty(ip) ? "0.0.0.0": ip);
}
if (StringUtils.isNotEmpty(proxyHostid)) {
param.setProxyHostid(proxyHostid);
}
List<String> hostids = zabbixClient.host().create(param);
String hostid = hostids.get(0);
if (log.isInfoEnabled()) {
List<String> groupids = new ArrayList<String>();
if (hostgroups != null) {
for (Hostgroup hostgroup : hostgroups) {
groupids.add(hostgroup.getGroupid());
}
}
log.info(MessageUtils.getMessage("IPROCESS-100311", hostid, fqdn, groupids, status));
}
return hostid;
}
public String updateHost(String hostid, String hostname, String fqdn, List<Hostgroup> hostgroups,
Boolean status, Boolean userIp, String ip, String proxyHostid) {
HostUpdateParam param = new HostUpdateParam();
param.setHostid(hostid);
param.setHost(hostname);
param.setGroups(hostgroups);
param.setDns(fqdn);
param.setPort(10050);
if (status != null) {
param.setStatus(status ? 0 : 1);// 有効の場合は0、無効の場合は1
}
if (userIp != null) {
param.setUseip(BooleanUtils.toInteger(userIp));// DNSの場合は0、IPの場合は1
param.setIp(StringUtils.isEmpty(ip) ? "0.0.0.0": ip);
}
if (StringUtils.isNotEmpty(proxyHostid)) {
param.setProxyHostid(proxyHostid);
}
List<String> hostids = zabbixClient.host().update(param);
hostid = hostids.get(0);
if (log.isInfoEnabled()) {
List<String> groupids = new ArrayList<String>();
if (hostgroups != null) {
for (Hostgroup hostgroup : hostgroups) {
groupids.add(hostgroup.getGroupid());
}
}
log.info(MessageUtils.getMessage("IPROCESS-100312", hostid, fqdn, groupids, status));
}
return hostid;
}
public String deleteHost(String hostid) {
List<String> hostids = zabbixClient.host().delete(Arrays.asList(hostid));
hostid = hostids.get(0);
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100313", hostid));
}
return hostid;
}
public void createHostgroup(String name) {
HostgroupCreateParam param = new HostgroupCreateParam();
param.setName(name);
zabbixClient.hostgroup().create(param);
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100326", name));
}
}
public void deleteHostgroup(String groupid, String name) {
zabbixClient.hostgroup().delete(Arrays.asList(groupid));
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100327", name));
}
}
public Hostgroup getHostgroupByName(String name) {
if (name == null) {
throw new IllegalArgumentException("name is required.");
}
HostgroupGetParam param = new HostgroupGetParam();
Map<String, List<Object>> filter = new HashMap<String, List<Object>>();
filter.put("name", Arrays.asList((Object)name));
param.setFilter(filter);
param.setOutput("extend");
List<Hostgroup> hostgroups = zabbixClient.hostgroup().get(param);
if (hostgroups.isEmpty()) {
return null;
}
Hostgroup hostgroup = hostgroups.get(0);
return hostgroup;
}
public Hostgroup getHostgroup(String groupid) {
HostgroupGetParam param = new HostgroupGetParam();
param.setGroupids(Arrays.asList(groupid));
param.setOutput("extend");
List<Hostgroup> hostgroups = zabbixClient.hostgroup().get(param);
if (hostgroups.isEmpty()) {
return null;
}
return hostgroups.get(0);
}
public List<Hostgroup> getHostgroups() {
HostgroupGetParam param = new HostgroupGetParam();
param.setOutput("extend");
List<Hostgroup> hostgroups = zabbixClient.hostgroup().get(param);
return hostgroups;
}
public List<Hostgroup> getHostgroupsByHostid(String hostid) {
HostGetParam param = new HostGetParam();
param.setHostids(Arrays.asList(hostid));
param.setOutput("extend");
param.setSelectGroups("extend");
List<Host> hosts = zabbixClient.host().get(param);
if (hosts.isEmpty()) {
return new ArrayList<Hostgroup>();
}
return hosts.get(0).getGroups();
}
public Template getTemplateByName(String name) {
TemplateGetParam param = new TemplateGetParam();
Map<String, List<Object>> filter = new HashMap<String, List<Object>>();
filter.put("host", Arrays.asList((Object)name));
param.setFilter(filter);
param.setOutput("extend");
List<Template> templates = zabbixClient.template().get(param);
if (templates.isEmpty()) {
return null;
}
return templates.get(0);
}
public List<Template> getTemplatesByHostid(String hostid) {
// ホストに適用されているテンプレートを取得
HostGetParam param = new HostGetParam();
param.setHostids(Arrays.asList(hostid));
param.setOutput("extend");
param.setSelectParentTemplates("extend");
List<Host> hosts = zabbixClient.host().get(param);
if (hosts.isEmpty()) {
return new ArrayList<Template>();
}
return hosts.get(0).getParenttemplates();
}
public boolean addTemplate(String hostid, Template template) {
// 現在適用されているテンプレートを取得
List<Template> templates = getTemplatesByHostid(hostid);
List<String> templateids = new ArrayList<String>();
for (Template hostTemplate : templates) {
templateids.add(hostTemplate.getTemplateid());
}
// テンプレートが適用されていればスキップする
if (templateids.contains(template.getTemplateid())) {
return false;
}
// テンプレートを適用する
templates.add(template);
HostUpdateParam param2 = new HostUpdateParam();
param2.setHostid(hostid);
param2.setTemplates(templates);
List<String> hostids = zabbixClient.host().update(param2);
hostid = hostids.get(0);
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100321", hostid, template.getTemplateid()));
}
return true;
}
public boolean removeTemplate(String hostid, Template template) {
// 現在適用されているテンプレートを取得
List<Template> templates = getTemplatesByHostid(hostid);
List<String> templateids = new ArrayList<String>();
for (Template hostTemplate : templates) {
templateids.add(hostTemplate.getTemplateid());
}
// テンプレートが適用されていなければスキップする
if (!templateids.contains(template.getTemplateid())) {
return false;
}
// テンプレートを除去する
for (int i = 0; i < templates.size(); i++) {
if (StringUtils.equals(template.getTemplateid(), templates.get(i).getTemplateid())) {
templates.remove(i);
break;
}
}
HostUpdateParam param = new HostUpdateParam();
param.setHostid(hostid);
param.setTemplates(templates);
zabbixClient.host().update(param);
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100322", hostid, template.getTemplateid()));
}
return true;
}
public boolean enableItems(String hostid, String templateid) {
//アイテムを有効化する
List<Item> items = getItemsByTemplateid(hostid, templateid);
if (items.isEmpty()) {
return false;
}
int enabledItems = 0;
for (Item item : items) {
if (!ItemUpdateParam.ENABLE.equals(item.getStatus())) {
ItemUpdateParam itemUpdateParam = new ItemUpdateParam();
itemUpdateParam.setItemid(item.getItemid());
itemUpdateParam.setStatus(ItemUpdateParam.ENABLE);
zabbixClient.item().update(itemUpdateParam);
enabledItems++;
}
}
if (enabledItems > 0) {
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100323", hostid, templateid, items.size()));
}
} else {
return false;
}
return true;
}
public boolean disableItems(String hostid, String templateid) {
//アイテムを無効化する
List<Item> items = getItemsByTemplateid(hostid, templateid);
if (items.isEmpty()) {
return false;
}
int disabledItems = 0;
for (Item item : items) {
if (!ItemUpdateParam.DISABLE.equals(item.getStatus())) {
ItemUpdateParam itemUpdateParam = new ItemUpdateParam();
itemUpdateParam.setItemid(item.getItemid());
itemUpdateParam.setStatus(ItemUpdateParam.DISABLE);
zabbixClient.item().update(itemUpdateParam);
disabledItems++;
}
}
if (disabledItems > 0) {
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100324", hostid, templateid, items.size()));
}
} else {
return false;
}
return true;
}
public boolean deleteItems(String hostid, String templateid) {
// アイテムを削除する
List<Item> items = getItemsByTemplateid(hostid, templateid);
if (items.isEmpty()) {
return false;
}
List<String> itemids = new ArrayList<String>();
for (Item item : items) {
itemids.add(item.getItemid());
}
zabbixClient.item().delete(itemids);
if (log.isInfoEnabled()) {
log.info(MessageUtils.getMessage("IPROCESS-100325", hostid, templateid, items.size()));
}
return true;
}
public List<Item> getItemsByTemplateid(String hostid, String templateid) {
//テンプレートIDに紐づくアイテムを取得
ApplicationGetParam applicationGetParam = new ApplicationGetParam();
//hostidにtemplateidをセットする必要がある
applicationGetParam.setHostids(Arrays.asList(templateid));
applicationGetParam.setOutput("extend");
List<Application> applications = zabbixClient.application().get(applicationGetParam);
List<Item> items = new ArrayList<Item>();
for (Application application : applications) {
ItemGetParam itemGetParam = new ItemGetParam();
itemGetParam.setApplication(application.getName());
itemGetParam.setHostids(Arrays.asList(hostid));
itemGetParam.setOutput("extend");
items.addAll(zabbixClient.item().get(itemGetParam));
}
return items;
}
}