From efc32d99359305bdb8f8b8c88c5f7969809c5e3e Mon Sep 17 00:00:00 2001 From: Noam Date: Sun, 2 Sep 2018 18:51:19 +0300 Subject: [PATCH] v0.0.1 --- .gitignore | 2 + README.md | 9 +++ images/icon.svg | 148 ++++++++++++++++++++++++++++++++++++++++++++++++ images/rdp.svg | 41 ++++++++++++++ images/ssh.svg | 1 + main.py | 141 +++++++++++++++++++++++++++++++++++++++++++++ manifest.json | 20 +++++++ screenshot.png | Bin 0 -> 30100 bytes 8 files changed, 362 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 images/icon.svg create mode 100644 images/rdp.svg create mode 100644 images/ssh.svg create mode 100644 main.py create mode 100644 manifest.json create mode 100644 screenshot.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61846a6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*tmp* +*.gvd* \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..3ea6bff --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +# ulauncher-remmina + +🖥 Ulauncher extension for quick access to [Remmina](https://remmina.org) profiles. + +You can enter several queries to match strings in profiles' descriptions (e.g. `r ssh stan`) + +Some icons from the [Numix project](https://github.com/numixproject) and [Remmina](https://github.com/FreeRDP/Remmina). + +![ulauncher-remmina extension screenshot](screenshot.png) diff --git a/images/icon.svg b/images/icon.svg new file mode 100644 index 0000000..7e15a98 --- /dev/null +++ b/images/icon.svg @@ -0,0 +1,148 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/rdp.svg b/images/rdp.svg new file mode 100644 index 0000000..6520ce4 --- /dev/null +++ b/images/rdp.svg @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/images/ssh.svg b/images/ssh.svg new file mode 100644 index 0000000..9e64490 --- /dev/null +++ b/images/ssh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/main.py b/main.py new file mode 100644 index 0000000..250491f --- /dev/null +++ b/main.py @@ -0,0 +1,141 @@ +import os +import logging +import distutils.spawn +from ulauncher.api.client.Extension import Extension +from ulauncher.api.client.EventListener import EventListener +from ulauncher.api.shared.event import KeywordQueryEvent +from ulauncher.api.shared.item.ExtensionResultItem import ExtensionResultItem +from ulauncher.api.shared.item.SmallResultItem import SmallResultItem +from ulauncher.api.shared.action.RenderResultListAction import RenderResultListAction +from ulauncher.api.shared.action.RunScriptAction import RunScriptAction + +logging.basicConfig() +logger = logging.getLogger(__name__) + +# Initialize items cache and Remmina profiles path +remmina_bin = '' +# Locate Remmina profiles and binary +remmina_profiles_path = "{}/.local/share/remmina".format(os.environ.get('HOME')) +remmina_bin = distutils.spawn.find_executable('remmina') +# This extension is useless without remmina +if remmina_bin is None or remmina_bin == '': + logger.error('Remmina executable path could not be determined') + exit() +# Check if Remmina profiles directory exists +if not os.path.isdir(remmina_profiles_path): + logger.error("Remmina profiles directory doesn't exist ({})".format(remmina_profiles_path)) + exit() + + +class RemminaExtension(Extension): + def __init__(self): + + super(RemminaExtension, self).__init__() + self.subscribe(KeywordQueryEvent, KeywordQueryEventListener()) + + def list_profiles(self, query): + profiles = [] + items_cache = [] + try: + # Get list of profile files from Remmina directory + for profile in os.listdir(remmina_profiles_path): + if profile.endswith(".remmina"): + profiles.append(os.path.join(remmina_profiles_path, profile)) + # Get sorted list of profiles + temp = profiles + profiles = sorted(temp) + except Exception as e: + print('Failed getting profile files') + + for p in profiles: + base = os.path.basename(p) + title = os.path.splitext(base)[0] + desc, proto = profile_details(p) + # Search for query inside filename and profile description + # Multiple strings can be used to search in description + # all() is used to achieve a AND search (include all keywords) + keywords = query.split(" ") + # if (query in base.lower()) or (query in desc.lower()): + if (query in base.lower()) or all(x in desc for x in keywords): + items_cache.append(create_item(title, proto, p, desc, p)) + + return items_cache + + +class KeywordQueryEventListener(EventListener): + def on_event(self, event, extension): + # Get query + term = (event.get_argument() or '').lower() + # Display all items when query empty + profiles_list = extension.list_profiles(term) + + return RenderResultListAction(profiles_list) + + +def create_item(name, icon, keyword, description, on_enter): + return ExtensionResultItem( + name=name, + description=description, + icon='images/{}.svg'.format(icon), + on_enter=RunScriptAction('#!/usr/bin/env bash\n{} -c {}\n'.format(remmina_bin, on_enter), None) + ) + + +def profile_details(profile_path): + if os.path.isfile(profile_path): + with open(profile_path, "r") as f: + # Read profile file lines + lines = f.read().split("\n") + # Initialize strings + desc = name = username = group = proto = "" + # Parse lines for relevant details + for line in lines: + # Profile name + if line.startswith("name="): + elem = line.split("name=") + if len(elem[1]) > 0: + name = elem[1] + # Profile username (optional) + if "username=" in line: + elem = line.split("username=") + # if len(elem) > 1: + if len(elem[0]) == 0 and len(elem[1]) > 0: + username = elem[1] + elif len(elem[0]) > 0 and len(elem[1]) > 0: + username = elem[1] + # Profile server and port + if line.startswith("server="): + elem = line.split("server=") + if len(elem[1]) > 0: + server = elem[1] + # Profile group name + if line.startswith("group="): + elem = line.split("group=") + if len(elem[1]) > 0: + group = elem[1] + # Profile protocol (for different icons) + if line.startswith("protocol="): + elem = line.split("protocol=") + if len(elem[1]) > 0: + proto = elem[1].strip().lower() + else: + pass + if len(username) > 0: + server = "{username}@{server}".format(username=username, + server=server) + if len(proto) > 0: + server = "{proto}://{server}".format(proto=proto, + server=server) + if len(group) > 0: + group = " | {group}".format(group=group) + desc = "{name} | {server} {group}".format(name=name, + server=server, + group=group) + return desc, proto + else: + # Default values + return "", "rdp" + + +if __name__ == '__main__': + RemminaExtension().run() diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..8a95332 --- /dev/null +++ b/manifest.json @@ -0,0 +1,20 @@ +{ + "manifest_version": "1", + "api_version": "1", + "name": "Remmina", + "description": "Quick access to Remmina profiles", + "developer_name": "noam09", + "icon": "images/icon.svg", + "options": { + "query_debounce": 0.1 + }, + "preferences": [ + { + "id": "remmina", + "type": "keyword", + "name": "Remmina", + "description": "Quick access to Remmina profiles", + "default_value": "r" + } + ] +} \ No newline at end of file diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f42f63e5e5501273e55777eb8eade10a8c1a7bbd GIT binary patch literal 30100 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 literal 0 HcmV?d00001