# Copyright (C) 2007, 2008 One Laptop Per Child # # 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 sys import getopt import os from gettext import gettext as _ import traceback import logging from jarabe import config _RESTART = 1 _same_option_warning = _("sugar-control-panel: WARNING, found more than" " one option with the same name: %s module: %r") _no_option_error = _("sugar-control-panel: key=%s not an available option") _general_error = _("sugar-control-panel: %s") def cmd_help(): '''Print the help to the screen''' # TRANS: Translators, there's a empty line at the end of this string, # which must appear in the translated string (msgstr) as well. print _('Usage: sugar-control-panel [ option ] key [ args ... ] \n\ Control for the sugar environment. \n\ Options: \n\ -h show this help message and exit \n\ -l list all the available options \n\ -h key show information about this key \n\ -g key get the current value of the key \n\ -s key set the current value for the key \n\ -c key clear the current value for the key \n\ ') def note_restart(): '''Instructions how to restart sugar''' print _('To apply your changes you have to restart sugar.\n' + 'Hit ctrl+alt+erase on the keyboard to trigger a restart.') def load_modules(): '''Build a list of pointers to available modules and import them. ''' modules = [] path = os.path.join(config.ext_path, 'cpsection') folder = os.listdir(path) for item in folder: if os.path.isdir(os.path.join(path, item)) and \ os.path.exists(os.path.join(path, item, 'model.py')): try: module = __import__('.'.join(('cpsection', item, 'model')), globals(), locals(), ['model']) except Exception: logging.error('Exception while loading extension:\n' + \ ''.join(traceback.format_exception(*sys.exc_info()))) else: modules.append(module) return modules def main(): try: options, args = getopt.getopt(sys.argv[1:], "h:s:g:c:l", []) except getopt.GetoptError: cmd_help() sys.exit(2) if not options: cmd_help() sys.exit(2) modules = load_modules() for option, key in options: found = 0 if option in ("-h"): for module in modules: method = getattr(module, 'set_' + key, None) if method: found += 1 if found == 1: print method.__doc__ else: print _(_same_option_warning % (key, module)) if found == 0: print _(_no_option_error % key) if option in ("-l"): for module in modules: methods = dir(module) print '%s:' % module.__name__.split('.')[1] for method in methods: if method.startswith('get_'): print ' %s' % method[4:] elif method.startswith('clear_'): print " %s (use the -c argument with this option)" \ % method[6:] if option in ("-g"): for module in modules: method = getattr(module, 'print_' + key, None) if method: found += 1 if found == 1: try: method() except Exception, detail: print _(_general_error % detail) else: print _(_same_option_warning % (key, module)) if found == 0: print _(_no_option_error % key) if option in ("-s"): for module in modules: method = getattr(module, 'set_' + key, None) if method: note = 0 found += 1 if found == 1: try: note = method(*args) except Exception, detail: print _(_general_error % detail) if note == _RESTART: note_restart() else: print _(_same_option_warning % (key, module)) if found == 0: print _(_no_option_error % key) if option in ("-c"): for module in modules: method = getattr(module, 'clear_' + key, None) if method: note = 0 found += 1 if found == 1: try: note = method(*args) except Exception, detail: print _(_general_error % detail) if note == _RESTART: note_restart() else: print _(_same_option_warning % (key, module)) if found == 0: print _(_no_option_error % key)