From dcaa17e8e698da6c3722251ac907727f5e005a00 Mon Sep 17 00:00:00 2001
From: "oljas.jarasbaev" <oljas.jarasbaev@demlabs.net>
Date: Wed, 7 Aug 2024 05:57:30 +0000
Subject: [PATCH] Feature 12444

---
 cellframe-sdk                         |  2 +-
 dap-sdk                               |  2 +-
 dist/etc/network/Backbone/main.cfg    |  2 +-
 dist/etc/network/KelVPN/main.cfg      |  2 +-
 dist/etc/network/mileena/main.cfg     |  2 +-
 dist/etc/network/riemann/main.cfg     |  2 +-
 dist/etc/network/subzero/main.cfg     |  2 +-
 dist/share/configs/cellframe-node.cfg | 23 +++++++----
 dist/share/default.setup              |  4 +-
 sources/main.c                        | 30 ++++++++------
 sources/main_node_cli.c               | 36 ++++++++++-------
 sources/main_node_tool.c              | 56 ++++++++++++++-------------
 12 files changed, 95 insertions(+), 68 deletions(-)

diff --git a/cellframe-sdk b/cellframe-sdk
index e7b90c2d2..a2ddc1b21 160000
--- a/cellframe-sdk
+++ b/cellframe-sdk
@@ -1 +1 @@
-Subproject commit e7b90c2d22ff38afbe6ce651880c33253a907d1d
+Subproject commit a2ddc1b21683fcc069b2ca251dae90b319bfddfe
diff --git a/dap-sdk b/dap-sdk
index ee6070798..8ee681461 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit ee6070798fe4e3d22517babf78fdc48c987fb416
+Subproject commit 8ee6814617484e6d12004e64041ce737023c853d
diff --git a/dist/etc/network/Backbone/main.cfg b/dist/etc/network/Backbone/main.cfg
index 34146ab02..8c1f65afc 100755
--- a/dist/etc/network/Backbone/main.cfg
+++ b/dist/etc/network/Backbone/main.cfg
@@ -19,7 +19,7 @@ static_genesis_block=0xD3E07282FC1C4FC733AEE7898BA1017DF7659CA7B64047886FA12EDD8
 
 
 [esbocs]
-consensus_debug=true
+consensus_debug=false
 #poa_mode=true
 min_validators_count=1
 auth_certs_prefix=scorpion.master
diff --git a/dist/etc/network/KelVPN/main.cfg b/dist/etc/network/KelVPN/main.cfg
index 71bf2c3ea..c66ed2e76 100644
--- a/dist/etc/network/KelVPN/main.cfg
+++ b/dist/etc/network/KelVPN/main.cfg
@@ -18,7 +18,7 @@ is_static_genesis_block=true
 static_genesis_block=0xAB7EE08EF7FFD1D20A4660B7963601E831488AEA4B16149C02F6CCBD0847E858
 
 [esbocs]
-consensus_debug=true
+consensus_debug=false
 min_validators_count=1
 auth_certs_prefix=kelvpn.master
 auth_certs_count=3
diff --git a/dist/etc/network/mileena/main.cfg b/dist/etc/network/mileena/main.cfg
index 00df2b460..af6982fcd 100755
--- a/dist/etc/network/mileena/main.cfg
+++ b/dist/etc/network/mileena/main.cfg
@@ -18,7 +18,7 @@ is_static_genesis_block=true
 static_genesis_block=0x1DB1E136B583A1553E4829D6A0453338B7413DDB1B12189F8456B064E822667F
 
 [esbocs]
-consensus_debug=true
+consensus_debug=false
 min_validators_count=2
 auth_certs_prefix=mileena.master
 validators_addrs=[CCCC::1234::0000::0000,CCCC::1234::0000::0001]
diff --git a/dist/etc/network/riemann/main.cfg b/dist/etc/network/riemann/main.cfg
index 29f09c91f..a3917a8e9 100644
--- a/dist/etc/network/riemann/main.cfg
+++ b/dist/etc/network/riemann/main.cfg
@@ -18,7 +18,7 @@ is_static_genesis_block=true
 static_genesis_block=0x5FDA4B2952C89AB639AD77E00A8EAE9CBC5B472444F1003844DEAF3F4D618D0F
 
 [esbocs]
-consensus_debug=true
+consensus_debug=false
 min_validators_count=1
 auth_certs_prefix=riemann.master
 validators_addrs=[6074::5C74::C320::A0F5,DBBA::AED3::2C72::87A7,FE4E::4EEC::007D::07E9]
