add Connect.parse_connect_params()

This commit is contained in:
Pavel Muhortov 2023-06-29 09:43:06 +03:00
parent cb03bae49b
commit c3b2d897c7
2 changed files with 171 additions and 96 deletions

View File

@ -96,9 +96,8 @@ userpass = pass
# FTP, SFTP, SMB. # FTP, SFTP, SMB.
records_root_path = ftp://user:pass@192.168.254.254:21/Records/camera.test.local records_root_path = ftp://user:pass@192.168.254.254:21/Records/camera.test.local
# #
# Separated parameters string has lower priority and parameters are overwritten by # One line parameters string has lower priority and parameters are overwritten by
# records_root_path = 'hosttype://username:password@hostname:hostport/some/path' # separated parameter variables if you use both.
# if you use both.
# #
#records_root_path = /Records/camera.test.local #records_root_path = /Records/camera.test.local
# #
@ -157,43 +156,41 @@ image_find_names = step071, image-01, image-02
# If image root or destination video directories on a remote host is used, username and password must be specified. # If image root or destination video directories on a remote host is used, username and password must be specified.
# Supported protocols: # Supported protocols:
# FTP, SFTP, SMB. # FTP, SFTP, SMB.
image_root_path = ftp://user:pass@192.168.254.254/Records/camera.test.local image_root_path = sftp://user:pass@192.168.254.254/Records/camera.test.local
# #
# Separated parameters string has lower priority and parameters are overwritten by # One line parameters string has lower priority and parameters are overwritten by
# image_root_path = 'hosttype://username:password@hostname:hostport/some/path' # separated parameter variables if you use both.
# if you use both.
# #
#image_root_path = /Records/camera.test.local #image_root_path = /Records/camera.test.local
# #
#image_root_host = 192.168.254.254 #image_root_host = 192.168.254.254
# #
# Optionality you can set custom connection port: # Optionality you can set custom connection port:
#image_root_port = 21 #image_root_port = 22
# #
# You must set connection type (ftp is faster than sftp, sftp is faster than smb): # You must set connection type (ftp is faster than sftp, sftp is faster than smb):
# ftp, sftp, smb. # ftp, sftp, smb.
#image_root_type = ftp #image_root_type = sftp
# #
#image_root_user = user #image_root_user = user
# #
#image_root_pass = pass #image_root_pass = pass
video_dest_path = ftp://user:pass@192.168.254.254/Downloads video_dest_path = smb://user:pass@192.168.254.254/Downloads
# #
# Separated parameters string has lower priority and parameters are overwritten by # One line parameters string has lower priority and parameters are overwritten by
# video_dest_path = 'hosttype://username:password@hostname:hostport/some/path' # separated parameter variables if you use both.
# if you use both.
# #
#video_dest_path = /Downloads #video_dest_path = /Downloads
# #
# Optionality you can set custom connection port: # Optionality you can set custom connection port:
#video_dest_host = 192.168.254.254 #video_dest_host = 192.168.254.254
# #
#video_dest_port = 21 #video_dest_port = 445
# #
# You must set connection type (ftp is faster than sftp, sftp is faster than smb): # You must set connection type (ftp is faster than sftp, sftp is faster than smb):
# ftp, sftp, smb. # ftp, sftp, smb.
#video_dest_type = ftp #video_dest_type = smb
# #
#video_dest_user = user #video_dest_user = user
# #
@ -213,9 +210,8 @@ video_find_names = step071, image-01, image-02
# FTP, SFTP, SMB. # FTP, SFTP, SMB.
video_root_path = ftp://user:pass@192.168.254.254/Downloads video_root_path = ftp://user:pass@192.168.254.254/Downloads
# #
# Separated parameters string has lower priority and parameters are overwritten by # One line parameters string has lower priority and parameters are overwritten by
# video_root_path = 'hosttype://username:password@hostname:hostport/some/path' # separated parameter variables if you use both.
# if you use both.
# #
#video_dest_path = /Downloads #video_dest_path = /Downloads
# #

View File

