This add a dump_portguid functionnality to openSM console which makes it really easy to generate cn_guid_file, root_guid_file and such by dumping into a file all port guids whom nodedesc contains at least one of the provided regexps
Signed-off-by: Nicolas Morey-Chaisemartin <[email protected]> --- Diff from v2: - Changed lock to read-only instead of exclusive - Removed useless cl_spinlock_release (remains from 1st patch) opensm/opensm/osm_console.c | 104 +++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 104 insertions(+), 0 deletions(-) diff --git a/opensm/opensm/osm_console.c b/opensm/opensm/osm_console.c index c6e8e59..5bc1079 100644 --- a/opensm/opensm/osm_console.c +++ b/opensm/opensm/osm_console.c @@ -42,6 +42,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> +#include <regex.h> #ifdef ENABLE_OSM_CONSOLE_SOCKET #include <arpa/inet.h> #endif @@ -1173,6 +1174,108 @@ static void version_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) } /* more parse routines go here */ +typedef struct _regexp_list { + regex_t exp; + struct _regexp_list *next; +} regexp_list_t; + +static void dump_portguid_parse(char **p_last, osm_opensm_t * p_osm, FILE * out) +{ + cl_qmap_t *p_port_guid_tbl; + osm_port_t *p_port; + osm_port_t *p_next_port; + + regexp_list_t *p_head_regexp = NULL; + regexp_list_t *p_regexp; + + /* Option variables */ + char *p_cmd = NULL; + FILE *output = out; + + /* Read commande line */ + + while (1) { + p_cmd = next_token(p_last); + if (p_cmd) { + if (strcmp(p_cmd, "file") == 0) { + p_cmd = next_token(p_last); + if (p_cmd) { + output = fopen(p_cmd, "w+"); + if (output == NULL) { + fprintf(out, + "Could not open file %s: %s\n", + p_cmd, strerror(errno)); + output = out; + } + } else + fprintf(out, "No file name passed\n"); + } else { + p_regexp = malloc(sizeof(*p_regexp)); + if (regcomp + (&(p_regexp->exp), p_cmd, + REG_NOSUB | REG_EXTENDED) != 0) { + fprintf(out, + "Couldn't parse regular expression %s. Skipping it.\n", + p_cmd); + } + p_regexp->next = p_head_regexp; + p_head_regexp = p_regexp; + } + } else + break; /* No more tokens */ + + } + + /* Check we have at least one expression to match */ + if (p_head_regexp == NULL) { + fprintf(out, "No valid expression provided. Aborting\n"); + return; + } + + if (p_osm->sm.p_subn->need_update != 0) { + fprintf(out, "Subnet is not ready yet. Try again later.\n"); + return; + } + + /* Subnet doesn't need to be updated so we can carry on */ + + CL_PLOCK_ACQUIRE(p_osm->sm.p_lock); + p_port_guid_tbl = &(p_osm->sm.p_subn->port_guid_tbl); + + p_next_port = (osm_port_t *) cl_qmap_head(p_port_guid_tbl); + while (p_next_port != (osm_port_t *) cl_qmap_end(p_port_guid_tbl)) { + + p_port = p_next_port; + p_next_port = + (osm_port_t *) cl_qmap_next(&p_next_port->map_item); + + for (p_regexp = p_head_regexp; p_regexp != NULL; + p_regexp = p_regexp->next) + if (regexec + (&(p_regexp->exp), p_port->p_node->print_desc, 0, + NULL, 0) == 0) + fprintf(output, "0x%" PRIxLEAST64 "\n", + cl_ntoh64(p_port->p_physp->port_guid)); + } + + CL_PLOCK_RELEASE(p_osm->sm.p_lock); + if (output != out) + fclose(output); + +} + +static void help_dump_portguid(FILE * out, int detail) +{ + fprintf(out, + "dump_portguid [file filename] regexp1 [regexp2 [regexp3 ...]] -- Dump port GUID matching a regexp \n"); + if (detail) { + fprintf(out, + "getguidgetguid -- Dump all the port GUID whom node_desc matches one of the provided regexp\n"); + fprintf(out, + " [file filename] -- Send the port GUID list to the specified file instead of regular output\n"); + } + +} static const struct command console_cmds[] = { {"help", &help_command, &help_parse}, @@ -1192,6 +1295,7 @@ static const struct command console_cmds[] = { #ifdef ENABLE_OSM_PERF_MGR {"perfmgr", &help_perfmgr, &perfmgr_parse}, #endif /* ENABLE_OSM_PERF_MGR */ + {"dump_portguid", &help_dump_portguid, &dump_portguid_parse}, {NULL, NULL, NULL} /* end of array */ }; -- 1.6.1 _______________________________________________ general mailing list [email protected] http://lists.openfabrics.org/cgi-bin/mailman/listinfo/general To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general
