diff options
author | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2007-01-27 11:54:56 (GMT) |
---|---|---|
committer | Tomeu Vizoso <tomeu@tomeuvizoso.net> | 2007-01-27 11:54:56 (GMT) |
commit | 9d13a9836d10e8ef5d2dda4dff6a7931ca2af728 (patch) | |
tree | b05c8b37576e56201ebb6fb7b030e3c018da35f5 /tools | |
parent | 37c6c1e9fa9b42d7a65f2234eac61307352887c2 (diff) |
Added new tool sugar-install-bundle.
Diffstat (limited to 'tools')
-rw-r--r-- | tools/Makefile.am | 3 | ||||
-rwxr-xr-x | tools/sugar-install-bundle | 56 |
2 files changed, 58 insertions, 1 deletions
diff --git a/tools/Makefile.am b/tools/Makefile.am index c4cd3bb..fb3f598 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -1 +1,2 @@ -bin_SCRIPTS = sugar-setup-activity +bin_SCRIPTS = sugar-install-bundle \ + sugar-setup-activity diff --git a/tools/sugar-install-bundle b/tools/sugar-install-bundle new file mode 100755 index 0000000..0945c29 --- /dev/null +++ b/tools/sugar-install-bundle @@ -0,0 +1,56 @@ +#!/usr/bin/env python +import sys +import os +import zipfile +import dbus + +from sugar import env + +DBUS_SERVICE = "org.laptop.Shell" +DBUS_PATH = "/org/laptop/Shell" + +# We check here that all the files in the .xo are inside one only dir (bundle_root_dir). +def get_bundle_root_dir(file_names): + bundle_root_dir = None + for file_name in file_names: + if not bundle_root_dir: + bundle_root_dir = file_name.partition('/')[0] + if not bundle_root_dir.endswith('.activity'): + raise 'Incorrect bundle.' + else: + if not file_name.startswith(bundle_root_dir): + raise 'Incorrect bundle.' + + return bundle_root_dir + +bus = dbus.SessionBus() +proxy_obj = bus.get_object(DBUS_SERVICE, DBUS_PATH) +dbus_service = dbus.Interface(proxy_obj, DBUS_SERVICE) + +bundle_dir = env.get_user_activities_dir() + +zip_file = zipfile.ZipFile(sys.argv[1]) +file_names = zip_file.namelist() +bundle_root_dir = get_bundle_root_dir(file_names) +bundle_path = os.path.join(bundle_dir, bundle_root_dir) + +# FIXME: we need to support installing different versions of the same bundle. +if os.path.exists(bundle_path): + raise IOError, 'This bundle is already installed as ' + bundle_path + +if os.spawnlp(os.P_WAIT, 'unzip', 'unzip', sys.argv[1], '-d', bundle_dir): + raise RuntimeError, 'An error occurred while extracting the .xo contents.' + +# notify shell of new bundle +if not dbus_service.add_bundle(bundle_path): + # error, let's delete the just expanded bundle. + for root, dirs, files in os.walk(bundle_path, topdown=False): + for name in files: + os.remove(os.path.join(root, name)) + for name in dirs: + os.rmdir(os.path.join(root, name)) + os.rmdir(bundle_path) + + raise RuntimeError, 'Bundle is not well-formed.' + +print "%s: '%s' installed." % (sys.argv[0], sys.argv[1]) |