diff --git a/orte/tools/console/Makefile.am b/orte/tools/console/Makefile.am index 6fc1e84318..68df8a4eda 100644 --- a/orte/tools/console/Makefile.am +++ b/orte/tools/console/Makefile.am @@ -16,6 +16,9 @@ include $(top_srcdir)/config/Makefile.options +EXTRA_DIST = $(pkgdata_DATA) +pkgdata_DATA = help-orteconsole.txt + libs = \ $(top_builddir)/orte/liborte.la \ $(top_builddir)/opal/libopal.la diff --git a/orte/tools/console/help-orteconsole.txt b/orte/tools/console/help-orteconsole.txt new file mode 100644 index 0000000000..2a7a077f2b --- /dev/null +++ b/orte/tools/console/help-orteconsole.txt @@ -0,0 +1,36 @@ +# -*- text -*- +# +# Copyright (c) 2004-2005 The Trustees of Indiana University. +# All rights reserved. +# Copyright (c) 2004-2005 The Trustees of the University of Tennessee. +# All rights reserved. +# Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, +# University of Stuttgart. All rights reserved. +# Copyright (c) 2004-2005 The Regents of the University of California. +# All rights reserved. +# $COPYRIGHT$ +# +# Additional copyrights may follow +# +# $HEADER$ +# +# This is the US/English general help file for Open RTE's Console. +# +[orteconsole:usage] +Usage: %s [OPTION]... +Start the Open RTE Console interface + +%s +[orteconsole:init-failure] +Open RTE was unable to initialize properly. The error occured while +attempting to %s. Returned value %d instead of ORTE_SUCCESS. +[orteconsole:finalize-failure] +Open RTE was unable to finalize properly. The error occured while +attempting to %s. Returned value %d instead of ORTE_SUCCESS. +[orteconsole:unknown-command] +Open RTE Console did not recognize the command: + %s +[orteconsole:unimplemented-command] +The command "%s" is not currently implemented in the Open RTE Console. +[orteconsole:failed-command] +The command "%s" failed with return value %d. diff --git a/orte/tools/console/orteconsole.c b/orte/tools/console/orteconsole.c index aba21aa5e7..51038eddb6 100644 --- a/orte/tools/console/orteconsole.c +++ b/orte/tools/console/orteconsole.c @@ -22,7 +22,9 @@ #include "include/orte_constants.h" #include <stdlib.h> #include <sys/types.h> +#ifdef HAVE_UNISTD_H #include <unistd.h> +#endif #include "dps/dps.h" @@ -44,99 +46,216 @@ #include "mca/pls/base/base.h" #include "tools/orted/orted.h" -#define ORTE_CONSOLE_MAX_LINE_LENGTH 1024 +#include "tools/console/orteconsole.h" -static char *orte_getinputline(void); +/* + * Global Variables + */ +static bool exit_cmd; -static void orte_console_sendcmd(orte_daemon_cmd_flag_t usercmd); +/* + * Globals for catching command line options + */ +orteconsole_globals_t orteconsole_globals; +opal_cmd_line_init_t cmd_line_opts[] = { + { NULL, NULL, NULL, 'h', NULL, "help", 0, + &orteconsole_globals.help, OPAL_CMD_LINE_TYPE_BOOL, + "This help message" }, + + /* End of list */ + { NULL, NULL, NULL, '\0', NULL, NULL, 0, + NULL, OPAL_CMD_LINE_TYPE_NULL, NULL } +}; + +/* + * Global structure describing valid internal commands + */ +orte_console_command_t console_commands[] = { + { "quit", "q", 0, ORTE_CONSOLE_TYPE_STD, + orte_console_exit, + "Exit the console" }, + + { "help", "h", 0, ORTE_CONSOLE_TYPE_STD, + orte_console_help, + "Print this display" }, + + { "contactinfo", "ci", 0, ORTE_CONSOLE_TYPE_STD, + orte_console_contactinfo, + "Query Contact Information from Daemons" }, + + { "dumpvm", "vm", 0, ORTE_CONSOLE_TYPE_STD, + orte_console_dumpvm, + "Get VM List from daemons" }, + + /* End of list */ + { NULL, NULL, 0, ORTE_CONSOLE_TYPE_NULL, + NULL, + NULL } +}; int main(int argc, char *argv[]) { int ret=0; opal_cmd_line_t *cmd_line; - bool exit_cmd; - char *usercmd, *str_response; - orte_buffer_t *buffer = NULL; - orte_process_name_t seed={0,0,0}; - size_t n; + char *usercmd; - /* setup to check common command line options that just report and die */ + /* + * Setup to check common command line options + */ + memset(&orteconsole_globals, 0, sizeof(orteconsole_globals_t)); cmd_line = OBJ_NEW(opal_cmd_line_t); - - opal_cmd_line_make_opt(cmd_line, 'v', "version", 0, - "Show version of this program"); - - opal_cmd_line_make_opt(cmd_line, 'h', "help", 0, - "Show help for this function"); - - - /* parse the local commands */ - if (OMPI_SUCCESS != opal_cmd_line_parse(cmd_line, true, argc, argv)) { + opal_cmd_line_create(cmd_line, cmd_line_opts); + if (OMPI_SUCCESS != (ret = opal_cmd_line_parse(cmd_line, false, + argc, argv))) { char *args = NULL; args = opal_cmd_line_get_usage_msg(cmd_line); - opal_show_help("help-console.txt", "console:usage", false, + opal_show_help("help-orteconsole.txt", "orteconsole:usage", false, + argv[0], args); + free(args); + return ret; + } + + /* Check for help request */ + if(orteconsole_globals.help) { + char *args = NULL; + args = opal_cmd_line_get_usage_msg(cmd_line); + opal_show_help("help-orteconsole.txt", "orteconsole:usage", false, argv[0], args); free(args); return 1; } - /* check for help and version requests */ - if (opal_cmd_line_is_taken(cmd_line, "help") || - opal_cmd_line_is_taken(cmd_line, "h")) { - char *args = NULL; - args = opal_cmd_line_get_usage_msg(cmd_line); - opal_show_help("help-console.txt", "console:usage", false, - argv[0], args); - free(args); - return 1; - } - - if (opal_cmd_line_is_taken(cmd_line, "version") || - opal_cmd_line_is_taken(cmd_line, "v")) { - printf("...showing off my version!\n"); - exit(1); - } - /* * Intialize the ORTE environment */ - if (OMPI_SUCCESS != orte_init()) { - /* BWB show_help */ - printf("show_help: ompi_init failed\n"); + if (OMPI_SUCCESS != (ret = orte_init()) ) { + opal_show_help("help-orteconsole.txt", "orteconsole:init-failure", false, + "orte_init()", ret); return ret; } + /* + * Work Loop + */ exit_cmd = false; while (!exit_cmd) { - printf("ompiconsole> "); - usercmd = orte_getinputline(); - if (0 == strncmp(usercmd, "exit", strlen("exit"))) { - exit_cmd = true; - orte_console_sendcmd(ORTE_DAEMON_EXIT_CMD); - } else if (0 == strncmp(usercmd, "contactinfo", strlen("contactinfo"))) { - orte_console_sendcmd(ORTE_DAEMON_CONTACT_QUERY_CMD); - if (0 > orte_rml.recv_buffer(&seed, buffer, ORTE_RML_TAG_DAEMON)) { - printf("****got a bad response\n"); - } else { - n = 1; - if (ORTE_SUCCESS != orte_dps.unpack(buffer, &str_response, &n, ORTE_STRING)) { - printf("****couldn't decode answer\n"); - } else { - printf(str_response); - printf("\n"); - } - } - } else if (0 == strncmp(usercmd, "dumpvm", strlen("dumpvm"))) { - fprintf(stderr, "getting vm list\n"); - } else { - printf("huh???\n"); - } + printf("ompiconsole> "); + + usercmd = orte_getinputline(); + + execute_command(usercmd); } - fprintf(stderr, "finalize rte\n"); - orte_finalize(); - exit(0); + /* + * Finialize ORTE Environment + */ + if(ORTE_SUCCESS != (ret = orte_finalize()) ) { + opal_show_help("help-orteconsole.txt", "orteconsole:finalize-failure", false, + "orte_finalize()", ret); + return ret; + } + + return ORTE_SUCCESS; +} + +static int execute_command(char *command) { + orte_console_command_t *cur_cmd; + int i, ret; + + for(i = 0; console_commands[i].cmd_type != ORTE_CONSOLE_TYPE_NULL; ++i) { + cur_cmd = &console_commands[i]; + + /* + * Check Full Name then check short name + */ + if ( ( 0 == strncmp(command, cur_cmd->cmd_full_name, + strlen(cur_cmd->cmd_full_name)) ) || + ( ( strlen(command) == strlen(cur_cmd->cmd_short_name) ) && + ( 0 == strncmp(command, cur_cmd->cmd_short_name, + strlen(cur_cmd->cmd_short_name)) ) ) ) { + ret = cur_cmd->cmd_function(); + + if(ret == ORTE_ERR_NOT_IMPLEMENTED) { + opal_show_help("help-orteconsole.txt", "orteconsole:unimplemented-command", false, + cur_cmd->cmd_full_name); + return ret; + } + else if(ret != ORTE_SUCCESS) { + opal_show_help("help-orteconsole.txt", "orteconsole:failed-command", false, + cur_cmd->cmd_full_name, ret); + return ret; + } + break; + } + } + + /* + * If command was not found :( + */ + if( console_commands[i].cmd_type == ORTE_CONSOLE_TYPE_NULL ) { + opal_show_help("help-orteconsole.txt", "orteconsole:unknown-command", false, + command); + return ORTE_ERR_NOT_IMPLEMENTED; + } + + return ORTE_SUCCESS; +} + +static int orte_console_exit() { + exit_cmd = true; + + orte_console_sendcmd(ORTE_DAEMON_EXIT_CMD); + + return ORTE_SUCCESS; +} + +static int orte_console_help() { + orte_console_command_t *cur_cmd; + int i; + + printf("Open RTE Console Commands:\n\n"); + + for(i = 0; console_commands[i].cmd_type != ORTE_CONSOLE_TYPE_NULL; ++i) { + cur_cmd = &console_commands[i]; + printf("%15s | %5s \t%s\n", + cur_cmd->cmd_full_name, + cur_cmd->cmd_short_name, + cur_cmd->cmd_description); + } + + printf("\n"); + + return ORTE_SUCCESS; +} + +static int orte_console_dumpvm() { + + return ORTE_ERR_NOT_IMPLEMENTED; +} + +static int orte_console_contactinfo() { + char * str_response; + orte_buffer_t *buffer = NULL; + orte_process_name_t seed={0,0,0}; + size_t n; + + orte_console_sendcmd(ORTE_DAEMON_CONTACT_QUERY_CMD); + if (0 > orte_rml.recv_buffer(&seed, buffer, ORTE_RML_TAG_DAEMON)) { + printf("****got a bad response\n"); + return ORTE_ERROR; + } else { + n = 1; + if (ORTE_SUCCESS != orte_dps.unpack(buffer, &str_response, &n, ORTE_STRING)) { + printf("****couldn't decode answer\n"); + return ORTE_ERROR; + } else { + printf(str_response); + printf("\n"); + } + } + + return ORTE_SUCCESS; } static void orte_console_sendcmd(orte_daemon_cmd_flag_t usercmd) @@ -171,9 +290,9 @@ char *orte_getinputline() ret = fgets(input, ORTE_CONSOLE_MAX_LINE_LENGTH, stdin); if (NULL != ret) { - input[strlen(input)-1] = '\0'; /* remove newline */ - buff = strdup(input); - return buff; + input[strlen(input)-1] = '\0'; /* remove newline */ + buff = strdup(input); + return buff; } return NULL; } diff --git a/orte/tools/console/orteconsole.h b/orte/tools/console/orteconsole.h new file mode 100644 index 0000000000..daac50ac37 --- /dev/null +++ b/orte/tools/console/orteconsole.h @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2004-2005 The Trustees of Indiana University. + * All rights reserved. + * Copyright (c) 2004-2005 The Trustees of the University of Tennessee. + * All rights reserved. + * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, + * University of Stuttgart. All rights reserved. + * Copyright (c) 2004-2005 The Regents of the University of California. + * All rights reserved. + * $COPYRIGHT$ + * + * Additional copyrights may follow + * + * $HEADER$ + */ + +#ifndef ORTECONSOLE_H +#define ORTECONSOLE_H + +#define ORTE_CONSOLE_MAX_LINE_LENGTH 1024 + +/* + * Local Structures + */ + +/* Command line Structure */ +typedef struct { + bool help; + + opal_mutex_t lock; + opal_condition_t cond; +} orteconsole_globals_t; + +enum orte_console_type_t { + ORTE_CONSOLE_TYPE_NULL, + ORTE_CONSOLE_TYPE_STD +}; +typedef enum orte_console_type_t orte_console_type_t; + +/* Structure detailing each command allowed by the console */ +typedef struct { + /* Full Name for the command */ + const char *cmd_full_name; + /* Common abbreviation for this command */ + const char *cmd_short_name; + /* Number of expected arguments */ + int cmd_args; + /* Type of command */ + orte_console_type_t cmd_type; + /* Pointer to the function to execute */ + int (*cmd_function) (void); + /* Short description of what this command does */ + const char *cmd_description; +} orte_console_command_t; + +/* + * Function for each command + */ +static int orte_console_exit(void); +static int orte_console_help(void); +static int orte_console_contactinfo(void); +static int orte_console_dumpvm(void); + +/* + * Support Functions + */ +static char *orte_getinputline(void); +static void orte_console_sendcmd(orte_daemon_cmd_flag_t usercmd); +static int execute_command(char *command); + +#endif /* ORTECONSOLE_H */