197 lines
7.4 KiB
Python
197 lines
7.4 KiB
Python
import json
|
|
import os
|
|
import traceback
|
|
|
|
from support import SupportSubprocess, d, logger
|
|
|
|
|
|
class SupportRclone(object):
|
|
__instance_list = []
|
|
|
|
__rclone_path = 'rclone'
|
|
__rclone_config_path = 'rclone.conf'
|
|
|
|
|
|
@classmethod
|
|
def initialize(cls, __rclone_path, __rclone_config_path):
|
|
cls.__rclone_path = __rclone_path
|
|
cls.__rclone_config_path = __rclone_config_path
|
|
|
|
@classmethod
|
|
def get_rclone_path(cls):
|
|
return cls.__rclone_path
|
|
|
|
@classmethod
|
|
def __get_cmd(cls, config_path=None):
|
|
command = [cls.__rclone_path]
|
|
if config_path == None:
|
|
command += ['--config', cls.__rclone_config_path]
|
|
else:
|
|
command += ['--config', config_path]
|
|
return command
|
|
|
|
|
|
@classmethod
|
|
def rclone_cmd(cls):
|
|
return [cls.__rclone_path, '--config', cls.__rclone_config_path]
|
|
|
|
@classmethod
|
|
def get_version(cls, rclone_path=None):
|
|
try:
|
|
if rclone_path == None:
|
|
rclone_path = cls.__rclone_path
|
|
cmd = [rclone_path, '--version']
|
|
result = SupportSubprocess.execute_command_return(cmd)
|
|
if result != None and result['status'] == 'finish':
|
|
return result['log']
|
|
except Exception as e:
|
|
logger.error(f'Exception:{str(e)}')
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
@classmethod
|
|
def config_list(cls, rclone_path=None, rclone_config_path=None, option=None):
|
|
try:
|
|
if rclone_path == None:
|
|
rclone_path = cls.__rclone_path
|
|
if rclone_config_path == None:
|
|
rclone_config_path = cls.__rclone_config_path
|
|
if os.path.exists(rclone_config_path) == False:
|
|
return
|
|
command = [rclone_path, '--config', rclone_config_path, 'config', 'dump']
|
|
if option is not None:
|
|
command += option
|
|
result = SupportSubprocess.execute_command_return(command, format='json')
|
|
for key, value in result['log'].items():
|
|
if 'token' in value and value['token'].startswith('{'):
|
|
value['token'] = json.loads(value['token'])
|
|
return result['log']
|
|
except Exception as e:
|
|
logger.error(f'Exception:{str(e)}')
|
|
logger.error(traceback.format_exc())
|
|
|
|
@classmethod
|
|
def get_config(cls, remote_name, rclone_path=None, rclone_config_path=None, option=None):
|
|
try:
|
|
data = cls.config_list(rclone_path=rclone_path, rclone_config_path=rclone_config_path, option=option)
|
|
return data.get(remote_name, None)
|
|
|
|
except Exception as e:
|
|
logger.error(f"Exception:{str(e)}")
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
@classmethod
|
|
def lsjson(cls, remote_path, config_path=None, option=None):
|
|
return cls.__execute_one_param('lsjson', remote_path, config_path=config_path, option=option, format='json')
|
|
|
|
|
|
@classmethod
|
|
def lsf(cls, remote_path, config_path=None, option=None):
|
|
if option == None:
|
|
option = ['--max-depth=1']
|
|
return cls.__execute_one_param('lsf', remote_path, config_path=config_path, option=option, format='json')
|
|
|
|
|
|
@classmethod
|
|
def size(cls, remote_path, config_path=None, option=None):
|
|
if option == None:
|
|
option = ['--json']
|
|
return cls.__execute_one_param('size', remote_path, config_path=config_path, option=option, format='json')
|
|
|
|
|
|
@classmethod
|
|
def mkdir(cls, remote_path, config_path=None, option=None):
|
|
return cls.__execute_one_param('mkdir', remote_path, config_path=config_path, option=option, format='json')
|
|
|
|
@classmethod
|
|
def purge(cls, remote_path, config_path=None, option=None):
|
|
return cls.__execute_one_param('purge', remote_path, config_path=config_path, option=option, format='json')
|
|
|
|
|
|
@classmethod
|
|
def __execute_one_param(cls, command, remote_path, config_path=None, option=None, format=None):
|
|
try:
|
|
command = cls.__get_cmd(config_path) + [command, remote_path]
|
|
if option is not None:
|
|
command += option
|
|
result = SupportSubprocess.execute_command_return(command, format=format)
|
|
ret = None
|
|
if result != None and result['status'] == 'finish':
|
|
ret = result['log']
|
|
return ret
|
|
except Exception as e:
|
|
logger.error(f'Exception:{str(e)}')
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
@classmethod
|
|
def copy(cls, src, tar, config_path=None, option=None):
|
|
return cls.__execute_two_param('copy', src, tar, config_path=config_path, option=option)
|
|
|
|
@classmethod
|
|
def copy_server_side(cls, src, tar, config_path=None, option=None):
|
|
if option == None:
|
|
option = ['--drive-server-side-across-configs=true', '--delete-empty-src-dirs']
|
|
return cls.__execute_two_param('copy', src, tar, config_path=config_path, option=option)
|
|
|
|
@classmethod
|
|
def move(cls, src, tar, config_path=None, option=None):
|
|
return cls.__execute_two_param('move', src, tar, config_path=config_path, option=option)
|
|
|
|
@classmethod
|
|
def move_server_side(cls, src, tar, config_path=None, option=None):
|
|
if option == None:
|
|
option = ['--drive-server-side-across-configs=true', '--delete-empty-src-dirs']
|
|
return cls.__execute_two_param('move', src, tar, config_path=config_path, option=option)
|
|
|
|
@classmethod
|
|
def __execute_two_param(cls, command, src, tar, config_path=None, option=None, format=None):
|
|
try:
|
|
command = cls.__get_cmd(config_path) + [command, src, tar]
|
|
if option is not None:
|
|
command += option
|
|
result = SupportSubprocess.execute_command_return(command, format=format)
|
|
ret = None
|
|
if result != None and result['status'] == 'finish':
|
|
ret = result['log']
|
|
return ret
|
|
except Exception as e:
|
|
logger.error(f'Exception:{str(e)}')
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
|
|
@classmethod
|
|
def getid(cls, remote_path, config_path=None, option=None):
|
|
try:
|
|
command = cls.__get_cmd(config_path) + ['backend', 'getid', remote_path]
|
|
if option is not None:
|
|
command += option
|
|
result = SupportSubprocess.execute_command_return(command)
|
|
ret = None
|
|
if result != None and result['status'] == 'finish':
|
|
ret = result['log']
|
|
if ret is not None and (len(ret.split(' ')) > 1 or ret == ''):
|
|
ret = None
|
|
return ret
|
|
except Exception as e:
|
|
logger.error(f"Exception:{str(e)}")
|
|
logger.error(traceback.format_exc())
|
|
|
|
|
|
@classmethod
|
|
def chpar(cls, src, tar, config_path=None, option=None):
|
|
try:
|
|
command = cls.__get_cmd(config_path) + ['backend', 'chpar', src, tar, '-o', 'depth=1', '-o', 'delete-empty-src-dir', '--drive-use-trash=false']
|
|
if option is not None:
|
|
command += option
|
|
result = SupportSubprocess.execute_command_return(command)
|
|
ret = None
|
|
if result != None and result['status'] == 'finish':
|
|
ret = result['log']
|
|
return True
|
|
except Exception as e:
|
|
logger.error(f"Exception:{str(e)}")
|
|
logger.error(traceback.format_exc())
|
|
return False |