/*
* 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;
import java.util.regex.Pattern;
import org.rhq.core.system.SystemInfo;
/**
* Handles discovery of DEB artifacts and revisions on a Linux system.
*
* @author Jason Dobies
*/
public class DebPackageDiscoveryDelegate {
// Constants --------------------------------------------
private static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+");
// Static --------------------------------------------
private static SystemInfo systemInfo;
private static boolean dpkgExists;
private static boolean aptCacheExists;
// Public --------------------------------------------
/*
* public static void checkExecutables() { File dpkgExec = new File("/usr/bin/dpkg"); dpkgExists =
* dpkgExec.exists();
*
* File aptCacheExec = new File("/usr/bin/apt-cache"); aptCacheExists = aptCacheExec.exists(); }
*
* public static Set<ArtifactDetails> discoverPackages(ArtifactType type) throws IOException {
* Set<ArtifactDetails> artifacts = new HashSet<ArtifactDetails>();
*
* // Make sure dpkg is actually on the system if (!dpkgExists) return artifacts;
*
* ProcessExecution processExecution = new ProcessExecution("/usr/bin/dpkg"); processExecution.setArguments(new
* String[]{"-l"}); processExecution.setCaptureOutput(true);
*
* ProcessExecutionResults executionResults = systemInfo.executeProcess(processExecution); String capturedOutput =
* executionResults.getCapturedOutput();
*
* if (capturedOutput == null) { return artifacts; }
*
*/
/* Output Format:
* Desired=Unknown/Install/Remove/Purge/Hold |
* Status=Not/Installed/Config-files/Unpacked/Failed-config/Half-installed |/
* Err?=(none)/Hold/Reinst-required/X=both-problems (Status,Err: uppercase=bad) ||/ Name
* Version Description
* +++-==========================-==========================-====================================================================
* ii acpi 0.09-1 displays information on ACPI devices ii
* acpi-support 0.95 a collection of useful events for acpi ii acpid
* 1.0.4-5ubuntu6 Utilities for using ACPI power management rc apache2-common
* 2.0.55-4ubuntu4 next generation, scalable, extendable web server
*/
/*
*
* BufferedReader lineReader = new BufferedReader(new StringReader(capturedOutput));
*
* // Pop off the first 5 lines of table headers for (int ii = 0; ii < 5; ii++) { lineReader.readLine();
* }
*
* String line; while ((line = lineReader.readLine()) != null) { String[] columns =
* WHITESPACE_PATTERN.split(line);
*
* String artifactName = columns[1];
*
* String description = ""; for (int ii = 3; ii < columns.length; ii++) description = description +
* columns[ii] + " ";
*
* ArtifactDetails artifact = new ArtifactDetails(type, artifactName, artifactName);
* artifact.setDescription(description);
*
* artifacts.add(artifact); }
*
* return artifacts; }
*
* public static ArtifactRevisionDetails discoverRevision(ArtifactDetails artifact, ArtifactRevisionDetails
* lastRevision) throws IOException { // Make sure apt-cache is actually on the system if (!aptCacheExists)
* return null;
*
* ProcessExecution processExecution = new ProcessExecution("/usr/bin/apt-cache");
* processExecution.setArguments(new String[]{"show", artifact.getArtifactKey()});
* processExecution.setCaptureOutput(true);
*
* ProcessExecutionResults executionResults = systemInfo.executeProcess(processExecution); String capturedOutput =
* executionResults.getCapturedOutput();
*
* if (capturedOutput == null) { return null; }
*
*/
/* Output Format:
* Package: php4-common Status: install ok installed Priority: optional Section: web
* Installed-Size: 392 Maintainer: Debian PHP Maintainers <pkg-php-maint@lists.alioth.debian.org>
* Architecture: i386 Source: php4 Version: 4:4.4.2-1.1 Depends: sed (>= 4.1.1-1) Conffiles:
* /etc/cron.d/php4 e54ece92e079603b47bbf398e669f9f8 Description: Common files for packages built from the php4
* source This package contains the documentation and example files relevant to all the other packages
* built from the php4 source. . PHP4 is an HTML-embedded scripting language. Much of its syntax is
* borrowed from C, Java and Perl with a couple of unique PHP-specific features thrown in. The goal of the
* language is to allow web developers to write dynamically generated pages quickly. . Homepage:
* http://www.php.net/ Package: aterm Priority: optional Section: universe/x11
* Installed-Size: 228 Maintainer: Ubuntu MOTU Developers <ubuntu-motu@lists.ubuntu.com>
* Original-Maintainer: G�ran Weinholt <weinholt@debian.org> Architecture: i386 Version: 1.0.0-4
* Provides: x-terminal-emulator Depends: libafterimage0 (>= 2.2.2), libc6 (>= 2.5-0ubuntu1), libfreetype6 (>=
* 2.2), libice6 (>= 1:1.0.0), libjpeg62, libpng12-0 (>= 1.2.13-4), libsm6, libtiff4, libungif4g (>= 4.1.4),
* libx11-6, libxext6, zlib1g (>= 1:1.2.1) Conflicts: suidmanager (<< 0.50) Filename:
* pool/universe/a/aterm/aterm_1.0.0-4_i386.deb Size: 83220 MD5sum: a78aeb3aafe549f91167ed427045c46b
* SHA1: d56766194b730614d6f143fca1446abe205343c8 SHA256:
* 14c1dcce265b5f4f393682a7968c0657ed1b5c92888767362279e04e1a3325fe Description: Afterstep XVT - a VT102
* emulator for the X window system Aterm is a colour vt102 terminal emulator, based on rxvt 2.4.8 with
* some additions of fast transparency, intended as an xterm replacement for users who do not require features
* such as Tektronix 4014 emulation and toolkit-style configurability. As a result, aterm uses much less
* swap space -- a significant advantage on a machine serving many X sessions. It was created with AfterStep
* Window Manager users in mind, but is not tied to any libraries, and can be used anywhere. Bugs:
* mailto:ubuntu-users@lists.ubuntu.com Origin: Ubuntu
*
*/
/*
*
* ArtifactRevisionDetails details = new ArtifactRevisionDetails(artifact.getArtifactKey(),
* "application/octet-stream"); Configuration configuration = new Configuration();
* details.setConfigurationContent(configuration);
*
* BufferedReader lineReader = new BufferedReader(new StringReader(capturedOutput));
*
* String line; String[] pieces;
*
* while ((line = lineReader.readLine()) != null) { pieces = WHITESPACE_PATTERN.split(line);
*
* if (pieces.length == 0) continue;
*
* // Version if (pieces[0].equals("Version:")) { String version = pieces[1];
*
* // ***** Version check to determine if this is a new revision ***** if (lastRevision != null &&
* lastRevision.getRevisionIdentifier() != null && lastRevision.getRevisionIdentifier().equals(version)) {
* return null; }
*
* configuration.put(new PropertySimple("Version", version)); details.setRevisionIdentifier(version);
* }
*
* // Filename else if (pieces[0].equals("Filename:")) configuration.put(new
* PropertySimple("Filename", pieces[1]));
*
* // MD5 else if (pieces[0].equals("MD5sum:")) details.setMd5(pieces[1]);
*
* // Size else if (pieces[0].equals("Size:")) details.setContentSize(new Long(pieces[1]));
*
* // Architecture else if (pieces[0].equals("Architecture:")) configuration.put(new
* PropertySimple("Architecture", pieces[1])); }
*
* return details; }
*
* public static void setSystemInfo(SystemInfo systemInfo) { DebPackageDiscoveryDelegate.systemInfo = systemInfo; }
*
* // Private --------------------------------------------
*
* private String executeWhich(String findMe) { ProcessExecution processExecution = new
* ProcessExecution("/usr/bin/which"); processExecution.setArguments(new String[]{findMe});
* processExecution.setCaptureOutput(true);
*
* ProcessExecutionResults executionResults = systemInfo.executeProcess(processExecution); String capturedOutput =
* executionResults.getCapturedOutput();
*
* String executable = ("".equals(capturedOutput) ? null : capturedOutput); return executable; }
*/
}