#!/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 from sugar import env #Get the standard logging directory. std_log_dir = logger.get_logs_dir() _logger = logging.getLogger('PyDebug') #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] SUGAR-BUNDLE-PATH" 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('SUGAR_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]) """ if os.getcwd().endswith(args[0]): path = os.getcwd() else: path = args[0] if not os.path.isdir(path): path = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data/pydebug',args[0]) if not os.path.isdir(path): path = os.path.join(os.environ['SUGAR_ACTIVITY_ROOT'],'data/pydebug/playpen',args[0]) if not os.path.isdir(path): path = os.path.join(os.getcwd(),args[0]) if not os.path.isdir(path): print ' %s is not a valid Activity Directory.' % args[0] sys.exit(1) path = os.path.abspath(path) _logger.debug('sugar_bundle_path set to %s'%path) os.chdir(path) os.environ['SUGAR_BUNDLE_PATH'] = path sys.path.insert(0,path) activity = ActivityBundle(path) cmd_args = activityfactory.get_command(activity) _logger.debug('cmd_args:%r'%cmd_args) bundle_name = activity.get_name() bundle_id = activity.get_bundle_id() #os.environ['SUGAR_BUNDLE_PATH'] = activity.get_path() #following will not work if storage system changes with new OS #required because debugger needs to be able to change home so that foreign apps will work activity_root = os.path.join('/home/olpc/.sugar/default/',bundle_id) os.environ['SUGAR_ACTIVITY_ROOT'] = activity_root _logger.debug('sugar_activity_root set to %s'%activity_root) 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) #following is useful for its side-effects 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'): act_args = line.split() act_args.pop(0) else: os.system(line) else: pass #cmd_args.pop(0) #more_args = ['-a',bundle_name,'-b',bundle_id] sys.argv = act_args[:2] +['-s',]+ cmd_args[1:] _logger.debug('about to call main.main() with args %r'%sys.argv) from sugar.activity import main main.main()