Committer: Tim Just <tim.just@xxxxxxxxxxxxxx> Date: 01/04/2010 at 18:38:09 Revision: 3761 Revision-id: tim.just@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Branch nick: tiny Log: Improved dependency check on daemon startup. Now the dependencies are only checked for enabled modules. Therefore you can disable a required module, if you simultaneously disable the dependent one. Also simplified the structure of generated header files and their creation in process_modules.py. Modified: M hipd/init.c M process_modules.py === modified file 'hipd/init.c' --- hipd/init.c 2010-03-31 16:20:58 +0000 +++ hipd/init.c 2010-04-01 15:38:03 +0000 @@ -760,7 +760,7 @@ */ int hipd_init(int flush_ipsec, int killold) { - int err = 0, certerr = 0, hitdberr = 0, i; + int err = 0, certerr = 0, hitdberr = 0, i, j; unsigned int mtu_val = HIP_HIT_DEV_MTU; char str[64]; char mtu[16]; @@ -965,25 +965,25 @@ /* Initialize modules */ HIP_INFO("Initializing modules.\n"); - /* Check if a required module was disabled. */ - for (i = 0; i < num_required_modules_hipd; i++) { - HIP_IFEL(lmod_module_disabled(required_modules_hipd[i]), - -1, - "The required module <%s> was disabled.\n", - required_modules_hipd[i]); - } - - for (i = 0; i < num_modules_hipd; i++) { - HIP_DEBUG("module: %s\n", modules_hipd[i]); - if (lmod_module_disabled(modules_hipd[i])) { + for (i = 0; i < hipd_num_modules; i++) { + HIP_DEBUG("module: %s\n", hipd_modules[i].name); + if (lmod_module_disabled(hipd_modules[i].name)) { HIP_DEBUG("state: DISABLED\n"); continue; } else { HIP_DEBUG("state: ENABLED\n"); - HIP_IFEL(hipd_init_functions[i](), - -1, - "Module initialization failed.\n"); + /* Check dependencies */ + for (j = 0; j < hipd_modules[i].num_required_moduels; j++) { + HIP_IFEL(lmod_module_disabled(hipd_modules[i].required_modules_hipd[j]), + -1, + "The module <%s> is required by <%s>, but was disabled.\n", + hipd_modules[i].required_modules_hipd[j], + hipd_modules[i].name); + } } + HIP_IFEL(hipd_modules[i].init_function(), + -1, + "Module initialization failed.\n"); } hip_init_sockets(); === modified file 'process_modules.py' --- process_modules.py 2010-03-31 15:16:34 +0000 +++ process_modules.py 2010-04-01 15:38:03 +0000 @@ -12,11 +12,11 @@ HEADER_FILE_DIR = MODULES_DIR HEADER_FILE_SUFFIX = '_modules.h' -WARNING_STRING = 'WARNING This file was generated by process_modules.py - ' -WARNING_STRING += 'Do NOT edit!' +WARNING_STRING = 'WARNING This file was generated by ' + __file__ + ' - ' +WARNING_STRING += 'DO NOT EDIT!' # Parses the XML document at 'path' and returns a dictionary with module info -def parse_module_info(path, required_modules): +def parse_xml_info(path): file = open(path, "r") dom = xml.dom.minidom.parse(file) @@ -38,7 +38,6 @@ current_req['maxversion'] = str(node.attributes['maxversion'].value) module_info['requires'].append(current_req) - required_modules.add(current_req['name']) module_info['conflicts'] = [] if 0 < len(dom.getElementsByTagName('conflicts')): @@ -66,7 +65,7 @@ app_info['init_function'] = str(current_app.attributes['init_function'].value) module_info['application'][name] = app_info - return (module_name, module_info, required_modules) + return (module_name, module_info) # Tries to read the XML configuration files for all sub-folders in the given # directory and returns a dictionary containing the module information @@ -74,7 +73,6 @@ # Initialize output variable module_info = {} - required_modules = set() # Iterate through all sub directories in MODULES_DIR for current_module in glob.glob(MODULES_DIR + '/*/'): @@ -91,8 +89,7 @@ try: path = os.path.join(current_module, MODULE_INFO_FILE) - (module_name, info, required_modules) = parse_module_info(path, - required_modules) + (module_name, info) = parse_xml_info(path) print '| state: ' + 'ENABLED' print '| version: ' + info['version'] + '\n|' module_info[module_name] = info @@ -101,15 +98,11 @@ print '\'' + path + '\' failed!' print '| ...ignoring this directory\n|' - return (module_info, required_modules) + return (module_info) # Checks the module_info data structure for missing dependencies and conflicts # between modules. Returns a -def process_module_info(module_info): - - includes = {} - init_functions = {} - num_modules = {} +def check_dependencies(module_info): for current_module in module_info.keys(): # Check for dependencies @@ -142,104 +135,78 @@ print '| ERROR ' + current_module + ' conflicts with module ' + conflict['name'] + ' (version ' + con_version + ')' sys.exit('| ...abort current run. Please check module configuration\n|') - for current_module in module_info.keys(): - for app_name in module_info[current_module]['application'].keys(): - # Build includes - if includes.has_key(app_name): - tmp = includes.pop(app_name) - else: - tmp = [] - - tmp.append(module_info[current_module]['application'][app_name]['header_file']) - includes[app_name] = tmp - - # Build init_functions - if init_functions.has_key(app_name): - tmp = init_functions.pop(app_name) - else: - tmp = [] - - tmp.append(module_info[current_module]['application'][app_name]['init_function']) - init_functions[app_name] = tmp - - return (includes, init_functions) - # Creates a C header file with the given filename an the needed includes, # the number of init functions per application and an array of function # pointers for each application -def create_header_files(output_dir, suffix, applications, includes, init_functions, enabled_modules, required_modules): +def create_header_files(applications, module_info): - if False == os.path.isdir(output_dir): - os.mkdir(output_dir) + if False == os.path.isdir(HEADER_FILE_DIR): + os.mkdir(HEADER_FILE_DIR) for current_app in applications: - hdr_file_path = os.path.join(output_dir, current_app + suffix) + hdr_file_path = os.path.join(HEADER_FILE_DIR, + current_app + HEADER_FILE_SUFFIX) try: hdr_file = open(hdr_file_path, 'w') try: app_string = 'HIP_MODULES_' + current_app.upper() + '_MODULES_H' - init_function_string = 'static int (*' + current_app - init_function_string += '_init_functions[])(void) = {' - module_string = 'const char *modules_' + current_app + '[] = {' - required_module_string = 'const char *required_modules_' - required_module_string += current_app + '[] = {' - hdr_file.write('/* ' + WARNING_STRING + ' */\n') hdr_file.write('#ifndef ' + app_string + '\n') hdr_file.write('#define ' + app_string + '\n') - if includes.has_key(current_app) and init_functions.has_key(current_app): - num_modules = str(len(init_functions[current_app])); - for current in includes[current_app]: - hdr_file.write('\n#include \"' + current + '\"') - - hdr_file.write('\n\nconst int num_modules_' + current_app) - hdr_file.write(' = ' + num_modules + ';\n') - hdr_file.write('\nconst int num_required_modules_' + current_app + ' = ') - hdr_file.write(str(len(required_modules)) + ';\n\n') - hdr_file.write(module_string) - - first_loop = True - for module in enabled_modules: - if first_loop != True: - hdr_file.write(',\n') - for i in range(len(module_string)): - hdr_file.write(' ') - hdr_file.write('"' + module + '"') - first_loop = False - hdr_file.write('};\n\n') - - hdr_file.write(required_module_string) - - first_loop = True - for module in required_modules: - if first_loop != True: - hdr_file.write(',\n') - for i in range(len(required_module_string)): - hdr_file.write(' ') - hdr_file.write('"' + module + '"') - first_loop = False - hdr_file.write('};\n\n') - hdr_file.write(init_function_string) - - first_loop = True - for function in init_functions[current_app]: - if first_loop != True: - hdr_file.write(',\n') - for i in range(len(init_function_string)): - hdr_file.write(' ') - hdr_file.write('&' + function) - first_loop = False - hdr_file.write('};') - else: - hdr_file.write('\nconst int num_modules_' + current_app) - hdr_file.write(' = 0;\n\nconst int num_required_modules_') - hdr_file.write(current_app + ' = 0;\n\n') - hdr_file.write(module_string + '};') - hdr_file.write('\n\n' + required_module_string + '};') - hdr_file.write('\n\n' + init_function_string + '};') + info_string = 'struct module_info ' + current_app + info_string += '_modules[] = {' + first_loop = True + num_spaces = len(info_string) + num_modules = 0 + max_required_modules = 0 + + for current_module in module_info: + if module_info[current_module]['application'].has_key(current_app): + app_info = module_info[current_module]['application'][current_app] + num_modules += 1 + hdr_file.write('\n#include \"' + app_info['header_file'] + '\"') + + num_required_modules = len(module_info[current_module]['requires']) + if num_required_modules > max_required_modules: + max_required_modules = num_required_modules + if first_loop != True: + info_string += ',\n' + for i in range(num_spaces): + info_string += ' ' + info_string += '{"' + current_module + '", ' + info_string += str(num_required_modules) + ', ' + + first_loop_1 = True + info_string += '{' + for required_module in module_info[current_module]['requires']: + if first_loop_1 != True: + info_string += ', ' + info_string += '"' + required_module['name'] + '"' + first_loop_1 = False + info_string += '}' + info_string += ', &' + app_info['init_function'] + '}' + first_loop = False + + info_string += '};' + + info_struct = '\n\n#define MAX_REQUIRED_MODULES ' + info_struct += str(max_required_modules) + info_struct += '\n\nstruct module_info {\n' + info_struct += ' const char *name;\n' + info_struct += ' const int num_required_moduels;\n' + info_struct += ' const char *required_modules_hipd[' + info_struct += 'MAX_REQUIRED_MODULES];\n' + info_struct += ' int (*init_function)(void);\n' + info_struct += '};\n\n' + hdr_file.write(info_struct) + hdr_file.write('/* Number of modules - determined during build process. */') + hdr_file.write('\nconst int ' + current_app + '_num_modules') + hdr_file.write(' = ' + str(num_modules) + ';\n\n') + + hdr_file.write(info_string) hdr_file.write('\n\n#endif /* ' + app_string + ' */\n') print '| created file: ' + hdr_file_path @@ -272,18 +239,12 @@ if disabled_modules: disabled_modules = disabled_modules.rsplit(',') - (module_info, required_modules) = read_module_info(os.path.join(srcdir, MODULES_DIR), - disabled_modules) - - (includes, init_functions) = process_module_info(module_info) - - create_header_files(HEADER_FILE_DIR, - HEADER_FILE_SUFFIX, - applications, - includes, - init_functions, - module_info.keys(), - required_modules) + (module_info) = read_module_info(os.path.join(srcdir, MODULES_DIR), + disabled_modules) + + check_dependencies(module_info) + + create_header_files(applications, module_info) if __name__ == "__main__": main()