diff --git a/dist/etc/network/subzero/main.cfg b/dist/etc/network/subzero/main.cfg
index 52e6b88aa..1f2d10a57 100644
--- a/dist/etc/network/subzero/main.cfg
+++ b/dist/etc/network/subzero/main.cfg
@@ -18,7 +18,7 @@ is_static_genesis_block=true
 static_genesis_block=0x4E4FC8F1B04683861370C023D23C4DD67CEF4B82698E405537BA64BDDF81CE26
 
 [esbocs]
-consensus_debug=true
+consensus_debug=false
 min_validators_count=2
 auth_certs_prefix=subzero.master
 validators_addrs=[6E38::C103::53BE::C7BD, 8CA6::AB31::5798::4469, 8EA1::0678::E93F::55B4]
diff --git a/dist/share/configs/cellframe-node.cfg b/dist/share/configs/cellframe-node.cfg
index 4e269e43b..1760cd1bf 100644
--- a/dist/share/configs/cellframe-node.cfg
+++ b/dist/share/configs/cellframe-node.cfg
@@ -88,6 +88,15 @@ auto_proc=false
 [chain_net]
 # debug_more=true
 
+[blocks]
+# debug_more=true
+
+[sign]
+# debug_more=true
+
+[stake]
+# debug_more=true
+
 [stream_ch_chain]
 # Uncomment to have more debug information in stream channel Chain
 # False by default
@@ -119,7 +128,7 @@ network_mask=255.255.255.0
 [cli-server]
 enabled=true
 #listen_port_tcp=12345
-#listen_unix_socket_path={{CONFIGS_PATH}}/var/run/node_cli
+#listen_unix_socket_path=../var/run/node_cli
 # Default permissions 770
 # IMPORTANT! Its accessible for all the users in system!
 listen_unix_socket_permissions=777
@@ -129,17 +138,17 @@ listen_unix_socket_permissions=777
 #   0 means auto detect
 threads_cnt=0 
 # By default notify opens at {CONFIGS_PATH}/var/run/node_notify
-notify_path=${CONFIGS_PATH}/var/run/node_notify
+notify_path=../var/run/node_notify
 #notify_permissions=770
 #notify_user=myuser
 #notify_group=mygroup
-pid_path=${CONFIGS_PATH}/var/run/cellframe-node.pid
-log_file=${CONFIGS_PATH}/var/log/cellframe-node.log
-wallets_path=${CONFIGS_PATH}/var/lib/wallet
-ca_folders=[${CONFIGS_PATH}/var/lib/ca,${CONFIGS_PATH}/share/ca]
+pid_path=../var/run/cellframe-node.pid
+log_file=../var/log/cellframe-node.log
+wallets_path=../var/lib/wallet
+ca_folders=[../var/lib/ca,../share/ca]
 
 [global_db]
-path=${CONFIGS_PATH}/var/lib/global_db
+path=../var/lib/global_db
 driver=
 #debug_more=true
 
diff --git a/dist/share/default.setup b/dist/share/default.setup
index b5951deab..56dd7602d 100644
--- a/dist/share/default.setup
+++ b/dist/share/default.setup
@@ -78,7 +78,7 @@ config cellframe-node  plugins          enabled          default     false
 
 # all os except win uses unix socket for cli
 if ${HOST_OS} != Windows
-    config cellframe-node  cli-server    listen-path          ensure    [${CONFIGS_PATH}/var/run/node_cli]
+    config cellframe-node  cli-server    listen-path          ensure    [../var/run/node_cli]
 endif
 
 # windows use tcp/ip for conserver
@@ -91,7 +91,7 @@ if Linux != ${HOST_OS}
     config cellframe-node  plugins       enabled          ensure     false
 endif
 
-config cellframe-node  plugins       py_path          ensure     ${CONFIGS_PATH}/var/lib/plugins
+config cellframe-node  plugins       py_path          ensure     ../var/lib/plugins
 
 config  Backbone     general     node-role   default     full
 config  KelVPN       general     node-role   default     full
diff --git a/sources/main.c b/sources/main.c
index ca2ac5815..ba2491ef2 100755
--- a/sources/main.c
+++ b/sources/main.c
@@ -109,7 +109,6 @@
 #include "dap_chain_net_srv_stake_pos_delegate.h"
 #include "dap_chain_net_srv_stake_lock.h"
 
-#include "dap_common.h"
 #include "dap_events_socket.h"
 #include "dap_client.h"
 #include "dap_http_simple.h"
@@ -151,15 +150,24 @@ int main( int argc, const char **argv )
     #if defined(_WIN32) && defined(NDEBUG)
         S_SetExceptionFilter( );
     #endif
