From cf4ac293936693f40d81538daf8488aaf5c5f9ed Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 25 Nov 2020 12:07:34 +0100 Subject: [PATCH] Remote logical backup from command line. --- org.argeo.maintenance/.gitignore | 1 + .../maintenance/backup/LogicalBackup.java | 80 ++++++++++++++++--- 2 files changed, 68 insertions(+), 13 deletions(-) diff --git a/org.argeo.maintenance/.gitignore b/org.argeo.maintenance/.gitignore index 09e3bc9b2..bdd97df6d 100644 --- a/org.argeo.maintenance/.gitignore +++ b/org.argeo.maintenance/.gitignore @@ -1,2 +1,3 @@ /bin/ /target/ +/testBackup/ diff --git a/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalBackup.java b/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalBackup.java index a292dcf23..9964b7f53 100644 --- a/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalBackup.java +++ b/org.argeo.maintenance/src/org/argeo/maintenance/backup/LogicalBackup.java @@ -7,6 +7,7 @@ import java.io.InputStream; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; +import java.net.URI; import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Files; @@ -14,6 +15,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.Dictionary; import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; import java.util.zip.ZipEntry; @@ -26,12 +29,16 @@ import javax.jcr.PathNotFoundException; import javax.jcr.Property; import javax.jcr.Repository; import javax.jcr.RepositoryException; +import javax.jcr.RepositoryFactory; import javax.jcr.Session; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.api.NodeConstants; import org.argeo.api.NodeUtils; +import org.argeo.jackrabbit.client.ClientDavexRepositoryFactory; +import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; @@ -81,6 +88,26 @@ public class LogicalBackup implements Runnable { } public void perform() throws RepositoryException, IOException { + // software backup + if (bundleContext != null) + performSoftwareBackup(); + + // data backup + Session defaultSession = login(null); + try { + String[] workspaceNames = defaultSession.getWorkspace().getAccessibleWorkspaceNames(); + workspaces: for (String workspaceName : workspaceNames) { + if ("security".equals(workspaceName)) + continue workspaces; + perform(workspaceName); + } + } finally { + JcrUtils.logoutQuietly(defaultSession); + } + + } + + public void performSoftwareBackup() throws IOException { for (Bundle bundle : bundleContext.getBundles()) { String relativePath = OSGI_BASE + "boot/" + bundle.getSymbolicName() + ".jar"; Dictionary headers = bundle.getHeaders(); @@ -147,18 +174,6 @@ public class LogicalBackup implements Runnable { } } - Session defaultSession = login(null); - try { - String[] workspaceNames = defaultSession.getWorkspace().getAccessibleWorkspaceNames(); - workspaces: for (String workspaceName : workspaceNames) { - if ("security".equals(workspaceName)) - continue workspaces; - perform(workspaceName); - } - } finally { - JcrUtils.logoutQuietly(defaultSession); - } - } public void perform(String workspaceName) throws RepositoryException, IOException { @@ -236,6 +251,45 @@ public class LogicalBackup implements Runnable { } protected Session login(String workspaceName) { - return NodeUtils.openDataAdminSession(repository, workspaceName); + if (bundleContext != null) {// local + return NodeUtils.openDataAdminSession(repository, workspaceName); + } else {// remote + try { + return repository.login(workspaceName); + } catch (RepositoryException e) { + throw new JcrException(e); + } + } } + + public final static void main(String[] args) throws Exception { + if (args.length == 0) { + printUsage("No argument"); + System.exit(1); + } + URI uri = new URI(args[0]); + Repository repository = createRemoteRepository(uri); + Path basePath = args.length > 1 ? Paths.get(args[1]) : Paths.get(System.getProperty("user.dir")); + if (!Files.exists(basePath)) + Files.createDirectories(basePath); + LogicalBackup backup = new LogicalBackup(null, repository, basePath); + backup.run(); + } + + private static void printUsage(String errorMessage) { + if (errorMessage != null) + System.err.println(errorMessage); + System.out.println("Usage: LogicalBackup []"); + + } + + protected static Repository createRemoteRepository(URI uri) throws RepositoryException { + RepositoryFactory repositoryFactory = new ClientDavexRepositoryFactory(); + Map params = new HashMap(); + params.put(ClientDavexRepositoryFactory.JACKRABBIT_DAVEX_URI, uri.toString()); + // TODO make it configurable + params.put(ClientDavexRepositoryFactory.JACKRABBIT_REMOTE_DEFAULT_WORKSPACE, NodeConstants.SYS_WORKSPACE); + return repositoryFactory.getRepository(params); + } + } -- 2.30.2