/* * 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, version 2, as * published by the Free Software Foundation, and/or the GNU Lesser * General Public License, version 2.1, also as published by the Free * Software Foundation. * * 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 and the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU General Public License * and the GNU Lesser General Public License along with this program; * if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ package org.rhq.plugins.platform.content.yum; import java.util.ArrayList; import java.util.Collection; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.rhq.core.pluginapi.inventory.ResourceContext; import org.rhq.core.system.ProcessExecution; import org.rhq.core.system.ProcessExecutionResults; /** * Represents the yum command line tool. * * @author jortel */ public class YumProxy { /** * The fully qualified path to the yum executable. */ private String yum = "/usr/bin/yum"; private final Log log = LogFactory.getLog(YumProxy.class); @SuppressWarnings("unchecked") private ResourceContext resourceContext; /** * Initialize the proxy with the current system information. During which the fully qualified path to the yum * executable is determined. * * @param resourceContext contains things like plugin config and system information */ @SuppressWarnings("unchecked") public void init(ResourceContext resourceContext) { this.resourceContext = resourceContext; ProcessExecution processExecution = new ProcessExecution("/usr/bin/which"); processExecution.setArguments(new String[] { "yum" }); processExecution.setCaptureOutput(true); ProcessExecutionResults executionResults = resourceContext.getSystemInformation().executeProcess( processExecution); String capturedOutput = executionResults.getCapturedOutput(); yum = (((capturedOutput == null) || "".equals(capturedOutput)) ? null : capturedOutput.trim()); log.info("Using (yum) found at: " + yum); } /** * Get the version of the yum executable. Equal to "yum --version". * * @return The version string of the yum execuatble. * * @throws Exception */ public String version() throws Exception { List<String> args = new ArrayList<String>(1); args.add("--version"); return execute(args); } /** * Install the specified packages. Equal to "yum -y install package, ...." * * @param packages A list of packages to install. * * @throws Exception On any error. */ public void install(Collection<String> packages) throws Exception { log.debug("install packages\n" + packages); List<String> args = new ArrayList<String>(); args.add("install"); args.add("-y"); args.addAll(packages); execute(args); } /** * Remove the specified packages. Equal to "yum -y remove package, ...." * * @param packages A list of packages to remove. * * @throws Exception On any error. */ public void remove(Collection<String> packages) throws Exception { log.debug("remove packages\n" + packages); List<String> args = new ArrayList<String>(); args.add("remove"); args.add("-y"); args.addAll(packages); execute(args); } /** * Clean the yum metadata Equal to "yum clean metadata" * * @throws Exception On any error. */ public void cleanMetadata() throws Exception { log.debug("clean metadata"); List<String> args = new ArrayList<String>(); args.add("clean"); args.add("metadata"); execute(args); } /** * Update packages Equal to "yum update" * * @throws Exception On any error. */ public void update() throws Exception { log.debug("update packages"); List<String> args = new ArrayList<String>(); args.add("update"); args.add("-y"); execute(args); } /** * Execute the specified yum command. * * @param args Command arguments. * * @return The string output. * * @throws Exception On all errors. */ private String execute(List<String> args) throws Exception { if (yum == null) { String msg = "yum executable: not-found"; log.error(msg); throw new Exception(msg); } ProcessExecution installPackages = new ProcessExecution(yum); installPackages.setArguments(args); installPackages.setCaptureOutput(true); installPackages.setWaitForCompletion(1000L * 60 * 30); // wait for it to finish in 30mins ProcessExecutionResults result = this.resourceContext.getSystemInformation().executeProcess(installPackages); String output = result.getCapturedOutput(); Integer exitCode = result.getExitCode(); log.info("yum result: " + exitCode + "\n" + output); if ((output == null) && ((exitCode == null) || (result.getExitCode() != 0))) { throw new Exception(output); } return output; } }