-#ifdef _WIN32
-    g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), dap_get_appname());
-#elif DAP_OS_MAC
-    g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources");
-#elif DAP_OS_ANDROID
-    g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s",dap_get_appname());
-#elif DAP_OS_UNIX
-    g_sys_dir_path = dap_strdup_printf("/opt/%s", dap_get_appname());
-#endif
+
+    // get relative path to config
+    if (argv[1] && argv[2] &&!dap_strcmp("-B" , argv[1]))
+        g_sys_dir_path = (char*)argv[2];
+
+    if (!g_sys_dir_path) {
+    #ifdef DAP_OS_WINDOWS
+        g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), dap_get_appname());
+    #elif DAP_OS_MAC
+        g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources");
+    #elif DAP_OS_ANDROID
+        g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s",dap_get_appname());
+    #elif DAP_OS_UNIX
+        g_sys_dir_path = dap_strdup_printf("/opt/%s", dap_get_appname());
+    #endif
+    }
+
+    log_it(L_DEBUG, "Use main path: %s", g_sys_dir_path);
 
     {
         char *l_log_dir = dap_strdup_printf("%s/var/log", g_sys_dir_path);
@@ -186,7 +194,7 @@ int main( int argc, const char **argv )
 #ifndef DAP_OS_WINDOWS
     char l_default_dir[MAX_PATH] = {'\0'};
     sprintf(l_default_dir, "%s/tmp", g_sys_dir_path);
-    s_pid_file_path = dap_config_get_item_str_default(g_config,  "resources", "pid_path", l_default_dir) ;
+    s_pid_file_path = dap_config_get_item_str_path_default(g_config,  "resources", "pid_path", l_default_dir) ;
     save_process_pid_in_file(s_pid_file_path);
 #endif
 
diff --git a/sources/main_node_cli.c b/sources/main_node_cli.c
index 028d505ad..091ece818 100644
--- a/sources/main_node_cli.c
+++ b/sources/main_node_cli.c
@@ -60,21 +60,27 @@ int main(int argc, const char *argv[])
     SetConsoleOutputCP(1252);
     WSADATA wsaData;
     WSAStartup(MAKEWORD(2,2), &wsaData);
-    g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), NODE_NAME);
-#elif DAP_OS_MAC
-    char * l_username = NULL;
-    exec_with_ret(&l_username,"whoami|tr -d '\n'");
-    if (!l_username){
-        printf("Fatal Error: Can't obtain username");
-        return 2;
-    }
-    g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources", l_username);
-    DAP_DELETE(l_username);
-#elif DAP_OS_ANDROID
-    g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s", NODE_NAME);
-#elif DAP_OS_UNIX
-    g_sys_dir_path = dap_strdup_printf("/opt/%s", NODE_NAME);
 #endif
