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