|
|
|
@ -4,11 +4,13 @@ import (
|
|
|
|
|
"context" |
|
|
|
|
"github.com/1Panel-dev/1Panel/global" |
|
|
|
|
"github.com/mholt/archiver/v4" |
|
|
|
|
"github.com/pkg/errors" |
|
|
|
|
"github.com/spf13/afero" |
|
|
|
|
"io" |
|
|
|
|
"io/fs" |
|
|
|
|
"net/http" |
|
|
|
|
"os" |
|
|
|
|
"path" |
|
|
|
|
"path/filepath" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
@ -116,6 +118,112 @@ func (f FileOp) Cut(oldPaths []string, dst string) error {
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f FileOp) Copy(src, dst string) error { |
|
|
|
|
if src = path.Clean("/" + src); src == "" { |
|
|
|
|
return os.ErrNotExist |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if dst = path.Clean("/" + dst); dst == "" { |
|
|
|
|
return os.ErrNotExist |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if src == "/" || dst == "/" { |
|
|
|
|
return os.ErrInvalid |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if dst == src { |
|
|
|
|
return os.ErrInvalid |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
info, err := f.Fs.Stat(src) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if info.IsDir() { |
|
|
|
|
return f.CopyDir(src, dst) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return f.CopyFile(src, dst) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f FileOp) CopyDir(src, dst string) error { |
|
|
|
|
srcInfo, err := f.Fs.Stat(src) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
dstDir := filepath.Join(dst, srcInfo.Name()) |
|
|
|
|
if err := f.Fs.MkdirAll(dstDir, srcInfo.Mode()); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dir, _ := f.Fs.Open(src) |
|
|
|
|
obs, err := dir.Readdir(-1) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
var errs []error |
|
|
|
|
|
|
|
|
|
for _, obj := range obs { |
|
|
|
|
fSrc := filepath.Join(src, obj.Name()) |
|
|
|
|
fDst := filepath.Join(dstDir, obj.Name()) |
|
|
|
|
|
|
|
|
|
if obj.IsDir() { |
|
|
|
|
err = f.CopyDir(fSrc, fDst) |
|
|
|
|
if err != nil { |
|
|
|
|
errs = append(errs, err) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
err = f.CopyFile(fSrc, fDst) |
|
|
|
|
if err != nil { |
|
|
|
|
errs = append(errs, err) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var errString string |
|
|
|
|
for _, err := range errs { |
|
|
|
|
errString += err.Error() + "\n" |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if errString != "" { |
|
|
|
|
return errors.New(errString) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (f FileOp) CopyFile(src, dst string) error { |
|
|
|
|
srcFile, err := f.Fs.Open(src) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
defer srcFile.Close() |
|
|
|
|
|
|
|
|
|
err = f.Fs.MkdirAll(filepath.Dir(dst), 0666) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
dstFile, err := f.Fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
defer dstFile.Close() |
|
|
|
|
|
|
|
|
|
if _, err = io.Copy(dstFile, srcFile); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
info, err := f.Fs.Stat(src) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
if err = f.Fs.Chmod(dst, info.Mode()); err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type CompressType string |
|
|
|
|
|
|
|
|
|
const ( |
|
|
|
|