+
+    // get relative path to config
+    int l_rel_path = 0;
+    if (argv[1] && argv[2] && !dap_strcmp("-B" , argv[1])) {
+        g_sys_dir_path = (char*)argv[2];
+        l_rel_path = 1;
+    }
+    if (!g_sys_dir_path) {
+    #ifdef DAP_OS_WINDOWS
+        g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), NODE_NAME);
+    #elif DAP_OS_MAC
+        g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources");
+    #elif DAP_OS_ANDROID
+        g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s", NODE_NAME);
+    #elif DAP_OS_UNIX
+        g_sys_dir_path = dap_strdup_printf("/opt/%s", NODE_NAME);
+    #endif
+    }
+
+
     /*if (dap_common_init(dap_get_appname(), NULL, NULL) != 0) {
         printf("Fatal Error: Can't init common functions module");
         return -2;
@@ -86,7 +92,7 @@ int main(int argc, const char *argv[])
         dap_config_init(l_config_dir);
     }
     dap_log_level_set(L_CRITICAL);
-    int res = dap_app_cli_main(NODE_NAME, argc, argv);
+    int res = dap_app_cli_main(NODE_NAME, l_rel_path ? argc - 2 : argc, l_rel_path ? argv + 2 : argv);
     switch (res) {
         case DAP_CLI_ERROR_FORMAT:
             printf("Response format error!\n");
diff --git a/sources/main_node_tool.c b/sources/main_node_tool.c
index ababf8d5f..1f3030582 100644
--- a/sources/main_node_tool.c
+++ b/sources/main_node_tool.c
@@ -45,7 +45,7 @@
 #define log_it(_log_level, string, ...) printf(string, ##__VA_ARGS__)
 #endif
 
-static int s_init( int argc, const char * argv[] );
+static int s_init();
 static void s_help( );
 static int s_is_file_available (char *l_path, const char *name, const char *ext);
 static void s_fill_hash_key_for_data(dap_enc_key_t *key, void *data);
@@ -112,7 +112,28 @@ struct options {
 int main(int argc, const char **argv)
 #endif
 {
-  int ret = s_init( argc, argv );
+  dap_set_appname("cellframe-node");
+
+    // get relative path to config
+    int l_rel_path = 0;
+    if (argv[1] && argv[2] && !dap_strcmp("-B" , argv[1])) {
+        g_sys_dir_path = (char*)argv[2];
+        l_rel_path = 1;
+    }
+
+    if (!g_sys_dir_path) {
+    #ifdef DAP_OS_WINDOWS
+        g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), dap_get_appname());
+    #elif DAP_OS_MAC
+        g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources");
+    #elif DAP_OS_ANDROID
+        g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s",dap_get_appname());
+    #elif DAP_OS_UNIX
+        g_sys_dir_path = dap_strdup_printf("/opt/%s", dap_get_appname());
+    #endif
+    }
+
+  int ret = s_init();
 
   if ( ret ) {
     log_it( L_ERROR, "Can't init modules" );
@@ -129,7 +150,7 @@ int main(int argc, const char **argv)
   bool l_find_cmd = false;
   bool l_find_subcmd = true;
   for (size_t i = 0; i < l_size; i++) {
-      int argv_index = 1;
+      int argv_index = 1 + l_rel_path*2;
       if (argc >= argv_index && !strncmp(s_opts[i].cmd, argv[argv_index], strlen (argv[argv_index]) + 1)) {
           l_find_cmd = true;
           l_find_subcmd = false;
@@ -145,7 +166,7 @@ int main(int argc, const char **argv)
               }
           }
           if (match) {
-              int l_ret = s_opts[i].handler(argc, argv);
+              int l_ret = s_opts[i].handler(l_rel_path ? argc-2 : argc, l_rel_path ? argv+2 : argv);
               return l_ret;
           }
       }
@@ -610,27 +631,8 @@ static int s_cert_get_addr(int argc, const char **argv) {
  * @param argv
  * @return
  */
-static int s_init( int argc, const char **argv )
+static int s_init()
 {
-    UNUSED(argc);
-    UNUSED(argv);
-    dap_set_appname("cellframe-node");
-#ifdef _WIN32
-    g_sys_dir_path = dap_strdup_printf("%s/%s", regGetUsrPath(), dap_get_appname());
-#elif DAP_OS_MAC
-    char * l_username = NULL;
-    exec_with_ret(&l_username,"whoami|tr -d '\n'");
-    if (!l_username){
-        printf("Fatal Error: Can't obtain username");
-    return 2;
-    }
-    g_sys_dir_path = dap_strdup_printf("/Applications/CellframeNode.app/Contents/Resources", l_username);
-    DAP_DELETE(l_username);
-#elif DAP_OS_ANDROID
-    g_sys_dir_path = dap_strdup_printf("/storage/emulated/0/opt/%s",dap_get_appname());
-#elif DAP_OS_UNIX
-    g_sys_dir_path = dap_strdup_printf("/opt/%s", dap_get_appname());
-#endif
     if (dap_common_init(dap_get_appname(), NULL, NULL) != 0) {
         printf("Fatal Error: Can't init common functions module");
         return -2;
@@ -642,13 +644,15 @@ static int s_init( int argc, const char **argv )
     g_config = dap_config_open(dap_get_appname());
     if (g_config) {
         uint16_t l_ca_folders_size = 0;
-        char **l_ca_folders = dap_config_get_array_str(g_config, "resources", "ca_folders", &l_ca_folders_size);
+        char **l_ca_folders = dap_config_get_item_str_path_array(g_config, "resources", "ca_folders", &l_ca_folders_size);
         dap_stpcpy(s_system_ca_dir, l_ca_folders[0]);
+        dap_config_get_item_str_path_array_free(l_ca_folders, &l_ca_folders_size);
         int t = dap_strlen(s_system_ca_dir);
         if (s_system_ca_dir[t - 1] == '/')
             s_system_ca_dir[t-1] = '\0';
-        const char *l_wallet_folder = dap_config_get_item_str(g_config, "resources", "wallets_path");
+        char *l_wallet_folder = dap_config_get_item_str_path_default(g_config, "resources", "wallets_path", NULL);
         dap_stpcpy(s_system_wallet_dir, l_wallet_folder);
+        DAP_DEL_Z(l_wallet_folder);
     } else {
         dap_stpcpy(s_system_ca_dir, "./");
         dap_stpcpy(s_system_wallet_dir, "./");
-- 
GitLab