unity-scope-virtualbox-0.1+13.10.20130723/0000755000015700001700000000000012173421445020362 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/po/0000755000015700001700000000000012173421445021000 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/po/unity-scope-virtualbox.pot0000644000015700001700000000234512173420503026176 0ustar pbuserpbgroup00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-02-21 02:00+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: ../src/unity_virtualbox_daemon.py:34 msgid "Search Virtualbox" msgstr "" #: ../src/unity_virtualbox_daemon.py:35 msgid "Sorry, there is no VirtualBox machine that matches your search." msgstr "" #: ../src/unity_virtualbox_daemon.py:36 msgid "Powered by VirtualBox" msgstr "" #: ../src/unity_virtualbox_daemon.py:45 msgid "Virtual Machines" msgstr "" #: ../data/virtualbox.scope.in.h:1 msgid "virtualbox;boxes;machines;vm;vbox;" msgstr "" #: ../data/virtualbox.scope.in.h:2 msgid "VirtualBox" msgstr "" #: ../data/virtualbox.scope.in.h:3 msgid "Find VirtualBox machines" msgstr "" #: ../data/virtualbox.scope.in.h:4 msgid "Search VirtualBox machines" msgstr "" unity-scope-virtualbox-0.1+13.10.20130723/po/POTFILES.in0000644000015700001700000000013512173420503022546 0ustar pbuserpbgroup00000000000000[encoding: UTF-8] src/unity_virtualbox_daemon.py [type: gettext/ini]data/virtualbox.scope.in unity-scope-virtualbox-0.1+13.10.20130723/MANIFEST.in0000644000015700001700000000007612173420503022115 0ustar pbuserpbgroup00000000000000include MANIFEST.in include src/* include data/* include po/* unity-scope-virtualbox-0.1+13.10.20130723/tests/0000755000015700001700000000000012173421445021524 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/tests/test_virtualbox.py0000644000015700001700000000352612173420503025334 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- from gi.repository import Unity from unittest import TestCase import imp class ResultSet(Unity.ResultSet): def __init__(self): Unity.ResultSet.__init__(self) self.results = [] def do_add_result(self, result): self.results.append({'uri':result.uri, 'title':result.title, 'comment':result.comment, 'icon':result.icon_hint}) class ScopeTestCase(TestCase): def init_scope(self, scope_path): self.scope_module = imp.load_source('scope', scope_path) self.scope = self.scope_module.load_scope() def perform_query(self, query, filter_set = Unity.FilterSet.new()): result_set = ResultSet() ctx = Unity.SearchContext.create(query, 0, filter_set, None, result_set, None) s = self.scope.create_search_for_query(ctx) s.run() return result_set class TestVirtualbox(ScopeTestCase): def setUp(self): self.init_scope('src/unity_virtualbox_daemon.py') def tearDown(self): self.scope = None self.scope_module = None def test_valid_searches(self): self.scope_module.EXTRA_DATA = '"Hardy Heron" {123-abc}\n"Dapper Drake" {abc-123}'.encode('utf-8') expected_results = ['Hardy Heron'] results = [] for s in ['hardy']: result_set = self.perform_query(s) results.append(result_set.results[0]['title']) self.assertEqual(results, expected_results) def test_failing_search(self): self.scope_module.EXTRA_DATA = ''.encode('utf-8') for s in ['query']: result_set = self.perform_query(s) self.assertEqual(len(result_set.results), 0) if __name__ == '__main__': unittest.main() unity-scope-virtualbox-0.1+13.10.20130723/src/0000755000015700001700000000000012173421445021151 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/src/__init__.py0000644000015700001700000000000012173420503023242 0ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/src/unity_virtualbox_daemon.py0000644000015700001700000002144112173420503026471 0ustar pbuserpbgroup00000000000000#! /usr/bin/python3 # -*- coding: utf-8 -*- # Copyright (C) 2013 David Callé # Copyright (C) 2012 Christopher Wayne # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program. If not, see . from gi.repository import Unity, UnityExtras from gi.repository import Gio, GLib import subprocess import re import shlex import gettext import datetime APP_NAME = 'unity-scope-virtualbox' LOCAL_PATH = '/usr/share/locale/' gettext.bindtextdomain(APP_NAME, LOCAL_PATH) gettext.textdomain(APP_NAME) _ = gettext.gettext GROUP_NAME = 'com.canonical.Unity.Scope.Boxes.Virtualbox' UNIQUE_PATH = '/com/canonical/unity/scope/boxes/virtualbox' SEARCH_URI = '' SEARCH_HINT = _('Search Virtualbox') NO_RESULTS_HINT = _('Sorry, there is no VirtualBox machine that matches your search.') PROVIDER_CREDITS = _('Powered by VirtualBox') SVG_DIR = '/usr/share/icons/unity-icon-theme/places/svg/' PROVIDER_ICON = SVG_DIR+'service-virtualbox.svg' DEFAULT_RESULT_ICON = 'virtualbox' DEFAULT_RESULT_MIMETYPE = 'application/x-virtualbox-vbox' DEFAULT_RESULT_TYPE = Unity.ResultType.DEFAULT EXTRA_DATA = None c1 = {'id' :'boxes', 'name' :_('Virtual Machines'), 'icon' :SVG_DIR+'group-boxes.svg', 'renderer':Unity.CategoryRenderer.VERTICAL_TILE} CATEGORIES = [c1] FILTERS = [] EXTRA_METADATA = [] def search(search, filters): ''' Any search method returning results as a list of tuples. Available tuple fields: uri (string) icon (string) title (string) comment (string) dnd_uri (string) mimetype (string) category (int) result_type (Unity ResultType) extras metadata fields (variant) ''' results = [] try: if not EXTRA_DATA: vboxlist = subprocess.check_output(['vboxmanage', 'list', 'vms']) else: vboxlist = EXTRA_DATA for vbox in vboxlist.splitlines(): if not re.match('\".*\"\s\{.*-.*\}', vbox.decode('utf-8')): continue vbox_name = re.sub('\{.*\}', '', vbox.decode('utf-8')) uuid = re.match(r'.*\{(.*)\}', vbox.decode('utf-8')) if uuid: uuid = uuid.group(1) else: uuid = shlex.split(vbox_name)[0] if search.lower() in vbox_name.lower(): results.append({'uri':uuid, 'title':shlex.split(vbox_name)[0]}) except Exception as error: print (error) return results # Classes below this point establish communication # with Unity, you probably shouldn't modify them. class MySearch (Unity.ScopeSearchBase): def __init__(self, search_context): super (MySearch, self).__init__() self.set_search_context (search_context) def do_run (self): ''' Adds results to the model ''' try: result_set = self.search_context.result_set for i in search(self.search_context.search_query, self.search_context.filter_state): if not 'uri' in i or not i['uri'] or i['uri'] == '': continue if not 'icon' in i or not i['icon'] or i['icon'] == '': i['icon'] = DEFAULT_RESULT_ICON if not 'mimetype' in i or not i['mimetype'] or i['mimetype'] == '': i['mimetype'] = DEFAULT_RESULT_MIMETYPE if not 'result_type' in i or not i['result_type'] or i['result_type'] == '': i['result_type'] = DEFAULT_RESULT_TYPE if not 'category' in i or not i['category'] or i['category'] == '': i['category'] = 0 if not 'title' in i or not i['title']: i['title'] = '' if not 'comment' in i or not i['comment']: i['comment'] = '' if not 'dnd_uri' in i or not i['dnd_uri'] or i['dnd_uri'] == '': i['dnd_uri'] = i['uri'] i['provider_credits'] = GLib.Variant('s', PROVIDER_CREDITS) result_set.add_result(**i) except Exception as error: print (error) class Preview (Unity.ResultPreviewer): def do_run(self): preview = Unity.GenericPreview.new(self.result.title, self.result.comment, None) preview.props.image_source_uri = self.result.icon_hint vboxinfo = subprocess.check_output(['vboxmanage', 'showvminfo', self.result.uri]) description_line = False for line in vboxinfo.splitlines(): line = line.decode('utf-8') if line.startswith('Guest OS:'): os = re.match(r'.*:\s+([^\s].*)',line) if os: os_text = os.group(1) preview.add_info(Unity.InfoHint.new("os", _("Operating System"), None, os_text)) if line.startswith('Memory size:'): memsize = re.match(r'.*:\s+([^\s].*)',line) if memsize: memsize_text = memsize.group(1) preview.add_info(Unity.InfoHint.new("memsize", _("Base Memory"), None, memsize_text)) if line.startswith('VRAM size:'): vramsize = re.match(r'.*:\s+([^\s].*)',line) if vramsize: vramsize_text = vramsize.group(1) preview.add_info(Unity.InfoHint.new("vramsize", _("Video Memory"), None, vramsize_text)) if line.startswith('Number of CPUs:'): numcpu = re.match(r'.*:\s+([^\s].*)',line) if numcpu: numcpu_text = numcpu.group(1) preview.add_info(Unity.InfoHint.new("numcpu", _("Processors"), None, numcpu_text)) if line.startswith('State:'): state = re.match(r'.*:\s+([^\s].*)\(since\s(.*)\)',line) if state: state_text = state.group(1) date = state.group(2) translated_date = datetime.datetime.strptime(date[:-3], '%Y-%m-%dT%H:%M:%S.%f') preview.props.subtitle = state_text.title() + "(%s)" % translated_date.strftime('%c') if line.startswith('Description:'): description_line = True continue if description_line: preview.props.description_markup = line description_line = False icon = Gio.FileIcon.new (Gio.file_new_for_path(PROVIDER_ICON)) view_action = Unity.PreviewAction.new("launch", _("Launch"), icon) preview.add_action(view_action) return preview class Scope (Unity.AbstractScope): def __init__(self): Unity.AbstractScope.__init__(self) def do_get_search_hint (self): return SEARCH_HINT def do_get_schema (self): ''' Adds specific metadata fields ''' schema = Unity.Schema.new () if EXTRA_METADATA: for m in EXTRA_METADATA: schema.add_field(m['id'], m['type'], m['field']) #FIXME should be REQUIRED for credits schema.add_field('provider_credits', 's', Unity.SchemaFieldType.OPTIONAL) return schema def do_get_categories (self): ''' Adds categories ''' cs = Unity.CategorySet.new () if CATEGORIES: for c in CATEGORIES: cat = Unity.Category.new (c['id'], c['name'], Gio.ThemedIcon.new(c['icon']), c['renderer']) cs.add (cat) return cs def do_get_filters (self): ''' Adds filters ''' fs = Unity.FilterSet.new () # if FILTERS: # return fs def do_get_group_name (self): return GROUP_NAME def do_get_unique_name (self): return UNIQUE_PATH def do_create_search_for_query (self, search_context): se = MySearch (search_context) return se def do_create_previewer(self, result, metadata): rp = Preview() rp.set_scope_result(result) rp.set_search_metadata(metadata) return rp def do_activate(self, result, metadata, id): GLib.spawn_async(["/usr/bin/vboxmanage", "startvm", result.uri]) return Unity.ActivationResponse(handled=Unity.HandledType.HIDE_DASH, goto_uri=None) def load_scope(): return Scope() unity-scope-virtualbox-0.1+13.10.20130723/setup.py0000644000015700001700000000124412173420503022067 0ustar pbuserpbgroup00000000000000#!/usr/bin/env python3 # -*- coding: utf-8 -*- from distutils.core import setup from DistUtilsExtra.command import * setup(name='unity-scope-virtualbox', version='0.1', author='David Callé', author_email='davidc@framli.eu', url='http://launchpad.net/ubuntu-scopes', license='GNU General Public License (GPL)', data_files=[ ('share/dbus-1/services', ['data/unity-scope-virtualbox.service']), ('share/unity-scopes/virtualbox', ['src/unity_virtualbox_daemon.py']), ('share/unity-scopes/virtualbox', ['src/__init__.py']), ], cmdclass={'build': build_extra.build_extra, 'build_i18n': build_i18n.build_i18n,}) unity-scope-virtualbox-0.1+13.10.20130723/setup.cfg0000644000015700001700000000021212173420503022170 0ustar pbuserpbgroup00000000000000[build] i18n=True [build_i18n] domain=unity-scope-virtualbox desktop_files=[('share/unity/scopes/boxes', ('data/virtualbox.scope.in',))] unity-scope-virtualbox-0.1+13.10.20130723/data/0000755000015700001700000000000012173421445021273 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/data/unity-scope-virtualbox.service0000644000015700001700000000023512173420503027323 0ustar pbuserpbgroup00000000000000[D-BUS Service] Name=com.canonical.Unity.Scope.Boxes.Virtualbox Exec=/usr/bin/python3 /usr/share/unity-scopes/scope-runner-dbus.py -s boxes/virtualbox.scope unity-scope-virtualbox-0.1+13.10.20130723/data/virtualbox.scope.in0000644000015700001700000000145512173420503025131 0ustar pbuserpbgroup00000000000000[Scope] DBusName=com.canonical.Unity.Scope.Boxes.Virtualbox DBusPath=/com/canonical/unity/scope/boxes/virtualbox Icon=/usr/share/icons/unity-icon-theme/places/svg/service-virtualbox.svg QueryBinary=virtualbox _Keywords=virtualbox;boxes;machines;vm;vbox; RequiredMetadata= OptionalMetadata= Loader=/usr/share/unity-scopes/virtualbox/unity_virtualbox_daemon.py Module=virtualbox.unity_virtualbox_daemon ModuleType=python3 RemoteContent=false Type=boxes _Name=VirtualBox _Description=This is an Ubuntu search plugin that enables information from VirtualBox to be searched and displayed in the Dash underneath the Boxes header. If you do not wish to search this content source, you can disable this search plugin. _SearchHint=Search VirtualBox machines [Desktop Entry] X-Ubuntu-Gettext-Domain=unity-scope-virtualbox unity-scope-virtualbox-0.1+13.10.20130723/data/icons/0000755000015700001700000000000012173421445022406 5ustar pbuserpbgroup00000000000000unity-scope-virtualbox-0.1+13.10.20130723/data/icons/service-virtualbox.svg0000644000015700001700000002447112173420503026766 0ustar pbuserpbgroup00000000000000 image/svg+xml