Compare commits

...

2 Commits

Author SHA1 Message Date
Bo-Yi Wu 665c665298 refactor: remove unnecessary quotes in plugin build process (#177)
- Modify `rmcmd` and `mkdircmd` to remove unneeded quotes
- Update `buildUnTarArgs` in `plugin.go` to use target without quotes
- Add `Exec` function to `plugin.go` with `strings.Replace` call
- Update tests in `plugin_test.go` to use target without quotes

ref: https://github.com/appleboy/scp-action/issues/112
2023-04-16 12:05:23 +08:00
Bo-Yi Wu c663c07449 feat: refactor plugin struct and add hostPort function with tests (#176)
- Change the `go` keyword to `gofmt` in line 259
- Add a new function `hostPort` to the `Plugin` struct
- Modify the `hostPort` function to set the port if it is specified in the host string
- Add 2 tests for `hostPort` function to `plugin_test.go`

ref https://github.com/appleboy/scp-action/issues/98
2023-04-16 11:29:15 +08:00
3 changed files with 95 additions and 11 deletions
+2 -2
View File
@@ -5,7 +5,7 @@ func rmcmd(os, target string) string {
case "windows":
return "DEL /F /S " + target
case "unix":
return "rm -rf '" + target + "'"
return "rm -rf " + target
}
return ""
}
@@ -15,7 +15,7 @@ func mkdircmd(os, target string) string {
case "windows":
return "if not exist " + target + " mkdir " + target
case "unix":
return "mkdir -p '" + target + "'"
return "mkdir -p " + target
}
return ""
+21 -3
View File
@@ -209,7 +209,7 @@ func (p *Plugin) buildUnTarArgs(target string) []string {
args = append(args,
"-C",
"'"+target+"'",
target,
)
return args
@@ -254,14 +254,15 @@ func (p *Plugin) Exec() error {
errChannel := make(chan error)
finished := make(chan struct{})
for _, host := range hosts {
go func(host string) {
go func(h string) {
defer wg.Done()
host, port := p.hostPort(h)
// Create MakeConfig instance with remote username, server address and path to private key.
ssh := &easyssh.MakeConfig{
Server: host,
User: p.Config.Username,
Password: p.Config.Password,
Port: p.Config.Port,
Port: port,
Key: p.Config.Key,
KeyPath: p.Config.KeyPath,
Passphrase: p.Config.Passphrase,
@@ -303,6 +304,7 @@ func (p *Plugin) Exec() error {
}
for _, target := range p.Config.Target {
target = strings.Replace(target, " ", "\\ ", -1)
// remove target folder before upload data
if p.Config.Remove {
p.log(host, "Remove target folder:", target)
@@ -385,6 +387,22 @@ func (p *Plugin) Exec() error {
return nil
}
// This function takes a Plugin struct and a host string and returns the host and port as separate strings.
func (p Plugin) hostPort(host string) (string, string) {
// Split the host string by colon (":") to get the host and port
hosts := strings.Split(host, ":")
// Get the default port from the Plugin's Config field
port := p.Config.Port
// If the host string contains a port (i.e. it has more than one element after splitting), set the port to that value
if len(hosts) > 1 {
host = hosts[0]
port = hosts[1]
}
// Return the host and port as separate strings
return host, port
}
func trimValues(keys []string) []string {
var newKeys []string
+72 -6
View File
@@ -615,7 +615,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) {
args: args{
target: "foo",
},
want: []string{"tar", "-zxf", "foo.tar.gz", "-C", "'foo'"},
want: []string{"tar", "-zxf", "foo.tar.gz", "-C", "foo"},
},
{
name: "strip components",
@@ -631,7 +631,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) {
args: args{
target: "foo",
},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "-C", "'foo'"},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "-C", "foo"},
},
{
name: "overwrite",
@@ -647,7 +647,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) {
args: args{
target: "foo",
},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "-C", "'foo'"},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "-C", "foo"},
},
{
name: "unlink first",
@@ -663,7 +663,7 @@ func TestPlugin_buildUnTarArgs(t *testing.T) {
args: args{
target: "foo",
},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "'foo'"},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "foo"},
},
{
name: "output folder path with space",
@@ -677,9 +677,9 @@ func TestPlugin_buildUnTarArgs(t *testing.T) {
DestFile: "foo.tar.gz",
},
args: args{
target: "foo bar",
target: "foo\\ bar",
},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "'foo bar'"},
want: []string{"tar", "-zxf", "foo.tar.gz", "--strip-components", "2", "--overwrite", "--unlink-first", "-C", "foo\\ bar"},
},
}
for _, tt := range tests {
@@ -804,3 +804,69 @@ func TestTargetFolderWithSpaces(t *testing.T) {
t.Fatalf("SCP-error: %v", err)
}
}
func TestHostPortString(t *testing.T) {
if os.Getenv("SSH_AUTH_SOCK") != "" {
if err := exec.Command("eval", "`ssh-agent -k`").Run(); err != nil {
t.Fatalf("exec: %v", err)
}
}
u, err := user.Lookup("drone-scp")
if err != nil {
t.Fatalf("Lookup: %v", err)
}
plugin := Plugin{
Config: Config{
Host: []string{"localhost:22", "localhost:22"},
Username: "drone-scp",
Port: "8080",
KeyPath: "tests/.ssh/id_rsa",
Source: []string{"tests/global/*"},
StripComponents: 2,
Target: []string{filepath.Join(u.HomeDir, "1234")},
CommandTimeout: 60 * time.Second,
TarExec: "tar",
},
}
err = plugin.Exec()
assert.Nil(t, err)
// check file exist
if _, err := os.Stat(filepath.Join(u.HomeDir, "1234", "c.txt")); os.IsNotExist(err) {
t.Fatalf("SCP-error: %v", err)
}
if _, err := os.Stat(filepath.Join(u.HomeDir, "1234", "d.txt")); os.IsNotExist(err) {
t.Fatalf("SCP-error: %v", err)
}
}
// Unit test for hostPort
func TestHostPort(t *testing.T) {
p := Plugin{
Config: Config{
Port: "8080",
},
}
// Test case 1: host string with port
host1 := "example.com:1234"
expectedHost1 := "example.com"
expectedPort1 := "1234"
actualHost1, actualPort1 := p.hostPort(host1)
if actualHost1 != expectedHost1 || actualPort1 != expectedPort1 {
t.Errorf("hostPort(%s) = (%s, %s); expected (%s, %s)", host1, actualHost1, actualPort1, expectedHost1, expectedPort1)
}
// Test case 2: host string without port
host2 := "example.com"
expectedHost2 := "example.com"
expectedPort2 := "8080" // default port
actualHost2, actualPort2 := p.hostPort(host2)
if actualHost2 != expectedHost2 || actualPort2 != expectedPort2 {
t.Errorf("hostPort(%s) = (%s, %s); expected (%s, %s)", host2, actualHost2, actualPort2, expectedHost2, expectedPort2)
}
}