/* * 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.augeas.helper; import java.io.File; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import net.augeas.Augeas; import org.apache.commons.io.FileUtils; import org.rhq.core.domain.configuration.Configuration; import org.rhq.core.domain.configuration.Property; import org.rhq.core.domain.configuration.RawConfiguration; import org.rhq.core.util.MessageDigestGenerator; /** * @author paji * */ public class AugeasRawConfigHelper { private String rootPath; private String loadPath; private String rootNodePath; private AugeasTranslator translator; private Map<String, List<String>> nodePaths = new HashMap<String, List<String>>(); private final String transformPrefix = "/augeas/load/custom" + System.currentTimeMillis(); private Map<String, String> configMap = new HashMap<String, String>(); public AugeasRawConfigHelper(String augeasRootPath, String augeasLoadPath, String rootNode, AugeasTranslator t) { rootPath = augeasRootPath; loadPath = augeasLoadPath; rootNodePath = rootNode; translator = t; } public void addLens(String lensName, String configFilePath) { configMap.put(configFilePath, lensName); } public void addNode(String configFilePath, String nodeSuffix) { if (!nodePaths.containsKey(configFilePath)) { nodePaths.put(configFilePath, new LinkedList<String>()); } nodePaths.get(configFilePath).add(nodeSuffix); } public void mergeRawConfig(Configuration from, RawConfiguration existingConfig, RawConfiguration toUpdate) throws Exception { Augeas aug = null; try { String lens = configMap.get(existingConfig.getPath()); aug = createAugeas(lens, existingConfig.getContents()); String file = getFile(aug); for (String pathSuffix : nodePaths.get(existingConfig.getPath())) { String propName = ("/files" + existingConfig.getPath() + "/" + pathSuffix).substring(rootNodePath .length()); String propValue = translator.getPropertyValue(propName, from); aug.set("/files" + file + "/" + pathSuffix, propValue); } aug.save(); toUpdate.setPath(existingConfig.getPath()); String contents = FileUtils.readFileToString(new File(file)); String sha256 = new MessageDigestGenerator(MessageDigestGenerator.SHA_256).calcDigestString(contents); toUpdate.setContents(contents, sha256); } finally { if (aug != null) { aug.close(); } } } public void mergeStructured(RawConfiguration from, Configuration toUpdate) throws Exception { Augeas aug = null; try { String lens = configMap.get(from.getPath()); aug = createAugeas(lens, from.getContents()); String file = getFile(aug); for (String pathSuffix : nodePaths.get(from.getPath())) { String propName = ("/files" + from.getPath() + "/" + pathSuffix).substring(rootNodePath.length()); String augeasPath = "/files" + file + "/" + pathSuffix; Property property = translator.createProperty(propName, augeasPath, aug); toUpdate.put(property); } } finally { if (aug != null) { aug.close(); } } } public void save(RawConfiguration config) throws Exception { File f = new File(config.getPath()); FileUtils.writeStringToFile(f, config.getContents()); } private String getFile(Augeas aug) { return aug.get(transformPrefix + "/incl"); } private Augeas createAugeas(String lens, String contents) throws Exception { Augeas aug = new Augeas(rootPath, loadPath, Augeas.NO_MODL_AUTOLOAD); File fl = File.createTempFile("_rhq", null); //write the 'to' file to disk FileUtils.writeStringToFile(fl, contents); aug.set(transformPrefix + "/lens", lens); aug.set(transformPrefix + "/incl", fl.getAbsolutePath()); aug.load(); return aug; } private String normalizeToUnix(byte[] contents) throws UnsupportedEncodingException { String s = new String(contents, "UTF8"); return s.replaceAll("\r\n", "\n"); } }