예제 #1
0
  public static File convertRpmToZip(File file) throws Exception {
    LOG.info("File: " + file.getAbsolutePath());

    FileInputStream fis = new FileInputStream(file);
    ReadableChannelWrapper in = new ReadableChannelWrapper(Channels.newChannel(fis));

    InputStream uncompressed = new GZIPInputStream(fis);
    in = new ReadableChannelWrapper(Channels.newChannel(uncompressed));

    String rpmZipName = file.getName();
    rpmZipName = StringUtils.replace(rpmZipName, ".", "-");
    rpmZipName = rpmZipName + ".zip";
    String rpmZipPath = FilenameUtils.getFullPath(file.getAbsolutePath());

    File rpmZipOutput = new File(rpmZipPath + File.separator + rpmZipName);
    LOG.info("Converting RPM: " + file.getName() + " to ZIP: " + rpmZipOutput.getName());
    ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(rpmZipOutput));

    String rpmName = file.getName();
    rpmName = StringUtils.replace(rpmName, ".", "-");

    CpioHeader header;
    int total = 0;
    do {
      header = new CpioHeader();
      total = header.read(in, total);

      if (header.getFileSize() > 0) {
        BoundedInputStream bis = new BoundedInputStream(uncompressed, header.getFileSize());

        String relPath = FilenameUtils.separatorsToSystem(header.getName());
        relPath = StringUtils.removeStart(relPath, ".");
        relPath = StringUtils.removeStart(relPath, "/");
        relPath = rpmName + File.separator + relPath;
        relPath = StringUtils.replace(relPath, "\\", "/");

        ZipEntry zipEntry = new ZipEntry(relPath);
        zos.putNextEntry(zipEntry);
        IOUtils.copy(bis, zos);
      } else {
        final int skip = header.getFileSize();
        if (uncompressed.skip(skip) != skip) throw new RuntimeException("Skip failed.");
      }

      total += header.getFileSize();
    } while (!header.isLast());

    zos.flush();
    zos.close();

    return rpmZipOutput;
  }
예제 #2
0
 /**
  * Scans a file and prints out useful information. This utility reads from standard input, and
  * parses the binary contents of the RPM file.
  *
  * @throws Exception if an error occurs while reading the RPM file or it's contents
  */
 public static void main(String[] args) throws Exception {
   InputStream fios = new FileInputStream(args[0]);
   ReadableChannelWrapper in = new ReadableChannelWrapper(Channels.newChannel(fios));
   Format format = new Scanner().run(in);
   System.out.println(format);
   InputStream uncompressed = new GZIPInputStream(fios);
   in = new ReadableChannelWrapper(Channels.newChannel(uncompressed));
   CpioHeader header;
   int total = 0;
   do {
     header = new CpioHeader();
     total = header.read(in, total);
     System.out.println(header);
     final int skip = header.getFileSize();
     if (uncompressed.skip(skip) != skip) throw new RuntimeException("Skip failed.");
     total += header.getFileSize();
   } while (!header.isLast());
 }