/*
* 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.cobbler;
import java.io.File;
import java.util.HashSet;
import java.util.Set;
import net.augeas.Augeas;
import org.apache.commons.io.FileUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.Property;
import org.rhq.core.domain.configuration.PropertySimple;
import org.rhq.core.domain.configuration.RawConfiguration;
import org.rhq.core.domain.configuration.definition.PropertyDefinitionSimple;
import org.rhq.core.domain.measurement.AvailabilityType;
import org.rhq.core.pluginapi.configuration.ResourceConfigurationFacet;
import org.rhq.core.pluginapi.inventory.InvalidPluginConfigurationException;
import org.rhq.core.pluginapi.inventory.ResourceContext;
import org.rhq.core.util.MessageDigestGenerator;
import org.rhq.plugins.augeas.AugeasConfigurationComponent;
import org.rhq.plugins.augeas.helper.AugeasNode;
import org.rhq.plugins.augeas.helper.AugeasRawConfigHelper;
import org.rhq.plugins.augeas.helper.AugeasTranslator;
/**
* The ResourceComponent for the "Cobbler File" ResourceType.
*
* @author Ian Springer
*/
public class CobblerComponent extends AugeasConfigurationComponent implements AugeasTranslator,
ResourceConfigurationFacet {
private static final String MODULES_PATH = "/etc/cobbler/modules.conf";
private static final String SETTINGS_PATH = "/etc/cobbler/settings";
private final Log log = LogFactory.getLog(this.getClass());
private AugeasRawConfigHelper rawConfigHelper;
@Override
public void start(ResourceContext resourceContext) throws InvalidPluginConfigurationException, Exception {
super.start(resourceContext);
rawConfigHelper = new AugeasRawConfigHelper(getAugeasRootPath(), getAugeasLoadPath(),
getResourceConfigurationRootPath(), this);
rawConfigHelper.addLens("CobblerSettings.lns", SETTINGS_PATH);
rawConfigHelper.addLens("CobblerModules.lns", MODULES_PATH);
rawConfigHelper.addNode(SETTINGS_PATH, "server");
rawConfigHelper.addNode(SETTINGS_PATH, "next_server");
rawConfigHelper.addNode(SETTINGS_PATH, "http_port");
rawConfigHelper.addNode(SETTINGS_PATH, "default_kickstart");
rawConfigHelper.addNode(SETTINGS_PATH, "snippetsdir");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_dhcp");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_dns");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_reverse_zones");
rawConfigHelper.addNode(SETTINGS_PATH, "manage_forward_zones");
rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_bridge");
rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_file_size");
rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_ram");
rawConfigHelper.addNode(SETTINGS_PATH, "default_virt_type");
rawConfigHelper.addNode(MODULES_PATH, "authentication/module");
rawConfigHelper.addNode(MODULES_PATH, "authorization/module");
rawConfigHelper.addNode(MODULES_PATH, "dhcp/module");
rawConfigHelper.addNode(MODULES_PATH, "dns/module");
}
@Override
protected Object toPropertyValue(PropertyDefinitionSimple propDefSimple, Augeas augeas, AugeasNode node) {
if ("manage_dhcp".equals(node.getName()) || "manage_dns".equals(node.getName())) {
return "1".equals(augeas.get(node.getPath()));
}
return super.toPropertyValue(propDefSimple, augeas, node);
}
@Override
protected String toNodeValue(Augeas augeas, AugeasNode node, PropertyDefinitionSimple propDefSimple,
PropertySimple propSimple) {
if ("manage_dhcp".equals(node.getName()) || "manage_dns".equals(node.getName())) {
if (propSimple.getBooleanValue()) {
return "1";
}
return "0";
}
return super.toNodeValue(augeas, node, propDefSimple, propSimple);
}
@Override
protected void setupAugeasModules(Augeas augeas) {
augeas.set("/augeas/load/CobblerSettings/lens", "CobblerSettings.lns");
augeas.set("/augeas/load/CobblerSettings/incl[1]", SETTINGS_PATH);
augeas.set("/augeas/load/CobblerModules/lens", "CobblerModules.lns");
augeas.set("/augeas/load/CobblerModules/incl[1]", MODULES_PATH);
}
public AvailabilityType getAvailability() {
return super.getAvailability();
}
public Set<RawConfiguration> loadRawConfigurations() {
try {
Set<RawConfiguration> configs = new HashSet<RawConfiguration>();
RawConfiguration modules = new RawConfiguration();
modules.setPath(MODULES_PATH);
String contents = FileUtils.readFileToString(new File(MODULES_PATH));
String sha256 = new MessageDigestGenerator(MessageDigestGenerator.SHA_256).calcDigestString(contents);
modules.setContents(contents, sha256);
configs.add(modules);
RawConfiguration settings = new RawConfiguration();
settings.setPath(SETTINGS_PATH);
contents = FileUtils.readFileToString(new File(SETTINGS_PATH));
sha256 = new MessageDigestGenerator(MessageDigestGenerator.SHA_256).calcDigestString(contents);
settings.setContents(contents, sha256);
configs.add(settings);
return configs;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Configuration loadStructuredConfiguration() {
try {
return loadResourceConfiguration();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public RawConfiguration mergeRawConfiguration(Configuration from, RawConfiguration to) {
try {
RawConfiguration config = new RawConfiguration();
rawConfigHelper.mergeRawConfig(from, to, config);
return config;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void mergeStructuredConfiguration(RawConfiguration from, Configuration to) {
try {
rawConfigHelper.mergeStructured(from, to);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void persistRawConfiguration(RawConfiguration rawConfiguration) {
try {
rawConfigHelper.save(rawConfiguration);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void persistStructuredConfiguration(Configuration configuration) {
try {
updateStructuredConfiguration(configuration);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void validateRawConfiguration(RawConfiguration rawConfiguration) {
// TODO Auto-generated method stub
}
public void validateStructuredConfiguration(Configuration configuration) {
// TODO Auto-generated method stub
}
public Property createProperty(String propName, String augeasPath, Augeas aug) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
return new PropertySimple(propName, "1".equals(aug.get(augeasPath)));
}
return new PropertySimple(propName, aug.get(augeasPath));
}
public String getPropertyValue(String propName, Configuration from) {
if ("settings/manage_dhcp".equals(propName) || "settings/manage_dns".equals(propName)) {
PropertySimple prop = (PropertySimple) from.get(propName);
if (prop.getBooleanValue()) {
return "1";
}
return "0";
}
return from.getSimpleValue(propName, "");
}
}