From 2154a1beca24723b6473b05161699a56bf04931a Mon Sep 17 00:00:00 2001
From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net>
Date: Wed, 3 Feb 2021 15:01:51 +0700
Subject: [PATCH] [+] Added ext_address,ext_address6 and ext_port_tcp to
 [server] section of main config [!] Fixed node info update, now it updates
 with own addresses and ports

---
 modules/net/dap_chain_net.c | 77 ++++++++++++++++++++++---------------
 1 file changed, 47 insertions(+), 30 deletions(-)

diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 79dc51ef25..f13b831171 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -1412,12 +1412,13 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                                             dap_config_get_item_str(l_cfg , "general" , "name" ),
                                             dap_config_get_item_str(l_cfg , "general" , "node-role" )
                                            );
+        dap_chain_net_pvt_t * l_net_pvt = PVT(l_net);
         if(!l_net) {
             log_it(L_ERROR,"Can't create l_net");
             return -1;
         }
-        PVT(l_net)->load_mode = true;
-        PVT(l_net)->acl_idx = a_acl_idx;
+        l_net_pvt->load_mode = true;
+        l_net_pvt->acl_idx = a_acl_idx;
         l_net->pub.gdb_groups_prefix = dap_strdup (
                     dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix",
                                                     dap_config_get_item_str(l_cfg , "general" , "name" ) ) );
@@ -1429,30 +1430,30 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
 
         // for sync special groups - nodes
         char **l_gdb_sync_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_addrs",
-                &PVT(l_net)->gdb_sync_nodes_addrs_count);
-        if(l_gdb_sync_nodes_addrs && PVT(l_net)->gdb_sync_nodes_addrs_count > 0) {
-            PVT(l_net)->gdb_sync_nodes_addrs = (dap_chain_node_addr_t*) DAP_NEW_Z_SIZE(char**,
-                    sizeof(dap_chain_node_addr_t)*PVT(l_net)->gdb_sync_nodes_addrs_count);
-            for(uint16_t i = 0; i < PVT(l_net)->gdb_sync_nodes_addrs_count; i++) {
-                dap_chain_node_addr_from_str(PVT(l_net)->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]);
+                &l_net_pvt->gdb_sync_nodes_addrs_count);
+        if(l_gdb_sync_nodes_addrs && l_net_pvt->gdb_sync_nodes_addrs_count > 0) {
+            l_net_pvt->gdb_sync_nodes_addrs = (dap_chain_node_addr_t*) DAP_NEW_Z_SIZE(char**,
+                    sizeof(dap_chain_node_addr_t)*l_net_pvt->gdb_sync_nodes_addrs_count);
+            for(uint16_t i = 0; i < l_net_pvt->gdb_sync_nodes_addrs_count; i++) {
+                dap_chain_node_addr_from_str(l_net_pvt->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]);
             }
         }
         // for sync special groups - groups
