diff --git a/cm-cli.py b/cm-cli.py index d3dd05aa..518461c5 100644 --- a/cm-cli.py +++ b/cm-cli.py @@ -201,7 +201,7 @@ cm_ctx = Ctx() def install_node(node_name, is_all=False, cnt_msg=''): - if '://' in node_name: + if core.is_valid_url(node_name): # install via urls res = core.gitclone_install([node_name]) if not res: diff --git a/glob/manager_core.py b/glob/manager_core.py index c39bbbb4..3f1bc48f 100644 --- a/glob/manager_core.py +++ b/glob/manager_core.py @@ -515,10 +515,16 @@ class GitProgress(RemoteProgress): def is_valid_url(url): try: + # Check for HTTP/HTTPS URL format result = urlparse(url) - return all([result.scheme, result.netloc]) - except ValueError: - return False + if all([result.scheme, result.netloc]): + return True + finally: + # Check for SSH git URL format + pattern = re.compile(r"^(.+@|ssh:\/\/).+:.+$") + if pattern.match(url): + return True + return False def gitclone_install(files, instant_execution=False, msg_prefix=''): diff --git a/js/common.js b/js/common.js index 7a914953..419862f0 100644 --- a/js/common.js +++ b/js/common.js @@ -34,8 +34,9 @@ function isValidURL(url) { if(url.includes('&')) return false; - const pattern = /^(https?|ftp):\/\/[^\s/$.?#].[^\s]*$/; - return pattern.test(url); + const http_pattern = /^(https?|ftp):\/\/[^\s$?#]+$/; + const ssh_pattern = /^(.+@|ssh:\/\/).+:.+$/; + return http_pattern.test(url) || ssh_pattern.test(url); } export async function install_pip(packages) {