tools: add turn to dsh

Change-Id: I6c252a9f9d6de1c4f6d85043d3ed238eec747244
diff --git a/tools/dsh/dsh.cpp b/tools/dsh/dsh.cpp
index 51b80a5..92f30b1 100644
--- a/tools/dsh/dsh.cpp
+++ b/tools/dsh/dsh.cpp
@@ -87,7 +87,11 @@
 
 dhtnet::Dsh::Dsh(const std::filesystem::path& path,
                  dht::crypto::Identity identity,
-                 const std::string& bootstrap)
+                 const std::string& bootstrap,
+                 const std::string& turn_host,
+                 const std::string& turn_user,
+                 const std::string& turn_pass,
+                 const std::string& turn_realm)
     : logger(dht::log::getStdLogger())
     // , std::shared_ptr<tls::CertificateStore>(path / "certstore", logger)
 {
@@ -218,8 +222,12 @@
                  dht::crypto::Identity identity,
                  const std::string& bootstrap,
                  dht::InfoHash peer_id,
-                 const std::string& binary)
-    : Dsh(path, identity, bootstrap)
+                 const std::string& binary,
+                 const std::string& turn_host,
+                 const std::string& turn_user,
+                 const std::string& turn_pass,
+                 const std::string& turn_realm)
+    : Dsh(path, identity, bootstrap, turn_host, turn_user, turn_pass, turn_realm)
 {
     // Build a client
     std::condition_variable cv;
diff --git a/tools/dsh/dsh.h b/tools/dsh/dsh.h
index 09ab147..c349619 100644
--- a/tools/dsh/dsh.h
+++ b/tools/dsh/dsh.h
@@ -29,13 +29,21 @@
     // Build a server
     Dsh(const std::filesystem::path& path,
         dht::crypto::Identity identity,
-        const std::string& bootstrap);
+        const std::string& bootstrap,
+        const std::string& turn_host,
+        const std::string& turn_user,
+        const std::string& turn_pass,
+        const std::string& turn_realm);
     // Build a client
     Dsh(const std::filesystem::path& path,
         dht::crypto::Identity identity,
         const std::string& bootstrap,
         dht::InfoHash peer_id,
-        const std::string& binary);
+        const std::string& binary,
+        const std::string& turn_host,
+        const std::string& turn_user,
+        const std::string& turn_pass,
+        const std::string& turn_realm);
     ~Dsh();
     void run();
 
diff --git a/tools/dsh/main.cpp b/tools/dsh/main.cpp
index a259cdc..b6697a3 100644
--- a/tools/dsh/main.cpp
+++ b/tools/dsh/main.cpp
@@ -28,7 +28,8 @@
 #else
 #include <fmt/ostream.h>
 #endif
-
+#include <yaml-cpp/yaml.h>
+#include <fstream>
 
 struct dhtsh_params
 {
@@ -39,22 +40,35 @@
     std::string bootstrap {};
     dht::InfoHash peer_id {};
     std::string binary {};
+    std::string ca {};
+    std::string turn_host {};
+    std::string turn_user {};
+    std::string turn_pass {};
+    std::string turn_realm {};
+    std::string dsh_configuration {};
 };
 
-static const constexpr struct option long_options[] = {{"help", no_argument, nullptr, 'h'},
-                                                       {"version", no_argument, nullptr, 'v'},
-                                                       {"listen", no_argument, nullptr, 'l'},
-                                                       {"bootstrap", required_argument, nullptr, 'b'},
-                                                       {"binary", required_argument, nullptr, 's'},
-                                                       {"id_path", required_argument, nullptr, 'I'},
-                                                       {nullptr, 0, nullptr, 0}};
+static const constexpr struct option long_options[]
+    = {{"help", no_argument, nullptr, 'h'},
+       {"version", no_argument, nullptr, 'v'},
+       {"listen", no_argument, nullptr, 'l'},
+       {"bootstrap", required_argument, nullptr, 'b'},
+       {"binary", required_argument, nullptr, 's'},
+       {"id_path", required_argument, nullptr, 'I'},
+       {"CA", required_argument, nullptr, 'C'},
+       {"turn_host", required_argument, nullptr, 't'},
+       {"turn_user", required_argument, nullptr, 'u'},
+       {"turn_pass", required_argument, nullptr, 'w'},
+       {"turn_realm", required_argument, nullptr, 'r'},
+       {"dsh_configuration", required_argument, nullptr, 'd'},
+       {nullptr, 0, nullptr, 0}};
 
 dhtsh_params
 parse_args(int argc, char** argv)
 {
     dhtsh_params params;
     int opt;
-    while ((opt = getopt_long(argc, argv, "hvls:I:p:i:", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hvls:I:p:i:C:r:w:u:t:d:", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'h':
             params.help = true;
@@ -74,6 +88,23 @@
         case 'I':
             params.path = optarg;
             break;
+        case 't':
+            params.turn_host = optarg;
+            break;
+        case 'u':
+            params.turn_user = optarg;
+            break;
+        case 'w':
+            params.turn_pass = optarg;
+            break;
+        case 'r':
+            params.turn_realm = optarg;
+            break;
+        case 'C':
+            params.ca = optarg;
+            break;
+        case 'd':
+            params.dsh_configuration = optarg;
         default:
             std::cerr << "Invalid option" << std::endl;
             exit(EXIT_FAILURE);
@@ -127,13 +158,18 @@
 
     if (params.help){
         fmt::print("Usage: dsh [OPTIONS] [PEER_ID]\n"
-                    "\nOptions:\n"
-                    "  -h, --help            Show this help message and exit.\n"
-                    "  -v, --version         Display the program version.\n"
-                    "  -l, --listen          Start the program in listen mode.\n"
-                    "  -b, --bootstrap       Specify the bootstrap option with an argument.\n"
-                    "  -s, --binary          Specify the binary option with an argument.\n"
-                    "  -I, --id_path         Specify the id_path option with an argument.\n");
+                   "\nOptions:\n"
+                   "  -h, --help            Show this help message and exit.\n"
+                   "  -v, --version         Display the program version.\n"
+                   "  -l, --listen          Start the program in listen mode.\n"
+                   "  -b, --bootstrap       Specify the bootstrap option with an argument.\n"
+                   "  -s, --binary          Specify the binary option with an argument.\n"
+                   "  -I, --id_path         Specify the id_path option with an argument.\n"
+                   "  -C, --CA              Specify the CA option with an argument.\n"
+                   "  -t, --turn_host       Specify the turn_host option with an argument.\n"
+                   "  -u, --turn_user       Specify the turn_user option with an argument.\n"
+                   "  -w, --turn_pass       Specify the turn_pass option with an argument.\n"
+                   "  -r, --turn_realm      Specify the turn_realm option with an argument.\n");
         return EXIT_SUCCESS;
     }
     if (params.version){
@@ -149,16 +185,25 @@
     std::unique_ptr<dhtnet::Dsh> dhtsh;
     if (params.listen) {
         // create dnc instance
-        dhtsh = std::make_unique<dhtnet::Dsh>(params.path, identity, params.bootstrap);
+        dhtsh = std::make_unique<dhtnet::Dsh>(params.path,
+                                              identity,
+                                              params.bootstrap,
+                                              params.turn_host,
+                                              params.turn_user,
+                                              params.turn_pass,
+                                              params.turn_realm);
     } else {
         dhtsh = std::make_unique<dhtnet::Dsh>(params.path,
                                               identity,
                                               params.bootstrap,
                                               params.peer_id,
-                                              params.binary);
+                                              params.binary,
+                                              params.turn_host,
+                                              params.turn_user,
+                                              params.turn_pass,
+                                              params.turn_realm);
     }
 
     dhtsh->run();
     return EXIT_SUCCESS;
-
 }