diff --git a/dap_chain_node_cli.c b/dap_chain_node_cli.c index 2e75da9acb5a653cafee84d4273c68acf2d592ce..ed1d78de8a4148a2b51fcd5d22051a1e6a1dde9f 100644 --- a/dap_chain_node_cli.c +++ b/dap_chain_node_cli.c @@ -770,19 +770,19 @@ int dap_chain_node_cli_init(dap_config_t * g_config) return 0; } - dap_chain_node_cli_cmd_item_create ("global_db", com_global_db, "Work with global database", - "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" - "global_db cells add -cell <cell id> \n\n" - "global_db node add -net <net name> -addr {<node address> | -alias <node alias>} -cell <cell id> {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n" - "global_db node del -net <net name> -addr <node address> | -alias <node alias>\n\n" - "global_db node link {add|del} -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n" - ); - - dap_chain_node_cli_cmd_item_create ("node", com_node, "Work with node", - "node alias -addr <node address> -alias <node alias>\n\n" +/* dap_chain_node_cli_cmd_item_create("global_db", com_global_db, "Work with global database", + "global_db cells add -cell <cell id> \n\n" + "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" + );*/ + + dap_chain_node_cli_cmd_item_create("node", com_node, "Work with node", + "node add -net <net name> -addr {<node address> | -alias <node alias>} -cell <cell id> {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n" + "node del -net <net name> -addr <node address> | -alias <node alias>\n\n" + "node link {add|del} -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n" + "node alias -addr <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 072bf8ac3997f1847a430eebb43d6d48b44b99c0..690826c8260f2c8a866c5c61f166e642f1cc1f78 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -507,7 +507,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add 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 address " NODE_ADDR_FP_STR "\ncell 0x%016llx\nipv4 %s\nipv6 %s%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, @@ -594,7 +594,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add 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 address " NODE_ADDR_FP_STR "\ncell 0x%016llx\nipv4 %s\nipv6 %s%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, @@ -619,6 +619,7 @@ static int node_info_dump_with_reply(dap_chain_net_t * a_net, dap_chain_node_add * * return 0 OK, -1 Err */ +/* int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) { enum { @@ -721,7 +722,7 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "command %s not recognized", a_argv[1]); return -1; } -} +}*/ /** * Node command @@ -729,12 +730,22 @@ int com_global_db(int a_argc, char ** a_argv, char **a_str_reply) int com_node(int a_argc, char ** a_argv, char **a_str_reply) { enum { - CMD_NONE, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT , CMD_DUMP + CMD_NONE, CMD_ADD, CMD_DEL, CMD_LINK, CMD_ALIAS, CMD_HANDSHAKE, CMD_CONNECT, CMD_DUMP }; int arg_index = 1; int cmd_num = CMD_NONE; const char *cmd_str = NULL; -// find add parameter ('alias' or 'handshake') + if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL)) { + cmd_num = CMD_ADD; + } + else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL)) { + cmd_num = CMD_DEL; + } + else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "link", NULL)) { + cmd_num = CMD_LINK; + } + else + // find add parameter ('alias' or 'handshake') if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "handshake", NULL)) { cmd_num = CMD_HANDSHAKE; } @@ -752,38 +763,91 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "command %s not recognized", a_argv[1]); return -1; } - dap_chain_node_addr_t l_node_addr={0}; const char *l_addr_str = NULL, *alias_str = NULL; - const char * l_net_str = NULL; + const char *l_cell_str = NULL, *l_link_str = NULL, *a_ipv4_str = NULL, *a_ipv6_str = NULL; + + // find net + dap_chain_net_t *l_net = NULL; + + if(dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, a_argc, a_argv, a_str_reply, NULL, &l_net) < 0) + return -11; // find addr, alias 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); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-cell", &l_cell_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv4", &a_ipv4_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-ipv6", &a_ipv6_str); + dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-link", &l_link_str); - if (l_addr_str) - if ( dap_chain_node_addr_from_str(&l_node_addr,l_addr_str) != 0 ) - dap_digit_from_string(l_addr_str, l_node_addr.raw, sizeof(l_node_addr.raw)); + // struct to write to the global db + dap_chain_node_addr_t l_node_addr = { 0 }; + dap_chain_node_addr_t l_link = { 0 }; + dap_chain_node_info_t *l_node_info = NULL; + size_t l_node_info_size = sizeof(l_node_info->hdr) + sizeof(l_link); + if(cmd_num >= CMD_ADD && cmd_num <= CMD_LINK) + l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size); - if(l_net_str == NULL) { - dap_chain_node_cli_set_reply_text(a_str_reply, "No -net <net name> option in command %s", a_argv[1]); - return -11; + if(l_addr_str) { + if(dap_chain_node_addr_from_str(&l_node_addr, l_addr_str) != 0) { + dap_digit_from_string(l_addr_str, l_node_addr.raw, sizeof(l_node_addr.raw)); + } + if(l_node_info) + memcpy(&l_node_info->hdr.address, &l_node_addr, sizeof(dap_chain_node_addr_t)); } - - dap_chain_net_t * l_net = dap_chain_net_by_name(l_net_str); - - if(l_net == NULL) { - dap_chain_node_cli_set_reply_text(a_str_reply, "%s: Can't find such network %s", a_argv[1], l_net_str); - return -12; + if(l_cell_str && l_node_info) { + dap_digit_from_string(l_cell_str, l_node_info->hdr.cell_id.raw, sizeof(l_node_info->hdr.cell_id.raw)); //DAP_CHAIN_CELL_ID_SIZE); + } + if(l_link_str) { + if(dap_chain_node_addr_from_str(&l_link, l_link_str) != 0) { + dap_digit_from_string(l_link_str, l_link.raw, sizeof(l_link.raw)); + } } switch (cmd_num) { - case CMD_DUMP:{ - // handler of command 'global_db node dump' + case CMD_ADD: + if(!arg_index || a_argc < 8) { + dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters"); + return -1; + } + // handler of command 'global_db node add' + int l_ret = node_info_add_with_reply(l_net, l_node_info, alias_str, l_cell_str, a_ipv4_str, a_ipv6_str, a_str_reply); + DAP_DELETE(l_node_info); + return l_ret; + //break; + + case CMD_DEL: + // handler of command 'global_db node del' + { + int l_ret = node_info_del_with_reply(l_net, l_node_info, alias_str, a_str_reply); + DAP_DELETE(l_node_info); + return l_ret; + } + case CMD_LINK: + if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "add", NULL)) { + // handler of command 'global_db node link add -addr <node address> -link <node address>' + int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "add", alias_str, &l_link, a_str_reply); + DAP_DELETE(l_node_info); + return l_ret; + } + else if(dap_chain_node_cli_find_option_val(a_argv, arg_index, min(a_argc, arg_index + 1), "del", NULL)) { + // handler of command 'global_db node link del -addr <node address> -link <node address>' + int l_ret = link_add_or_del_with_reply(l_net, l_node_info, "del", alias_str, &l_link, a_str_reply); + DAP_DELETE(l_node_info); + return l_ret; + } + else { + dap_chain_node_cli_set_reply_text(a_str_reply, "command not recognize, supported format:\n" + "global_db node link <add|del] [-addr <node address> | -alias <node alias>] -link <node address>"); + DAP_DELETE(l_node_info); + return -1; + } - return node_info_dump_with_reply(l_net, &l_node_addr , l_is_full, alias_str, a_str_reply); + case CMD_DUMP: { + // handler of command 'node dump' + bool l_is_full = dap_chain_node_cli_find_option_val(a_argv, arg_index, a_argc, "-full", NULL); + return node_info_dump_with_reply(l_net, &l_node_addr, l_is_full, alias_str, a_str_reply); } // add alias case CMD_ALIAS: