working commit

This commit is contained in:
Олег Бородин
2026-05-21 14:15:03 +02:00
parent 3f7cfcd234
commit 5a2985f936
9 changed files with 185 additions and 16 deletions
+1
View File
@@ -15,6 +15,7 @@ helmetsrv_SOURCES = helmetsrv.cpp \
helmetcli_SOURCES = helmetcli.cpp \ helmetcli_SOURCES = helmetcli.cpp \
uxclient.cpp uxclient.hpp \ uxclient.cpp uxclient.hpp \
cliconfig.cpp cliconfig.hpp \
$(helmet_SOURCES) $(helmet_SOURCES)
helmet_SOURCES = \ helmet_SOURCES = \
+2 -1
View File
@@ -108,7 +108,7 @@ am__objects_1 = uxlogger.$(OBJEXT) msgheader.$(OBJEXT) \
interface.$(OBJEXT) iprouter.$(OBJEXT) stringaux.$(OBJEXT) \ interface.$(OBJEXT) iprouter.$(OBJEXT) stringaux.$(OBJEXT) \
networkaux.$(OBJEXT) uxcontrol.pb.$(OBJEXT) networkaux.$(OBJEXT) uxcontrol.pb.$(OBJEXT)
am_helmetcli_OBJECTS = helmetcli.$(OBJEXT) uxclient.$(OBJEXT) \ am_helmetcli_OBJECTS = helmetcli.$(OBJEXT) uxclient.$(OBJEXT) \
$(am__objects_1) cliconfig.$(OBJEXT) $(am__objects_1)
helmetcli_OBJECTS = $(am_helmetcli_OBJECTS) helmetcli_OBJECTS = $(am_helmetcli_OBJECTS)
helmetcli_LDADD = $(LDADD) helmetcli_LDADD = $(LDADD)
am_helmetsrv_OBJECTS = helmetsrv.$(OBJEXT) tservice.$(OBJEXT) \ am_helmetsrv_OBJECTS = helmetsrv.$(OBJEXT) tservice.$(OBJEXT) \
@@ -315,6 +315,7 @@ helmetsrv_SOURCES = helmetsrv.cpp \
helmetcli_SOURCES = helmetcli.cpp \ helmetcli_SOURCES = helmetcli.cpp \
uxclient.cpp uxclient.hpp \ uxclient.cpp uxclient.hpp \
cliconfig.cpp cliconfig.hpp \
$(helmet_SOURCES) $(helmet_SOURCES)
helmet_SOURCES = \ helmet_SOURCES = \
+90
View File
@@ -0,0 +1,90 @@
#include <expected>
#include <fstream>
#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <cstring>
#include <iomanip>
#include <iostream>
#include <stdexcept>
#include <string>
#include <utility>
#include <cliconfig.hpp>
#include <stringaux.hpp>
#include <networkaux.hpp>
int ClientConfig::Servport(void) {
return servport;
}
std::string ClientConfig::Servaddr(void) {
return servaddr;
}
std::vector<std::string> ClientConfig::Localnets(void) {
return localnets;
}
std::expected<void, std::string> ClientConfig::Read(std::string filename) {
std::ifstream file;
file.open(filename);
if (file.fail()) {
auto state = file.rdstate();
if (state & std::ios_base::badbit) {
return std::unexpected("Read/writing error on i/o operation");
} else if (state & std::ios_base::failbit) {
return std::unexpected("Logical error on i/o operation");
}
}
std::string line;
while (std::getline(file, line)) {
auto tokens = split(line, "#;");
auto keyval = trim(tokens[0]);
if (keyval.size() == 0) continue;
tokens = split(keyval, "=");
if (tokens.size() < 2) continue;
auto key = trim(tokens[0]);
auto val = trim(tokens[1]);
kvmap[key] = val;
if (key == "localnet") {
localnets.push_back(val);
} else if (key == "servaddr") {
servaddr = val;
} else if (key == "servport") {
auto convRes = strtoint(val);
if (!convRes) {
auto msg = std::format("servport: {}", convRes.error());
return std::unexpected(msg);
}
servport = convRes.value();
}
}
file.close();
return {};
}
std::expected<void, std::string> ClientConfig::Validate(void) {
if (servport == 0) {
return std::unexpected("Zero server port");
}
if (servaddr.size() == 0) {
return std::unexpected("Zero server address");
}
for (const auto& val : localnets) {
auto netprefixRes = netprefix(val);
if (!netprefixRes) {
return std::unexpected("Incorrect local network " + val + ":" + netprefixRes.error());
}
auto networkRes = network(val);
if (!networkRes) {
return std::unexpected("Incorrect local network " + val + ":" + networkRes.error());
}
}
return {};
}
+27
View File
@@ -0,0 +1,27 @@
#ifndef SRVCONFIG_HPP
#define SRVCONFIG_HPP
#include <string>
#include <expected>
#include <map>
#include <vector>
class ClientConfig {
private:
std::map<std::string, std::string> kvmap;
std::vector<std::string> localnets;
int servport;
std::string servaddr;
public:
std::expected<void, std::string> Read(std::string filename);
int Listenport(void);
std::string Tunnelnet(void);
std::vector<std::string> Localnets(void);
std::expected<void, std::string> Validate(void);
int Servport(void);
std::string Servaddr(void);
};
#endif
+3
View File
@@ -0,0 +1,3 @@
servport = 1025;
serveraddr = 127.0.0.1;
localnet = 10.11.12.0/24;
+28 -5
View File
@@ -5,19 +5,42 @@
#include <uxlogger.hpp> #include <uxlogger.hpp>
#include <uxclient.hpp> #include <uxclient.hpp>
#include <cliconfig.hpp>
#include <defines.hpp>
std::expected<void, std::string> Run(void) {
ClientConfig config;
std::string confdir(SRV_CONFDIR);
auto readRes = config.Read(confdir + "/" + "helmetcli.conf");
if (!readRes) {
return std::unexpected("Read config error: " + readRes.error());
}
auto validateRes = config.Validate();
if (!validateRes) {
return std::unexpected("Validate config error: " + validateRes.error());
}
auto servaddr = config.Servaddr();
auto servport = config.Servport();
auto localnets = config.Localnets();
int main(int argc, char** argv) {
UxClient client; UxClient client;
auto connectRes = client.Connect("127.0.0.1", 1025); auto connectRes = client.Connect(servaddr, servport);
if (!connectRes) { if (!connectRes) {
uxlogger.Error(connectRes.error()); return std::unexpected(connectRes.error());
return 1;
} }
auto runRes = client.Run(); auto runRes = client.Run();
if (!runRes) {
return std::unexpected(runRes.error());
}
return {};
}
int main(int argc, char** argv) {
auto runRes = Run();
if (!runRes) { if (!runRes) {
uxlogger.Error(runRes.error()); uxlogger.Error(runRes.error());
return 1; return 1;
} }
} }
+23
View File
@@ -16,11 +16,13 @@ extern "C" {
#include <sockhand.hpp> #include <sockhand.hpp>
#include <uxlogger.hpp> #include <uxlogger.hpp>
#include <networkaux.hpp> #include <networkaux.hpp>
#include <iprouter.hpp>
#include <uxcontrol.pb.h> #include <uxcontrol.pb.h>
void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, std::vector<std::string> routes) { void SocketHandler::Handle(int newsock, std::string laddr, std::string raddr, std::vector<std::string> routes) {
sock = newsock; sock = newsock;
tunAddress = raddr;
auto interfaceName = std::format("uxsrv{}", sock); auto interfaceName = std::format("uxsrv{}", sock);
auto createRes = interface.Create(interfaceName); auto createRes = interface.Create(interfaceName);
if (!createRes) { if (!createRes) {
@@ -213,6 +215,27 @@ void SocketHandler::RecvMessages(void) {
auto error = writeRes.error(); auto error = writeRes.error();
uxlogger.Error(std::format("Write packet error: {}", error)); uxlogger.Error(std::format("Write packet error: {}", error));
} }
} else if (kind == localRouteMsg) {
uxcontrol::RouteMessage routeMessage;
routeMessage.ParseFromString(rawMessage);
auto network = routeMessage.address();
auto prefix = routeMessage.prefix();
auto networkRes = nethost(network, prefix, 0);
if (!networkRes) {
uxlogger.Error(networkRes.error());
break;
}
network = networkRes.value();
uxlogger.Info(std::format("Received route {}/{} gw {}", network, prefix, tunAddress));
if (tunAddress != "") {
Router router;
auto addRouteRes = router.AddRoute(network, prefix, tunAddress, interface.Name());
if (!addRouteRes) {
uxlogger.Error(addRouteRes.error());
} else {
uxlogger.Warning(std::format("Add route {}/{}", network, prefix));
}
}
} else { } else {
uxlogger.Warning("Received unknown kind of message"); uxlogger.Warning("Received unknown kind of message");
} }
+1
View File
@@ -15,6 +15,7 @@ private:
std::mutex intMtx; std::mutex intMtx;
std::binary_semaphore done{0}; std::binary_semaphore done{0};
Interface interface; Interface interface;
std::string tunAddress;
public: public:
void Handle(int newsock, std::string laddr, std::string raddr, std::vector<std::string> routes); void Handle(int newsock, std::string laddr, std::string raddr, std::vector<std::string> routes);
void RecvMessages(void); void RecvMessages(void);
+10 -10
View File
@@ -119,7 +119,16 @@ void UxClient::RecvMessages(void) {
auto kind = metaPart.kind(); auto kind = metaPart.kind();
uxlogger.Debug(std::format("Received message kind: {}", kind)); uxlogger.Debug(std::format("Received message kind: {}", kind));
if (kind == tunAddressMsg) { if (kind == internetPkgMsg) {
uxcontrol::PacketMessage packetMessage;
packetMessage.ParseFromString(rawMessage);
auto payload = packetMessage.payload();
auto writeRes = interface.Write(payload);
if (!writeRes) {
auto error = writeRes.error();
uxlogger.Error(std::format("Write packet error: {}", error));
}
} else if (kind == tunAddressMsg) {
uxcontrol::AddressMessage addrMessage; uxcontrol::AddressMessage addrMessage;
addrMessage.ParseFromString(rawMessage); addrMessage.ParseFromString(rawMessage);
uxlogger.Debug(std::format("Receive address {}", addrMessage.address())); uxlogger.Debug(std::format("Receive address {}", addrMessage.address()));
@@ -133,15 +142,6 @@ void UxClient::RecvMessages(void) {
uxlogger.Error(setMaskRes.error()); uxlogger.Error(setMaskRes.error());
} }
tunAddress = addrMessage.address(); tunAddress = addrMessage.address();
} else if (kind == internetPkgMsg) {
uxcontrol::PacketMessage packetMessage;
packetMessage.ParseFromString(rawMessage);
auto payload = packetMessage.payload();
auto writeRes = interface.Write(payload);
if (!writeRes) {
auto error = writeRes.error();
uxlogger.Error(std::format("Write packet error: {}", error));
}
} else if (kind == localRouteMsg) { } else if (kind == localRouteMsg) {
uxcontrol::RouteMessage routeMessage; uxcontrol::RouteMessage routeMessage;
routeMessage.ParseFromString(rawMessage); routeMessage.ParseFromString(rawMessage);