diff --git a/termius/porting/providers/ssh/adapter.py b/termius/porting/providers/ssh/adapter.py index 0416d52..65dd5bc 100644 --- a/termius/porting/providers/ssh/adapter.py +++ b/termius/porting/providers/ssh/adapter.py @@ -56,7 +56,8 @@ def adapt_instance_to_ssh_config_host(self, host_instance): return adapted - def adapt_ssh_config_host_to_instance(self, alias, parsed_host): + def adapt_ssh_config_host_to_instance(self, alias, parsed_host, + parsed_group=None): """Convert parsed host to application host.""" app_host = Host( label=alias, @@ -80,5 +81,7 @@ def adapt_ssh_config_host_to_instance(self, alias, parsed_host): ) app_host.ssh_config = ssh_config + if parsed_group: + app_host.group = parsed_group return app_host diff --git a/termius/porting/providers/ssh/parser.py b/termius/porting/providers/ssh/parser.py index 8b6a274..49c0fc4 100644 --- a/termius/porting/providers/ssh/parser.py +++ b/termius/porting/providers/ssh/parser.py @@ -14,7 +14,9 @@ def parse(self, file_obj): # noqa :param file_obj: a file-like object to read the config file from """ + termius_group = "# termius:group" termius_ignore_regexp = re.compile(r'# termius:ignore') + termius_groups_regexp = re.compile(r'{}'.format(termius_group)) host = {'host': ['*'], 'config': {}} @@ -30,6 +32,10 @@ def parse(self, file_obj): # noqa if ignore_comment: host['config']['ignore'] = '' + groups_comment = termius_groups_regexp.match(line) + if groups_comment: + host['group'] = line.replace(termius_group, "").strip() + continue match = re.match(self.SETTINGS_REGEX, line) diff --git a/termius/porting/providers/ssh/provider.py b/termius/porting/providers/ssh/provider.py index 6ca2bd0..88c273f 100644 --- a/termius/porting/providers/ssh/provider.py +++ b/termius/porting/providers/ssh/provider.py @@ -5,7 +5,7 @@ from os.path import expanduser from pathlib2 import Path -from termius.core.models.terminal import Host +from termius.core.models.terminal import Host, Group from ..base import BasePortingProvider from .parser import SSHConfigParser @@ -50,8 +50,20 @@ def provider_hosts(self): ] to_import = [] - + parsed_group = None for alias in parsed_hosts: + parsed_group_name = parser._config[parsed_hosts.index(alias) + 1]\ + .get("group", None) + if parsed_group_name: + matching_groups = [x for x in self.storage.get_all(Group) + if x['label'] == parsed_group_name] + if len(matching_groups) == 0: + g = Group(label=parsed_group_name) + self.storage.create(g) + matching_groups = [g] + + item = matching_groups.pop() + parsed_group = Group(**item) parsed_host = parser.lookup(alias) if 'ignore' in parsed_host: @@ -59,7 +71,7 @@ def provider_hosts(self): to_import.append( self.adapter.adapt_ssh_config_host_to_instance( - alias, parsed_host + alias, parsed_host, parsed_group ) )