Skip to content

Commit

Permalink
Fix some jumphost issues
Browse files Browse the repository at this point in the history
  • Loading branch information
Jason Gauci committed Oct 2, 2019
1 parent 23d1f86 commit c66cb86
Show file tree
Hide file tree
Showing 18 changed files with 346 additions and 62 deletions.
4 changes: 2 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ IF(CODE_COVERAGE)
ENDIF(CODE_COVERAGE)

if(UNIX)
# Enable C++-11
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++11")
# Enable C++-17
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=c++17")

# Enable debug info
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")
Expand Down
1 change: 1 addition & 0 deletions proto/ETerminal.proto
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ enum TerminalPacketType {
PORT_FORWARD_DATA = 7;
TERMINAL_USER_INFO = 8;
TERMINAL_INIT = 9;
JUMPHOST_INIT = 10;
}

message TerminalBuffer {
Expand Down
1 change: 1 addition & 0 deletions src/base/Headers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
#include <iostream>
#include <memory>
#include <mutex>
#include <optional>
#include <set>
#include <sstream>
#include <streambuf>
Expand Down
4 changes: 2 additions & 2 deletions src/base/SocketHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ class SocketHandler {
}
}

inline Packet readPacket(int fd) {
inline optional<Packet> readPacket(int fd) {
int64_t length;
readAll(fd, (char*)&length, sizeof(int64_t), false);
if (length < 0 || length > 128 * 1024 * 1024) {
Expand All @@ -67,7 +67,7 @@ class SocketHandler {
throw std::runtime_error(s.c_str());
}
if (length == 0) {
return Packet("");
return nullopt;
}
string s(length, '\0');
readAll(fd, &s[0], length, false);
Expand Down
6 changes: 5 additions & 1 deletion src/terminal/SshSetupHandler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,8 @@ string genCommand(const string &passkey, const string &id,
string SshSetupHandler::SetupSsh(const string &user, const string &host,
const string &host_alias, int port,
const string &jumphost, int jport, bool kill,
int vlevel, const string &cmd_prefix) {
int vlevel, const string &cmd_prefix,
optional<string> serverFifo) {
string clientTerm("xterm-256color");
auto envString = getenv("TERM");
if (envString != NULL) {
Expand All @@ -48,6 +49,9 @@ string SshSetupHandler::SetupSsh(const string &user, const string &host,
string passkey = genRandom(32);
string id = genRandom(16);
string cmdoptions{"--verbose=" + std::to_string(vlevel)};
if (bool(serverFifo)) {
cmdoptions += " --serverfifo=" + *serverFifo;
}

string SSH_SCRIPT_DST =
genCommand(passkey, id, clientTerm, user, kill, cmd_prefix, cmdoptions);
Expand Down
3 changes: 2 additions & 1 deletion src/terminal/SshSetupHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ class SshSetupHandler {
static string SetupSsh(const string &user, const string &host,
const string &host_alias, int port,
const string &jumphost, int jport, bool kill,
int vlevel, const string &cmd_prefix);
int vlevel, const string &cmd_prefix,
optional<string> serverFifo);
};
} // namespace et
#endif // __ET_SSH_SETUP_HANDLER__
1 change: 0 additions & 1 deletion src/terminal/TerminalClient.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,6 @@ TerminalClient::TerminalClient(shared_ptr<SocketHandler> _socketHandler,
Packet(EtPacketType::INITIAL_PAYLOAD, protoToString(payload)));
fd_set rfd;
timeval tv;

for (int a = 0; a < 3; a++) {
FD_ZERO(&rfd);
int clientFd = connection->getSocketFd();
Expand Down
10 changes: 9 additions & 1 deletion src/terminal/TerminalClientMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ int main(int argc, char** argv) {
("silent", "Disable logging") //
("N,no-terminal", "Do not create a terminal") //
("f,forward-ssh-agent", "Forward ssh-agent socket") //
("serverfifo",
"If set, communicate to etserver on the matching fifo name", //
cxxopts::value<std::string>()) //
;

options.parse_positional({"host", "positional"});
Expand Down Expand Up @@ -202,10 +205,15 @@ int main(int argc, char** argv) {
}

int jport = result["jport"].as<int>();
optional<string> serverFifo = nullopt;
if (result.count("serverfifo")) {
serverFifo = result["serverfifo"].as<string>();
}
string idpasskeypair = SshSetupHandler::SetupSsh(
username, host, host_alias, port, jumphost, jport,
result.count("x") > 0, result["v"].as<int>(),
result.count("prefix") ? result["prefix"].as<string>() : "");
result.count("prefix") ? result["prefix"].as<string>() : "",
serverFifo);

string id = "", passkey = "";
// Trim whitespace
Expand Down
8 changes: 6 additions & 2 deletions src/terminal/TerminalMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,10 @@ int main(int argc, char** argv) {
("v,verbose", "Enable verbose logging",
cxxopts::value<int>()->default_value("0")) //
("logtostdout", "Write log to stdout") //
("serverfifo",
"If set, connects to the etserver instance listening on the matching "
"fifo name", //
cxxopts::value<std::string>()->default_value(ROUTER_FIFO_NAME)) //
;

options.parse_positional({"host", "positional"});
Expand Down Expand Up @@ -135,7 +139,7 @@ int main(int argc, char** argv) {
LOG(FATAL) << "Error creating daemon: " << strerror(errno);
}
SocketEndpoint routerFifoEndpoint;
routerFifoEndpoint.set_name(ROUTER_FIFO_NAME);
routerFifoEndpoint.set_name(result["serverfifo"].as<string>());
SocketEndpoint destinationEndpoint;
destinationEndpoint.set_name(result["dsthost"].as<string>());
destinationEndpoint.set_port(result["dstport"].as<int>());
Expand Down Expand Up @@ -164,7 +168,7 @@ int main(int argc, char** argv) {
el::Helpers::installPreRollOutCallback(LogHandler::rolloutHandler);

SocketEndpoint routerEndpoint;
routerEndpoint.set_name(ROUTER_FIFO_NAME);
routerEndpoint.set_name(result["serverfifo"].as<string>());
UserTerminalHandler uth(ipcSocketHandler, term, true, routerEndpoint,
idpasskey);
cout << "IDPASSKEY:" << idpasskey << endl;
Expand Down
20 changes: 13 additions & 7 deletions src/terminal/TerminalServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,20 +76,24 @@ void TerminalServer::run() {
}

void TerminalServer::runJumpHost(
shared_ptr<ServerClientConnection> serverClientState) {
shared_ptr<ServerClientConnection> serverClientState,
const InitialPayload &payload) {
InitialResponse response;
serverClientState->writePacket(
Packet(uint8_t(EtPacketType::INITIAL_RESPONSE), protoToString(response)));
// set thread name
el::Helpers::setThreadName(serverClientState->getId());
bool run = true;

bool b[BUF_SIZE];
int terminalFd =
terminalRouter->getInfoForId(serverClientState->getId()).fd();
shared_ptr<SocketHandler> terminalSocketHandler =
terminalRouter->getSocketHandler();

terminalSocketHandler->writePacket(
terminalFd,
Packet(TerminalPacketType::JUMPHOST_INIT, protoToString(payload)));

while (!halt && run && !serverClientState->isShuttingDown()) {
fd_set rfd;
timeval tv;
Expand All @@ -108,18 +112,18 @@ void TerminalServer::runJumpHost(

try {
if (FD_ISSET(terminalFd, &rfd)) {
memset(b, 0, BUF_SIZE);
try {
Packet packet = terminalSocketHandler->readPacket(terminalFd);
serverClientState->writePacket(packet);
auto packet = terminalSocketHandler->readPacket(terminalFd);
if (bool(packet)) {
serverClientState->writePacket(*packet);
}
} catch (const std::runtime_error &ex) {
LOG(INFO) << "Terminal session ended" << ex.what();
run = false;
break;
}
}

VLOG(4) << "Jumphost serverclientFd: " << serverClientFd;
if (serverClientFd > 0 && FD_ISSET(serverClientFd, &rfd)) {
VLOG(4) << "Jumphost is selected";
if (serverClientState->hasData()) {
Expand Down Expand Up @@ -356,8 +360,10 @@ void TerminalServer::handleConnection(
}
InitialPayload payload = stringToProto<InitialPayload>(packet.getPayload());
if (payload.jumphost()) {
runJumpHost(serverClientState);
LOG(INFO) << "RUNNING JUMPHOST";
runJumpHost(serverClientState, payload);
} else {
LOG(INFO) << "RUNNING TERMINAL";
runTerminal(serverClientState, payload);
}
}
Expand Down
5 changes: 3 additions & 2 deletions src/terminal/TerminalServer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,10 @@ class TerminalServer : public ServerConnection {
std::shared_ptr<PipeSocketHandler> _pipeSocketHandler,
const SocketEndpoint &_routerEndpoint);
virtual ~TerminalServer();
void runJumpHost(shared_ptr<ServerClientConnection> serverClientState);
void runJumpHost(shared_ptr<ServerClientConnection> serverClientState,
const InitialPayload &payload);
void runTerminal(shared_ptr<ServerClientConnection> serverClientState,
const InitialPayload& payload);
const InitialPayload &payload);
void handleConnection(shared_ptr<ServerClientConnection> serverClientState);
virtual bool newClient(shared_ptr<ServerClientConnection> serverClientState);

Expand Down
20 changes: 19 additions & 1 deletion src/terminal/TerminalServerMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@ int main(int argc, char **argv) {
"/var/run/etserver.pid")) //
("v,verbose", "Enable verbose logging",
cxxopts::value<int>()->default_value("0"), "LEVEL") //
("serverfifo",
"If set, listens on the matching fifo name", //
cxxopts::value<std::string>()->default_value(ROUTER_FIFO_NAME)) //
;

auto result = options.parse(argc, argv);
Expand Down Expand Up @@ -57,6 +60,8 @@ int main(int argc, char **argv) {
LogHandler::stderrToFile("/tmp/etserver");
}

string serverFifo = "";

// default max log file size is 20MB for etserver
string maxlogsize = "20971520";

Expand All @@ -81,6 +86,14 @@ int main(int argc, char **argv) {
el::Loggers::setVerboseLevel(atoi(vlevel));
}

{
const char *fifoName =
ini.GetValue("Debug", "serverfifo", ROUTER_FIFO_NAME);
if (fifoName) {
serverFifo = string(fifoName);
}
}

// read silent setting
const char *silent = ini.GetValue("Debug", "silent", NULL);
if (silent && atoi(silent) != 0) {
Expand All @@ -98,6 +111,11 @@ int main(int argc, char **argv) {
}
}

if (result.count("serverfifo") &&
result["serverfifo"].as<string>() != ROUTER_FIFO_NAME) {
serverFifo = result["serverfifo"].as<string>();
}

GOOGLE_PROTOBUF_VERIFY_VERSION;
srand(1);

Expand All @@ -123,7 +141,7 @@ int main(int argc, char **argv) {
SocketEndpoint serverEndpoint;
serverEndpoint.set_port(port);
SocketEndpoint routerFifo;
routerFifo.set_name(ROUTER_FIFO_NAME);
routerFifo.set_name(serverFifo);
TerminalServer terminalServer(tcpSocketHandler, serverEndpoint,
pipeSocketHandler, routerFifo);
terminalServer.run();
Expand Down
Loading

0 comments on commit c66cb86

Please sign in to comment.