blob: 9fa16c46ff3a8de1ff2fa3040798ed66a2adef26 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.servlet.outputhandler;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.URI;
import java.util.Date;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.transaction.util.FileHelper;
import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.backup.AppointmentCategoryConverter;
import org.apache.openmeetings.backup.AppointmentConverter;
import org.apache.openmeetings.backup.AppointmentReminderTypeConverter;
import org.apache.openmeetings.backup.DateConverter;
import org.apache.openmeetings.backup.OmTimeZoneConverter;
import org.apache.openmeetings.backup.OrganisationConverter;
import org.apache.openmeetings.backup.PollTypeConverter;
import org.apache.openmeetings.backup.RoomConverter;
import org.apache.openmeetings.backup.RoomTypeConverter;
import org.apache.openmeetings.backup.StateConverter;
import org.apache.openmeetings.backup.UserConverter;
import org.apache.openmeetings.data.basic.AuthLevelUtil;
import org.apache.openmeetings.data.basic.SessiondataDao;
import org.apache.openmeetings.data.basic.dao.ConfigurationDao;
import org.apache.openmeetings.data.basic.dao.LdapConfigDao;
import org.apache.openmeetings.data.calendar.daos.AppointmentDao;
import org.apache.openmeetings.data.calendar.daos.MeetingMemberDao;
import org.apache.openmeetings.data.conference.PollManager;
import org.apache.openmeetings.data.conference.RoomManager;
import org.apache.openmeetings.data.file.dao.FileExplorerItemDao;
import org.apache.openmeetings.data.flvrecord.FlvRecordingDao;
import org.apache.openmeetings.data.user.OrganisationManager;
import org.apache.openmeetings.data.user.UserManager;
import org.apache.openmeetings.data.user.dao.PrivateMessageFolderDao;
import org.apache.openmeetings.data.user.dao.PrivateMessagesDao;
import org.apache.openmeetings.data.user.dao.UserContactsDao;
import org.apache.openmeetings.data.user.dao.UsersDao;
import org.apache.openmeetings.persistence.beans.basic.Configuration;
import org.apache.openmeetings.persistence.beans.basic.OmTimeZone;
import org.apache.openmeetings.persistence.beans.calendar.Appointment;
import org.apache.openmeetings.persistence.beans.calendar.AppointmentCategory;
import org.apache.openmeetings.persistence.beans.calendar.AppointmentReminderTyps;
import org.apache.openmeetings.persistence.beans.domain.Organisation;
import org.apache.openmeetings.persistence.beans.files.FileExplorerItem;
import org.apache.openmeetings.persistence.beans.flvrecord.FlvRecording;
import org.apache.openmeetings.persistence.beans.poll.PollType;
import org.apache.openmeetings.persistence.beans.poll.RoomPoll;
import org.apache.openmeetings.persistence.beans.room.Room;
import org.apache.openmeetings.persistence.beans.room.RoomType;
import org.apache.openmeetings.persistence.beans.user.PrivateMessage;
import org.apache.openmeetings.persistence.beans.user.State;
import org.apache.openmeetings.persistence.beans.user.User;
import org.apache.openmeetings.utils.OmFileHelper;
import org.apache.openmeetings.utils.math.CalendarPatterns;
import org.red5.logging.Red5LoggerFactory;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.convert.Registry;
import org.simpleframework.xml.convert.RegistryStrategy;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.Strategy;
import org.simpleframework.xml.stream.Format;
import org.simpleframework.xml.stream.NodeBuilder;
import org.simpleframework.xml.stream.OutputNode;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
/**
*
* @author sebastianwagner
*
*/
public class BackupExport {
private static final Logger log = Red5LoggerFactory.getLogger(
BackupExport.class, OpenmeetingsVariables.webAppRootKey);
private static final String BACKUP_COMMENT =
"###############################################\n"
+ "This File is auto-generated by the Backup Tool \n"
+ "you should use the BackupPanel to modify or change this file \n"
+ "see http://openmeetings.apache.org/Upgrade.html for Details \n"
+ "###############################################\n";
@Autowired
private AppointmentDao appointmentDao;
@Autowired
private SessiondataDao sessiondataDao;
@Autowired
private UserManager userManager;
@Autowired
private OrganisationManager organisationManager;
@Autowired
private RoomManager roomManager;
@Autowired
private FileExplorerItemDao fileExplorerItemDao;
@Autowired
private FlvRecordingDao flvRecordingDao;
@Autowired
private UsersDao usersDao;
@Autowired
private MeetingMemberDao meetingMemberDao;
@Autowired
private LdapConfigDao ldapConfigDao;
@Autowired
private PrivateMessagesDao privateMessagesDao;
@Autowired
private PrivateMessageFolderDao privateMessageFolderDao;
@Autowired
private UserContactsDao userContactsDao;
@Autowired
private AuthLevelUtil authLevelUtil;
@Autowired
private PollManager pollManager;
@Autowired
private ConfigurationDao configurationDao;
public void performExport(File filePath, File backup_dir,
boolean includeFiles) throws Exception {
if (!backup_dir.exists()) {
backup_dir.mkdirs();
}
Serializer simpleSerializer = new Persister();
/*
* ##################### Backup Organizations
*/
writeList(simpleSerializer, backup_dir, "organizations.xml",
"organisations", organisationManager.getOrganisations(3L));
/*
* ##################### Backup Users
*/
exportUsers(backup_dir, usersDao.getAllUsersDeleted());
/*
* ##################### Backup Room
*/
{
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(User.class, UserConverter.class);
registry.bind(RoomType.class, RoomTypeConverter.class);
writeList(serializer, backup_dir, "rooms.xml",
"rooms", roomManager.getBackupRooms());
}
/*
* ##################### Backup Room Organizations
*/
{
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(Organisation.class, OrganisationConverter.class);
registry.bind(Room.class, RoomConverter.class);
writeList(serializer, backup_dir, "rooms_organisation.xml",
"room_organisations", roomManager.getRoomsOrganisations());
}
/*
* ##################### Backup Appointments
*/
{
List<Appointment> list = appointmentDao.getAppointments();
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(AppointmentCategory.class, AppointmentCategoryConverter.class);
registry.bind(User.class, UserConverter.class);
registry.bind(AppointmentReminderTyps.class, AppointmentReminderTypeConverter.class);
registry.bind(Room.class, RoomConverter.class);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getAppointmentStarttime().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "appointements.xml", "appointments", list);
}
/*
* ##################### Backup Meeting Members
*/
{
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(User.class, UserConverter.class);
registry.bind(Appointment.class, AppointmentConverter.class);
writeList(serializer, backup_dir, "meetingmembers.xml",
"meetingmembers", meetingMemberDao.getMeetingMembers());
}
/*
* ##################### LDAP Configs
*/
writeList(simpleSerializer, backup_dir, "ldapconfigs.xml",
"ldapconfigs", ldapConfigDao.getLdapConfigs());
/*
* ##################### Private Messages
*/
{
List<PrivateMessage> list = privateMessagesDao.getPrivateMessages();
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(User.class, UserConverter.class);
registry.bind(Room.class, RoomConverter.class);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "privateMessages.xml",
"privatemessages", list);
}
/*
* ##################### Private Message Folders
*/
writeList(simpleSerializer, backup_dir, "privateMessageFolder.xml",
"privatemessagefolders", privateMessageFolderDao.getPrivateMessageFolders());
/*
* ##################### User Contacts
*/
{
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(User.class, UserConverter.class);
writeList(serializer, backup_dir, "userContacts.xml",
"usercontacts", userContactsDao.getUserContacts());
}
/*
* ##################### File-Explorer
*/
{
List<FileExplorerItem> list = fileExplorerItemDao.getFileExplorerItems();
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "fileExplorerItems.xml",
"fileExplorerItems", list);
}
/*
* ##################### Recordings
*/
{
List<FlvRecording> list = flvRecordingDao.getAllFlvRecordings();
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getInserted().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "flvRecordings.xml",
"flvrecordings", list);
}
/*
* ##################### Polls
*/
{
List<RoomPoll> list = pollManager.getPollListBackup();
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(User.class, UserConverter.class);
registry.bind(Room.class, RoomConverter.class);
registry.bind(PollType.class, PollTypeConverter.class);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getCreated().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "roompolls.xml", "roompolls", list);
}
/*
* ##################### Config
*/
{
List<Configuration> list = configurationDao.getConfigurations(
0, Integer.MAX_VALUE, "c.configuration_id", true);
Registry registry = new Registry();
registry.bind(OmTimeZone.class, OmTimeZoneConverter.class);
registry.bind(State.class, StateConverter.class);
registry.bind(User.class, UserConverter.class);
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getStarttime().getClass(), DateConverter.class);
}
writeList(serializer, backup_dir, "configs.xml", "configs", list);
}
if (includeFiles) {
/*
* ##################### Backup Room Files
*/
File targetRootDir = new File(backup_dir, "roomFiles");
if (!targetRootDir.exists()) {
targetRootDir.mkdir();
}
File sourceDir = OmFileHelper.getUploadDir();
File[] files = sourceDir.listFiles();
for (File file : files) {
if (file.isDirectory()) {
if (!file.getName().equals("backup")
&& !file.getName().equals("import")) {
log.debug("### " + file.getName());
FileHelper.copyRec(file, new File(targetRootDir, file.getName()));
}
}
}
/*
* ##################### Backup Recording Files
*/
File targetDirRec = new File(backup_dir, "recordingFiles");
if (!targetDirRec.exists()) {
targetDirRec.mkdir();
}
File sourceDirRec = OmFileHelper.getStreamsHibernateDir();
FileHelper.copyRec(sourceDirRec, targetDirRec);
}
writeZipDir(backup_dir, filePath);
log.debug("---Done");
}
private <T> void writeList(Serializer ser, File backup_dir,
String fileName, String listElement, List<T> list) throws Exception {
FileOutputStream fos = new FileOutputStream(new File(backup_dir,
fileName));
writeList(ser, fos, listElement, list);
}
private <T> void writeList(Serializer ser, OutputStream os, String listElement, List<T> list) throws Exception {
Format format = new Format("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
OutputNode doc = NodeBuilder.write(new OutputStreamWriter(os, "UTF-8"), format);
OutputNode root = doc.getChild("root");
root.setComment(BACKUP_COMMENT);
OutputNode listNode = root.getChild(listElement);
if (list != null) {
for (T t : list) {
try {
ser.write(t, listNode);
} catch (Exception e) {
log.error("Exception While writing node of type: " + t.getClass(), e);
}
}
}
root.commit();
}
public void exportUsers(File backup_dir, List<User> list) throws Exception {
FileOutputStream fos
= new FileOutputStream(new File(backup_dir, "users.xml"));
exportUsers(fos, list);
}
public void exportUsers(OutputStream os, List<User> list) throws Exception {
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
registry.bind(Organisation.class, OrganisationConverter.class);
registry.bind(OmTimeZone.class, OmTimeZoneConverter.class);
registry.bind(State.class, StateConverter.class);
if (list != null && list.size() > 0) {
registry.bind(list.get(0).getRegdate().getClass(), DateConverter.class);
}
writeList(serializer, os, "users", list);
}
/*
* (non-Javadoc)
*
* @see
* javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
* , javax.servlet.http.HttpServletResponse)
*/
public void service(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse, ServletContext servletCtx)
throws ServletException, IOException {
String sid = httpServletRequest.getParameter("sid");
if (sid == null) {
sid = "default";
}
log.debug("sid: " + sid);
Long users_id = sessiondataDao.checkSession(sid);
Long user_level = userManager.getUserLevelByID(users_id);
log.debug("users_id: " + users_id);
log.debug("user_level: " + user_level);
if (authLevelUtil.checkAdminLevel(user_level)) {
// if (true) {
String includeFileOption = httpServletRequest
.getParameter("includeFileOption");
boolean includeFiles = includeFileOption == null || "yes".equals(includeFileOption);
String moduleName = httpServletRequest
.getParameter("moduleName");
if (moduleName == null) {
moduleName = "moduleName";
}
log.debug("moduleName: " + moduleName);
if (moduleName.equals("backup")) {
/*
* ##################### Create Base Folder structure
*/
File working_dir = OmFileHelper.getUploadBackupDir();
String dateString = "backup_"
+ CalendarPatterns.getTimeForStreamId(new Date());
File backup_dir = new File(working_dir, dateString);
String requestedFile = dateString + ".zip";
File backupFile = new File(backup_dir, requestedFile);
try {
performExport(backupFile, backup_dir, includeFiles);
httpServletResponse.reset();
httpServletResponse.resetBuffer();
httpServletResponse
.setContentType("APPLICATION/OCTET-STREAM");
httpServletResponse.setHeader("Content-Disposition",
"attachment; filename=\"" + requestedFile + "\"");
httpServletResponse.setHeader("Content-Length",
"" + backupFile.length());
OutputStream out = httpServletResponse.getOutputStream();
OmFileHelper.copyFile(backupFile, out);
out.flush();
out.close();
} catch (Exception er) {
log.error("Error exporting: ", er);
}
if (backupFile.exists()) {
// log.debug("DELETE :1: "+backupFile.getCanonicalPath());
backupFile.delete();
}
FileHelper.removeRec(backup_dir);
}
} else {
log.debug("ERROR LangExport: not authorized FileDownload "
+ (new Date()));
}
}
private void writeZipDir(File directoryToZip, File zipFile) throws IOException {
FileOutputStream fos = null;
ZipOutputStream zos = null;
try {
fos = new FileOutputStream(zipFile);
zos = new ZipOutputStream(fos);
writeZipDir(directoryToZip.toURI(), directoryToZip, zos, zipFile);
} finally {
if (zos != null) {
try {
zos.close();
} catch (IOException e) {
log.error("Enexpected error while closing ZipOutputStream", e);
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
log.error("Enexpected error while closing FileOutputStream", e);
}
}
}
}
private void writeZipDir(URI base, File dir, ZipOutputStream zos, File zipFile) throws IOException {
for (File file : dir.listFiles()) {
if (zipFile.equals(file)) {
continue;
}
if (file.isDirectory()) {
writeZipDir(base, file, zos, zipFile);
} else {
String path = base.relativize(file.toURI()).toString();
log.debug("Writing '" + path + "' to zip file");
ZipEntry zipEntry = new ZipEntry(path);
zos.putNextEntry(zipEntry);
OmFileHelper.copyFile(file, zos);
zos.closeEntry();
}
}
}
}