]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.maintenance/src/org/argeo/maintenance/backup/vfs/OsCallBackup.java
afd4783fd89ad7dcac903cb5dade58ebcf8a9d65
[lgpl/argeo-commons.git] / org.argeo.maintenance / src / org / argeo / maintenance / backup / vfs / OsCallBackup.java
1 package org.argeo.maintenance.backup.vfs;
2
3 import java.io.ByteArrayOutputStream;
4 import java.util.HashMap;
5 import java.util.Map;
6
7 import org.apache.commons.exec.CommandLine;
8 import org.apache.commons.exec.DefaultExecutor;
9 import org.apache.commons.exec.ExecuteException;
10 import org.apache.commons.exec.ExecuteStreamHandler;
11 import org.apache.commons.exec.Executor;
12 import org.apache.commons.exec.PumpStreamHandler;
13 import org.apache.commons.io.IOUtils;
14 import org.apache.commons.logging.Log;
15 import org.apache.commons.logging.LogFactory;
16 import org.apache.commons.vfs2.FileContent;
17 import org.apache.commons.vfs2.FileObject;
18 import org.argeo.maintenance.MaintenanceException;
19
20 /**
21 * Runs an OS command and save its standard output as a file. Typically used for
22 * MySQL or OpenLDAP dumps.
23 */
24 public class OsCallBackup extends AbstractAtomicBackup {
25 private final static Log log = LogFactory.getLog(OsCallBackup.class);
26
27 private String command;
28 private Map<String, String> variables = new HashMap<String, String>();
29 private Executor executor = new DefaultExecutor();
30
31 private Map<String, String> environment = new HashMap<String, String>();
32
33 /** Name of the sudo user, root if "", not sudo if null */
34 private String sudo = null;
35
36 public OsCallBackup() {
37 }
38
39 public OsCallBackup(String name) {
40 super(name);
41 }
42
43 public OsCallBackup(String name, String command) {
44 super(name);
45 this.command = command;
46 }
47
48 @Override
49 public void writeBackup(FileObject targetFo) {
50 String commandToUse = command;
51
52 // sudo
53 if (sudo != null) {
54 if (sudo.equals(""))
55 commandToUse = "sudo " + commandToUse;
56 else
57 commandToUse = "sudo -u " + sudo + " " + commandToUse;
58 }
59
60 CommandLine commandLine = CommandLine.parse(commandToUse, variables);
61 ByteArrayOutputStream errBos = new ByteArrayOutputStream();
62 if (log.isTraceEnabled())
63 log.trace(commandLine.toString());
64
65 try {
66 // stdout
67 FileContent targetContent = targetFo.getContent();
68 // stderr
69 ExecuteStreamHandler streamHandler = new PumpStreamHandler(targetContent.getOutputStream(), errBos);
70 executor.setStreamHandler(streamHandler);
71 executor.execute(commandLine, environment);
72 } catch (ExecuteException e) {
73 byte[] err = errBos.toByteArray();
74 String errStr = new String(err);
75 throw new MaintenanceException("Process " + commandLine + " failed (" + e.getExitValue() + "): " + errStr, e);
76 } catch (Exception e) {
77 byte[] err = errBos.toByteArray();
78 String errStr = new String(err);
79 throw new MaintenanceException("Process " + commandLine + " failed: " + errStr, e);
80 } finally {
81 IOUtils.closeQuietly(errBos);
82 }
83 }
84
85 public void setCommand(String command) {
86 this.command = command;
87 }
88
89 protected String getCommand() {
90 return command;
91 }
92
93 /**
94 * A reference to the environment variables that will be passed to the
95 * process. Empty by default.
96 */
97 protected Map<String, String> getEnvironment() {
98 return environment;
99 }
100
101 protected Map<String, String> getVariables() {
102 return variables;
103 }
104
105 public void setVariables(Map<String, String> variables) {
106 this.variables = variables;
107 }
108
109 public void setExecutor(Executor executor) {
110 this.executor = executor;
111 }
112
113 public void setSudo(String sudo) {
114 this.sudo = sudo;
115 }
116
117 }