Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/libstore/include/nix/store/ssh.hh
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ private:

Sync<State> state_;

void addCommonSSHOpts(Strings & args);
bool isMasterRunning();
void addCommonSSHOpts(Strings & args, Path socketPath);
bool isMasterRunning(Path socketPath);

#ifndef _WIN32 // TODO re-enable on Windows, once we can start processes.
Path startMaster();
Expand Down
23 changes: 12 additions & 11 deletions src/libstore/ssh.cc
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ SSHMaster::SSHMaster(
checkValidAuthority(authority);
}

void SSHMaster::addCommonSSHOpts(Strings & args)
void SSHMaster::addCommonSSHOpts(Strings & args, Path socketPath)
{
auto sshArgs = getNixSshOpts();
args.insert(args.end(), sshArgs.begin(), sshArgs.end());
Expand All @@ -113,12 +113,15 @@ void SSHMaster::addCommonSSHOpts(Strings & args)
// the remote session won't be garbled if the local command is slow.
args.push_back("-oPermitLocalCommand=yes");
args.push_back("-oLocalCommand=echo started");
args.insert(args.end(), {"-S", socketPath});
}

bool SSHMaster::isMasterRunning()
bool SSHMaster::isMasterRunning(Path socketPath)
{
assert(useMaster);

Strings args = {"-O", "check", hostnameAndUser};
addCommonSSHOpts(args);
addCommonSSHOpts(args, socketPath);

auto res = runProgram(RunOptions{.program = "ssh", .args = args, .mergeStderrToStdout = true});
return res.first == 0;
Expand Down Expand Up @@ -183,9 +186,7 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(Strings && comman

if (!fakeSSH) {
args = {"ssh", hostnameAndUser.c_str(), "-x"};
addCommonSSHOpts(args);
if (socketPath != "")
args.insert(args.end(), {"-S", socketPath});
addCommonSSHOpts(args, socketPath);
if (verbosity >= lvlChatty)
args.push_back("-v");
args.splice(args.end(), std::move(extraSshArgs));
Expand All @@ -206,7 +207,7 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(Strings && comman

// Wait for the SSH connection to be established,
// So that we don't overwrite the password prompt with our progress bar.
if (!fakeSSH && !useMaster && !isMasterRunning()) {
if (!fakeSSH && !(useMaster && isMasterRunning(socketPath))) {
std::string reply;
try {
reply = readLine(out.readSide.get());
Expand All @@ -231,7 +232,7 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(Strings && comman
Path SSHMaster::startMaster()
{
if (!useMaster)
return "";
return "none";

auto state(state_.lock());

Expand All @@ -248,7 +249,7 @@ Path SSHMaster::startMaster()

auto suspension = logger->suspend();

if (isMasterRunning())
if (isMasterRunning(state->socketPath))
return state->socketPath;

state->sshMaster = startProcess(
Expand All @@ -260,10 +261,10 @@ Path SSHMaster::startMaster()
if (dup2(out.writeSide.get(), STDOUT_FILENO) == -1)
throw SysError("duping over stdout");

Strings args = {"ssh", hostnameAndUser.c_str(), "-M", "-N", "-S", state->socketPath};
Strings args = {"ssh", hostnameAndUser.c_str(), "-M", "-N"};
if (verbosity >= lvlChatty)
args.push_back("-v");
addCommonSSHOpts(args);
addCommonSSHOpts(args, state->socketPath);
auto env = createSSHEnv();
nix::execvpe(args.begin()->c_str(), stringsToCharPtrs(args).data(), stringsToCharPtrs(env).data());

Expand Down