v++
рефакторинг. Исправлен баг. если прервать локальную задачу, не удалялся файл interrupt.
This commit is contained in:
@@ -6,6 +6,7 @@ import Common.Utils.Validators.ShellParser;
|
||||
import GlobalData.Machine.Machine;
|
||||
import GlobalData.RemoteFile.RemoteFile;
|
||||
import GlobalData.User.User;
|
||||
import ProjectData.Project.db_project_info;
|
||||
import Visual_DVM_2021.Passes.PassException;
|
||||
import com.jcraft.jsch.*;
|
||||
import javafx.util.Pair;
|
||||
@@ -19,6 +20,7 @@ public class UserConnection {
|
||||
//--
|
||||
public ChannelSftp sftpChannel = null;
|
||||
public ChannelShell shellChannel = null;
|
||||
public ChannelExec execChannel = null;
|
||||
//--
|
||||
JSch jsch = null;
|
||||
Session session = null;
|
||||
@@ -92,10 +94,12 @@ public class UserConnection {
|
||||
}
|
||||
if (sftpChannel != null) sftpChannel.disconnect();
|
||||
if (shellChannel != null) shellChannel.disconnect();
|
||||
if (execChannel != null) execChannel.disconnect();
|
||||
if (session != null) session.disconnect();
|
||||
//----------------------
|
||||
sftpChannel = null;
|
||||
shellChannel = null;
|
||||
execChannel = null;
|
||||
jsch = null;
|
||||
session = null;
|
||||
//---
|
||||
@@ -289,4 +293,122 @@ public class UserConnection {
|
||||
}
|
||||
return "";
|
||||
}
|
||||
//--
|
||||
public void tryRM(RemoteFile file) throws Exception {
|
||||
if (Exists(file)) {
|
||||
sftpChannel.rm(file.full_name);
|
||||
}
|
||||
}
|
||||
//с проверкой.
|
||||
public boolean tryGetSingleFileWithMaxSize(RemoteFile src, File dst, int maxSize) throws Exception {
|
||||
if (Exists(src)) {
|
||||
if ((maxSize == 0) || (getFileKBSize(src.full_name) <= maxSize)) {
|
||||
getSingleFile(src.full_name, dst.getAbsolutePath());
|
||||
return true;
|
||||
} else {
|
||||
Utils.WriteToFile(dst, "Размер файла превышает " + maxSize + " KB.\n" + "Файл не загружен. Его можно просмотреть на машине по адресу\n" + Utils.Brackets(src.full_name));
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
//--
|
||||
public void SynchronizeProjectSubDirsR(db_project_info project, File local_dir, RemoteFile remote_dir, boolean data) throws Exception {
|
||||
// ShowMessage2("синхронизация: " + local_dir.getName());
|
||||
Vector<File> local_subdirs = project.getSubdirectoriesSimple(local_dir);
|
||||
Vector<File> local_files = project.getActiveFilesForSynchronization(local_dir, data);
|
||||
//------------------------------------------------------------------------
|
||||
LinkedHashMap<String, RemoteFile> remote_subdirs = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, RemoteFile> remote_files = new LinkedHashMap<>();
|
||||
Vector<ChannelSftp.LsEntry> files = sftpChannel.ls(remote_dir.full_name);
|
||||
for (ChannelSftp.LsEntry file : files) {
|
||||
if (file.getAttrs().isDir()) {
|
||||
if (!file.getFilename().equals(".") && !file.getFilename().equals(".."))
|
||||
remote_subdirs.put(file.getFilename(), new RemoteFile(remote_dir.full_name, file.getFilename(), true));
|
||||
} else {
|
||||
RemoteFile rf = new RemoteFile(remote_dir.full_name, file.getFilename());
|
||||
rf.updateTime = RemoteFile.convertUpdateTime(file.getAttrs().getMTime());
|
||||
remote_files.put(file.getFilename(), rf);
|
||||
}
|
||||
}
|
||||
for (File lsd : local_subdirs) {
|
||||
RemoteFile rsd = null;
|
||||
if (!remote_subdirs.containsKey(lsd.getName()))
|
||||
sftpChannel.mkdir((rsd = new RemoteFile(remote_dir.full_name, lsd.getName(), true)).full_name);
|
||||
else rsd = remote_subdirs.get(lsd.getName());
|
||||
SynchronizeProjectSubDirsR(project, lsd, rsd, data);
|
||||
}
|
||||
for (File lf : local_files) {
|
||||
RemoteFile rf = null;
|
||||
if (!remote_files.containsKey(lf.getName())) {
|
||||
rf = new RemoteFile(remote_dir.full_name, lf.getName());
|
||||
// ShowMessage2(lf.getName());
|
||||
putSingleFile(lf, rf);
|
||||
} else {
|
||||
rf = remote_files.get(lf.getName());
|
||||
if (lf.lastModified() > rf.updateTime) {
|
||||
// ShowMessage2(lf.getName());
|
||||
putSingleFile(lf, rf);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//--
|
||||
public Vector<RemoteFile> getFilesByExtensions(RemoteFile dir, String... extensions) throws Exception {
|
||||
Vector<RemoteFile> res = new Vector<>();
|
||||
Vector<ChannelSftp.LsEntry> files = sftpChannel.ls(dir.full_name);
|
||||
for (ChannelSftp.LsEntry file : files) {
|
||||
String[] data = file.getFilename().split("\\.");
|
||||
if (data.length > 1) {
|
||||
String file_extension = data[data.length - 1];
|
||||
for (String extension : extensions) {
|
||||
if (file_extension.equalsIgnoreCase(extension))
|
||||
res.add(new RemoteFile(dir.full_name, file.getFilename()));
|
||||
}
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
public void deleteFilesByExtensions(RemoteFile dir, String... extensions) throws Exception {
|
||||
Vector<RemoteFile> to_delete = getFilesByExtensions(dir, extensions);
|
||||
for (RemoteFile file : to_delete)
|
||||
sftpChannel.rm(file.full_name);
|
||||
}
|
||||
|
||||
public void Command(String... commands) throws Exception {
|
||||
if (commands.length > 0) {
|
||||
String command = String.join("\n", commands);
|
||||
// UI.Print(DebugPrintLevel.Session, command);
|
||||
// UI.Print(DebugPrintLevel.Session, "Creating Exec Channel.");
|
||||
execChannel = (ChannelExec) session.openChannel("exec");
|
||||
execChannel.setErrStream(System.err);
|
||||
execChannel.setCommand(command);
|
||||
execChannel.connect();
|
||||
BufferedReader in = new BufferedReader(new InputStreamReader(execChannel.getInputStream()));
|
||||
while (in.readLine() != null) ;
|
||||
execChannel.disconnect();
|
||||
}
|
||||
}
|
||||
public String CommandWithAnswer(char end, String... commands) throws Exception {
|
||||
String output = "";
|
||||
if (commands.length > 0) {
|
||||
String command = String.join("\n", commands);
|
||||
// UI.Print(DebugPrintLevel.Session, command);
|
||||
// UI.Print(DebugPrintLevel.Session, "Creating Exec Channel.");
|
||||
// System.out.println(Utils.Brackets(command));
|
||||
execChannel = (ChannelExec) session.openChannel("exec");
|
||||
execChannel.setErrStream(System.err);
|
||||
InputStreamReader reader = new InputStreamReader(execChannel.getInputStream());
|
||||
execChannel.setCommand(command);
|
||||
execChannel.connect();
|
||||
char[] chars = new char[1];
|
||||
while (reader.read(chars) >= 0) if (chars[0] == end) break;
|
||||
else output += chars[0];
|
||||
execChannel.disconnect();
|
||||
}
|
||||
// System.out.println(Utils.Brackets(output));
|
||||
return output;
|
||||
}
|
||||
public void copy(RemoteFile src, RemoteFile dst) throws Exception {
|
||||
ShellCommand("cp " + Utils.DQuotes(src.full_name) + " " + Utils.DQuotes(dst.full_name));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user