Introduce OS call backup
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 3 Oct 2012 16:10:10 +0000 (16:10 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 3 Oct 2012 16:10:10 +0000 (16:10 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@5585 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

demo/log4j.properties
server/runtime/org.argeo.server.core/build.properties
server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java [new file with mode: 0644]

index 06e71583d3e3b963198568bec129773eff71ec97..46e90839b8f863e196208b8f886c9ca9bdc6486c 100644 (file)
@@ -6,6 +6,7 @@ log4j.logger.org.argeo.jackrabbit.remote.ExtendedDispatcherServlet=WARN
 log4j.logger.org.argeo.server.webextender.TomcatDeployer=WARN
 
 #log4j.logger.org.springframework.security=DEBUG
+log4j.logger.org.apache.commons.exec=DEBUG
 
 log4j.logger.org.apache.catalina=INFO
 log4j.logger.org.apache.coyote=INFO
index 23bde2468660f6057720a82db73d900f16c70bae..ee20c144ec0aa82b06c3f6643a23b21ad75b7682 100644 (file)
@@ -1 +1,6 @@
 source.. = src/main/java/
+additional.bundles = slf4j.api,\
+                     slf4j.org.apache.commons.logging,\
+                     slf4j.log4j,\
+                     org.apache.log4j
+                     
\ No newline at end of file
diff --git a/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java b/server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java
new file mode 100644 (file)
index 0000000..84d89d5
--- /dev/null
@@ -0,0 +1,98 @@
+package org.argeo.server.backup;
+
+import java.io.ByteArrayOutputStream;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.exec.CommandLine;
+import org.apache.commons.exec.DefaultExecutor;
+import org.apache.commons.exec.ExecuteException;
+import org.apache.commons.exec.ExecuteStreamHandler;
+import org.apache.commons.exec.Executor;
+import org.apache.commons.exec.PumpStreamHandler;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.commons.vfs.FileContent;
+import org.apache.commons.vfs.FileObject;
+import org.apache.commons.vfs.FileSystemManager;
+import org.apache.commons.vfs.VFS;
+import org.argeo.ArgeoException;
+
+/**
+ * Runs a an OS command and save the output as a file. Typically used for MySQL
+ * dumps
+ */
+public class OsCallBackup implements Runnable {
+
+       private final static Log log = LogFactory.getLog(OsCallBackup.class);
+
+       private String command;
+       private Map<String, String> variables = new HashMap<String, String>();
+
+       private String target;
+
+       @Override
+       public void run() {
+               try {
+                       Executor executor = new DefaultExecutor();
+
+                       CommandLine commandLine = CommandLine.parse(command, variables);
+
+                       // stdout
+                       FileSystemManager fsm = VFS.getManager();
+                       FileObject targetFo = fsm.resolveFile(target);
+                       FileContent targetContent = targetFo.getContent();
+
+                       // stderr
+                       ByteArrayOutputStream errBos = new ByteArrayOutputStream();
+                       ExecuteStreamHandler streamHandler = new PumpStreamHandler(
+                                       targetContent.getOutputStream(), errBos);
+
+                       executor.setStreamHandler(streamHandler);
+
+                       try {
+                               if (log.isDebugEnabled())
+                                       log.debug(commandLine.toString());
+
+                               executor.execute(commandLine);
+                       } catch (ExecuteException e) {
+                               byte[] err = errBos.toByteArray();
+                               String errStr = new String(err);
+                               throw new ArgeoException("Process failed with exit value "
+                                               + e.getExitValue() + ": " + errStr);
+                       }
+               } catch (Exception e) {
+                       throw new ArgeoException("Cannot backup to " + target
+                                       + " with command " + command + " " + variables, e);
+               }
+       }
+
+       public void setCommand(String command) {
+               this.command = command;
+       }
+
+       public void setVariables(Map<String, String> variables) {
+               this.variables = variables;
+       }
+
+       public void setTarget(String target) {
+               this.target = target;
+       }
+
+       public static void main(String args[]) {
+               OsCallBackup osCallBackup = new OsCallBackup();
+               osCallBackup.setCommand("/usr/bin/mysqldump"
+                               + " --lock-tables --add-locks --add-drop-table"
+                               + " -u ${dbUser} --password=${dbPassword} --databases ${dbName}");
+               Map<String, String> variables = new HashMap<String, String>();
+               variables.put("dbUser", "root");
+               variables.put("dbPassword", "");
+               variables.put("dbName", "test");
+               osCallBackup.setVariables(variables);
+
+               osCallBackup
+                               .setTarget("/home/mbaudier/dev/src/commons/server/runtime/org.argeo.server.core/target/dump.sql");
+
+               osCallBackup.run();
+       }
+}