提交 1e456c72 编写于 作者: B barrierye

fix bug in FTP monitor

上级 156854a3
...@@ -83,18 +83,26 @@ class Monitor(object): ...@@ -83,18 +83,26 @@ class Monitor(object):
if self._local_tmp_path is None: if self._local_tmp_path is None:
raise Exception('local_tmp_path not set.') raise Exception('local_tmp_path not set.')
def _decompress_model_file(local_tmp_path, model_name, unpacked_filename): def _decompress_model_file(self, local_tmp_path, model_name,
unpacked_filename):
import sys
print(unpacked_filename)
sys.stdout.flush()
if unpacked_filename is None: if unpacked_filename is None:
return model_name return model_name
tar_model_path = os.path.join(local_tmp_path, model_name) tar_model_path = os.path.join(local_tmp_path, model_name)
print(tar_model_path)
sys.stdout.flush()
if not tarfile.is_tarfile(tar_model_path): if not tarfile.is_tarfile(tar_model_path):
raise Exception( raise Exception(
'the model({}) of remote production is not a tar packaged file type.'. 'the model({}) of remote production is not a tar packaged file type.'.
format(tar_model_path)) format(tar_model_path))
try: try:
tar = tarfile.open(tar_model_path) tar = tarfile.open(tar_model_path)
tar.extractall(path=os.join(local_tmp_path)) tar.extractall(local_tmp_path)
tar.close() tar.close()
print('ok')
sys.stdout.flush()
except: except:
raise Exception( raise Exception(
'Decompressing failed, please check your permission of {} or disk space left.'. 'Decompressing failed, please check your permission of {} or disk space left.'.
...@@ -256,33 +264,49 @@ class FTPMonitor(Monitor): ...@@ -256,33 +264,49 @@ class FTPMonitor(Monitor):
except ftplib.error_perm: except ftplib.error_perm:
return [False, None] return [False, None]
def _download_remote_file(self,
remote_path,
remote_filename,
local_tmp_path,
overwrite=True):
local_fullpath = os.path.join(local_tmp_path, remote_filename)
if not overwrite and os.path.isfile(fullpath):
return
else:
with open(local_fullpath, 'wb') as f:
self._ftp.cwd(remote_path)
self._ftp.retrbinary('RETR {}'.format(remote_filename), f.write)
def _download_remote_files(self, def _download_remote_files(self,
remote_path, remote_path,
remote_dirname, remote_dirname,
local_tmp_path, local_tmp_path,
overwrite=True): overwrite=True):
local_dirpath = os.path.join(local_tmp_path, remote_dirname) import ftplib
if not os.path.exists(local_dirpath):
os.mkdir(local_dirpath)
remote_dirpath = os.path.join(remote_path, remote_dirname) remote_dirpath = os.path.join(remote_path, remote_dirname)
output = [] # Check whether remote_dirpath is a file or a folder
self._ftp.cwd(remote_dirpath) try:
self._ftp.dir(output.append) self._ftp.cwd(remote_dirpath)
for line in output:
[attr, _, _, _, _, _, _, _, name] = line.split() local_dirpath = os.path.join(local_tmp_path, remote_dirname)
if attr[0] == 'd': if not os.path.exists(local_dirpath):
self._download_remote_files( os.mkdir(local_dirpath)
os.path.join(remote_path, remote_dirname), name,
os.path.join(local_tmp_path, remote_dirname), overwrite) output = []
else: self._ftp.dir(output.append)
fullpath = os.path.join(local_tmp_path, remote_dirname, name) for line in output:
if not overwrite and os.path.isfile(fullpath): [attr, _, _, _, _, _, _, _, name] = line.split()
continue if attr[0] == 'd':
self._download_remote_files(
os.path.join(remote_path, remote_dirname), name,
os.path.join(local_tmp_path, remote_dirname), overwrite)
else: else:
with open(fullpath, 'wb') as f: self._download_remote_file(remote_dirname, name,
self._ftp.cwd(remote_dirpath) local_tmp_path, overwrite)
self._ftp.retrbinary('RETR {}'.format(name), f.write) except ftplib.error_perm:
self._download_remote_file(remote_path, remote_dirname,
local_tmp_path, overwrite)
return
def _pull_remote_dir(self, remote_path, dirname, local_tmp_path): def _pull_remote_dir(self, remote_path, dirname, local_tmp_path):
self._download_remote_files( self._download_remote_files(
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册