diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c index a53a53ed498f859abdbd0f53bacfa53536eca3e3..a999d40a22a99bb6982503a75b57c964f5c59d6f 100644 --- a/dap_chain_node_cli.c +++ b/dap_chain_node_cli.c @@ -782,7 +782,7 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "node alias {<node address> | -alias <node alias>}\n\n" "node connect {<node address> | -alias <node alias>}\n\n" "node handshake {<node address> | -alias <node alias>}\n" - "node dump -net <net name> [ -addr <node address> | -alias <node alias>]\n\n" + "node dump -net <net name> [ -addr <node address> | -alias <node alias>] [-full]\n\n" ); dap_chain_node_cli_cmd_item_create ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts", "ping [-c <count>] host\n"); diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index 75802c9796eaab53009f9c9d46d324e24fb05f65..088153c34dca08fe32629e9473ca80583142c453 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -439,35 +439,100 @@ static int link_add_or_del_with_reply(dap_chain_net_t * a_net, dap_chain_node_in * str_reply[out] for reply * return 0 Ok, -1 error */ -static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_addr_t * a_addr, const char *a_alias, char **a_str_reply) +static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_addr_t * a_addr, bool a_is_full, const char *a_alias, char **a_str_reply) { int l_ret = 0; - dap_string_t *l_string_reply = dap_string_new("Node dump:\n"); + dap_string_t *l_string_reply = dap_string_new("Node dump:"); - if( (a_addr && a_addr->uint64 ) || a_alias) { + if((a_addr && a_addr->uint64) || a_alias) { dap_chain_node_addr_t *l_addr; - if (a_addr && a_addr->uint64){ + if(a_addr && a_addr->uint64) { l_addr = DAP_NEW(dap_chain_node_addr_t); l_addr->uint64 = a_addr->uint64; - } else if (a_alias) { - l_addr = dap_chain_node_alias_find(a_net,a_alias); + } else if(a_alias) { + l_addr = dap_chain_node_alias_find(a_net, a_alias); } - if ( l_addr ) { + if(!l_addr) { + dap_chain_node_cli_set_reply_text(a_str_reply, "addr not found"); + dap_string_free(l_string_reply, true); + return -1; + } + // read node + dap_chain_node_info_t *node_info_read = node_info_read_and_reply(a_net, l_addr, a_str_reply); + + // get aliases in form of string + dap_string_t *aliases_string = dap_string_new(NULL); + dap_list_t *list_aliases = get_aliases_by_name(a_net, l_addr); + if(list_aliases) + { + dap_list_t *list = list_aliases; + while(list) + { + const char *alias = (const char *) list->data; + dap_string_append_printf(aliases_string, "\nalias %s", alias); + list = dap_list_next(list); + } + dap_list_free_full(list_aliases, (dap_callback_destroyed_t) free); } + else + dap_string_append(aliases_string, "\nno aliases"); + + const int hostlen = 128; + char *host4 = (char*) alloca(hostlen); + char *host6 = (char*) alloca(hostlen); + struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = node_info_read->hdr.ext_addr_v4 }; + const char* str_ip4 = inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host4, hostlen); + + struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = node_info_read->hdr.ext_addr_v6 }; + const char* str_ip6 = inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host6, hostlen); + + // get links in form of string + dap_string_t *links_string = dap_string_new(NULL); + for(unsigned int i = 0; i < node_info_read->hdr.links_number; i++) { + dap_chain_node_addr_t link_addr = node_info_read->links[i]; + dap_string_append_printf(links_string, "\nlink%02d address : " NODE_ADDR_FP_STR, i, + NODE_ADDR_FP_ARGS_S(link_addr)); + } + + dap_string_append_printf(l_string_reply, "\n"); + // set short reply with node param + if(!a_is_full) + dap_string_append_printf(l_string_reply, + "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tnumber of links %u", + NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), + node_info_read->hdr.cell_id.uint64, str_ip4, + node_info_read->hdr.links_number); + else + // set full reply with node param + dap_string_append_printf(l_string_reply, + "node address " NODE_ADDR_FP_STR "\ncell 0x%016llx%s\nipv4 %s\nipv6 %s\nlinks %u%s", + NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), + node_info_read->hdr.cell_id.uint64, + str_ip4, str_ip6, aliases_string->str, + node_info_read->hdr.links_number, links_string->str); + dap_string_free(aliases_string, true); + dap_string_free(links_string, true); + + DAP_DELETE(l_addr); + DAP_DELETE(node_info_read); + + }else { // Dump list - dap_global_db_obj_t **l_objs = NULL; + dap_global_db_obj_t *l_objs = NULL; size_t l_nodes_count = 0; dap_chain_node_info_t *l_node_info; + dap_string_append(l_string_reply, "\n"); // read all node l_objs = dap_chain_global_db_gr_load( a_net->pub.gdb_nodes, &l_nodes_count); if(!l_nodes_count || !l_objs) { dap_string_append_printf(l_string_reply, "No records\n"); + dap_string_free(l_string_reply, true); l_ret = -1; }else { dap_string_append_printf(l_string_reply,"Got %u records:\n",l_nodes_count); for(size_t i = 0; i < l_nodes_count; i++) { - dap_chain_node_info_t *node_info = (dap_chain_node_info_t *) l_objs[i]->value; + dap_chain_node_info_t *node_info = (dap_chain_node_info_t *) l_objs[i].value; // find addr by alias or addr_str dap_chain_node_addr_t *address = node_info_get_addr(a_net, node_info, &node_info->hdr.address, a_alias); if(!address) { @@ -518,7 +583,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add if(i) dap_string_append_printf(l_string_reply, "\n"); // set short reply with node param - if(l_objs) + if(!a_is_full) dap_string_append_printf(l_string_reply, "node address "NODE_ADDR_FP_STR"\tcell 0x%016llx\tipv4 %s\tnumber of links %u", NODE_ADDR_FP_ARGS_S(node_info_read->hdr.address), @@ -690,6 +755,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-addr", &l_addr_str); dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-alias", &alias_str); dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-net", &l_net_str); + bool l_is_full = dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-full", NULL); if (l_addr_str) if ( dap_chain_node_addr_from_str(&l_node_addr,l_addr_str) != 0 ) @@ -712,7 +778,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) case CMD_DUMP:{ // handler of command 'global_db node dump' - return node_info_dump_with_reply(l_net, &l_node_addr , alias_str, a_str_reply); + return node_info_dump_with_reply(l_net, &l_node_addr , l_is_full, alias_str, a_str_reply); } // add alias case CMD_ALIAS: