Skip to content
Snippets Groups Projects
Commit ecde63fd authored by Adrien Béraud's avatar Adrien Béraud
Browse files

tools/dnc: cleanup

Change-Id: I18214484a3ce7e8be87a37f2ca97ca114fa12348
parent d78d1acb
Branches
No related tags found
No related merge requests found
...@@ -31,53 +31,44 @@ ...@@ -31,53 +31,44 @@
namespace dhtnet { namespace dhtnet {
dht::crypto::Identity dht::crypto::Identity
loadIdentity(bool isServer) loadIdentity(const std::filesystem::path& path)
{ {
std::string idDir = std::string(getenv("HOME")) + "/.dhtnetTools"; if (!std::filesystem::exists(path)) {
if (isServer){ std::filesystem::create_directory(path);
if (!std::filesystem::exists(idDir)) {
std::filesystem::create_directory(idDir);
} }
try { try {
std::filesystem::directory_iterator endIter; for (const auto& path: std::filesystem::directory_iterator(path)) {
for (std::filesystem::directory_iterator iter(idDir); iter != endIter; ++iter) { auto p = path.path();
if (iter->path().extension() == ".pem") { if (p.extension() == ".pem") {
auto privateKey = std::make_unique<dht::crypto::PrivateKey>( auto privateKey = std::make_unique<dht::crypto::PrivateKey>(
fileutils::loadFile(std::filesystem::path(iter->path()))); fileutils::loadFile(p));
// Generate certificate
auto certificate = std::make_unique<dht::crypto::Certificate>( auto certificate = std::make_unique<dht::crypto::Certificate>(
dht::crypto::Certificate::generate(*privateKey, "dhtnc")); fileutils::loadFile(p.replace_extension(".crt")));
// return
return dht::crypto::Identity(std::move(privateKey), std::move(certificate)); return dht::crypto::Identity(std::move(privateKey), std::move(certificate));
} }
} }
} catch (const std::exception& e) { } catch (const std::exception& e) {
fmt::print(stderr, "Error loadind key from .dhtnetTools: {}\n", e.what()); fmt::print(stderr, "Error loadind key from .dhtnetTools: {}\n", e.what());
} }
}
auto ca = dht::crypto::generateIdentity("ca"); auto ca = dht::crypto::generateIdentity("ca");
auto id = dht::crypto::generateIdentity("dhtnc", ca); auto id = dht::crypto::generateIdentity("dhtnc", ca);
idDir += "/id"; dht::crypto::saveIdentity(id, path / "id");
if (isServer)
dht::crypto::saveIdentity(id, idDir);
return id; return id;
} }
std::unique_ptr<ConnectionManager::Config> std::unique_ptr<ConnectionManager::Config>
connectionManagerConfig(dht::crypto::Identity identity, connectionManagerConfig(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port, const std::string& bootstrap,
std::shared_ptr<Logger> logger, std::shared_ptr<Logger> logger,
tls::CertificateStore& certStore, tls::CertificateStore& certStore,
std::shared_ptr<asio::io_context> ioContext, std::shared_ptr<asio::io_context> ioContext,
IceTransportFactory& iceFactory) IceTransportFactory& iceFactory)
{ {
std::filesystem::create_directories(std::string(getenv("HOME")) + "/.dhtnetTools/certstore"); std::filesystem::create_directories(path / "certstore");
// DHT node creation: To make a connection manager at first a DHT node should be created // DHT node creation: To make a connection manager at first a DHT node should be created
dht::DhtRunner::Config dhtConfig; dht::DhtRunner::Config dhtConfig;
dhtConfig.dht_config.id = identity; dhtConfig.dht_config.id = identity;
dhtConfig.threaded = true; dhtConfig.threaded = true;
...@@ -96,7 +87,7 @@ connectionManagerConfig(dht::crypto::Identity identity, ...@@ -96,7 +87,7 @@ connectionManagerConfig(dht::crypto::Identity identity,
}; };
auto runner = std::make_shared<dht::DhtRunner>(); auto runner = std::make_shared<dht::DhtRunner>();
runner->run(dhtConfig, std::move(dhtContext)); runner->run(dhtConfig, std::move(dhtContext));
runner->bootstrap(bootstrap_ip_add, bootstrap_port); runner->bootstrap(bootstrap);
// DHT node creation end: // DHT node creation end:
// ConnectionManager creation: // ConnectionManager creation:
...@@ -106,7 +97,8 @@ connectionManagerConfig(dht::crypto::Identity identity, ...@@ -106,7 +97,8 @@ connectionManagerConfig(dht::crypto::Identity identity,
config->ioContext = ioContext; config->ioContext = ioContext;
config->certStore = &certStore; config->certStore = &certStore;
config->factory = &iceFactory; config->factory = &iceFactory;
config->cachePath = std::string(getenv("HOME")) + "/.dhtnetTools"; config->cachePath = path;
config->logger = logger;
return std::move(config); return std::move(config);
} }
......
...@@ -26,12 +26,11 @@ using Buffer = std::shared_ptr<std::vector<uint8_t>>; ...@@ -26,12 +26,11 @@ using Buffer = std::shared_ptr<std::vector<uint8_t>>;
* certification. * certification.
* @return dht::crypto::Identity * @return dht::crypto::Identity
*/ */
dht::crypto::Identity loadIdentity(const std::filesystem::path& path);
dht::crypto::Identity loadIdentity(bool isServer);
// add certstore to the config // add certstore to the config
std::unique_ptr<ConnectionManager::Config> connectionManagerConfig(dht::crypto::Identity identity, std::unique_ptr<ConnectionManager::Config> connectionManagerConfig(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port, const std::string& bootstrap,
std::shared_ptr<Logger> logger, std::shared_ptr<Logger> logger,
tls::CertificateStore& certStore, tls::CertificateStore& certStore,
std::shared_ptr<asio::io_context> ioContext, std::shared_ptr<asio::io_context> ioContext,
......
...@@ -55,11 +55,11 @@ Dnc::parseName(const std::string_view name) ...@@ -55,11 +55,11 @@ Dnc::parseName(const std::string_view name)
// Build a server // Build a server
Dnc::Dnc(dht::crypto::Identity identity, Dnc::Dnc(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port) const std::string& bootstrap)
: logger(dht::log::getStdLogger()) : logger(dht::log::getStdLogger())
, certStore(std::string(getenv("HOME")) + "/.dhtnetTools/certstore", logger) , certStore(path / "certstore", logger)
{ {
ioContext = std::make_shared<asio::io_context>(); ioContext = std::make_shared<asio::io_context>();
...@@ -73,7 +73,7 @@ Dnc::Dnc(dht::crypto::Identity identity, ...@@ -73,7 +73,7 @@ Dnc::Dnc(dht::crypto::Identity identity,
} }
}); });
auto config = connectionManagerConfig(identity, bootstrap_ip_add, bootstrap_port, logger, certStore, ioContext, iceFactory); auto config = connectionManagerConfig(path, identity, bootstrap, logger, certStore, ioContext, iceFactory);
// create a connection manager // create a connection manager
connectionManager = std::make_unique<ConnectionManager>(std::move(config)); connectionManager = std::make_unique<ConnectionManager>(std::move(config));
...@@ -91,7 +91,7 @@ Dnc::Dnc(dht::crypto::Identity identity, ...@@ -91,7 +91,7 @@ Dnc::Dnc(dht::crypto::Identity identity,
[&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name) { [&](const std::shared_ptr<dht::crypto::Certificate>&, const std::string& name) {
// handle channel request // handle channel request
if (logger) if (logger)
logger->debug("Channel request received"); logger->debug("Channel request received: {}", name);
return true; return true;
}); });
...@@ -104,6 +104,9 @@ Dnc::Dnc(dht::crypto::Identity identity, ...@@ -104,6 +104,9 @@ Dnc::Dnc(dht::crypto::Identity identity,
} }
try { try {
auto parsedName = parseName(name); auto parsedName = parseName(name);
if (logger)
logger->debug("Connecting to {}:{}", parsedName.first, parsedName.second);
asio::ip::tcp::resolver resolver(*ioContext); asio::ip::tcp::resolver resolver(*ioContext);
asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(parsedName.first, asio::ip::tcp::resolver::results_type endpoints = resolver.resolve(parsedName.first,
parsedName.second); parsedName.second);
...@@ -140,6 +143,7 @@ Dnc::Dnc(dht::crypto::Identity identity, ...@@ -140,6 +143,7 @@ Dnc::Dnc(dht::crypto::Identity identity,
} else { } else {
if (logger) if (logger)
logger->error("Connection error: {}", error.message()); logger->error("Connection error: {}", error.message());
mtlxSocket->shutdown();
} }
}); });
...@@ -150,16 +154,16 @@ Dnc::Dnc(dht::crypto::Identity identity, ...@@ -150,16 +154,16 @@ Dnc::Dnc(dht::crypto::Identity identity,
}); });
} }
// Build a client // Build a client
Dnc::Dnc(dht::crypto::Identity identity, Dnc::Dnc(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port, const std::string& bootstrap,
dht::InfoHash peer_id, dht::InfoHash peer_id,
int port, const std::string& remote_host,
const std::string& ip_add) int remote_port)
: Dnc(identity, bootstrap_ip_add, bootstrap_port) : Dnc(path, identity, bootstrap)
{ {
std::condition_variable cv; std::condition_variable cv;
auto name = fmt::format("nc://{:s}:{:d}", ip_add, port); auto name = fmt::format("nc://{:s}:{:d}", remote_host, remote_port);
connectionManager->connectDevice(peer_id, connectionManager->connectDevice(peer_id,
name, name,
[&](std::shared_ptr<ChannelSocket> socket, [&](std::shared_ptr<ChannelSocket> socket,
......
...@@ -32,16 +32,16 @@ class Dnc ...@@ -32,16 +32,16 @@ class Dnc
{ {
public: public:
// Build a server // Build a server
Dnc(dht::crypto::Identity identity, Dnc(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port); const std::string& bootstrap);
// Build a client // Build a client
Dnc(dht::crypto::Identity identity, Dnc(const std::filesystem::path& path,
const std::string& bootstrap_ip_add, dht::crypto::Identity identity,
const std::string& bootstrap_port, const std::string& bootstrap,
dht::InfoHash peer_id, dht::InfoHash peer_id,
int port, const std::string& remote_host,
const std::string& ip_add); int remote_port);
~Dnc(); ~Dnc();
void run(); void run();
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include <iostream> #include <iostream>
#include <unistd.h> #include <unistd.h>
#include <getopt.h> #include <getopt.h>
#include <fmt/std.h>
#include <netinet/in.h> #include <netinet/in.h>
struct dhtnc_params struct dhtnc_params
...@@ -30,21 +30,23 @@ struct dhtnc_params ...@@ -30,21 +30,23 @@ struct dhtnc_params
bool help {false}; bool help {false};
bool version {false}; bool version {false};
bool listen {false}; bool listen {false};
std::string ip_add {}; bool verbose {false};
std::string bootstrap_ip {}; std::filesystem::path path {};
std::string bootstrap_port {}; std::string bootstrap {};
in_port_t port {}; std::string remote_host {};
in_port_t remote_port {};
dht::InfoHash peer_id {}; dht::InfoHash peer_id {};
}; };
static const constexpr struct option long_options[] static const constexpr struct option long_options[]
= {{"help", no_argument, nullptr, 'h'}, = {{"help", no_argument, nullptr, 'h'},
{"version", no_argument, nullptr, 'v'}, {"version", no_argument, nullptr, 'V'},
{"verbose", no_argument, nullptr, 'v'},
{"port", required_argument, nullptr, 'p'}, {"port", required_argument, nullptr, 'p'},
{"ip", required_argument, nullptr, 'i'}, {"ip", required_argument, nullptr, 'i'},
{"listen", no_argument, nullptr, 'l'}, {"listen", no_argument, nullptr, 'l'},
{"bootstrap_ip", required_argument, nullptr, 'b'}, {"bootstrap", required_argument, nullptr, 'b'},
{"bootstrap_port", required_argument, nullptr, 'P'}, {"id_path", required_argument, nullptr, 'I'},
{nullptr, 0, nullptr, 0}}; {nullptr, 0, nullptr, 0}};
dhtnc_params dhtnc_params
...@@ -52,28 +54,32 @@ parse_args(int argc, char** argv) ...@@ -52,28 +54,32 @@ parse_args(int argc, char** argv)
{ {
dhtnc_params params; dhtnc_params params;
int opt; int opt;
while ((opt = getopt_long(argc, argv, "hvp:i:", long_options, nullptr)) != -1) { while ((opt = getopt_long(argc, argv, "hvI:p:i:", long_options, nullptr)) != -1) {
fmt::print("opt: {} {}\n", opt, optarg);
switch (opt) { switch (opt) {
case 'h': case 'h':
params.help = true; params.help = true;
break; break;
case 'v': case 'V':
params.version = true; params.version = true;
break; break;
case 'v':
params.verbose = true;
break;
case 'p': case 'p':
params.port = std::stoi(optarg); params.remote_port = std::stoi(optarg);
break; break;
case 'i': case 'i':
params.ip_add = optarg; params.remote_host = optarg;
break; break;
case 'l': case 'l':
params.listen = true; params.listen = true;
break; break;
case 'b': case 'b':
params.bootstrap_ip = optarg; params.bootstrap = optarg;
break; break;
case 'P': case 'I':
params.bootstrap_port = optarg; params.path = optarg;
break; break;
default: default:
std::cerr << "Invalid option" << std::endl; std::cerr << "Invalid option" << std::endl;
...@@ -93,14 +99,14 @@ parse_args(int argc, char** argv) ...@@ -93,14 +99,14 @@ parse_args(int argc, char** argv)
} }
// default values // default values
if (params.port == 0) if (params.remote_port == 0)
params.port = 22; params.remote_port = 2000;
if (params.ip_add.empty()) if (params.remote_host.empty())
params.ip_add = "127.0.0.1"; params.remote_host = "127.0.0.1";
if (params.bootstrap_ip.empty()) if (params.bootstrap.empty())
params.bootstrap_ip = "bootstrap.jami.net"; params.bootstrap = "bootstrap.jami.net";
if (params.bootstrap_port.empty()) if (params.path.empty())
params.bootstrap_port = "4222"; params.path = std::filesystem::path(getenv("HOME")) / ".dhtnet";
return params; return params;
} }
...@@ -126,26 +132,23 @@ setSipLogLevel() ...@@ -126,26 +132,23 @@ setSipLogLevel()
int int
main(int argc, char** argv) main(int argc, char** argv)
{ {
fmt::print("dnc 1.0\n");
setSipLogLevel(); setSipLogLevel();
auto params = parse_args(argc, argv); auto params = parse_args(argc, argv);
auto identity = dhtnet::loadIdentity(params.path);
fmt::print("Loaded identity: {} from {}\n", identity.second->getId(), params.path);
std::unique_ptr<dhtnet::Dnc> dhtnc; std::unique_ptr<dhtnet::Dnc> dhtnc;
if (params.listen) { if (params.listen) {
auto identity = dhtnet::loadIdentity(true);
// create dnc instance // create dnc instance
dhtnc = std::make_unique<dhtnet::Dnc>(identity, params.bootstrap_ip, params.bootstrap_port); dhtnc = std::make_unique<dhtnet::Dnc>(params.path, identity, params.bootstrap);
fmt::print("DhtNC 1.1\n");
fmt::print("Loaded identity: {}\n", identity.second->getId());
} else { } else {
auto identity = dhtnet::loadIdentity(false); dhtnc = std::make_unique<dhtnet::Dnc>(params.path,
dhtnc = std::make_unique<dhtnet::Dnc>(identity, identity,
params.bootstrap_ip, params.bootstrap,
params.bootstrap_port,
params.peer_id, params.peer_id,
params.port, params.remote_host,
params.ip_add); params.remote_port);
fmt::print("DhtNC 1.0\n");
fmt::print("Loaded identity: {}\n", identity.second->getId());
} }
dhtnc->run(); dhtnc->run();
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment