mirror of
https://github.com/nestriness/cdc-file-transfer.git
synced 2026-01-30 14:35:37 +02:00
[cdc_rsync] [cdc_stream] Switch from scp to sftp (#66)
Use sftp for deploying remote components instead of scp. sftp has the advantage that it can also create directries, chmod files etc., so that we can do everything in one call of sftp instead of mixing scp and ssh calls. The downside of sftp is that it can't switch to ~ resp. %userprofile% for the remote side, and we have to assume that sftp starts in the user's home dir. This is the default and works on my machines! cdc_rsync and cdc_stream check the CDC_SFTP_COMMAND env var now and accept --sftp-command flags. If they are not set, the corresponding scp flag and env var is still used, with scp replaced by sftp. This is most likely correct as sftp and scp usually reside in the same directory and share largely identical parameters.
This commit is contained in:
@@ -32,6 +32,10 @@ constexpr char kUserHostDst[] = "user@host:destination";
|
||||
constexpr char kUserHost[] = "user@host";
|
||||
constexpr char kDst[] = "destination";
|
||||
|
||||
constexpr char kSshCommandEnvVar[] = "CDC_SSH_COMMAND";
|
||||
constexpr char kScpCommandEnvVar[] = "CDC_SCP_COMMAND";
|
||||
constexpr char kSftpCommandEnvVar[] = "CDC_SFTP_COMMAND";
|
||||
|
||||
class TestLog : public Log {
|
||||
public:
|
||||
explicit TestLog() : Log(LogLevel::kInfo) {}
|
||||
@@ -60,6 +64,11 @@ class ParamsTest : public ::testing::Test {
|
||||
void TearDown() override {
|
||||
std::cout.rdbuf(prev_stdout_);
|
||||
std::cerr.rdbuf(prev_stderr_);
|
||||
|
||||
// Clear env. They seem to be sticky sometimes and leak into other tests.
|
||||
path::SetEnv(kSshCommandEnvVar, "");
|
||||
path::SetEnv(kScpCommandEnvVar, "");
|
||||
path::SetEnv(kSftpCommandEnvVar, "");
|
||||
}
|
||||
|
||||
protected:
|
||||
@@ -152,24 +161,57 @@ TEST_F(ParamsTest, ParseFailsOnContimeoutEqualsNoValue) {
|
||||
ExpectError(NeedsValueError("contimeout"));
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSshScpCommands) {
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc,
|
||||
kUserHostDst, "--ssh-command=sshcmd",
|
||||
"--scp-command=scpcmd", NULL};
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSshSftpCommands) {
|
||||
const char* argv[] = {
|
||||
"cdc_rsync.exe", kSrc, kUserHostDst, "--ssh-command=sshcmd",
|
||||
"--sftp-command=sftpcmd", NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.scp_command, "scpcmd");
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "sftpcmd");
|
||||
EXPECT_EQ(parameters_.options.ssh_command, "sshcmd");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSshScpCommandsByEnvVars) {
|
||||
EXPECT_OK(path::SetEnv("CDC_SSH_COMMAND", "sshcmd"));
|
||||
EXPECT_OK(path::SetEnv("CDC_SCP_COMMAND", "scpcmd"));
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSshSftpCommandsByEnvVars) {
|
||||
EXPECT_OK(path::SetEnv(kSshCommandEnvVar, "sshcmd"));
|
||||
EXPECT_OK(path::SetEnv(kSftpCommandEnvVar, "sftpcmd"));
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst, NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.scp_command, "scpcmd");
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "sftpcmd");
|
||||
EXPECT_EQ(parameters_.options.ssh_command, "sshcmd");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithScpCommandFallback) {
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst,
|
||||
"--scp-command=C:\\scp.exe foo", NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "C:\\sftp.exe foo");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithScpCommandFallbackByEnvVar) {
|
||||
EXPECT_OK(path::SetEnv(kScpCommandEnvVar, "C:\\scp.exe foo"));
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst, NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "C:\\sftp.exe foo");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSftpOverwritingScp) {
|
||||
const char* argv[] = {"cdc_rsync.exe",
|
||||
kSrc,
|
||||
kUserHostDst,
|
||||
"--scp-command=C:\\scp.exe foo",
|
||||
"--sftp-command=sftpcmd",
|
||||
NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "sftpcmd");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithSftpEnvVarOverwritingScp) {
|
||||
EXPECT_OK(path::SetEnv(kSftpCommandEnvVar, "sftpcmd"));
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst,
|
||||
"--scp-command=C:\\scp.exe foo", NULL};
|
||||
EXPECT_TRUE(Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
EXPECT_EQ(parameters_.options.sftp_command, "sftpcmd");
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithNoSshCommand) {
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst,
|
||||
"--ssh-command=", NULL};
|
||||
@@ -178,12 +220,12 @@ TEST_F(ParamsTest, ParseSucceedsWithNoSshCommand) {
|
||||
ExpectError(NeedsValueError("ssh-command"));
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseSucceedsWithNoScpCommand) {
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst, "--scp-command",
|
||||
TEST_F(ParamsTest, ParseSucceedsWithNoSftpCommand) {
|
||||
const char* argv[] = {"cdc_rsync.exe", kSrc, kUserHostDst, "--sftp-command",
|
||||
NULL};
|
||||
EXPECT_FALSE(
|
||||
Parse(static_cast<int>(std::size(argv)) - 1, argv, ¶meters_));
|
||||
ExpectError(NeedsValueError("scp-command"));
|
||||
ExpectError(NeedsValueError("sftp-command"));
|
||||
}
|
||||
|
||||
TEST_F(ParamsTest, ParseFailsOnNoUserHost) {
|
||||
|
||||
Reference in New Issue
Block a user