/*
* RHQ Management Platform
* Copyright (C) 2005-2009 Red Hat, Inc.
* All rights reserved.
*
* This program 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 version 2 of the License.
*
* This program 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 this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.custom;
import java.io.File;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.auth.Subject;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.measurement.ResourceAvailability;
import org.rhq.core.domain.resource.InventoryStatus;
import org.rhq.core.domain.resource.ResourceCategory;
import org.rhq.enterprise.server.RHQConstants;
import org.rhq.enterprise.server.plugin.pc.ScheduledJobInvocationContext;
import org.rhq.enterprise.server.plugin.pc.ServerPluginComponent;
import org.rhq.enterprise.server.plugin.pc.ServerPluginContext;
import org.rhq.enterprise.server.resource.ResourceManagerLocal;
import org.rhq.enterprise.server.util.LookupUtil;
/**
* A sample lifecycle listener for the sample generic plugin. This listener will be
* the main plugin component the server uses to start and stop the plugin.
*/
public class SimpleReportsPluginComponent implements ServerPluginComponent {
private final Log log = LogFactory.getLog(SimpleReportsPluginComponent.class);
private static final String PROP_REPORT_DIRECTORY = "reportDirectory";
private static final String PROP_REPORT_HEADER = "reportHeader";
private static final String JOBPROP_SHOW_PLATFORMS = "showPlatforms";
private static final String JOBPROP_SHOW_SERVERS = "showServers";
private static final String JOBPROP_SHOW_SERVICES = "showServices";
private static final String JOBPROP_RESOURCE_IDS = "resourceIds";
private ServerPluginContext context;
private File reportDir = null;
private String reportHeader = null;
public void initialize(ServerPluginContext context) throws Exception {
PropertySimple reportDirProp = context.getPluginConfiguration().getSimple(PROP_REPORT_DIRECTORY);
if (reportDirProp == null || reportDirProp.getStringValue() == null) {
throw new Exception("Simple report server plugin is misconfigured - report directory property is not set");
}
this.reportDir = new File(reportDirProp.getStringValue());
this.reportDir.mkdirs();
if (!this.reportDir.isDirectory()) {
throw new Exception("Report directory does not exist and could not be created: " + this.reportDir);
}
PropertySimple reportHeaderProp = context.getPluginConfiguration().getSimple(PROP_REPORT_HEADER);
if (reportHeaderProp != null) {
this.reportHeader = reportHeaderProp.getStringValue();
} else {
this.reportHeader = null;
}
this.context = context;
log.info("The simple report server plugin has been initialized!!!");
}
public void start() {
log.info("The simple report server plugin has started!!!");
}
public void stop() {
log.info("The simple report server plugin has stopped!!!");
}
public void shutdown() {
log.info("The simple report server plugin has been shut down!!!");
}
public void generateResourceAvailabilityReport(ScheduledJobInvocationContext invocation) throws Exception {
log.info("The simple report server plugin scheduled job [generateResourceAvailabilityReport] has triggered!!!");
Properties data = invocation.getJobDefinition().getCallbackData();
if (data == null) {
throw new Exception("No callback data - cannot generate resource availability report");
}
// determine what resources we need to ping
String resourceIdsStr = data.getProperty(JOBPROP_RESOURCE_IDS, "");
String[] resourceIdsStrArray = resourceIdsStr.split(",");
List<Integer> resourceIds = new ArrayList<Integer>(resourceIdsStrArray.length);
for (String resourceIdStr : resourceIdsStrArray) {
resourceIds.add(new Integer(resourceIdStr)); // throws exception if not a valid number, which halts job (which is good)
}
// ping the resources to get their availabilities
List<ResourceAvailability> avails = new ArrayList<ResourceAvailability>(resourceIds.size());
for (Integer id : resourceIds) {
avails.add(pingResource(id.intValue()));
}
// dump the availability data to the report file
File file = new File(this.reportDir, "availabilities.txt");
PrintStream ps = new PrintStream(file);
try {
printHeader(ps);
ps.println(" Report: AVAILABILITY");
ps.println(" Date: " + new Date());
for (ResourceAvailability avail : avails) {
ps.printf("Resource: %6d | %4s | %s\n", //
avail.getResource().getId(), //
(avail.getAvailabilityType() == null) ? "???" : avail.getAvailabilityType().toString(), //
avail.getResource().getName());
}
} finally {
ps.close();
}
return;
}
public void generateSimpleReports(ScheduledJobInvocationContext invocation) throws Exception {
log.info("The simple report server plugin scheduled job [generateSimpleReport] has triggered!!!");
try {
Properties data = invocation.getJobDefinition().getCallbackData();
boolean showPlatforms = Boolean.parseBoolean(data.getProperty(JOBPROP_SHOW_PLATFORMS, "true"));
boolean showServers = Boolean.parseBoolean(data.getProperty(JOBPROP_SHOW_SERVERS, "true"));
boolean showServices = Boolean.parseBoolean(data.getProperty(JOBPROP_SHOW_SERVICES, "true"));
if (showPlatforms) {
generatePlatformsReport();
}
if (showServers) {
generateServersReport();
}
if (showServices) {
generateServicesReport();
}
} catch (Exception e) {
log.error("Failed to generate simple report", e);
}
return;
}
private void generatePlatformsReport() throws Exception {
Subject user = getOverlord();
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
ResourceCategory category = ResourceCategory.PLATFORM;
int committed = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.COMMITTED);
int ignored = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.IGNORED);
int deleted = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.DELETED);
int uninventoried = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.UNINVENTORIED);
File file = new File(this.reportDir, "platforms.txt");
PrintStream ps = new PrintStream(file);
try {
printHeader(ps);
ps.println(" Report: PLATFORM");
ps.println(" Date: " + new Date());
ps.println(" Committed: " + committed);
ps.println(" Ignored: " + ignored);
ps.println(" Deleted: " + deleted);
ps.println("Uninventoried: " + uninventoried);
} finally {
ps.close();
}
return;
}
private void generateServersReport() throws Exception {
Subject user = getOverlord();
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
ResourceCategory category = ResourceCategory.SERVER;
int committed = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.COMMITTED);
int ignored = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.IGNORED);
int deleted = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.DELETED);
int uninventoried = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.UNINVENTORIED);
File file = new File(this.reportDir, "servers.txt");
PrintStream ps = new PrintStream(file);
try {
printHeader(ps);
ps.println(" Report: SERVER");
ps.println(" Date: " + new Date());
ps.println(" Committed: " + committed);
ps.println(" Ignored: " + ignored);
ps.println(" Deleted: " + deleted);
ps.println("Uninventoried: " + uninventoried);
} finally {
ps.close();
}
return;
}
private void generateServicesReport() throws Exception {
Subject user = getOverlord();
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
ResourceCategory category = ResourceCategory.SERVICE;
int committed = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.COMMITTED);
int ignored = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.IGNORED);
int deleted = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.DELETED);
int uninventoried = resourceManager.getResourceCountByCategory(user, category, InventoryStatus.UNINVENTORIED);
File file = new File(this.reportDir, "services.txt");
PrintStream ps = new PrintStream(file);
try {
printHeader(ps);
ps.println(" Report: SERVICE");
ps.println(" Date: " + new Date());
ps.println(" Committed: " + committed);
ps.println(" Ignored: " + ignored);
ps.println(" Deleted: " + deleted);
ps.println("Uninventoried: " + uninventoried);
} finally {
ps.close();
}
return;
}
private void printHeader(PrintStream ps) {
if (this.reportHeader != null) {
ps.println(this.reportHeader);
}
}
/**
* Returns the availability for the given resource (e.g. UP or DOWN).
*
* @param resourceId the ID of the resource whose availability is to be checked
* @return the resource availability
*/
private ResourceAvailability pingResource(int resourceId) {
Subject user = getOverlord();
ResourceManagerLocal resourceManager = LookupUtil.getResourceManager();
ResourceAvailability avail = resourceManager.getLiveResourceAvailability(user, resourceId);
return avail;
}
private Subject getOverlord() {
Subject user = LookupUtil.getSubjectManager().getOverlord();
return user;
}
// currently not used, but this shows how you'd look up remote EJB SLSBs
private static <T> T lookupRemote(Class<? super T> type) {
try {
return (T) new InitialContext().lookup((RHQConstants.EAR_NAME + "/" + type.getSimpleName() + "/remote"));
} catch (NamingException e) {
throw new RuntimeException("Failed to lookup remote interface to EJB: " + type, e);
}
}
}