Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/elfmz/far2l.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorelfmz <fenix1905@tut.by>2022-01-14 01:43:56 +0300
committerelfmz <fenix1905@tut.by>2022-01-14 01:43:56 +0300
commit8c8f6e1d2f63ec700ff685f7adb5a635913c8e01 (patch)
tree878fe80de61dc710333656d310968122cb5c8ebc /NetRocks
parent045f14d22088085c6b246690a1f7e95c675a00cd (diff)
NetRocks: avoid keepalive while command being executed to avoid its disruption
Diffstat (limited to 'NetRocks')
-rw-r--r--NetRocks/src/Host/HostRemoteBroker.cpp2
-rw-r--r--NetRocks/src/Protocol/Protocol.h6
-rw-r--r--NetRocks/src/Protocol/SSH/ProtocolSCP.cpp9
-rw-r--r--NetRocks/src/Protocol/SSH/ProtocolSCP.h2
-rw-r--r--NetRocks/src/Protocol/SSH/ProtocolSFTP.cpp9
-rw-r--r--NetRocks/src/Protocol/SSH/ProtocolSFTP.h2
-rw-r--r--NetRocks/src/Protocol/SSH/SSHConnection.cpp27
-rw-r--r--NetRocks/src/Protocol/SSH/SSHConnection.h2
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();
};