/*
* RHQ Management Platform
* Copyright (C) 2005-2008 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.hosts.helper;
import java.io.File;
import java.io.IOException;
import java.util.Date;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import org.rhq.core.domain.configuration.Configuration;
import org.rhq.core.domain.configuration.ConfigurationUpdateStatus;
import org.rhq.core.domain.configuration.Property;
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.pluginapi.configuration.ConfigurationFacet;
import org.rhq.core.pluginapi.configuration.ConfigurationUpdateReport;
import org.rhq.plugins.hosts.HostsComponent;
/**
* @author Ian Springer
*/
public class NonAugeasHostsConfigurationDelegate implements ConfigurationFacet {
private HostsComponent hostsComponent;
public NonAugeasHostsConfigurationDelegate(HostsComponent hostsComponent) {
this.hostsComponent = hostsComponent;
}
public Configuration loadResourceConfiguration() throws Exception {
Configuration resourceConfig = new Configuration();
List configurationFiles = this.hostsComponent.getConfigurationFiles();
if (configurationFiles == null || configurationFiles.isEmpty()) {
throw new Exception("Cannot find the hosts file on this machine");
}
File hostsFile = (File) configurationFiles.get(0);
Hosts hosts = Hosts.load(hostsFile);
resourceConfig.setNotes("Loaded at " + new Date());
PropertyList entriesProp = new PropertyList(".");
resourceConfig.put(entriesProp);
for (HostsEntry entry : hosts.getEntries()) {
PropertyMap entryProp = new PropertyMap("*[canonical]");
entriesProp.add(entryProp);
entryProp.put(new PropertySimple("ipaddr", entry.getIpAddress()));
entryProp.put(new PropertySimple("canonical", entry.getCanonicalName()));
StringBuilder aliasPropValue = new StringBuilder();
for (String alias : entry.getAliases()) {
aliasPropValue.append(alias).append("\n");
}
if (!entry.getAliases().isEmpty()) {
// Chop the final newline char.
aliasPropValue.deleteCharAt(aliasPropValue.length() - 1);
}
entryProp.put(new PropertySimple("alias", aliasPropValue));
}
return resourceConfig;
}
public void updateResourceConfiguration(ConfigurationUpdateReport report) {
Configuration resourceConfig = report.getConfiguration();
Hosts newHosts = new Hosts();
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);
}
}
HostsEntry entry = new HostsEntry(ipAddress, canonicalName, aliasSet);
newHosts.addEntry(entry);
}
File hostsFile = (File) this.hostsComponent.getConfigurationFiles().get(0);
try {
Hosts.store(newHosts, hostsFile);
} catch (IOException e) {
throw new RuntimeException("Failed to write hosts file [" + hostsFile + "].", e);
}
report.setStatus(ConfigurationUpdateStatus.SUCCESS);
return;
}
}