2 * Copyright (C) 2007-2012 Argeo GmbH
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
16 package org
.argeo
.cms
.internal
.backup
;
18 import java
.util
.ArrayList
;
19 import java
.util
.HashMap
;
20 import java
.util
.List
;
23 import org
.apache
.commons
.logging
.Log
;
24 import org
.apache
.commons
.logging
.LogFactory
;
25 import org
.apache
.commons
.vfs2
.FileObject
;
26 import org
.apache
.commons
.vfs2
.FileSystemException
;
27 import org
.apache
.commons
.vfs2
.FileSystemManager
;
28 import org
.apache
.commons
.vfs2
.FileSystemOptions
;
29 import org
.apache
.commons
.vfs2
.Selectors
;
30 import org
.apache
.commons
.vfs2
.UserAuthenticator
;
31 import org
.apache
.commons
.vfs2
.impl
.DefaultFileSystemConfigBuilder
;
32 import org
.argeo
.ArgeoException
;
35 * Combines multiple backups and transfer them to a remote location. Purges
36 * remote and local data based on certain criteria.
38 public class SystemBackup
implements Runnable
{
39 private final static Log log
= LogFactory
.getLog(SystemBackup
.class);
41 private FileSystemManager fileSystemManager
;
42 private UserAuthenticator userAuthenticator
= null;
44 private String backupsBase
;
45 private String systemName
;
47 private List
<AtomicBackup
> atomicBackups
= new ArrayList
<AtomicBackup
>();
48 private BackupPurge backupPurge
= new SimpleBackupPurge();
50 private Map
<String
, UserAuthenticator
> remoteBases
= new HashMap
<String
, UserAuthenticator
>();
54 if (atomicBackups
.size() == 0)
55 throw new ArgeoException("No atomic backup listed");
56 List
<String
> failures
= new ArrayList
<String
>();
58 SimpleBackupContext backupContext
= new SimpleBackupContext(
59 fileSystemManager
, backupsBase
, systemName
);
61 // purge older backups
62 FileSystemOptions opts
= new FileSystemOptions();
64 DefaultFileSystemConfigBuilder
.getInstance().setUserAuthenticator(
65 opts
, userAuthenticator
);
66 } catch (FileSystemException e
) {
67 throw new ArgeoException("Cannot create authentication", e
);
72 backupPurge
.purge(fileSystemManager
, backupsBase
, systemName
,
73 backupContext
.getDateFormat(), opts
);
74 } catch (Exception e
) {
75 failures
.add("Purge " + backupsBase
+ " failed: " + e
.getMessage());
76 log
.error("Purge of " + backupsBase
+ " failed", e
);
80 for (AtomicBackup atomickBackup
: atomicBackups
) {
82 String target
= atomickBackup
.backup(fileSystemManager
,
83 backupsBase
, backupContext
, opts
);
84 if (log
.isDebugEnabled())
85 log
.debug("Performed backup " + target
);
86 } catch (Exception e
) {
87 String msg
= "Atomic backup " + atomickBackup
.getName()
88 + " failed: " + ArgeoException
.chainCausesMessages(e
);
91 if (log
.isTraceEnabled())
93 "Stacktrace of atomic backup "
94 + atomickBackup
.getName() + " failure.", e
);
99 for (String remoteBase
: remoteBases
.keySet()) {
100 FileObject localBaseFo
= null;
101 FileObject remoteBaseFo
= null;
102 UserAuthenticator auth
= remoteBases
.get(remoteBase
);
105 FileSystemOptions remoteOpts
= new FileSystemOptions();
107 DefaultFileSystemConfigBuilder
.getInstance()
108 .setUserAuthenticator(remoteOpts
, auth
);
109 backupPurge
.purge(fileSystemManager
, remoteBase
, systemName
,
110 backupContext
.getDateFormat(), remoteOpts
);
111 } catch (Exception e
) {
112 failures
.add("Purge " + remoteBase
+ " failed: "
114 log
.error("Cannot purge " + remoteBase
, e
);
118 localBaseFo
= fileSystemManager
.resolveFile(backupsBase
+ '/'
119 + backupContext
.getRelativeFolder(), opts
);
120 remoteBaseFo
= fileSystemManager
.resolveFile(remoteBase
+ '/'
121 + backupContext
.getRelativeFolder(), remoteOpts
);
122 remoteBaseFo
.copyFrom(localBaseFo
, Selectors
.SELECT_ALL
);
123 if (log
.isDebugEnabled())
124 log
.debug("Copied backup to " + remoteBaseFo
+ " from "
127 } catch (Exception e
) {
128 failures
.add("Dispatch to " + remoteBase
+ " failed: "
131 "Cannot dispatch backups from "
132 + backupContext
.getRelativeFolder() + " to "
135 BackupUtils
.closeFOQuietly(localBaseFo
);
136 BackupUtils
.closeFOQuietly(remoteBaseFo
);
139 int failureCount
= 0;
140 if (failures
.size() > 0) {
141 StringBuffer buf
= new StringBuffer();
142 for (String failure
: failures
) {
143 buf
.append('\n').append(failureCount
).append(" - ")
147 throw new ArgeoException(failureCount
148 + " error(s) when running the backup,"
149 + " check the logs and the backups as soon as possible."
154 public void setFileSystemManager(FileSystemManager fileSystemManager
) {
155 this.fileSystemManager
= fileSystemManager
;
158 public void setBackupsBase(String backupsBase
) {
159 this.backupsBase
= backupsBase
;
162 public void setSystemName(String name
) {
163 this.systemName
= name
;
166 public void setAtomicBackups(List
<AtomicBackup
> atomicBackups
) {
167 this.atomicBackups
= atomicBackups
;
170 public void setBackupPurge(BackupPurge backupPurge
) {
171 this.backupPurge
= backupPurge
;
174 public void setUserAuthenticator(UserAuthenticator userAuthenticator
) {
175 this.userAuthenticator
= userAuthenticator
;
178 public void setRemoteBases(Map
<String
, UserAuthenticator
> remoteBases
) {
179 this.remoteBases
= remoteBases
;
182 // public static void main(String args[]) {
185 // StandardFileSystemManager fsm = new StandardFileSystemManager();
188 // SystemBackup systemBackup = new SystemBackup();
189 // systemBackup.setSystemName("mySystem");
191 // .setBackupsBase("/home/mbaudier/dev/src/commons/server/runtime/org.argeo.server.core/target");
192 // systemBackup.setFileSystemManager(fsm);
194 // List<AtomicBackup> atomicBackups = new ArrayList<AtomicBackup>();
196 // MySqlBackup mySqlBackup = new MySqlBackup("root", "", "test");
197 // atomicBackups.add(mySqlBackup);
198 // PostgreSqlBackup postgreSqlBackup = new PostgreSqlBackup(
199 // "argeo", "argeo", "gis_template");
200 // atomicBackups.add(postgreSqlBackup);
201 // SvnBackup svnBackup = new SvnBackup(
202 // "/home/mbaudier/tmp/testsvnrepo");
203 // atomicBackups.add(svnBackup);
205 // systemBackup.setAtomicBackups(atomicBackups);
207 // Map<String, UserAuthenticator> remoteBases = new HashMap<String, UserAuthenticator>();
208 // StaticUserAuthenticator userAuthenticator = new StaticUserAuthenticator(
209 // null, "demo", "demo");
210 // remoteBases.put("sftp://localhost/home/mbaudier/test",
211 // userAuthenticator);
212 // systemBackup.setRemoteBases(remoteBases);
214 // systemBackup.run();
217 // } catch (FileSystemException e) {
218 // // TODO Auto-generated catch block
219 // e.printStackTrace();
225 // Thread.sleep(120 * 1000);
226 // } catch (InterruptedException e) {
227 // e.printStackTrace();