-        char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &PVT(l_net)->gdb_sync_groups_count);
-        if(l_gdb_sync_groups && PVT(l_net)->gdb_sync_groups_count > 0) {
-            PVT(l_net)->gdb_sync_groups = (char **) DAP_NEW_SIZE(char**, sizeof(char*)*PVT(l_net)->gdb_sync_groups_count);
-            for(uint16_t i = 0; i < PVT(l_net)->gdb_sync_groups_count; i++) {
-                PVT(l_net)->gdb_sync_groups[i] = dap_strdup(l_gdb_sync_groups[i]);
+        char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &l_net_pvt->gdb_sync_groups_count);
+        if(l_gdb_sync_groups && l_net_pvt->gdb_sync_groups_count > 0) {
+            l_net_pvt->gdb_sync_groups = (char **) DAP_NEW_SIZE(char**, sizeof(char*)*l_net_pvt->gdb_sync_groups_count);
+            for(uint16_t i = 0; i < l_net_pvt->gdb_sync_groups_count; i++) {
+                l_net_pvt->gdb_sync_groups[i] = dap_strdup(l_gdb_sync_groups[i]);
                 // added group to history log
-                dap_list_t *l_groups0 = dap_chain_global_db_driver_get_groups_by_mask(PVT(l_net)->gdb_sync_groups[i]);
+                dap_list_t *l_groups0 = dap_chain_global_db_driver_get_groups_by_mask(l_net_pvt->gdb_sync_groups[i]);
                 dap_list_t *l_groups = l_groups0;
                 while(l_groups) {
                     char *l_group_name = l_groups->data;
                     // do not use groups with names like *.del
                     if(dap_fnmatch("*.del", l_group_name, 0)) {
                         const char *l_history_group = dap_chain_global_db_add_history_extra_group(l_group_name,
-                                                        PVT(l_net)->gdb_sync_nodes_addrs,
-                                                        &PVT(l_net)->gdb_sync_nodes_addrs_count);
+                                                        l_net_pvt->gdb_sync_nodes_addrs,
+                                                        &l_net_pvt->gdb_sync_nodes_addrs_count);
                         dap_chain_global_db_add_history_extra_group_callback_notify(l_group_name,
                                 s_gbd_history_callback_notify, l_net);
                         // create history for group
@@ -1503,11 +1504,11 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
         l_net->pub.ledger = dap_chain_ledger_create(l_ledger_flags, l_net->pub.name);
         // Check if seed nodes are present in local db alias
         char **l_seed_aliases = dap_config_get_array_str( l_cfg , "general" ,"seed_nodes_aliases"
-                                                             ,&PVT(l_net)->seed_aliases_count);
-        PVT(l_net)->seed_aliases = PVT(l_net)->seed_aliases_count>0 ?
+                                                             ,&l_net_pvt->seed_aliases_count);
+        l_net_pvt->seed_aliases = l_net_pvt->seed_aliases_count>0 ?
                                    (char **)DAP_NEW_SIZE(char**, sizeof(char*)*PVT(l_net)->seed_aliases_count) : NULL;
         for(size_t i = 0; i < PVT(l_net)->seed_aliases_count; i++) {
-            PVT(l_net)->seed_aliases[i] = dap_strdup(l_seed_aliases[i]);
+            l_net_pvt->seed_aliases[i] = dap_strdup(l_seed_aliases[i]);
         }
 
         uint16_t l_seed_nodes_addrs_len =0;
@@ -1590,7 +1591,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
         }
 
         log_it (L_DEBUG, "Read %u aliases, %u address and %u ipv4 addresses, check them",
-                PVT(l_net)->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
+                l_net_pvt->seed_aliases_count,l_seed_nodes_addrs_len, l_seed_nodes_ipv4_len );
         // save new nodes from cfg file to db
         for ( size_t i = 0; i < PVT(l_net)->seed_aliases_count &&
                             i < l_seed_nodes_addrs_len &&
@@ -1601,9 +1602,9 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                               )
                                                                     ; i++ ){
             dap_chain_node_addr_t * l_seed_node_addr;
-            l_seed_node_addr = dap_chain_node_alias_find(l_net, PVT(l_net)->seed_aliases[i] );
+            l_seed_node_addr = dap_chain_node_alias_find(l_net, l_net_pvt->seed_aliases[i] );
             //if (l_seed_node_addr == NULL){
-                log_it(L_NOTICE, "Update alias %s in database, prefill it",PVT(l_net)->seed_aliases[i]);
+                log_it(L_NOTICE, "Update alias %s in database, prefill it",l_net_pvt->seed_aliases[i]);
                 dap_chain_node_info_t * l_node_info = DAP_NEW_Z(dap_chain_node_info_t);
                 l_seed_node_addr = DAP_NEW_Z(dap_chain_node_addr_t);
                 dap_snprintf( l_node_info->hdr.alias,sizeof ( l_node_info->hdr.alias),"%s",PVT(l_net)->seed_aliases[i]);
@@ -1650,7 +1651,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                             l_node_info->hdr.ext_addr_v6.s6_addr32[0] ){
                         int l_ret;
                         if ( (l_ret = dap_chain_node_info_save(l_net, l_node_info)) ==0 ){
-                            if (dap_chain_node_alias_register(l_net,PVT(l_net)->seed_aliases[i],l_seed_node_addr))
+                            if (dap_chain_node_alias_register(l_net,l_net_pvt->seed_aliases[i],l_seed_node_addr))
                                 log_it(L_NOTICE,"Seed node "NODE_ADDR_FP_STR" added to the curent list",NODE_ADDR_FP_ARGS(l_seed_node_addr) );
                             else {
                                 log_it(L_WARNING,"Cant register alias %s for address "NODE_ADDR_FP_STR,NODE_ADDR_FP_ARGS(l_seed_node_addr));
@@ -1717,8 +1718,8 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                 }
                 if(l_node_addr)
                     log_it(L_NOTICE, "Parse node addr " NODE_ADDR_FP_STR " successfully", NODE_ADDR_FP_ARGS(l_node_addr));
-                PVT(l_net)->node_addr = l_node_addr;
-                //}
+                l_net_pvt->node_addr = l_node_addr;
+
             }
             if ( l_node_addr ) {
                 char *l_addr_hash_str = dap_chain_node_addr_to_hash_str(l_node_addr);
@@ -1727,11 +1728,27 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx)
                 if(!l_addr_hash_str){
                     log_it(L_ERROR,"Can't get hash string for node address!");
                 } else {
-                    PVT(l_net)->node_info = dap_chain_node_info_read (l_net, l_node_addr);
-                    if ( !PVT(l_net)->node_info ) { // If not present - create it
-                        PVT(l_net)->node_info = DAP_NEW_Z(dap_chain_node_info_t);
-                        memcpy(&PVT(l_net)->node_info->hdr.address, l_node_addr,sizeof (*l_node_addr));
-                        dap_chain_node_info_save(l_net,PVT(l_net)->node_info);
+                    l_net_pvt->node_info = dap_chain_node_info_read (l_net, l_node_addr);
+                    if ( !l_net_pvt->node_info ) { // If not present - create it
+                        l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t);
+                        memcpy(&l_net_pvt->node_info->hdr.address, l_node_addr,sizeof (*l_node_addr));
+                        if (dap_config_get_item_bool_default(g_config,"server","enabled",false) ){
+                            const char * l_ext_addr_v4 = dap_config_get_item_str_default(g_config,"server","ext_address",NULL);
+                            const char * l_ext_addr_v6 = dap_config_get_item_str_default(g_config,"server","ext_address6",NULL);
+                            uint16_t l_ext_port = dap_config_get_item_uint16_default(g_config,"server","ext_port_tcp",0);
+                            uint16_t l_node_info_port = l_ext_port? l_ext_port :
+                                                    dap_config_get_item_uint16_default(g_config,"server","listen_port_tcp",8089);
+                            if (l_ext_addr_v4)
+                                inet_pton(AF_INET,l_ext_addr_v4,&l_net_pvt->node_info->hdr.ext_addr_v4 );
+                            if (l_ext_addr_v6)
+                                inet_pton(AF_INET6,l_ext_addr_v6,&l_net_pvt->node_info->hdr.ext_addr_v6 );
+                            l_net_pvt->node_info->hdr.ext_port =l_node_info_port;
+                            log_it(L_INFO,"Server is enabled on %s:%u",l_ext_addr_v4?l_ext_addr_v4:"<none>",
+                                   l_node_info_port);
+                        }else
+                            log_it(L_INFO,"Server is disabled, add only node address in nodelist");
+
+                        dap_chain_node_info_save(l_net,l_net_pvt->node_info);
                     }
                     log_it(L_NOTICE,"GDB Info: node_addr: " NODE_ADDR_FP_STR"  links: %u cell_id: 0x%016X ",
                            NODE_ADDR_FP_ARGS(l_node_addr),
-- 
GitLab