/**
* Copyright (c) 2009--2014 Red Hat, Inc.
*
* This software is licensed to you under the GNU General Public License,
* version 2 (GPLv2). There is NO WARRANTY for this software, express or
* implied, including the implied warranties of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. You should have received a copy of GPLv2
* along with this software; if not, see
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt.
*
* Red Hat trademarks are not licensed under GPLv2. No permission is
* granted to use or replicate Red Hat trademarks that are incorporated
* in this software or its documentation.
*/
package com.redhat.rhn.taskomatic.task.repomd;
import com.redhat.rhn.domain.channel.Channel;
import com.redhat.rhn.frontend.dto.PackageCapabilityDto;
import com.redhat.rhn.frontend.dto.PackageDto;
import com.redhat.rhn.manager.task.TaskManager;
import com.redhat.rhn.taskomatic.task.TaskConstants;
import org.apache.log4j.Logger;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Collection;
import java.util.zip.GZIPOutputStream;
/**
*
* @version $Rev $
*
*/
public class DebPackageWriter {
private static Logger log = Logger.getLogger(DebPackageWriter.class);
private String filenamePackages = "";
private String channelLabel = "";
/**
*
* @param channel debian channel
* @param prefix path to repository
*/
public DebPackageWriter(Channel channel, String prefix) {
log.debug("DebPackageWriter created");
try {
channelLabel = channel.getLabel();
filenamePackages = prefix + "Packages";
File f = new File(filenamePackages);
if (f.exists()) {
f.delete();
}
f.createNewFile();
}
catch (Exception e) {
log.debug("Create file Packages failed " + e.toString());
}
}
/**
* add package info to Packages file in repository
*
* @param pkgDto package object
*/
public void addPackage(PackageDto pkgDto) {
try {
BufferedWriter out = new BufferedWriter(new FileWriter(
filenamePackages, true));
out.write("Package: ");
out.write(pkgDto.getName());
out.newLine();
out.write("Version: ");
out.write(pkgDto.getVersion());
String release = pkgDto.getRelease();
if (!release.equalsIgnoreCase("X")) {
out.write("-" + release);
}
out.newLine();
out.write("Architecture: ");
out.write(pkgDto.getArchLabel().replace("-deb", ""));
out.newLine();
out.write("Maintainer: ");
out.write(pkgDto.getVendor());
out.newLine();
Long packagePayloadSize = pkgDto.getPayloadSize();
if (packagePayloadSize > 0) {
out.write("Installed-Size: ");
out.write(pkgDto.getPayloadSize().toString());
out.newLine();
}
// dependencies
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_PROVIDES,
pkgDto.getId(), "Provides");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_REQUIRES,
pkgDto.getId(), "Depends");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_CONFLICTS,
pkgDto.getId(), "Conflicts");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_OBSOLETES,
pkgDto.getId(), "Replaces");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_SUGGESTS,
pkgDto.getId(), "Suggests");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_RECOMMENDS,
pkgDto.getId(), "Recommends");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_PREDEPENDS,
pkgDto.getId(), "Pre-Depends");
addPackageDepData(
out,
TaskConstants.TASK_QUERY_REPOMD_GENERATOR_CAPABILITY_BREAKS,
pkgDto.getId(), "Breaks");
out.write("Filename: XMLRPC/GET-REQ/" + channelLabel + "/getPackage/" +
pkgDto.getName() + "-" + pkgDto.getVersion() + "-" +
pkgDto.getRelease() + "." + pkgDto.getArchLabel() + ".deb");
out.newLine();
// size of package, is checked by apt
out.write("Size: ");
out.write(pkgDto.getPackageSize().toString());
out.newLine();
// at least one checksum is required by apt
if (pkgDto.getChecksumType().equalsIgnoreCase("md5")) {
out.write("MD5sum: ");
out.write(pkgDto.getChecksum());
out.newLine();
}
if (pkgDto.getChecksumType().equalsIgnoreCase("sha1")) {
out.write("SHA1: ");
out.write(pkgDto.getChecksum());
out.newLine();
}
if (pkgDto.getChecksumType().equalsIgnoreCase("sha256")) {
out.write("SHA256: ");
out.write(pkgDto.getChecksum());
out.newLine();
}
out.write("Section: ");
out.write(pkgDto.getPackageGroupName());
out.newLine();
// Priority is not stored in DB
// out.write("Priority: ");
// out.write(pkgDto.get);
// out.newLine();
// out.write("Homepage: ");
// out.write(pkgDto.get);
// out.newLine();
out.write("Description: ");
out.write(pkgDto.getDescription());
out.newLine();
// new line after package metadata
out.newLine();
out.flush();
out.close();
}
catch (Exception e) {
log.debug("Failed to add deb package " + e.toString());
}
}
/**
* @param out
*
* @param pkgCapIter
* pkg capability info
* @param pkgId
* package Id to set
* @param dep
* dependency info
*/
private void addPackageDepData(BufferedWriter out, String query,
Long pkgId, String dep) {
int count = 0;
Collection<PackageCapabilityDto> capabilities = TaskManager
.getPackageCapabilityDtos(pkgId, query);
int icapcount = capabilities.size();
String[] names = new String[icapcount];
String[] versions = new String[icapcount];
String[] senses = new String[icapcount];
try {
for (PackageCapabilityDto capability : capabilities) {
if (count == 0) {
out.write(dep + ": ");
}
count++;
int iordernumber = Integer.parseInt(capability.getName().substring(
capability.getName().indexOf("_") + 1));
names[iordernumber] = capability.getName().substring(
0, capability.getName().indexOf("_"));
versions[iordernumber] = capability.getVersion();
senses[iordernumber] = getSenseAsString(capability.getSense());
}
for (int iIndex = 0; iIndex < names.length; iIndex++) {
if (iIndex != 0) {
out.write(", ");
}
out.write(names[iIndex]);
if (versions[iIndex] != null && !versions[iIndex].isEmpty()) {
out.write(" (");
if (senses[iIndex] != null) {
out.write(senses[iIndex] + " ");
}
out.write(versions[iIndex]);
out.write(")");
}
}
}
catch (Exception e) {
log.debug("failed to write DEB dependency " + dep + " " + e.toString());
}
try {
if (count > 0) {
out.newLine();
}
}
catch (Exception e) {
log.debug("failed to write new line " + e.toString());
}
}
/**
* @param senseIn package sense
* @return a human readable representation of the sense
*/
private String getSenseAsString(long senseIn) {
long sense = senseIn & 0xf;
if (sense == 2) {
return "<<";
}
else if (sense == 4) {
return ">>";
}
else if (sense == 8) {
return "=";
}
else if (sense == 10) {
return "<=";
}
else if (sense == 12) {
return ">=";
}
else { // 0
return null;
}
}
/**
* Create Packages.gz from Packages
*/
public void generatePackagesGz() {
try {
// Create the GZIP output stream
String outFilename = filenamePackages + ".gz";
GZIPOutputStream out = new GZIPOutputStream(new FileOutputStream(
outFilename, false));
// Open the input file
FileInputStream in = new FileInputStream(filenamePackages);
// Transfer bytes from the input file to the GZIP output stream
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
out.write(buf, 0, len);
}
in.close();
// Complete the GZIP file
out.finish();
out.close();
}
catch (IOException e) {
log.debug("Failed to create Packages.gz " + e.toString());
}
}
}