def size(path, alias=None, log_level=0): if alias == None: return dev0s.response.success( f"Successfully retrieved the size of {path}.", { "size": FilePath(path).size(mode="MB"), }) else: return execute( command= f"""ssh {DEFAULT_SSH_OPTIONS} {alias} ' python3 /usr/local/lib/ssht00ls/lib/utils/size {path} --non-interactive ' '""", message=f"Successfully retrieved the size of [{alias}:{path}].", log_level=log_level, serialize=True, )
def size(path, alias=None, log_level=0): if alias == None: return r3sponse.success(f"Successfully retrieved the size of {path}.", { "size": FilePath(path).size(mode="MB"), }) else: return execute( command= f"""ssh {DEFAULT_SSH_OPTIONS} {alias} ' python3 /usr/local/lib/ssht00ls/classes/utils/size.py {path} ' '""", message=f"Successfully retrieved the size of {alias}:{path}.", error=f"Failed to retrieve the size of {alias}:{path}.", log_level=log_level, serialize=True, )
def pull( # the local path. path=None, # the ssht00ls alias. alias=None, # the remote path. remote=None, # exlude subpaths (list) (leave None to exclude none). exclude=[], # include subpaths (list) (leave None to include none). include=[], # path is directory boolean (leave None to parse automatically). directory=True, empty_directory=False, # update deleted files. delete=False, # forced mode. forced=False, # version control. safe=False, # accept new hosts keys. accept_new_host_keys=True, # checks. checks=True, # log level. log_level=dev0s.defaults.options.log_level, # get the command in str. command=False, ): # checks. if exclude != None: exclude += EXCLUDE if include != None: include += INCLUDE if checks: # check alias. path = serialize_path(gfp.clean(path)) remote = serialize_path(gfp.clean(remote)) #response = aliases.check(alias) #if not response.success: return response # check encryption activated. #if not ssht00ls_agent.activated: # return dev0s.response.error(f"The {ssht00ls_agent.id} encryption requires to be activated.") # check passphrase. #if CONFIG["aliases"][alias]["smartcard"] in [True, "true", "True"]: # response = ssht00ls_agent.encryption.decrypt(CONFIG["aliases"][alias]["passphrase"]) #else: # response = ssht00ls_agent.encryption.decrypt(CONFIG["aliases"][alias]["passphrase"]) #if not response.success: return response #passphrase = response.decrypted.decode() # tests. #response = agent.add(private_key=CONFIG["aliases"][alias]["private_key"], passphrase=passphrase) #if not response["success"]: return response response = ssh.utils.test_ssht00ls( alias=alias, accept_new_host_keys=accept_new_host_keys) if not response.success: return response response = ssh.utils.test_path( alias=alias, path=remote, accept_new_host_keys=accept_new_host_keys) if not response.success: return response # dir. if directory == None: response = ssh.utils.test_dir( alias=alias, path=remote, accept_new_host_keys=accept_new_host_keys) if not response.success and "not a directory" not in response.error: return response elif response.success: directory = True else: directory = False tested = True elif directory: response = ssh.utils.test_dir( alias=alias, path=remote, accept_new_host_keys=accept_new_host_keys) if not response.success: return response tested = True # check base. base = FilePath(path).base(back=1) if not Files.exists(base): os.system(f"mkdir -p {base}") if not Files.exists(base): return dev0s.response.error(f"Failed to create pull base {base}.") if log_level >= 3: print(f"Created directory {base}.") # fix rsync timestamp bug. if empty_directory and directory and not Files.exists(path): os.system(f"mkdir -p {path}") # options. exclude_str = Array(array=exclude).string(joiner=" --exclude ", sum_first=True) include_str = Array(array=include).string(joiner=" --include ", sum_first=True) delete_str = Boolean(delete).string(true="--delete", false="") lremote = serialize_path(gfp.clean(remote), append_last_slash=directory) lpath = serialize_path(gfp.clean(path), append_last_slash=directory) _command_ = f"rsync -{Boolean(directory).string(true='a', false='')}zqt '{alias}:{lremote}' '{lpath}' {exclude_str} {include_str} {delete_str} --timeout={SSH_TIMEOUT}" #_command_ = f"rsync -azqtr '{alias}:{lremote}' '{lpath}' {exclude_str} {include_str} {delete_str}" # execute. if command: return _command_ else: return execute( command=_command_, loader=f"Pulling [{alias}:{remote}] to [{path}]", message=f"Successfully pulled [{alias}:{remote}] to [{path}].", log_level=log_level, )
def push( # the local path. path=None, # the ssht00ls alias. alias=None, # the remote path. remote=None, # exlude subpaths (list) (leave None to use default). exclude=None, # include subpaths (list) (leave None to use default). include=None, # path is directory boolean (leave None to parse automatically). directory=True, empty_directory=False, # update deleted files. delete=False, # forced mode. forced=False, # version control. safe=False, # accept new hosts keys. accept_new_host_keys=True, # checks. checks=True, check_base=True, # log level. log_level=syst3m.defaults.options.log_level, # get the command in str. command=False, ): # checks. if exclude == None: exclude = EXCLUDE if include == None: include = INCLUDE if checks: # check alias. path = serialize_path(gfp.clean(path)) remote = serialize_path(gfp.clean(remote)) #response = aliases.check(alias) #if not response.success: return response # check encryption activated. #if not encryption.activated: # return r3sponse.error("The encryption requires to be activated.") # check passphrase. #if CONFIG["aliases"][alias]["smartcard"] in [True, "true", "True"]: # response = encrypion.encryption.decrypt(CONFIG["aliases"][alias]["passphrase"]) #else: # response = encrypion.encryption.decrypt(CONFIG["aliases"][alias]["passphrase"]) #if not response.success: return response #passphrase = response.decrypted.decode() # tests. #response = agent.add(private_key=CONFIG["aliases"][alias]["private_key"], passphrase=passphrase) #if not response["success"]: return response response = ssh.utils.test_ssht00ls( alias=alias, accept_new_host_keys=accept_new_host_keys) if not response.success: return response response = ssh.utils.test_path( alias=alias, path=FilePath(remote).base(), accept_new_host_keys=accept_new_host_keys) if not response.success: return response # dir. if directory == None: directory = os.path.isdir(path) elif directory and not os.path.isdir(path): return r3sponse.error(f"Path {path} is not a directory.") # check remote base. # must be excluded from the checks == False. base = FilePath(remote).base(back=1) if check_base: response = ssh.utils.test_dir( alias=alias, path=base, accept_new_host_keys=accept_new_host_keys, create=True, checks=False) if not response.success: return response if response.created and log_level >= 3: print(f"Created remote directory {base}.") # options. exclude_str = Array(array=exclude).string(joiner=" --exclude ", sum_first=True) include_str = Array(array=include).string(joiner=" --include ", sum_first=True) delete_str = Boolean(delete).convert(true="--delete", false="") lremote = serialize_path(gfp.clean(remote), append_last_slash=directory) lpath = serialize_path(gfp.clean(path), append_last_slash=directory) _command_ = f"rsync -{Boolean(directory).convert(true='a', false='')}zqt '{lpath}' '{alias}:{lremote}' {exclude_str} {include_str} {delete_str} --timeout={SSH_TIMEOUT}" #_command_ = f"rsync -azqtr --rsh=ssh '{lpath}' '{alias}:{lremote}' {exclude_str} {include_str} {delete_str}" # execute. if command: return _command_ else: return execute( command=_command_, message=f"Successfully pushed [{path}] to [{alias}:{remote}].", error=f"Failed to push [{path}] to [{alias}:{remote}].", loader=f"Pushing [{path}] to [{alias}:{remote}].", log_level=log_level, )