Fix SSH connection loss causing operation failures
- Add comprehensive SSH connection checking with auto-reconnection - Implement ensureSSHConnection() function for all file operations - Enhanced error handling with specific SSH connection error messages - Fixed operations affected: - File/folder renaming - File/folder creation - File/folder deletion - File upload/download - Improved user feedback with host-specific error messages - Consistent connection recovery across all file manager functions - Better reliability for long-running SSH sessions
This commit is contained in:
@@ -231,6 +231,9 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
if (!sshSessionId) return;
|
if (!sshSessionId) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
const targetPath = currentPath.endsWith('/')
|
const targetPath = currentPath.endsWith('/')
|
||||||
? `${currentPath}${file.name}`
|
? `${currentPath}${file.name}`
|
||||||
: `${currentPath}/${file.name}`;
|
: `${currentPath}/${file.name}`;
|
||||||
@@ -239,7 +242,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
toast.success(t("fileManager.fileUploadedSuccessfully", { name: file.name }));
|
toast.success(t("fileManager.fileUploadedSuccessfully", { name: file.name }));
|
||||||
loadDirectory(currentPath);
|
loadDirectory(currentPath);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToUploadFile"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToUploadFile"));
|
||||||
|
}
|
||||||
console.error("Upload failed:", error);
|
console.error("Upload failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -248,6 +255,9 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
if (!sshSessionId) return;
|
if (!sshSessionId) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
const response = await downloadSSHFile(sshSessionId, file.path);
|
const response = await downloadSSHFile(sshSessionId, file.path);
|
||||||
|
|
||||||
if (response?.content) {
|
if (response?.content) {
|
||||||
@@ -272,7 +282,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
toast.success(t("fileManager.fileDownloadedSuccessfully", { name: file.name }));
|
toast.success(t("fileManager.fileDownloadedSuccessfully", { name: file.name }));
|
||||||
}
|
}
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToDownloadFile"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToDownloadFile"));
|
||||||
|
}
|
||||||
console.error("Download failed:", error);
|
console.error("Download failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -281,6 +295,9 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
if (!sshSessionId || files.length === 0) return;
|
if (!sshSessionId || files.length === 0) return;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
await deleteSSHItem(sshSessionId, file.path);
|
await deleteSSHItem(sshSessionId, file.path);
|
||||||
}
|
}
|
||||||
@@ -288,7 +305,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
loadDirectory(currentPath);
|
loadDirectory(currentPath);
|
||||||
clearSelection();
|
clearSelection();
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToDeleteItems"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToDeleteItems"));
|
||||||
|
}
|
||||||
console.error("Delete failed:", error);
|
console.error("Delete failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -302,6 +323,9 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
: `${currentPath}/${defaultName}`;
|
: `${currentPath}/${defaultName}`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
await createSSHFolder(sshSessionId, folderPath);
|
await createSSHFolder(sshSessionId, folderPath);
|
||||||
|
|
||||||
// 重新加载目录
|
// 重新加载目录
|
||||||
@@ -316,7 +340,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
setEditingFile(newFolder);
|
setEditingFile(newFolder);
|
||||||
setIsCreatingNewFile(true);
|
setIsCreatingNewFile(true);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToCreateFolder"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToCreateFolder"));
|
||||||
|
}
|
||||||
console.error("Create folder failed:", error);
|
console.error("Create folder failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -330,6 +358,9 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
: `${currentPath}/${defaultName}`;
|
: `${currentPath}/${defaultName}`;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
await createSSHFile(sshSessionId, filePath, "");
|
await createSSHFile(sshSessionId, filePath, "");
|
||||||
|
|
||||||
// 重新加载目录
|
// 重新加载目录
|
||||||
@@ -345,7 +376,11 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
setEditingFile(newFile);
|
setEditingFile(newFile);
|
||||||
setIsCreatingNewFile(true);
|
setIsCreatingNewFile(true);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToCreateFile"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToCreateFile"));
|
||||||
|
}
|
||||||
console.error("Create file failed:", error);
|
console.error("Create file failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -425,6 +460,38 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
setEditingFile(file);
|
setEditingFile(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 确保SSH连接有效
|
||||||
|
async function ensureSSHConnection() {
|
||||||
|
if (!sshSessionId || !currentHost) return;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const status = await getSSHStatus(sshSessionId);
|
||||||
|
console.log('SSH connection status:', status);
|
||||||
|
|
||||||
|
if (!status.connected) {
|
||||||
|
console.log('SSH not connected, attempting to reconnect...');
|
||||||
|
|
||||||
|
await connectSSH(sshSessionId, {
|
||||||
|
hostId: currentHost.id,
|
||||||
|
ip: currentHost.ip,
|
||||||
|
port: currentHost.port,
|
||||||
|
username: currentHost.username,
|
||||||
|
password: currentHost.password,
|
||||||
|
sshKey: currentHost.key,
|
||||||
|
keyPassword: currentHost.keyPassword,
|
||||||
|
authType: currentHost.authType,
|
||||||
|
credentialId: currentHost.credentialId,
|
||||||
|
userId: currentHost.userId
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log('SSH reconnection successful');
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.log('SSH connection check/reconnect failed:', error);
|
||||||
|
throw error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 处理重命名确认
|
// 处理重命名确认
|
||||||
async function handleRenameConfirm(file: FileItem, newName: string) {
|
async function handleRenameConfirm(file: FileItem, newName: string) {
|
||||||
if (!sshSessionId) return;
|
if (!sshSessionId) return;
|
||||||
@@ -433,11 +500,18 @@ function FileManagerContent({ initialHost, onClose }: FileManagerModernProps) {
|
|||||||
const newPath = file.path.replace(file.name, newName);
|
const newPath = file.path.replace(file.name, newName);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
// 确保SSH连接有效
|
||||||
|
await ensureSSHConnection();
|
||||||
|
|
||||||
await renameSSHItem(sshSessionId, oldPath, newPath);
|
await renameSSHItem(sshSessionId, oldPath, newPath);
|
||||||
toast.success(t("fileManager.itemRenamedSuccessfully", { name: newName }));
|
toast.success(t("fileManager.itemRenamedSuccessfully", { name: newName }));
|
||||||
loadDirectory(currentPath);
|
loadDirectory(currentPath);
|
||||||
} catch (error: any) {
|
} catch (error: any) {
|
||||||
toast.error(t("fileManager.failedToRenameItem"));
|
if (error.message?.includes('connection') || error.message?.includes('established')) {
|
||||||
|
toast.error(`SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`);
|
||||||
|
} else {
|
||||||
|
toast.error(t("fileManager.failedToRenameItem"));
|
||||||
|
}
|
||||||
console.error("Rename failed:", error);
|
console.error("Rename failed:", error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user