|
1 | 1 | package ssh |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "errors" |
4 | 5 | "fmt" |
5 | 6 | "net" |
| 7 | + "path" |
6 | 8 | "strings" |
7 | 9 | "time" |
8 | 10 |
|
| 11 | + "github.com/1Panel-dev/1Panel/core/global" |
9 | 12 | gossh "golang.org/x/crypto/ssh" |
10 | 13 | ) |
11 | 14 |
|
@@ -79,6 +82,35 @@ func (c *SSHClient) Run(shell string) (string, error) { |
79 | 82 | return string(buf), err |
80 | 83 | } |
81 | 84 |
|
| 85 | +func (c *SSHClient) CpFileWithCheck(src, dst string) error { |
| 86 | + localMd5, err := c.Runf("md5sum %s | awk '{print $1}'", src) |
| 87 | + if err != nil { |
| 88 | + global.LOG.Debugf("load md5sum with src for %s failed, std: %s, err: %v", path.Base(src), localMd5, err) |
| 89 | + localMd5 = "" |
| 90 | + } |
| 91 | + for i := 0; i < 3; i++ { |
| 92 | + std, cpErr := c.Runf("cp %s %s", src, dst) |
| 93 | + if err != nil { |
| 94 | + err = fmt.Errorf("cp file %s failed, std: %s, err: %v", src, std, cpErr) |
| 95 | + continue |
| 96 | + } |
| 97 | + if len(strings.TrimSpace(localMd5)) == 0 { |
| 98 | + return nil |
| 99 | + } |
| 100 | + remoteMd5, errDst := c.Runf("md5sum %s | awk '{print $1}'", dst) |
| 101 | + if errDst != nil { |
| 102 | + global.LOG.Debugf("load md5sum with dst for %s failed, std: %s, err: %v", path.Base(src), remoteMd5, errDst) |
| 103 | + return nil |
| 104 | + } |
| 105 | + if strings.TrimSpace(localMd5) == strings.TrimSpace(remoteMd5) { |
| 106 | + return nil |
| 107 | + } |
| 108 | + err = errors.New("cp file failed, file is not match!") |
| 109 | + } |
| 110 | + |
| 111 | + return err |
| 112 | +} |
| 113 | + |
82 | 114 | func (c *SSHClient) SudoHandleCmd() string { |
83 | 115 | if _, err := c.Run("sudo -n ls"); err == nil { |
84 | 116 | return "sudo " |
@@ -108,7 +140,9 @@ func (c *SSHClient) Runf(shell string, args ...interface{}) (string, error) { |
108 | 140 | } |
109 | 141 |
|
110 | 142 | func (c *SSHClient) Close() { |
111 | | - _ = c.Client.Close() |
| 143 | + if c.Client != nil { |
| 144 | + _ = c.Client.Close() |
| 145 | + } |
112 | 146 | } |
113 | 147 |
|
114 | 148 | func makePrivateKeySigner(privateKey []byte, passPhrase []byte) (gossh.Signer, error) { |
|
0 commit comments