diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index cf29f2650..d2817dd9e 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -5,14 +5,14 @@ if(SHADOW) enable_lto(shadow-plugin) else() add_executable(lokinet main.cpp) - add_executable(lokinetctl lokinetctl.cpp) - enable_lto(lokinet lokinetctl) + add_executable(lokinet-vpn lokinet-vpn.cpp) + enable_lto(lokinet lokinet-vpn) if(TRACY_ROOT) target_sources(lokinet PRIVATE ${TRACY_ROOT}/TracyClient.cpp) endif() - foreach(exe lokinet lokinetctl) + foreach(exe lokinet lokinet-vpn) if(WIN32 AND NOT MSVC_VERSION) target_sources(${exe} PRIVATE ../llarp/win32/version.rc) target_link_libraries(${exe} PRIVATE ws2_32 iphlpapi) @@ -38,12 +38,7 @@ else() install(CODE "execute_process(COMMAND setcap cap_net_admin,cap_net_bind_service=+eip ${CMAKE_INSTALL_PREFIX}/bin/lokinet)") endif() - if(CURL_FOUND) - target_include_directories(lokinetctl PRIVATE ${CURL_INCLUDE_DIRS}) - target_link_libraries(lokinetctl PRIVATE ${CURL_LIBRARIES}) - endif(CURL_FOUND) - - install(PROGRAMS lokinet-vpn DESTINATION bin COMPONENT lokinet) + install(TARGETS lokinet-vpn RUNTIME DESTINATION bin COMPONENT lokinet) endif() diff --git a/daemon/lokinet-vpn.cpp b/daemon/lokinet-vpn.cpp new file mode 100644 index 000000000..b31060739 --- /dev/null +++ b/daemon/lokinet-vpn.cpp @@ -0,0 +1,87 @@ +#include +#include +#include + +int +main(int argc, char* argv[]) +{ + cxxopts::Options opts("lokinet-vpn", "LokiNET vpn control utility"); + + opts.add_options()("v,verbose", "Verbose", cxxopts::value())( + "h,help", "help", cxxopts::value())("up", "put vpn up", cxxopts::value())( + "down", "put vpn down", cxxopts::value())( + "exit", "specify exit node address", cxxopts::value())( + "rpc", "rpc url for lokinet", cxxopts::value()); + + lokimq::address rpcURL("tcp://127.0.0.1:1190"); + std::string exitAddress; + lokimq::LogLevel logLevel = lokimq::LogLevel::warn; + bool goUp = false; + bool goDown = false; + try + { + const auto result = opts.parse(argc, argv); + + if (result.count("help") > 0) + { + std::cout << opts.help() << std::endl; + return 0; + } + + if (result.count("verbose") > 0) + { + logLevel = lokimq::LogLevel::debug; + } + if (result.count("rpc") > 0) + { + rpcURL = lokimq::address(result["rpc"].as()); + } + if (result.count("exit") > 0) + { + exitAddress = result["exit"].as(); + } + goUp = result.count("up") > 0; + goDown = result.count("down") > 0; + } + catch (const cxxopts::option_not_exists_exception& ex) + { + std::cerr << ex.what(); + std::cout << opts.help() << std::endl; + return 1; + } + if ((not goUp) and (not goDown)) + { + std::cout << opts.help() << std::endl; + return 1; + } + if (goUp and exitAddress.empty()) + { + std::cout << "no exit address provided" << std::endl; + return 1; + } + + lokimq::LokiMQ lmq{[](lokimq::LogLevel lvl, const char* file, int line, std::string msg) { + std::cout << lvl << " [" << file << ":" << line << "] " << msg << std::endl; + }, + logLevel}; + + lmq.start(); + + std::promise connectPromise; + + const auto connID = lmq.connect_remote( + rpcURL, + [&connectPromise](auto) { connectPromise.set_value(true); }, + [&connectPromise](auto, std::string_view msg) { + std::cout << "failed to connect to lokinet RPC: " << msg << std::endl; + connectPromise.set_value(false); + }); + + auto ftr = connectPromise.get_future(); + if (not ftr.get()) + { + return 1; + } + + return 0; +}