forked from lix-project/lix
Fix ControlMaster behaviour
This commit is contained in:
parent
8976769a1c
commit
61cdb0b057
|
@ -41,6 +41,11 @@ void SSHMaster::addCommonSSHOpts(Strings & args)
|
||||||
args.push_back("-oLocalCommand=echo started");
|
args.push_back("-oLocalCommand=echo started");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool SSHMaster::isMasterRunning() {
|
||||||
|
auto res = runProgram(RunOptions {.program = "ssh", .args = {"-O", "check", host}, .mergeStderrToStdout = true});
|
||||||
|
return res.first == 0;
|
||||||
|
}
|
||||||
|
|
||||||
std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string & command)
|
std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string & command)
|
||||||
{
|
{
|
||||||
Path socketPath = startMaster();
|
Path socketPath = startMaster();
|
||||||
|
@ -97,7 +102,7 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string
|
||||||
|
|
||||||
// Wait for the SSH connection to be established,
|
// Wait for the SSH connection to be established,
|
||||||
// So that we don't overwrite the password prompt with our progress bar.
|
// So that we don't overwrite the password prompt with our progress bar.
|
||||||
if (!fakeSSH && !useMaster) {
|
if (!fakeSSH && !useMaster && !isMasterRunning()) {
|
||||||
std::string reply;
|
std::string reply;
|
||||||
try {
|
try {
|
||||||
reply = readLine(out.readSide.get());
|
reply = readLine(out.readSide.get());
|
||||||
|
@ -133,6 +138,8 @@ Path SSHMaster::startMaster()
|
||||||
logger->pause();
|
logger->pause();
|
||||||
Finally cleanup = [&]() { logger->resume(); };
|
Finally cleanup = [&]() { logger->resume(); };
|
||||||
|
|
||||||
|
bool wasMasterRunning = isMasterRunning();
|
||||||
|
|
||||||
state->sshMaster = startProcess([&]() {
|
state->sshMaster = startProcess([&]() {
|
||||||
restoreProcessContext();
|
restoreProcessContext();
|
||||||
|
|
||||||
|
@ -152,13 +159,15 @@ Path SSHMaster::startMaster()
|
||||||
|
|
||||||
out.writeSide = -1;
|
out.writeSide = -1;
|
||||||
|
|
||||||
std::string reply;
|
if (!wasMasterRunning) {
|
||||||
try {
|
std::string reply;
|
||||||
reply = readLine(out.readSide.get());
|
try {
|
||||||
} catch (EndOfFile & e) { }
|
reply = readLine(out.readSide.get());
|
||||||
|
} catch (EndOfFile & e) { }
|
||||||
|
|
||||||
if (reply != "started")
|
if (reply != "started")
|
||||||
throw Error("failed to start SSH master connection to '%s'", host);
|
throw Error("failed to start SSH master connection to '%s'", host);
|
||||||
|
}
|
||||||
|
|
||||||
return state->socketPath;
|
return state->socketPath;
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ private:
|
||||||
Sync<State> state_;
|
Sync<State> state_;
|
||||||
|
|
||||||
void addCommonSSHOpts(Strings & args);
|
void addCommonSSHOpts(Strings & args);
|
||||||
|
bool isMasterRunning();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue