KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > outerj > daisy > backupTool > BackupTool


1 /*
2  * Copyright 2004 Outerthought bvba and Schaubroeck nv
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */

16 package org.outerj.daisy.backupTool;
17
18 import java.io.File JavaDoc;
19 import java.io.FileNotFoundException JavaDoc;
20 import java.io.PrintWriter JavaDoc;
21 import java.io.StringWriter JavaDoc;
22 import java.util.Date JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.Map JavaDoc;
25 import java.util.Properties JavaDoc;
26
27 import javax.mail.Message JavaDoc;
28 import javax.mail.Session JavaDoc;
29 import javax.mail.Transport JavaDoc;
30 import javax.mail.internet.InternetAddress JavaDoc;
31 import javax.mail.internet.MimeMessage JavaDoc;
32
33 import org.apache.commons.cli.CommandLine;
34 import org.apache.commons.cli.CommandLineParser;
35 import org.apache.commons.cli.HelpFormatter;
36 import org.apache.commons.cli.MissingOptionException;
37 import org.apache.commons.cli.Option;
38 import org.apache.commons.cli.OptionGroup;
39 import org.apache.commons.cli.Options;
40 import org.apache.commons.cli.ParseException;
41 import org.apache.commons.cli.PosixParser;
42 import org.w3c.dom.Document JavaDoc;
43 import org.w3c.dom.Element JavaDoc;
44 import org.outerj.daisy.util.VersionHelper;
45
46 public class BackupTool {
47
48     private File JavaDoc backupLocation;
49
50     private static String JavaDoc XPATH_JMX_CONF = "/targets/target[@path = '/daisy/jmx/mbeanserver']/configuration/xmlHttpAdaptor";
51
52     public static void main(String JavaDoc[] args) throws Exception JavaDoc {
53         Options options = createOptions();
54         CommandLineParser parser = new PosixParser();
55         Map JavaDoc confMap = new HashMap JavaDoc();
56         try {
57             CommandLine cmd = parser.parse(options, args);
58             if (cmd.hasOption("h"))
59                 printHelp(options);
60             else if (cmd.hasOption('v')) {
61                 String JavaDoc versionString = VersionHelper.getVersionString(BackupTool.class.getClassLoader(),
62                         "org/outerj/daisy/backupTool/versioninfo.properties");
63                 System.out.println(versionString);
64             } else if (!cmd.hasOption('l') && !(cmd.hasOption('b') || cmd.hasOption('r'))) {
65                 System.out.println("The -l and -b or -r options are required.");
66             } else {
67                 try {
68                     BackupTool tool;
69                     File JavaDoc backupLocation = new File JavaDoc(cmd.getOptionValue("l"));
70
71 // if (cmd.hasOption("o"))
72
// confMap.put("openjms", new File(cmd.getOptionValue("o"), "config" + File.separator + "openjms.xml"));
73

74                     if (cmd.hasOption("a"))
75                         confMap.put("additional-entries", new File JavaDoc(cmd.getOptionValue("a")));
76
77                     File JavaDoc datadir = null;
78                     
79                     String JavaDoc datadirPath = cmd.getOptionValue("d");
80                     datadir = new File JavaDoc(datadirPath);
81                     confMap.put("datadir", datadir);
82
83                     if (cmd.hasOption("b")) {
84                         if (!datadir.exists()) {
85                             System.out.println("Specified data dir does not exist: " + datadir.getAbsolutePath());
86                             System.exit(1);
87                         }
88
89                         File JavaDoc myConfig = new File JavaDoc(datadir, "conf" + File.separator + "myconfig.xml");
90                         confMap.put("myconfig", myConfig);
91
92                         tool = new BackupTool(confMap, backupLocation);
93                         tool.createBackup();
94
95                     } else if (cmd.hasOption("r")) {
96                         String JavaDoc backupName = cmd.getOptionValue("r");
97                         tool = new BackupTool(confMap, backupLocation, backupName);
98                         tool.restoreBackup(backupName);
99                     } else if (cmd.hasOption("R")) {
100                         String JavaDoc backupName = cmd.getOptionValue("R");
101                         tool = new BackupTool(confMap, backupLocation, backupName);
102                         tool.rehashBackup(backupName);
103                     }
104
105                 } catch (Exception JavaDoc e) {
106                     if (cmd.hasOption("e") && cmd.hasOption("s"))
107                         sendExceptionEmail(cmd.getOptionValue("e"), cmd.getOptionValue("f"), cmd.getOptionValue("s"), e);
108
109                     e.printStackTrace();
110                     System.exit(1);
111                 }
112             }
113         } catch (ParseException e) {
114             if (e instanceof MissingOptionException)
115                 System.err.println("The " + e.getMessage() + " option is required.");
116             else
117                 e.printStackTrace();
118
119             printHelp(options);
120             System.exit(1);
121         }
122     }
123
124     public BackupTool(Map JavaDoc confMap, File JavaDoc backupLocation, String JavaDoc backupname) throws Exception JavaDoc {
125         if (!backupLocation.exists())
126             throw new FileNotFoundException JavaDoc ("The backup directory " + backupLocation.getPath() + " does not exist");
127
128         this.backupLocation = backupLocation;
129         File JavaDoc backupInstance = new File JavaDoc(backupLocation, backupname);
130         if (!backupInstance.exists())
131             throw new FileNotFoundException JavaDoc ("The backup at " + backupInstance.getPath() + " could not be found");
132
133         File JavaDoc confDir = new File JavaDoc(backupInstance, "conftemp");
134         BackupHelper.unzipToDirectory(new File JavaDoc(backupInstance, "daisy-conf.zip"), confDir);
135         confMap.put("myconfig", new File JavaDoc(confDir, "myconfig.xml"));
136         confMap.put("confdir", confDir);
137
138         init(confMap);
139         BackupHelper.deleteFile(confDir);
140     }
141
142     public BackupTool(Map JavaDoc confMap, File JavaDoc backupLocation) throws Exception JavaDoc {
143         if (!backupLocation.exists()) {
144             if (!backupLocation.mkdirs())
145                 throw new Exception JavaDoc("Could not create the backup directory " + backupLocation.getAbsolutePath());
146         }
147         this.backupLocation = backupLocation;
148         init(confMap);
149     }
150
151     private void init(Map JavaDoc confMap) throws Exception JavaDoc {
152         if (confMap.containsKey("myconfig")) {
153             File JavaDoc myConfig = (File JavaDoc)confMap.get("myconfig");
154
155             Document JavaDoc myConfigDocument = BackupHelper.parseFile(myConfig);
156             Element JavaDoc jmxConf = BackupHelper.getElementFromDom(myConfigDocument, XPATH_JMX_CONF);
157
158             JMXRepositoryLocker locker = new JMXRepositoryLocker(jmxConf.getAttribute("host"), Integer.parseInt(jmxConf.getAttribute("port")), jmxConf
159                     .getAttribute("username"), jmxConf.getAttribute("password"));
160
161             BackupManager.setLocker(locker);
162             BackupManager.setBackupLocation(backupLocation);
163
164             File JavaDoc datadir = (File JavaDoc)confMap.get("datadir");
165             BackupManager.getInstance().registerEntryLoader(new DaisyEntryLoader(myConfig, datadir));
166
167             // Extracting the location of the activemq-conf.xml file out of the myconfig.xml
168
// is not so easy, not only because it is embedded inside an URL but also because
169
// it probably contains a ${daisy.datadir} reference, and we need to read the
170
// activemq-conf.xml which is inside the backup. So we will just assume users
171
// have not adjusted the default location.
172
File JavaDoc confdir = (File JavaDoc)confMap.get("confdir");
173             if (confdir == null) // no confdir means we're backuping, not restoring
174
confdir = new File JavaDoc(datadir, "conf");
175             File JavaDoc amqConfFile = new File JavaDoc(confdir, "activemq-conf.xml");
176             BackupManager.getInstance().registerEntryLoader(new ActiveMQEntryLoader(amqConfFile));
177         }
178
179         if (confMap.containsKey("openjms"))
180             BackupManager.getInstance().registerEntryLoader(new OpenJMSEntryLoader((File JavaDoc)confMap.get("openjms")));
181
182         if (confMap.containsKey("additional-entries"))
183             BackupManager.getInstance().registerEntryLoader(new FileListEntryLoader((File JavaDoc)confMap.get("additional-entries")));
184     }
185
186     public void createBackup() throws Exception JavaDoc {
187         BackupInstance buInstance = BackupManager.getInstance().createBackupInstance();
188         BackupManager.getInstance().backup(buInstance);
189     }
190
191     public void restoreBackup(String JavaDoc backupName) throws Exception JavaDoc {
192         BackupInstance buInstance = BackupManager.getInstance().loadBackupInstance(backupName);
193
194         System.out.println();
195         System.out.println("Before restoring a backup, make sure that the repository server");
196         System.out.println("and the Daisy Wiki are not running.");
197         System.out.println();
198
199         boolean doRestore = BackupHelper.promptYesNo("Restoring this backup will undo all changes made since " + buInstance.getCreateDate().toString()
200                 + "\nDo you wish to restore the backup? [yes|no, default: no]", false);
201         if (doRestore)
202             BackupManager.getInstance().restore(buInstance);
203     }
204     
205     public void rehashBackup(String JavaDoc backupName) throws Exception JavaDoc {
206         BackupInstance buInstance = BackupManager.getInstance().loadBackupInstance(backupName);
207         System.out.println("Rehashing backup entries at " + buInstance.getDirectory().getAbsolutePath());
208         BackupManager.getInstance().rehash(buInstance);
209         System.out.println("Done");
210     }
211
212     private static void printHelp(Options o) {
213         HelpFormatter help = new HelpFormatter();
214         help.printHelp("daisy-backup-tool", o, true);
215     }
216
217     private static Options createOptions() {
218         Options options = new Options();
219
220         Option versionOption = new Option("v", "version", false, "Print version info");
221
222         Option configOption = new Option("d", "daisy-data-dir", true, "Daisy data directory");
223         configOption.setRequired(true);
224         configOption.setArgName("daisydata-path");
225
226 // Option openjmsConfigOption = new Option("o", "openjms-home", true, "Openjms installation directory");
227
// openjmsConfigOption.setArgName("openjms-home-path");
228

229         Option backupLocationOption = new Option("l", "backuplocation", true, "Location where backups are stored");
230         backupLocationOption.setArgName("backup-path");
231
232         Option emailTo = new Option("e", "emailaddress", true, "Where emails will be sent to incase of an exception");
233         emailTo.setArgName("email-address");
234         
235         Option emailFrom = new Option("f", "fromaddress", true, "Sender address to use for exception emails");
236         emailFrom.setArgName("from-address");
237
238         Option smtpServer = new Option("s", "smtp-server", true, "Smtp server");
239         smtpServer.setArgName("smtp-server");
240
241         Option additionalEntries = new Option("a", "additional-entries", true, "Path to configuration of additional backup entries");
242         additionalEntries.setArgName("entry-configuration-file");
243
244         OptionGroup commandGroup = new OptionGroup();
245         Option restoreOption = new Option("r", "restore", true, "Restore an existing backup");
246         restoreOption.setArgName("backup-name");
247         Option backupOption = new Option("b", "backup", false, "Create a new backup");
248         Option rehashOption = new Option("R", "rehash", true, "Rehash files from an existing backup");
249         rehashOption.setArgName("backup-name");
250         commandGroup.addOption(backupOption);
251         commandGroup.addOption(restoreOption);
252         commandGroup.addOption(rehashOption);
253         commandGroup.addOption(versionOption);
254         commandGroup.addOption( new Option("h", "help", false, "Show this message"));
255         commandGroup.setRequired(true);
256
257         
258         options.addOption(configOption);
259         options.addOption(backupLocationOption);
260         options.addOptionGroup(commandGroup);
261 // options.addOption(openjmsConfigOption);
262
options.addOption(emailTo);
263         options.addOption(emailFrom);
264         options.addOption(smtpServer);
265         options.addOption(additionalEntries);
266
267         return options;
268     }
269
270     private static void sendExceptionEmail(String JavaDoc to, String JavaDoc from, String JavaDoc smtpHost, Exception JavaDoc e) throws Exception JavaDoc {
271         Properties JavaDoc props = new Properties JavaDoc();
272         props.put("mail.smtp.host", smtpHost);
273
274         MimeMessage JavaDoc msg = new MimeMessage JavaDoc(Session.getInstance(props));
275         msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
276         msg.setSubject("Daisy Backup Failed");
277         
278         if (from != null){
279             msg.setFrom(new InternetAddress JavaDoc(from));
280         }
281
282         StringWriter JavaDoc sw = new StringWriter JavaDoc();
283         PrintWriter JavaDoc pw = new PrintWriter JavaDoc(sw);
284         e.printStackTrace(pw);
285         String JavaDoc text = "Stacktrace :\n" + sw.toString();
286
287         msg.setText(text);
288         msg.setSentDate(new Date JavaDoc());
289
290         Transport.send(msg);
291     }
292
293 }
294
Popular Tags