]> git.argeo.org Git - lgpl/argeo-commons.git/blobdiff - server/runtime/org.argeo.server.core/src/main/java/org/argeo/server/backup/OsCallBackup.java
Introduce OS call backup
[lgpl/argeo-commons.git] / server / runtime / org.argeo.server.core / src / main / java / org / argeo / server / backup / OsCallBackup.java
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();
+       }
+}