/* * 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.rhq.plugins.services; import java.util.Date; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.freedesktop.dbus.DBusConnection; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.PropertyList; import org.rhq.core.domain.configuration.PropertyMap; import org.rhq.core.domain.configuration.PropertySimple; import org.rhq.core.domain.measurement.AvailabilityType; import org.rhq.core.pluginapi.configuration.ConfigurationFacet; import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport; import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException; import org.rhq.core.pluginapi.inventory.ResourceComponent; import org.rhq.core.pluginapi.inventory.ResourceContext; import org.rhq.services.ServiceManager; /** * The ResourceComponent for the "Services File" ResourceType. * * @author Partha Aji */ public class ServicesComponent<T extends ResourceComponent> implements ResourceComponent<T>, ConfigurationFacet { private final Log log = LogFactory.getLog(this.getClass()); private ResourceContext<T> resourceContext; private String resourceDescription; private List<String> sysVServices; private List<String> xinetdServices; public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception { this.resourceContext = resourceContext; this.resourceDescription = this.resourceContext.getResourceType() + " Resource with key [" + this.resourceContext.getResourceKey() + "]"; } public void stop() { return; } public AvailabilityType getAvailability() { return AvailabilityType.UP; } private void setupServices() throws Exception { DBusConnection conn = null; try { conn = DBusConnection.getConnection(DBusConnection.SYSTEM); sysVServices = ServiceManager.instance().listSysVServices(conn); xinetdServices = ServiceManager.instance().listXinetdServices(conn); } finally { if (conn != null) { conn.disconnect(); } } } public List<String> getSysVServices() throws Exception { if (sysVServices == null) { setupServices(); } return sysVServices; } public List<String> getXinetDServices() throws Exception { if (xinetdServices == null) { setupServices(); } return xinetdServices; } @Override public Configuration loadResourceConfiguration() throws Exception { Configuration resourceConfig = new Configuration(); resourceConfig.setNotes("Loaded at " + new Date()); PropertyList entriesProp = new PropertyList("services"); resourceConfig.put(entriesProp); for (String name : getSysVServices()) { PropertyMap entryProp = new PropertyMap("service"); entriesProp.add(entryProp); entryProp.put(new PropertySimple("name", name)); entryProp.put(new PropertySimple("type", "Sys V Service")); } for (String name : getXinetDServices()) { PropertyMap entryProp = new PropertyMap("service"); entriesProp.add(entryProp); entryProp.put(new PropertySimple("name", name)); entryProp.put(new PropertySimple("type", "XinetD Service")); } return resourceConfig; } @Override public void updateResourceConfiguration(ConfigurationUpdateReport report) { /** * Configuration resourceConfig = report.getConfiguration(); Services newServices = new Services(); PropertyList entriesProp = resourceConfig.getList("."); for (Property entryProp: entriesProp.getList()) { PropertyMap entryPropMap = (PropertyMap) entryProp; String ipAddress = entryPropMap.getSimple("ipaddr").getStringValue(); String canonicalName = entryPropMap.getSimple("canonical").getStringValue(); String aliases = entryPropMap.getSimpleValue("alias", null); Set<String> aliasSet; if (aliases == null) { aliasSet = null; } else { String[] aliasArray = aliases.trim().split("\\s+"); aliasSet = new LinkedHashSet<String>(aliasArray.length); for (String alias : aliasArray) { aliasSet.add(alias); } } ServicesEntry entry = new ServicesEntry(ipAddress, canonicalName, aliasSet); newServices.addEntry(entry); } File servicesFile = (File)this.servicesComponent.getConfigurationFiles().get(0); try { Services.store(newServices, servicesFile); } catch (IOException e) { throw new RuntimeException("Failed to write services file [" + servicesFile + "].", e); } report.setStatus(ConfigurationUpdateStatus.SUCCESS); return; */ } }