#!/usr/bin/env python # Copyright (C) 2007, Red Hat, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY 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, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA import os import sys import dbus from optparse import OptionParser import logging from sugar import logger #Get the standard logging directory. std_log_dir = logger.get_logs_dir() _logger = logging.getLogger('SugarLaunch') #First log handler: outputs to a file called 'VideoEdit.activity.log' file_handler = logging.FileHandler('/home/olpc/.sugar/default/logs/PyDebug.activity.log') file_formatter = logging.Formatter('%(name)s -- %(asctime)s %(funcName)s: %(lineno)d\n %(message)s\n') file_handler.setFormatter(file_formatter) _logger.addHandler(file_handler) _logger.setLevel(logging.DEBUG) #Second log handler: outputs to a the console, using a slightly different output structure console_handler = logging.StreamHandler() console_formatter = logging.Formatter('%(name)s %(levelname)s ||| %(message)s') console_handler.setFormatter(console_formatter) _logger.addHandler(console_handler) from sugar.activity import activityfactory from sugar.bundle.activitybundle import ActivityBundle usage = "usage: %prog [options] activity" parser = OptionParser(usage) parser.add_option("-d", "--debug", action="store_true", dest="debug", help="launch activity inside gdb") (options, args) = parser.parse_args() if len(args) == 0: path = os.environ('SUBAR_BUNDLE_PATH') if not os.path.isdir(path): print 'You need to specify the activity path on command line \nor set the SUGAR_BUNDLE_PATH environment variable.' sys.exit(1) """ bus = dbus.SessionBus() proxy = bus.get_object('org.laptop.Shell', '/org/laptop/Shell') path = dbus.Interface(proxy, 'org.laptop.Shell').GetBundlePath(args[0]) """ path = args[0] if not os.path.isdir(path): path = os.path.join(os.environ('SUGAR_ACTIVITY_ROOT'),args[0]) if not os.path.isdir(path): path = os.path.join(os.path.curdir(),args[0]) if not os.path.isdir(path): print ' %s is not a valid Activity Directory.' % args[0] sys.exit(1) os.chdir(path) activity = ActivityBundle(path) cmd_args = activityfactory.get_command(activity) def _which(exec_file): if 'PATH' in os.environ: envpath = os.environ['PATH'] else: return None for path in envpath.split(os.pathsep): fullname = os.path.join(path, exec_file) if os.path.exists(fullname): return fullname return None def _get_interpreter(exec_file): if os.path.exists(exec_file): abs_path = exec_file else: abs_path = _which(exec_file) if not abs_path: return exec_file f = open(abs_path) line = f.readline(100) if line.startswith('#!'): cmds = line[2:].strip().split(' ') cmds.append(abs_path) if '/usr/bin/env' in cmds: cmds.remove('/usr/bin/env') return cmds return exec_file if options.debug: act_args = cmd_args cmd_args = ['gdb', '--args'] cmd_args.extend(_get_interpreter(act_args.pop(0))) cmd_args.extend(act_args) info = activityfactory.get_environment(activity) #os.execvpe(cmd_args[0], cmd_args, activityfactory.get_environment(activity)) _logger.debug("Command to execute:%s."%cmd_args[0]) print("Command to execute:%s."%cmd_args[0]) if not cmd_args[0].startswith('sugar-activity'): for line in open(cmd_args[0],'r'): if line.startswith('exec') or line.startswith('sugar-activity'): cmd_args = line.split() cmd_args.pop(0) #cmd_args.pop(0) cmd_args = cmd_args + ['-s',] #run the debugger in a single process sys.argv = cmd_args from sugar.activity import main main.main()