рефакторинг бекапов. бекапы для тестирования. бекапы по кнопке
++
This commit is contained in:
21
src/_VisualDVM/Repository/Server/BackUpsChecker.java
Normal file
21
src/_VisualDVM/Repository/Server/BackUpsChecker.java
Normal file
@@ -0,0 +1,21 @@
|
||||
package _VisualDVM.Repository.Server;
|
||||
import java.util.Calendar;
|
||||
public class BackUpsChecker extends RepositoryServerClient {
|
||||
RepositoryServer server;
|
||||
@Override
|
||||
protected RepositoryServer getServer() {
|
||||
return server;
|
||||
}
|
||||
public BackUpsChecker(RepositoryServer server_in) {
|
||||
server = server_in;
|
||||
}
|
||||
@Override
|
||||
protected void perform() throws Exception {
|
||||
Calendar rightNow = Calendar.getInstance();
|
||||
int hour = rightNow.get(Calendar.HOUR_OF_DAY);
|
||||
int minute = rightNow.get(Calendar.MINUTE);
|
||||
if ((hour == 0) && (minute == 0)) {
|
||||
ServerCommand(ServerCode.CreateBackUp,false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -6,10 +6,15 @@ import Common.Database.RepositoryRefuseException;
|
||||
import Common.Utils.InterruptThread;
|
||||
import Common.Utils.Utils_;
|
||||
import _VisualDVM.Constants;
|
||||
import _VisualDVM.Global;
|
||||
import _VisualDVM.Passes.All.ArchivesBackupPass;
|
||||
import _VisualDVM.Passes.All.UnzipFolderPass;
|
||||
import _VisualDVM.Passes.All.ZipFolderPass;
|
||||
import _VisualDVM.Passes.Server.RepositoryPass;
|
||||
import _VisualDVM.Repository.EmailMessage;
|
||||
import _VisualDVM.Utils;
|
||||
import javafx.util.Pair;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import sun.misc.SignalHandler;
|
||||
|
||||
import javax.activation.DataHandler;
|
||||
@@ -23,10 +28,8 @@ import javax.mail.internet.MimeMultipart;
|
||||
import java.io.*;
|
||||
import java.net.ServerSocket;
|
||||
import java.net.Socket;
|
||||
import java.util.Date;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.Properties;
|
||||
import java.util.Vector;
|
||||
import java.nio.file.Files;
|
||||
import java.util.*;
|
||||
public abstract class RepositoryServer<D extends Database> {
|
||||
protected static FileWriter Log;
|
||||
protected static boolean printOn = true;
|
||||
@@ -43,15 +46,40 @@ public abstract class RepositoryServer<D extends Database> {
|
||||
//-
|
||||
protected ServerCode code;
|
||||
protected long count = 0; //для отладки.
|
||||
BackUpsChecker backUpsChecker = null;
|
||||
/*
|
||||
public static Vector<Pair<Machine, User>> storages = new Vector<>(
|
||||
Arrays.asList(new Pair<>(new Machine("titan",
|
||||
"dvmh.keldysh.ru",
|
||||
22, MachineType.Server),
|
||||
new User("dvmuser1", "mprit_2011"))
|
||||
));
|
||||
//-
|
||||
*/
|
||||
|
||||
protected Thread interruptThread = new InterruptThread(10000,
|
||||
() -> {
|
||||
System.exit(0);
|
||||
return null;
|
||||
});
|
||||
protected Thread backUpsThread = new Thread(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
while (true) {
|
||||
backUpsChecker.Perform();
|
||||
Utils_.sleep(60000);
|
||||
}
|
||||
}
|
||||
});
|
||||
Class<D> d_class;
|
||||
//-----------RECURSION ->
|
||||
SignalHandler signalHandler = signal -> {
|
||||
};
|
||||
//--
|
||||
public static ZipFolderPass zip = new ZipFolderPass();
|
||||
public static UnzipFolderPass unzip = new UnzipFolderPass();
|
||||
public static ArchivesBackupPass backupSession = new ArchivesBackupPass();
|
||||
//--
|
||||
public RepositoryServer(Class<D> d_class_in) {
|
||||
d_class = d_class_in;
|
||||
}
|
||||
@@ -160,7 +188,11 @@ public abstract class RepositoryServer<D extends Database> {
|
||||
DiagnosticSignalHandler.install("TERM", signalHandler);
|
||||
DiagnosticSignalHandler.install("INT", signalHandler);
|
||||
DiagnosticSignalHandler.install("ABRT", signalHandler);
|
||||
//--
|
||||
interruptThread.start();
|
||||
backUpsChecker = new BackUpsChecker(this);
|
||||
backUpsThread.start();
|
||||
//--
|
||||
startAdditionalThreads();
|
||||
server = new ServerSocket(getPort());
|
||||
StartAction();
|
||||
@@ -198,6 +230,9 @@ public abstract class RepositoryServer<D extends Database> {
|
||||
case Email:
|
||||
Email();
|
||||
break;
|
||||
case CreateBackUp:
|
||||
CreateBackUp();
|
||||
break;
|
||||
case EditObject:
|
||||
EditObject();
|
||||
break;
|
||||
@@ -324,6 +359,53 @@ public abstract class RepositoryServer<D extends Database> {
|
||||
}
|
||||
void Email() throws Exception {
|
||||
Email((EmailMessage) request.object, request.arg);
|
||||
}
|
||||
void CreateBackUp() throws Exception {
|
||||
//определить имя папки с багом.
|
||||
boolean force = (boolean) request.object;
|
||||
//--
|
||||
Calendar rightNow = Calendar.getInstance();
|
||||
int year = rightNow.get(Calendar.YEAR);
|
||||
int month = rightNow.get(Calendar.MONTH);
|
||||
int day = rightNow.get(Calendar.DAY_OF_MONTH);
|
||||
//--
|
||||
String backUpName = year + "_" + (month + 1) + "_" + (day);
|
||||
File todayBackUp = new File(Global.DataBackUpsDirectory, backUpName);
|
||||
File todayBackUpArchive = new File(Global.DataBackUpsDirectory, backUpName + ".zip");
|
||||
if (force&&todayBackUpArchive.exists())
|
||||
Utils_.forceDeleteWithCheck(todayBackUpArchive);
|
||||
//-
|
||||
// Чистка старых бекапов на самом сервере.
|
||||
Utils.keepNewFiles(todayBackUp.getParentFile(), 2);
|
||||
|
||||
|
||||
if (!todayBackUpArchive.exists()) {
|
||||
FileUtils.forceMkdir(todayBackUp);
|
||||
//--
|
||||
File dbBackUp = new File(todayBackUp, db.getFile().getName());
|
||||
Files.copy(db.getFile().toPath(), dbBackUp.toPath());
|
||||
//--перегружаемая часть.
|
||||
extraBackup(todayBackUp);
|
||||
//--- общая часть.
|
||||
zip.Do(todayBackUp.getAbsolutePath(), todayBackUpArchive.getAbsolutePath());
|
||||
Utils_.forceDeleteWithCheck(todayBackUp);
|
||||
//-
|
||||
// for (Pair<Machine, User> cred : storages) {
|
||||
// backupSession.Do(cred.getKey(), cred.getValue(), todayBackUpArchive);
|
||||
// }
|
||||
//bonus backup
|
||||
if (rightNow.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY) {
|
||||
EmailMessage message = new EmailMessage(getClass().getSimpleName()+" BackUp",
|
||||
"Резервная копия файлов");
|
||||
message.addAttachement(todayBackUpArchive);
|
||||
for (String address : Constants.admins_mails) {
|
||||
Email(message, address);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
protected void extraBackup(File todayBackUp){
|
||||
|
||||
}
|
||||
//----
|
||||
void PublishObject() throws Exception {
|
||||
|
||||
77
src/_VisualDVM/Repository/Server/RepositoryServerClient.java
Normal file
77
src/_VisualDVM/Repository/Server/RepositoryServerClient.java
Normal file
@@ -0,0 +1,77 @@
|
||||
package _VisualDVM.Repository.Server;
|
||||
import Common.Passes.PassException;
|
||||
import Common.Utils.Utils_;
|
||||
import _VisualDVM.Global;
|
||||
import _VisualDVM.Passes.Server.RepositoryPass;
|
||||
import _VisualDVM.TestingSystem.Common.TestingServer;
|
||||
|
||||
import java.io.FileWriter;
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
||||
public abstract class RepositoryServerClient<T extends RepositoryServer> {
|
||||
protected abstract T getServer();
|
||||
protected int getSleepMillis() {
|
||||
return 2000;
|
||||
}
|
||||
//---
|
||||
protected boolean isPrintOn() {
|
||||
return true;
|
||||
}
|
||||
protected void Print(String message) {
|
||||
try {
|
||||
if (isPrintOn()) {
|
||||
FileWriter testLog = new FileWriter(getClass().getSimpleName() + "_Log.txt", true);
|
||||
String dmessage = Utils_.Brackets(new Date()) + " " + message;
|
||||
testLog.write(dmessage + "\n");
|
||||
testLog.close();
|
||||
}
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
}
|
||||
}
|
||||
//--
|
||||
protected Object ServerCommand(ServerCode code_in, String arg, Serializable object_in) throws Exception {
|
||||
RepositoryPass<T,Object> pass = new RepositoryPass<T, Object>(getServer()) {
|
||||
@Override
|
||||
public String getDescription() {
|
||||
return "";
|
||||
}
|
||||
@Override
|
||||
protected void ServerAction() throws Exception {
|
||||
Command(new SafeServerExchangeUnit(code_in, arg, object_in));
|
||||
target = server_response.object;
|
||||
}
|
||||
@Override
|
||||
protected boolean validate() {
|
||||
return Log.isEmpty();
|
||||
}
|
||||
@Override
|
||||
protected int getTimeout() {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
if (!pass.Do()) {
|
||||
ServerConnectionError(code_in, pass.Log.toString());
|
||||
}
|
||||
return pass.target;
|
||||
}
|
||||
protected Object ServerCommand(ServerCode code_in, Serializable object_in) throws Exception {
|
||||
return ServerCommand(code_in, "", object_in);
|
||||
}
|
||||
protected Object ServerCommand(ServerCode code_in) throws Exception {
|
||||
return ServerCommand(code_in, "", null);
|
||||
}
|
||||
protected void ServerConnectionError(ServerCode code_in, String logText) throws Exception {
|
||||
throw new PassException(Utils_.Brackets(new Date().toString()) + " Ошибка взаимодействия с сервером " + code_in);
|
||||
}
|
||||
protected abstract void perform() throws Exception;
|
||||
public void Perform() {
|
||||
try {
|
||||
perform();
|
||||
} catch (Exception ex) {
|
||||
ex.printStackTrace();
|
||||
} finally {
|
||||
Utils_.sleep(getSleepMillis());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -68,9 +68,12 @@ public enum ServerCode {
|
||||
EditUserAccount,
|
||||
PublishUserAccount,
|
||||
DeleteUserAccount,
|
||||
GetDVMPackageCredentials;
|
||||
GetDVMPackageCredentials,
|
||||
CreateBackUp;
|
||||
public String getDescription(){
|
||||
switch (this){
|
||||
case CreateBackUp:
|
||||
return "Создание резервной копии данных сервера";
|
||||
case GetDVMPackageCredentials:
|
||||
return "Получение входных данных пакета тестирования DVM на сервере";
|
||||
case DeleteUserAccount:
|
||||
|
||||
Reference in New Issue
Block a user