#!/usr/bin/env python # $Id$ #XXX TODO: add app should modify config.xml to add application-specific daemons ''' add items to the BOINC database -- command-line interface. See also ``xadd``. Usages: add project --name=yah --long_name="YETI @ home" add platform --name=c64 [ --user_friendly_name="Commodore 64" ] add core_version --platform=c64 --version_num=717 --exec_file=/path/to/boinc_7.17_c64 [--message="Message"] [--message_priority="Priority"] add app --name=YetiApp [--min_version=716] add app_version --app=YetiApp --platform=c64 --version_num=717 --exec_file=/path/to/yeti_7.17_c64 [--signature_file=/path/to/sig_file] [--exec_file=/path/to/more_bins [--signature_file=/tmp/sig_file2]] ... add user --name="Carl Sagan" --email_addr="carl.sagan@example.com" --authenticator="deadbeef" [--country=Estonia --postal_code=94703 --global_prefs_file=/path/to/prefs.xml] add work --name="/path/ap_20031026.23987.28452.wu" --wu_template=/path/wu_template.xml --result_template=/path/result_template.xml [--rsc_fpops_est=3000000] [--rsc_fpops_bound=5000000] [--rsc_memory_bound=20000000] [--rsc_disk_bound=10000000] [--delay_bound=14days | --delay_bound=1209600] [--min_quorum=3] [--target_nresults=10] [--max_error_results=5] [--max_total_results=20] [--max_success_results=10] [--sequence 4] (unimplemented) infile1 [infile2] ... add workunit (TODO) add result (TODO) ''' import boinc_path_config from Boinc import database, db_mid, configxml from Boinc.util import * from Boinc.add_util import * import sys, os, getopt def ambiguous_lookup(string, dict): results = [] string = string.replace('_','') for key in dict: k = key.replace('_','') if k == string: return [dict[key]] if k.startswith(string): results.append(dict[key]) return results def lookup_object_to_add(name_of_object_to_add): name_of_object_to_add = name_of_object_to_add.strip().lower() possible_objects = ambiguous_lookup(name_of_object_to_add, add_objects) if len(possible_objects) == 0: raise SystemExit("No such object '%s' to add"%name_of_object_to_add) if len(possible_objects) > 1: print >>sys.stderr, "Object name '%s' matches multiple objects:"%name_of_object_to_add for object in possible_objects: print " ", object.name raise SystemExit(1) return possible_objects[0] def parse_global_options(args): # raise SystemExit('todo') pass def dv(object,arg): if arg in object.default_values: return ' --%s [%s]' %(arg, object.default_values[arg]) else: return ' --%s' %arg def help_object(object, msg=None): if msg: print >>sys.stderr, "add:", msg print print >>sys.stderr, "Syntax: add %s"%object.name for arg in object.args: print >>sys.stderr, dv(object,arg) print >>sys.stderr, " Optional:" for arg in object.optional_args: print >>sys.stderr, dv(object,arg) raise SystemExit def commandline_add_object(add_object, args): try: parsed_opts, placement_args = \ getopt.getopt(args, '', map(lambda s: s+'=', add_object.args + add_object.optional_args)) if placement_args: raise getopt.GetoptError('Unknown args '+' '.join(placement_args)) except getopt.GetoptError, e: help_object(add_object, e) untranslated_args_dict = {} for arg,value in parsed_opts: if not arg.startswith('--'): raise Exception('internal error: arg should start with "--"') untranslated_args_dict[arg[2:]] = value try: do_add_object(add_object, untranslated_args_dict) except AddObjectException, e: help_object(add_object, e) if len(sys.argv) < 2: print >>sys.stderr, """Syntax: add Adds an object to the BOINC database. Objects to add:""" for object in sorted_keys(objects_to_add): print >>sys.stderr, " ", object print >>sys.stderr, """ Global options: --config=config.xml Path to configuration file. --skip_old Ignore database objects that already exist These override config.xml: --db_name Database name --db_password Database password --db_user Database user For command-line help on a particular object, use add without further arguments. """ raise SystemExit(1) add_object = lookup_object_to_add(sys.argv[1]) args = sys.argv[2:] parse_global_options(args) config = configxml.default_config() database.connect(config.config) commandline_add_object(add_object, args)