diff options
author | elfmz <fenix1905@tut.by> | 2022-01-14 01:43:56 +0300 |
---|---|---|
committer | elfmz <fenix1905@tut.by> | 2022-01-14 01:43:56 +0300 |
commit | 8c8f6e1d2f63ec700ff685f7adb5a635913c8e01 (patch) | |
tree | 878fe80de61dc710333656d310968122cb5c8ebc /NetRocks | |
parent | 045f14d22088085c6b246690a1f7e95c675a00cd (diff) |
NetRocks: avoid keepalive while command being executed to avoid its disruption
Diffstat (limited to 'NetRocks')
-rw-r--r-- | NetRocks/src/Host/HostRemoteBroker.cpp | 2 | ||||
-rw-r--r-- | NetRocks/src/Protocol/Protocol.h | 6 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/ProtocolSCP.cpp | 9 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/ProtocolSCP.h | 2 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp | 9 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/ProtocolSFTP.h | 2 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/SSHConnection.cpp | 27 | ||||
-rw-r--r-- | NetRocks/src/Protocol/SSH/SSHConnection.h | 2 |
8 files changed, 54 insertions, 5 deletions
diff --git a/NetRocks/src/Host/HostRemoteBroker.cpp b/NetRocks/src/Host/HostRemoteBroker.cpp index a1799008..ec358eba 100644 --- a/NetRocks/src/Host/HostRemoteBroker.cpp +++ b/NetRocks/src/Host/HostRemoteBroker.cpp @@ -197,7 +197,7 @@ class HostRemoteBroker : protected IPCEndpoint fprintf(stderr, "OnKeepAlive for '%s'\n", _keepalive_path.c_str()); } - _protocol->GetMode(_keepalive_path); + _protocol->KeepAlive(_keepalive_path); } catch (std::exception &e) { fprintf(stderr, "OnKeepAlive: <%s> for '%s'\n", e.what(), _keepalive_path.c_str()); diff --git a/NetRocks/src/Protocol/Protocol.h b/NetRocks/src/Protocol/Protocol.h index 07f541f3..d2148f20 100644 --- a/NetRocks/src/Protocol/Protocol.h +++ b/NetRocks/src/Protocol/Protocol.h @@ -55,6 +55,12 @@ struct IProtocol { virtual ~IProtocol() {}; + /* default implementation */ + virtual void KeepAlive(const std::string &path_to_check) + { + GetMode(path_to_check); + } + /* optimized and not-throwing version of GetMode for mass-query of modes */ virtual void GetModes(bool follow_symlink, size_t count, const std::string *pathes, mode_t *modes) noexcept { diff --git a/NetRocks/src/Protocol/SSH/ProtocolSCP.cpp b/NetRocks/src/Protocol/SSH/ProtocolSCP.cpp index 043dfa39..a271571c 100644 --- a/NetRocks/src/Protocol/SSH/ProtocolSCP.cpp +++ b/NetRocks/src/Protocol/SSH/ProtocolSCP.cpp @@ -1076,3 +1076,12 @@ void ProtocolSCP::ExecuteCommand(const std::string &working_dir, const std::stri _conn->executed_command.reset(); _conn->executed_command = std::make_shared<SSHExecutedCommand>(_conn, working_dir, command_line, fifo); } + +void ProtocolSCP::KeepAlive(const std::string &path_to_check) +{ + if (_conn->executed_command) { + _conn->executed_command->KeepAlive(); + } else { + GetMode(path_to_check); + } +} diff --git a/NetRocks/src/Protocol/SSH/ProtocolSCP.h b/NetRocks/src/Protocol/SSH/ProtocolSCP.h index 47ad0ad2..4a809e94 100644 --- a/NetRocks/src/Protocol/SSH/ProtocolSCP.h +++ b/NetRocks/src/Protocol/SSH/ProtocolSCP.h @@ -39,4 +39,6 @@ public: virtual std::shared_ptr<IFileWriter> FilePut(const std::string &path, mode_t mode, unsigned long long size_hint, unsigned long long resume_pos = 0); virtual void ExecuteCommand(const std::string &working_dir, const std::string &command_line, const std::string &fifo); + + virtual void KeepAlive(const std::string &path_to_check); }; diff --git a/NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp b/NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp index 8ce1f95c..9648de23 100644 --- a/NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp +++ b/NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp @@ -681,3 +681,12 @@ void ProtocolSFTP::ExecuteCommand(const std::string &working_dir, const std::str _conn->executed_command.reset(); _conn->executed_command = std::make_shared<SSHExecutedCommand>(_conn, working_dir, command_line, fifo); } + +void ProtocolSFTP::KeepAlive(const std::string &path_to_check) +{ + if (_conn->executed_command) { + _conn->executed_command->KeepAlive(); + } else { + GetMode(path_to_check); + } +} diff --git a/NetRocks/src/Protocol/SSH/ProtocolSFTP.h b/NetRocks/src/Protocol/SSH/ProtocolSFTP.h index 878b2aab..57c7c605 100644 --- a/NetRocks/src/Protocol/SSH/ProtocolSFTP.h +++ b/NetRocks/src/Protocol/SSH/ProtocolSFTP.h @@ -35,4 +35,6 @@ public: virtual std::shared_ptr<IFileWriter> FilePut(const std::string &path, mode_t mode, unsigned long long size_hint, unsigned long long resume_pos = 0); virtual void ExecuteCommand(const std::string &working_dir, const std::string &command_line, const std::string &fifo); + + virtual void KeepAlive(const std::string &path_to_check); }; diff --git a/NetRocks/src/Protocol/SSH/SSHConnection.cpp b/NetRocks/src/Protocol/SSH/SSHConnection.cpp index 1ec033f9..08a3077a 100644 --- a/NetRocks/src/Protocol/SSH/SSHConnection.cpp +++ b/NetRocks/src/Protocol/SSH/SSHConnection.cpp @@ -360,8 +360,20 @@ void SSHExecutedCommand::IOLoop() throw std::runtime_error("select failed"); } - if (FD_ISSET(_kickass[0], &fdr) || FD_ISSET(_kickass[0], &fde)) { - throw std::runtime_error("got kickass"); + if (FD_ISSET(_kickass[0], &fde)) { + throw std::runtime_error("kickass exception"); + } + + if (FD_ISSET(_kickass[0], &fdr)) { + char c = 0; + if (os_call_ssize(read, _kickass[0], (void*)&c, sizeof(c)) != 1) { + throw std::runtime_error("kickass read failed"); + } + if (c == 0) { + throw std::runtime_error("kickass-driven exit"); + } + + // TODO: somehow keepalive } if (FD_ISSET(fd_in, &fdr)) { // || FD_ISSET(fd_in, &fde) @@ -459,9 +471,9 @@ SSHExecutedCommand::SSHExecutedCommand(std::shared_ptr<SSHConnection> conn, cons SSHExecutedCommand::~SSHExecutedCommand() { if (!WaitThread(0)) { - char c = 1; + char c = 0; if (os_call_ssize(write, _kickass[1], (const void*)&c, sizeof(c)) != 1) { - perror("write kickass"); + perror("~SSHExecutedCommand: write kickass"); } WaitThread(); } @@ -494,3 +506,10 @@ SSHExecutedCommand::~SSHExecutedCommand() } } +void SSHExecutedCommand::KeepAlive() +{ + char c = 1; + if (os_call_ssize(write, _kickass[1], (const void*)&c, sizeof(c)) != 1) { + perror("SSHExecutedCommand::KeepAlive: write kickass"); + } +} diff --git a/NetRocks/src/Protocol/SSH/SSHConnection.h b/NetRocks/src/Protocol/SSH/SSHConnection.h index cb93a110..c88577ed 100644 --- a/NetRocks/src/Protocol/SSH/SSHConnection.h +++ b/NetRocks/src/Protocol/SSH/SSHConnection.h @@ -66,6 +66,8 @@ class SSHExecutedCommand : protected Threaded public: SSHExecutedCommand(std::shared_ptr<SSHConnection> conn, const std::string &working_dir, const std::string &command_line, const std::string &fifo); virtual ~SSHExecutedCommand(); + + void KeepAlive(); }; |