@ -1342,6 +1342,77 @@ class Connect:
@staticmethod
def parse_connect_params(
connect_string: str,
logger_alias: str = inspect.stack()[0].function
) -> dict:
"""One line connection string separator.
Args:
connect_string (str): hosttype://username:password@hostname:hostport/some/path.
logger_alias (str, optional): logger_alias (str, optional): sublogger name.
Defaults to function or method name.
Returns:
dict: {
'hostpath': remote_hostpath,
'hostname': remote_hostname,
'hostport': remote_hostport,
'hosttype': remote_hosttype,
'username': remote_username,
'password': remote_password
}
"""
local_logger = logging.getLogger(logger_alias)
if Do.args_valid(locals(), Connect.parse_connect_params.__annotations__):
remote_hostpath = None
remote_hostname = None
remote_hostport = None
remote_hosttype = None
remote_username = None
remote_password = None
if '://' in connect_string:
remote_hostname = connect_string.split('/')[2]
remote_hosttype = connect_string.split('://')[0]
remote_hostpath = connect_string.replace(
remote_hosttype + '://' + remote_hostname, ''
)
if '@' in remote_hostname:
remote_username = remote_hostname.split('@')[0].split(':')[0]
remote_password = remote_hostname.split('@')[0].split(':')[1]
remote_hostname = remote_hostname.split('@')[1]
if ':' in remote_hostname:
remote_hostport = int(remote_hostname.split(':')[1])
remote_hostname = remote_hostname.split(':')[0]
else:
remote_hostpath = connect_string
remote_hosttype = 'local'
if not remote_hostport:
if remote_hosttype == 'ftp':
remote_hostport = 21
if remote_hosttype == 'sftp':
remote_hostport = 22
if remote_hosttype == 'smb':
remote_hostport = 445
local_logger.debug(msg=''
+ '\n' + 'hostpath: ' + str(remote_hostpath)
+ '\n' + 'hostname: ' + str(remote_hostname)
+ '\n' + 'hostport: ' + str(remote_hostport)
+ '\n' + 'hosttype: ' + str(remote_hosttype)
+ '\n' + 'username: ' + str(remote_username)
+ '\n' + 'password: ' + str(remote_password)
)
return {
'hostpath': remote_hostpath,
'hostname': remote_hostname,
'hostport': remote_hostport,
'hosttype': remote_hosttype,
'username': remote_username,
'password': remote_password
}
@classmethod @classmethod
def file_search( def file_search(
cls, cls,
@ -1358,9 +1429,9 @@ class Connect:
Args: Args:
search_path (str): where to search. search_path (str): where to search.
search_path='/some/path', hostname='hostname', username='username', etc.
has lower priority and parameters are overwritten by
search_path = 'hosttype://username:password@hostname:hostport/some/path' search_path = 'hosttype://username:password@hostname:hostport/some/path'
has lower priority and parameters are overwritten by
search_path='/some/path', hostname='hostname', username='username', etc.
search_name (str, type, optional): full or partial filename for the filter. search_name (str, type, optional): full or partial filename for the filter.
Defaults to None. Defaults to None.
hostname (str, type, optional): remote hostname. hostname (str, type, optional): remote hostname.
@ -1390,30 +1461,24 @@ class Connect:
+ '\n' + 'username: ' + str(username) + '\n' + 'username: ' + str(username)
+ '\n' + 'password: ' + str(password) + '\n' + 'password: ' + str(password)
) )
remote_hostpath = search_path
connect = cls.parse_connect_params(connect_string=search_path)
remote_hostpath = connect['hostpath']
remote_hostname = hostname remote_hostname = hostname
if not remote_hostname:
remote_hostname = connect['hostname']
remote_hostport = hostport remote_hostport = hostport
if not remote_hostport:
remote_hostport = connect['hostport']
remote_hosttype = hosttype remote_hosttype = hosttype
if not remote_hosttype:
remote_hosttype = connect['hosttype']
remote_username = username remote_username = username
if not remote_username:
remote_username = connect['username']
remote_password = password remote_password = password
if '://' in search_path: if not remote_password:
remote_hostname = search_path.split('/')[2] remote_password = connect['password']
remote_hosttype = search_path.split('://')[0]
remote_hostpath = search_path.replace(remote_hosttype + '://' + remote_hostname, '')
if '@' in remote_hostname:
remote_username = remote_hostname.split('@')[0].split(':')[0]
remote_password = remote_hostname.split('@')[0].split(':')[1]
remote_hostname = remote_hostname.split('@')[1]
if ':' in remote_hostname:
remote_hostport = int(remote_hostname.split(':')[1])
remote_hostname = remote_hostname.split(':')[0]
if not hostport:
if remote_hosttype == 'ftp':
remote_hostport = 21
if remote_hosttype == 'sftp':
remote_hostport = 22
if remote_hosttype == 'smb':
remote_hostport = 445
if remote_hosttype == 'ftp': if remote_hosttype == 'ftp':
files_found = cls.ftp_file_search( files_found = cls.ftp_file_search(
@ -1471,9 +1536,9 @@ class Connect:
Args: Args:
src_file (str): src_file (str):
src_file='/remote/path/to/file.', hostname='hostname', username='username', etc.
has lower priority and parameters are overwritten by
src_file = 'hosttype://username:password@hostname:hostport/remote/path/to/file.' src_file = 'hosttype://username:password@hostname:hostport/remote/path/to/file.'
has lower priority and parameters are overwritten by
src_file='/remote/path/to/file', hostname='hostname', username='username', etc.
dst_file (str):/local/path/to/file. dst_file (str):/local/path/to/file.
hostname (str, type, optional): remote hostname. hostname (str, type, optional): remote hostname.
Defaults to None. Defaults to None.
@ -1502,30 +1567,24 @@ class Connect:
+ '\n' + 'username: ' + str(username) + '\n' + 'username: ' + str(username)
+ '\n' + 'password: ' + str(password) + '\n' + 'password: ' + str(password)
) )
remote_hostpath = src_file
connect = cls.parse_connect_params(connect_string=src_file)
remote_hostpath = connect['hostpath']
remote_hostname = hostname remote_hostname = hostname
if not remote_hostname:
remote_hostname = connect['hostname']
remote_hostport = hostport remote_hostport = hostport
if not remote_hostport:
remote_hostport = connect['hostport']
remote_hosttype = hosttype remote_hosttype = hosttype
if not remote_hosttype:
remote_hosttype = connect['hosttype']
remote_username = username remote_username = username
if not remote_username:
remote_username = connect['username']
remote_password = password remote_password = password
if '://' in src_file: if not remote_password:
remote_hostname = src_file.split('/')[2] remote_password = connect['password']
remote_hosttype = src_file.split('://')[0]
remote_hostpath = src_file.replace(remote_hosttype + '://' + remote_hostname, '')
if '@' in remote_hostname:
remote_username = remote_hostname.split('@')[0].split(':')[0]
remote_password = remote_hostname.split('@')[0].split(':')[1]
remote_hostname = remote_hostname.split('@')[1]
if ':' in remote_hostname:
remote_hostport = int(remote_hostname.split(':')[1])
remote_hostname = remote_hostname.split(':')[0]
if not hostport:
if remote_hosttype == 'ftp':
remote_hostport = 21
if remote_hosttype == 'sftp':
remote_hostport = 22
if remote_hosttype == 'smb':
remote_hostport = 445
if remote_hosttype == 'ftp': if remote_hosttype == 'ftp':
result = cls.ftp_get_file( result = cls.ftp_get_file(
@ -1584,9 +1643,9 @@ class Connect:
Args: Args:
src_file (str):/local/path/to/file. src_file (str):/local/path/to/file.
dst_file (str): dst_file (str):
dst_file='/remote/path/to/file.', hostname='hostname', username='username', etc.
has lower priority and parameters are overwritten by
dst_file = 'hosttype://username:password@hostname:hostport/remote/path/to/file.' dst_file = 'hosttype://username:password@hostname:hostport/remote/path/to/file.'
has lower priority and parameters are overwritten by
dst_file='/remote/path/to/file', hostname='hostname', username='username', etc.
hostname (str, type, optional): remote hostname. hostname (str, type, optional): remote hostname.
Defaults to None. Defaults to None.
hostport (int, type, optional): remote host connection port. hostport (int, type, optional): remote host connection port.
@ -1614,30 +1673,24 @@ class Connect:
+ '\n' + 'username: ' + str(username) + '\n' + 'username: ' + str(username)
+ '\n' + 'password: ' + str(password) + '\n' + 'password: ' + str(password)
) )
remote_hostpath = dst_file
connect = cls.parse_connect_params(connect_string=dst_file)
remote_hostpath = connect['hostpath']
remote_hostname = hostname remote_hostname = hostname
if not remote_hostname:
remote_hostname = connect['hostname']
remote_hostport = hostport remote_hostport = hostport
if not remote_hostport:
remote_hostport = connect['hostport']
remote_hosttype = hosttype remote_hosttype = hosttype
if not remote_hosttype:
remote_hosttype = connect['hosttype']
remote_username = username remote_username = username
if not remote_username:
remote_username = connect['username']
remote_password = password remote_password = password
if '://' in dst_file: if not remote_password:
remote_hostname = dst_file.split('/')[2] remote_password = connect['password']
remote_hosttype = dst_file.split('://')[0]
remote_hostpath = dst_file.replace(remote_hosttype + '://' + remote_hostname, '')
if '@' in remote_hostname:
remote_username = remote_hostname.split('@')[0].split(':')[0]
remote_password = remote_hostname.split('@')[0].split(':')[1]
remote_hostname = remote_hostname.split('@')[1]
if ':' in remote_hostname:
remote_hostport = int(remote_hostname.split(':')[1])
remote_hostname = remote_hostname.split(':')[0]
if not hostport:
if remote_hosttype == 'ftp':
remote_hostport = 21
if remote_hosttype == 'sftp':
remote_hostport = 22
if remote_hosttype == 'smb':
remote_hostport = 445
if remote_hosttype == 'ftp': if remote_hosttype == 'ftp':
result = cls.ftp_put_file( result = cls.ftp_put_file(
@ -3235,6 +3288,19 @@ class Convert:
) )
makedirs(temp_path, exist_ok=True) makedirs(temp_path, exist_ok=True)
for image in image_found: for image in image_found:
connect = Connect.parse_connect_params(connect_string=image_root)
if not image_root_host:
image_root_host = connect['hostname']
if not image_root_port:
image_root_port = connect['hostport']
if not image_root_type:
image_root_type = connect['hosttype']
if not image_root_user:
image_root_user = connect['username']
if not image_root_pass:
image_root_pass = connect['password']
if Connect.file_download( if Connect.file_download(
src_file=image, src_file=image,
dst_file=temp_path + sep + path.basename(image), dst_file=temp_path + sep + path.basename(image),
@ -3393,21 +3459,34 @@ class Publish:
) )
makedirs(temp_path, exist_ok=True) makedirs(temp_path, exist_ok=True)
for video in video_found: for video in video_found:
if Connect.file_download(
src_file=video, connect = Connect.parse_connect_params(connect_string=video_root)
dst_file=temp_path + sep + path.basename(video), if not video_root_host:
hostname=video_root_host, video_root_host = connect['hostname']
hostport=video_root_port, if not video_root_port:
hosttype=video_root_type, video_root_port = connect['hostport']
username=video_root_user, if not video_root_type:
password=video_root_pass, video_root_type = connect['hosttype']
logger_alias=logger_alias if not video_root_user:
)['success']: video_root_user = connect['username']
temp_files.append(temp_path + sep + path.basename(video)) if not video_root_pass:
video_files[publish_period][name] = ( video_root_pass = connect['password']
temp_path + sep + path.basename(video)
) if Connect.file_download(
src_file=video,
dst_file=temp_path + sep + path.basename(video),
hostname=video_root_host,
hostport=video_root_port,
hosttype=video_root_type,
username=video_root_user,
password=video_root_pass,
logger_alias=logger_alias
)['success']:
temp_files.append(temp_path + sep + path.basename(video))
video_files[publish_period][name] = (
temp_path + sep + path.basename(video)
)
if tg_api_key: if tg_api_key:
tg = Telegram(tg_api_key) tg = Telegram(tg_api_key)