List of usage examples for org.apache.commons.compress.tar TarEntry getName
public String getName()
From source file:org.bootchart.Main.java
/** * Parses the bootchart log tarball from the log tarball or directory and * renders the chart to the output stream. * // w ww.j av a2s.c om * @param logFile log tarball or directory * @param format image format (png, svg or eps) * @param prune whether to prune the tree * @param fileName file name prefix * @return rendered image file path * @throws IOException if an I/O error is thrown */ public static String render(File logFile, String format, boolean prune, String fileName) throws IOException { if (!logFile.exists()) { return null; } TarInputStream tis = null; File[] files = null; boolean isLogTarball; // whether it's a tarball or dir if (logFile.isFile()) { isLogTarball = true; InputStream is = new FileInputStream(logFile); if (logFile.getName().endsWith("gz")) { is = new GZIPInputStream(is); } tis = new TarInputStream(is); } else { isLogTarball = false; files = logFile.listFiles(); Arrays.sort(files); } Properties headers = new Properties(); Map pidNameMap = null; Map forkMap = null; Stats cpuStats = null; Stats diskStats = null; PsStats psStats = null; BootStats bootStats = null; int numCpu = 1; String monitoredApp = null; // used for profiling specific processes boolean hasMoreFiles = true; int fileI = 0; while (hasMoreFiles) { String logName = null; InputStream is = null; TarEntry tarEntry = null; if (isLogTarball) { tarEntry = tis.getNextEntry(); if (tarEntry == null) { hasMoreFiles = false; break; } logName = tarEntry.getName(); is = tis; } else { logName = files[fileI].getName(); is = new FileInputStream(files[fileI]); fileI++; if (fileI >= files.length) { hasMoreFiles = false; } } log.fine("Parsing log file: " + logName); if (logName.equals("header")) { // read the headers headers = HeaderParser.parseLog(is); if (headers != null) { monitoredApp = headers.getProperty("profile.process"); } numCpu = HeaderParser.getNumCPUs(headers); } else if (logName.equals("ps.log")) { // read ps log file psStats = PsParser.parseLog(is, pidNameMap, forkMap); } else if (logName.equals("proc_ps.log")) { // read the /proc/[PID]/stat log file psStats = ProcPsParser.parseLog(is, pidNameMap, forkMap); } else if (logName.equals("proc_stat.log")) { // read the /proc/stat log file cpuStats = ProcStatParser.parseLog(is); } else if (logName.equals("proc_diskstats.log")) { // read the /proc/diskstats log file diskStats = ProcDiskStatParser.parseLog(is, numCpu); } else if (logName.equals("kernel_pacct")) { // parse process forking PID mappings forkMap = PacctParser.parseLog(is); } else if (logName.equals("init_pidname.log")) { // map pids to command names (useful for Gentoo, where most init // processes are sourced and thus shown as "rc boot" or // "rc default") pidNameMap = PidNameParser.parseLog(is); } else { log.warning("Unknown log file: " + logName); if (logName.length() > 32) { // We're getting garbage from TarInputStream. Break out since // a malformed tarball can cause spinning. hasMoreFiles = false; break; } } } long opTime = 0; if (bootStats == null) { ProcessTree procTree = new ProcessTree(null, monitoredApp, prune); if (psStats == null || psStats.processList.size() == 0) { log.warning("No process samples"); } else { opTime = System.currentTimeMillis(); procTree = new ProcessTree(psStats, monitoredApp, prune); opTime = System.currentTimeMillis() - opTime; log.fine("Tree generation and pruning took " + opTime + " ms"); if (procTree.processTree.size() == 0 || procTree.duration == 0) { log.warning("No processes found"); } } //log.fine(procTree.toString()); bootStats = new BootStats(cpuStats, diskStats, procTree); } Renderer renderer = null; opTime = System.currentTimeMillis(); if ("png".equals(format)) { renderer = new PNGRenderer(); } else if ("svg".equals(format)) { renderer = new SVGRenderer(); } else if ("eps".equals(format)) { renderer = new EPSRenderer(); } else { throw new IllegalArgumentException("Invalid format: " + format); } fileName += "." + renderer.getFileSuffix(); FileOutputStream fos = new FileOutputStream(fileName); renderer.render(headers, bootStats, fos); fos.close(); log.fine("Wrote image: " + new File(fileName).getAbsolutePath()); System.out.println("Wrote image: " + new File(fileName).getAbsolutePath()); opTime = System.currentTimeMillis() - opTime; log.fine("Render time: " + opTime + " ms)"); return fileName; }
From source file:org.dcm4chex.archive.hsm.TarRetrieverService.java
private void extractTar(File tarFile, File cacheDir) throws IOException, VerifyTarException { int count = 0; long totalSize = 0; long free = FileSystemUtils.freeSpace(journal.getDataRootDir().getPath()); long fsize = tarFile.length(); long toDelete = fsize + minFreeDiskSpace - free; if (toDelete > 0) free += free(toDelete);// ww w.j av a2s. c o m byte[] buf = new byte[bufferSize]; TarInputStream tar = new TarInputStream(new FileInputStream(tarFile)); InputStream in = tar; try { TarEntry entry = skipDirectoryEntries(tar); if (entry == null) throw new IOException("No entries in " + tarFile); String entryName = entry.getName(); Map<String, byte[]> md5sums = null; MessageDigest digest = null; if ("MD5SUM".equals(entryName)) { if (checkMD5) { try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } md5sums = new HashMap<String, byte[]>(); BufferedReader lineReader = new BufferedReader(new InputStreamReader(tar)); String line; while ((line = lineReader.readLine()) != null) { md5sums.put(line.substring(34), MD5Utils.toBytes(line.substring(0, 32))); } } entry = skipDirectoryEntries(tar); } else if (checkMD5) { getLog().warn("Missing MD5SUM entry in " + tarFile); } for (; entry != null; entry = skipDirectoryEntries(tar)) { entryName = entry.getName(); // Retrieve saved MD5 checksum byte[] md5sum = null; if (md5sums != null && digest != null) { md5sum = md5sums.remove(entryName); if (md5sum == null) throw new VerifyTarException("Unexpected TAR entry: " + entryName + " in " + tarFile); digest.reset(); in = new DigestInputStream(tar, digest); } File fOri = new File(cacheDir, entryName.replace('/', File.separatorChar)); File f = new File(fOri.getAbsolutePath() + ".tmp"); File dir = f.getParentFile(); if (dir.mkdirs()) { log.info("M-WRITE " + dir); } log.info("M-WRITE " + f); // Write the stream to file FileOutputStream out = new FileOutputStream(f); boolean cleanup = true; try { int len; while ((len = in.read(buf)) > 0) { out.write(buf, 0, len); } cleanup = false; } finally { try { out.close(); } catch (Exception ignore) { } if (cleanup) { log.info("M-DELETE " + f); f.delete(); } } // Verify MD5 if (md5sums != null && digest != null) { if (!Arrays.equals(digest.digest(), md5sum)) { log.info("M-DELETE " + f); f.delete(); throw new VerifyTarException( "Failed MD5 check of TAR entry: " + entryName + " in " + tarFile); } else log.info("MD5 check is successful for " + entryName + " in " + tarFile); } free -= f.length(); count++; totalSize += f.length(); if (f.exists()) f.renameTo(fOri); } } finally { tar.close(); } toDelete = prefFreeDiskSpace - free; if (toDelete > 0) { freeNonBlocking(toDelete); } }
From source file:org.dcm4chex.archive.hsm.VerifyTar.java
public static Map<String, byte[]> verify(InputStream in, String tarname, byte[] buf, ArrayList<String> objectNames) throws IOException, VerifyTarException { TarInputStream tar = new TarInputStream(in); try {//www. j a va 2s . c o m log.debug("Verify tar file: {}", tarname); TarEntry entry = tar.getNextEntry(); if (entry == null) throw new VerifyTarException("No entries in " + tarname); String entryName = entry.getName(); if (!"MD5SUM".equals(entryName)) throw new VerifyTarException("Missing MD5SUM entry in " + tarname); BufferedReader dis = new BufferedReader(new InputStreamReader(tar)); HashMap<String, byte[]> md5sums = new HashMap<String, byte[]>(); String line; while ((line = dis.readLine()) != null) { char[] c = line.toCharArray(); byte[] md5sum = new byte[16]; for (int i = 0, j = 0; i < md5sum.length; i++, j++, j++) { md5sum[i] = (byte) ((fromHexDigit(c[j]) << 4) | fromHexDigit(c[j + 1])); } md5sums.put(line.substring(34), md5sum); } Map<String, byte[]> entries = new HashMap<String, byte[]>(md5sums.size()); entries.putAll(md5sums); MessageDigest digest; try { digest = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } while ((entry = tar.getNextEntry()) != null) { entryName = entry.getName(); log.debug("START: Check MD5 of entry: {}", entryName); if (objectNames != null && !objectNames.remove(entryName)) throw new VerifyTarException( "TAR " + tarname + " contains entry: " + entryName + " not in file list"); byte[] md5sum = (byte[]) md5sums.remove(entryName); if (md5sum == null) throw new VerifyTarException("Unexpected TAR entry: " + entryName + " in " + tarname); digest.reset(); in = new DigestInputStream(tar, digest); while (in.read(buf) > 0) ; if (!Arrays.equals(digest.digest(), md5sum)) { throw new VerifyTarException("Failed MD5 check of TAR entry: " + entryName + " in " + tarname); } log.debug("DONE: Check MD5 of entry: {}", entryName); } if (!md5sums.isEmpty()) throw new VerifyTarException("Missing TAR entries: " + md5sums.keySet() + " in " + tarname); if (objectNames != null && !objectNames.isEmpty()) throw new VerifyTarException( "Missing TAR entries from object list: " + objectNames.toString() + " in " + tarname); return entries; } finally { tar.close(); } }