Skip to content

Commit 5acc556

Browse files
authored
refactor: 统一连接器的数据传送行为 (#3083)
Signed-off-by: mumuhhh <14306508+mumuhhh@users.noreply.github.com>
1 parent ee846ad commit 5acc556

3 files changed

Lines changed: 32 additions & 63 deletions

File tree

pkg/connector/connector.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,17 @@ package connector
1818

1919
import (
2020
"context"
21+
"fmt"
2122
"io"
2223
"io/fs"
2324
"net"
2425
"os"
26+
"path"
27+
"path/filepath"
28+
"strings"
2529

2630
"github.com/cockroachdb/errors"
31+
"k8s.io/apimachinery/pkg/util/rand"
2732
"k8s.io/klog/v2"
2833

2934
_const "github.com/kubesphere/kubekey/v4/pkg/const"
@@ -134,3 +139,23 @@ func isLocalIP(ipAddr string) bool {
134139

135140
return false
136141
}
142+
143+
func PutData(ctx context.Context, data []byte, dest string, mode fs.FileMode, conn Connector) error {
144+
dest = filepath.ToSlash(dest)
145+
tmpDest := path.Join("/tmp", ".kk."+rand.String(10))
146+
147+
if err := conn.PutFile(ctx, data, tmpDest, mode); err != nil {
148+
return err
149+
}
150+
151+
// Escape single quotes to prevent shell injection
152+
esc := func(s string) string {
153+
return strings.ReplaceAll(s, "'", "'\\''")
154+
}
155+
156+
cmd := fmt.Sprintf("mkdir -p '%s' && mv '%s' '%s' || { rm -f '%s'; exit 1; }",
157+
esc(path.Dir(dest)), esc(tmpDest), esc(dest), esc(tmpDest))
158+
_, _, err := conn.ExecuteCommand(ctx, cmd)
159+
160+
return err
161+
}

pkg/modules/copy/copy.go

Lines changed: 4 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828
"github.com/cockroachdb/errors"
2929
kkcorev1alpha1 "github.com/kubesphere/kubekey/api/core/v1alpha1"
3030
"k8s.io/apimachinery/pkg/runtime"
31-
"k8s.io/apimachinery/pkg/util/rand"
3231
"k8s.io/klog/v2"
3332
"k8s.io/utils/ptr"
3433

@@ -251,15 +250,7 @@ func (ca copyArgs) copyAbsoluteDir(ctx context.Context, conn connector.Connector
251250
}
252251
dest := filepath.Join(ca.dest, rel)
253252

254-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
255-
256-
if err = conn.PutFile(ctx, data, tmpDest, mode); err != nil {
257-
return err
258-
}
259-
260-
_, _, err = conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
261-
262-
return err
253+
return connector.PutData(ctx, data, dest, mode, conn)
263254
})
264255
}
265256

@@ -295,16 +286,7 @@ func (ca copyArgs) copyRelativeDir(ctx context.Context, pj project.Project, relP
295286
}
296287
dest := filepath.Join(ca.dest, rel)
297288

298-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
299-
300-
err = conn.PutFile(ctx, data, tmpDest, mode)
301-
if err != nil {
302-
return err
303-
}
304-
305-
_, _, err = conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
306-
307-
return err
289+
return connector.PutData(ctx, data, dest, mode, conn)
308290
})
309291
}
310292

@@ -330,14 +312,7 @@ func (ca copyArgs) copyContent(ctx context.Context, mode fs.FileMode, conn conne
330312
mode = os.FileMode(*ca.mode)
331313
}
332314

333-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
334-
335-
if err := conn.PutFile(ctx, []byte(ca.content), tmpDest, mode); err != nil {
336-
return internal.StdoutFailed, "failed to copy file", err
337-
}
338-
339-
_, _, err := conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(ca.dest), tmpDest, ca.dest))
340-
315+
err := connector.PutData(ctx, []byte(ca.content), ca.dest, mode, conn)
341316
if err != nil {
342317
return internal.StdoutFailed, "failed to copy file", err
343318
}
@@ -356,13 +331,6 @@ func (ca copyArgs) copyFile(ctx context.Context, data []byte, mode fs.FileMode,
356331
if ca.mode != nil {
357332
mode = os.FileMode(*ca.mode)
358333
}
359-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
360-
361-
if err := conn.PutFile(ctx, data, tmpDest, mode); err != nil {
362-
return err
363-
}
364-
365-
_, _, err := conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
366334

367-
return err
335+
return connector.PutData(ctx, data, dest, mode, conn)
368336
}

pkg/modules/template/template.go

Lines changed: 3 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package template
1818

1919
import (
2020
"context"
21-
"fmt"
2221
"io/fs"
2322
"math"
2423
"os"
@@ -28,7 +27,6 @@ import (
2827
"github.com/cockroachdb/errors"
2928
kkcorev1alpha1 "github.com/kubesphere/kubekey/api/core/v1alpha1"
3029
"k8s.io/apimachinery/pkg/runtime"
31-
"k8s.io/apimachinery/pkg/util/rand"
3230
"k8s.io/klog/v2"
3331
"k8s.io/utils/ptr"
3432

@@ -228,15 +226,8 @@ func handleRelativeDir(ctx context.Context, pj project.Project, relPath string,
228226
}
229227
dest = filepath.Join(ta.dest, rel)
230228
}
231-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
232229

233-
if err = conn.PutFile(ctx, result, tmpDest, mode); err != nil {
234-
return err
235-
}
236-
237-
_, _, err = conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
238-
239-
return err
230+
return connector.PutData(ctx, result, dest, mode, conn)
240231
})
241232
}
242233

@@ -255,15 +246,8 @@ func (ta templateArgs) readFile(ctx context.Context, data string, mode fs.FileMo
255246
if ta.mode != nil {
256247
mode = os.FileMode(*ta.mode)
257248
}
258-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
259-
260-
if err = conn.PutFile(ctx, result, tmpDest, mode); err != nil {
261-
return err
262-
}
263249

264-
_, _, err = conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
265-
266-
return err
250+
return connector.PutData(ctx, result, dest, mode, conn)
267251
}
268252

269253
// absDir when template.src is absolute dir, get all files by os, parse it, and copy to remote.
@@ -304,15 +288,7 @@ func (ta templateArgs) absDir(ctx context.Context, conn connector.Connector, var
304288
dest = filepath.Join(ta.dest, rel)
305289
}
306290

307-
tmpDest := filepath.Join("/tmp", ".kk."+rand.String(10))
308-
309-
if err = conn.PutFile(ctx, result, tmpDest, mode); err != nil {
310-
return err
311-
}
312-
313-
_, _, err = conn.ExecuteCommand(ctx, fmt.Sprintf("mkdir -p %s\nmv %s %s", filepath.Dir(dest), tmpDest, dest))
314-
315-
return err
291+
return connector.PutData(ctx, result, dest, mode, conn)
316292
}); err != nil {
317293
return errors.Wrapf(err, "failed to walk dir %q", ta.src)
318294
}

0 commit comments

Comments
 (0)