#!/usr/bin/env python from __future__ import with_statement, division import sys, cgitb cgitb.enable(format="plain") cgitb.handler = sys.excepthook.handle from pprint import pprint from sugar.datastore import datastore as ds from os.path import exists, join, splitext from os import makedirs, rename, link, chmod from commands import mkarg from errno import EEXIST from urllib import quote_plus from jarabe.model.bundleregistry import get_registry from sugar import env import cjson import sugar.mime def mkdir_p(path): try: makedirs(path) except OSError, e: if e.errno == EEXIST: pass else: raise def get_bundle(md): return get_registry().get_bundle(str(md['activity'])) def get_command(md, bundle): command = bundle.get_command().split(' ') command.extend(['-b', str(md['activity'])]) command.extend(['-a', str(md['activity_id'])]) if 'object_id' in md and md['object_id'] != "": command.extend(['-o', str(md['object_id'])]) if 'uri' in md and md['uri'] != "": command.extend(['-u', str(md['uri'])]) # if the command is in $BUNDLE_ROOT/bin, execute the absolute path so there # is no need to mangle with the shell's PATH if '/' not in command[0]: bin_path = join(bundle.get_path(), 'bin') absolute_path = join(bin_path, command[0]) if exists(absolute_path): command[0] = absolute_path return [mkarg(v)[1:] for v in command] def get_environ(md, bundle): ret = {} bin_path = join(bundle.get_path(), 'bin') activity_root = env.get_profile_path(str(md['activity'])) ret['SUGAR_BUNDLE_PATH'] = bundle.get_path() ret['SUGAR_BUNDLE_ID'] = str(md['activity']) ret['SUGAR_ACTIVITY_ROOT'] = activity_root ret['PATH'] = bin_path if bundle.get_path().startswith(env.get_user_activities_path()): ret['SUGAR_LOCALEDIR'] = join(bundle.get_path(), 'locale') return ret def export(e): md = e.metadata.get_dictionary() md['object_id'] = e.object_id print md['activity_id'] title = str(md.get('title', '')) if 'activity_id' in md and md['activity_id'] != "": title = title + "_" + str(md.get('activity_id', '')[0:8]) title = quote_plus(title) print title preview = md['preview'] del md['preview'] final_dir = title dir = final_dir + ".tmp" if exists(final_dir): print 'already exists' return xos_dir = join(dir, ".xos") mkdir_p(xos_dir) with open(join(xos_dir, "metadata.json"), "w") as f: f.write(cjson.encode(md)) with open(join(xos_dir, "preview.png"), "w") as f: f.write(preview) if e.file_path != "": base, ext = splitext(title) if ext == '': mime_type = md['mime_type'] ext = sugar.mime.get_primary_extension(mime_type) if ext == None: ext = ".bin" else: ext = "." + ext link(e.file_path, join(dir, base + ext)) if 'activity' in md and md['activity'] != '' and \ 'activity_id' in md and md['activity_id'] != '': bundle = get_bundle(md) cmd = get_command(md, bundle) env = get_environ(md, bundle) resume_path = join(xos_dir, "resume") with open(resume_path, "w") as f: f.write("#!/bin/bash\n") f.write("cd" + mkarg(str(bundle.get_path())) + "\n") f.write("env ") for k, v in env.iteritems(): if k == 'PATH': f.write('%s=%s' % (mkarg(k)[1:], mkarg(v)[1:])) f.write(':"$PATH"\\\n ') else: f.write('%s=%s\\\n ' % (mkarg(k)[1:], mkarg(v)[1:])) f.write(" ".join(cmd) + "\n") chmod(resume_path, 0755) rename(dir, final_dir) def main(): results, count = ds.find({}) for e in results: try: export(e) except: cgitb.handler() print main()