设备增加网络配置,增加编程文件传输接口
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import logging
|
||||
from ftplib import FTP
|
||||
import os
|
||||
from ftplib import FTP, error_perm
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -52,8 +53,8 @@ class FtpController:
|
||||
print(self.username, self.port, self.host, self.password)
|
||||
ftp = FTP_P()
|
||||
_logger.info("===================connect==================")
|
||||
# self.ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
|
||||
ftp.set_pasv(0) # 0主动模式 1 #被动模式
|
||||
# ftp.set_debuglevel(2) #打开调试级别2,显示详细信息
|
||||
# ftp.set_pasv(1) # 0主动模式 1 #被动模式
|
||||
try:
|
||||
ftp.connect(self.host, self.port)
|
||||
ftp.login(self.username, self.password)
|
||||
@@ -128,3 +129,126 @@ class FtpController:
|
||||
:return:
|
||||
"""
|
||||
self.ftp.delete(delpath)
|
||||
|
||||
|
||||
|
||||
def transfer_nc_files(source_ftp_info, target_ftp_info, source_dir, target_dir, keep_dir=False):
|
||||
"""
|
||||
从源FTP服务器下载所有.nc文件并上传到目标FTP服务器,保持目录结构
|
||||
|
||||
Args:
|
||||
source_ftp_info: dict, 源FTP连接信息 {host, port, username, password}
|
||||
target_ftp_info: dict, 目标FTP连接信息 {host, port, username, password}
|
||||
source_dir: str, 源FTP上的起始目录
|
||||
target_dir: str, 目标FTP上的目标目录
|
||||
keep_dir: bool, 是否保持目录结构,默认False
|
||||
"""
|
||||
try:
|
||||
# 连接源FTP
|
||||
source_ftp = FtpController(
|
||||
source_ftp_info['host'],
|
||||
source_ftp_info['port'],
|
||||
source_ftp_info['username'],
|
||||
source_ftp_info['password']
|
||||
)
|
||||
source_ftp.ftp.set_pasv(1)
|
||||
|
||||
# 连接目标FTP
|
||||
target_ftp = FtpController(
|
||||
target_ftp_info['host'],
|
||||
target_ftp_info['port'],
|
||||
target_ftp_info['username'],
|
||||
target_ftp_info['password']
|
||||
)
|
||||
source_ftp.ftp.set_pasv(1)
|
||||
|
||||
# 递归遍历源目录
|
||||
def traverse_dir(current_dir, relative_path=''):
|
||||
source_ftp.ftp.cwd(current_dir)
|
||||
file_list = source_ftp.ftp.nlst()
|
||||
|
||||
for item in file_list:
|
||||
try:
|
||||
# 尝试进入目录
|
||||
source_ftp.ftp.cwd(f"{current_dir}/{item}")
|
||||
# 如果成功则是目录
|
||||
new_relative_path = os.path.join(relative_path, item)
|
||||
# 在目标FTP创建对应目录
|
||||
try:
|
||||
if keep_dir:
|
||||
target_ftp.ftp.mkd(f"{target_dir}/{new_relative_path}")
|
||||
except:
|
||||
pass # 目录可能已存在
|
||||
# 递归遍历子目录
|
||||
traverse_dir(f"{current_dir}/{item}", new_relative_path)
|
||||
source_ftp.ftp.cwd('..')
|
||||
except:
|
||||
# 如果是.nc文件则传输
|
||||
if item.lower().endswith('.nc'):
|
||||
# 下载到临时文件
|
||||
temp_path = f"/tmp/{item}"
|
||||
with open(temp_path, 'wb') as f:
|
||||
source_ftp.ftp.retrbinary(f'RETR {item}', f.write)
|
||||
|
||||
# 上传到目标FTP对应目录
|
||||
if keep_dir:
|
||||
target_path = f"{target_dir}/{relative_path}/{item}"
|
||||
else:
|
||||
target_path = f"{target_dir}/{item}"
|
||||
with open(temp_path, 'rb') as f:
|
||||
target_ftp.ftp.storbinary(f'STOR {target_path}', f)
|
||||
|
||||
# 删除临时文件
|
||||
os.remove(temp_path)
|
||||
logging.info(f"已传输文件: {item}")
|
||||
|
||||
# 清空目标目录下的所有内容
|
||||
try:
|
||||
target_ftp.ftp.cwd(target_dir)
|
||||
files = target_ftp.ftp.nlst()
|
||||
|
||||
for f in files:
|
||||
try:
|
||||
# 尝试删除文件
|
||||
target_ftp.ftp.delete(f)
|
||||
except:
|
||||
try:
|
||||
# 如果删除失败,可能是目录,递归删除目录
|
||||
def remove_dir(path):
|
||||
target_ftp.ftp.cwd(path)
|
||||
sub_files = target_ftp.ftp.nlst()
|
||||
for sf in sub_files:
|
||||
try:
|
||||
target_ftp.ftp.delete(sf)
|
||||
except:
|
||||
remove_dir(f"{path}/{sf}")
|
||||
target_ftp.ftp.cwd('..')
|
||||
target_ftp.ftp.rmd(path)
|
||||
|
||||
remove_dir(f"{target_dir}/{f}")
|
||||
except:
|
||||
logging.error(f"无法删除 {f}")
|
||||
pass
|
||||
|
||||
logging.info(f"已清空目标目录 {target_dir}")
|
||||
except Exception as e:
|
||||
logging.error(f"清空目标目录失败: {str(e)}")
|
||||
return False
|
||||
|
||||
# 开始遍历
|
||||
traverse_dir(source_dir)
|
||||
|
||||
logging.info("所有.nc文件传输完成")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logging.error(f"传输过程出错: {str(e)}")
|
||||
return False
|
||||
|
||||
finally:
|
||||
# 关闭FTP连接
|
||||
try:
|
||||
source_ftp.ftp.quit()
|
||||
target_ftp.ftp.quit()
|
||||
except:
|
||||
pass
|
||||
Reference in New Issue
Block a user