From caa74ca94c0bffe1d40a180600baf54e0de31d28 Mon Sep 17 00:00:00 2001
From: Kai Reinhard <K.Reinhard@micromata.de>
Date: Tue, 11 Dec 2018 07:26:10 +0000
Subject: [PATCH] Main supports now displaying content files of an archive content cache file (as cli -e).

---
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java |    8 ++++
 borgbutler-server/src/main/resources/log4j.properties                                 |    2 +
 borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java              |   52 ++++++++++++++++++++++++++
 borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java          |    4 ++
 4 files changed, 66 insertions(+), 0 deletions(-)

diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
index 9b355cc..d07ff28 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ArchiveFilelistCache.java
@@ -62,6 +62,14 @@
         if (!file.exists()) {
             return null;
         }
+        return load(file);
+    }
+
+    public FilesystemItem[] load(File file) {
+        if (file.exists() == false) {
+            log.error("File '" + file.getAbsolutePath() + "' doesn't exist. Can't get archive content files.");
+            return null;
+        }
         log.info("Loading archive content as file list from: " + file.getAbsolutePath());
         FilesystemItem[] list = null;
         try {
diff --git a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
index 6f093c4..7fd03fe 100644
--- a/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
+++ b/borgbutler-core/src/main/java/de/micromata/borgbutler/cache/ButlerCache.java
@@ -95,6 +95,10 @@
         return items;
     }
 
+    public FilesystemItem[] getArchiveContent(File file) {
+        return archiveFilelistCache.load(file);
+    }
+
     public void shutdown() {
         JCS.shutdown();
     }
diff --git a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
index bee8c24..f050f12 100644
--- a/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
+++ b/borgbutler-server/src/main/java/de/micromata/borgbutler/server/Main.java
@@ -1,13 +1,24 @@
 package de.micromata.borgbutler.server;
 
 import de.micromata.borgbutler.cache.ButlerCache;
+import de.micromata.borgbutler.json.borg.FilesystemItem;
 import de.micromata.borgbutler.server.jetty.JettyServer;
 import de.micromata.borgbutler.server.user.SingleUserManager;
 import de.micromata.borgbutler.server.user.UserManager;
 import org.apache.commons.cli.*;
+import org.apache.commons.compress.compressors.gzip.GzipCompressorOutputStream;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.FilenameUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.*;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
 public class Main {
     private static Logger log = LoggerFactory.getLogger(Main.class);
 
@@ -35,6 +46,7 @@
     private void _start(String[] args) {
         // create Options object
         Options options = new Options();
+        options.addOption("e", "extract-archive-content", true, "Extracts the content of an archive cache file only (doesn't start the server). A complete file list of the archive will be extracted to stdout.");
         options.addOption("p", "port", true, "The default port for the web server.");
         options.addOption("q", "quiet", false, "Don't open browser automatically.");
         options.addOption("h", "help", false, "Print this help screen.");
@@ -46,6 +58,11 @@
                 printHelp(options);
                 return;
             }
+            if (line.hasOption('e')) {
+                String file = line.getOptionValue("e");
+                printArchiveContent(file);
+                return;
+            }
             if (line.hasOption('p')) {
                 // initialise the member variable
                 String portString = line.getOptionValue("p");
@@ -112,4 +129,39 @@
         HelpFormatter formatter = new HelpFormatter();
         formatter.printHelp("borgbutler-server", options);
     }
+
+    private static void printArchiveContent(String fileName) {
+        File file = new File(fileName);
+        FilesystemItem[] fileList = ButlerCache.getInstance().getArchiveContent(file);
+        boolean parseFormatExceptionPrinted = false;
+        if (fileList != null && fileList.length > 0) {
+            TimeZone tz = TimeZone.getTimeZone("UTC");
+            DateFormat iso = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss'Z'"); // Quoted "Z" to indicate UTC, no timezone offset
+            iso.setTimeZone(tz);
+            DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.S");
+            File out = new File(FilenameUtils.getBaseName(fileName) + ".txt.gz");
+            log.info("Writing file list to: " + out.getAbsolutePath());
+            try (PrintWriter writer = new PrintWriter(new BufferedOutputStream(new GzipCompressorOutputStream(new FileOutputStream(out))))) {
+                for (FilesystemItem item : fileList) {
+                    String time = item.getMtime();
+                    try {
+                        Date date = df.parse(item.getMtime());
+                        time = iso.format(date);
+                    } catch (java.text.ParseException ex) {
+                        if (!parseFormatExceptionPrinted) {
+                            parseFormatExceptionPrinted = true;
+                            log.error("Can't parse date: " + item.getMtime());
+                        }
+                    }
+                    writer.write(item.getMode() + " " + item.getUser() + " "
+                            + StringUtils.rightPad(FileUtils.byteCountToDisplaySize(item.getSize()), 10)
+                            + " " + time + " " + item.getPath());
+                    writer.write("\n");
+                }
+            } catch (IOException ex) {
+                log.error("Can't write file '" + out.getAbsolutePath() + "': " + ex.getMessage());
+            }
+        }
+        // 2018-12-04T22:44:58.924642
+    }
 }
diff --git a/borgbutler-server/src/main/resources/log4j.properties b/borgbutler-server/src/main/resources/log4j.properties
index 5b3dfdf..141c0c5 100644
--- a/borgbutler-server/src/main/resources/log4j.properties
+++ b/borgbutler-server/src/main/resources/log4j.properties
@@ -2,6 +2,8 @@
 #log4j.logger.de.micromata.borgbutler.persistency=debug
 #log4j.logger.de.micromata.borgbutler.main.jetty=debug
 
+log4j.logger.org.apache.commons.jcs=WARN
+
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 

--
Gitblit v1.10.0