mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-12-18 13:29:03 +08:00
fix: Fixed issue with tar file failed with exist 1 (#9261)
This commit is contained in:
parent
669855de70
commit
dd44fdd1f2
5 changed files with 65 additions and 30 deletions
|
|
@ -271,6 +271,10 @@ func (u *CronjobService) uploadCronjobBackFile(cronjob model.Cronjob, task *task
|
||||||
cloudSrc := strings.TrimPrefix(file, global.Dir.TmpDir+"/")
|
cloudSrc := strings.TrimPrefix(file, global.Dir.TmpDir+"/")
|
||||||
for _, account := range accounts {
|
for _, account := range accounts {
|
||||||
if len(account) != 0 {
|
if len(account) != 0 {
|
||||||
|
task.LogStart(i18n.GetMsgWithMap("UploadFile", map[string]interface{}{
|
||||||
|
"file": pathUtils.Join(accountMap[account].backupPath, cloudSrc),
|
||||||
|
"backup": accountMap[account].name,
|
||||||
|
}))
|
||||||
_, err := accountMap[account].client.Upload(file, pathUtils.Join(accountMap[account].backupPath, cloudSrc))
|
_, err := accountMap[account].client.Upload(file, pathUtils.Join(accountMap[account].backupPath, cloudSrc))
|
||||||
task.LogWithStatus(
|
task.LogWithStatus(
|
||||||
i18n.GetMsgWithMap("UploadFile", map[string]interface{}{
|
i18n.GetMsgWithMap("UploadFile", map[string]interface{}{
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/agent/app/task"
|
"github.com/1Panel-dev/1Panel/agent/app/task"
|
||||||
|
|
@ -17,12 +18,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type CommandHelper struct {
|
type CommandHelper struct {
|
||||||
workDir string
|
workDir string
|
||||||
outputFile string
|
outputFile string
|
||||||
scriptPath string
|
scriptPath string
|
||||||
timeout time.Duration
|
timeout time.Duration
|
||||||
taskItem *task.Task
|
taskItem *task.Task
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
|
IgnoreExist1 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Option func(*CommandHelper)
|
type Option func(*CommandHelper)
|
||||||
|
|
@ -65,6 +67,7 @@ func (c *CommandHelper) RunBashCWithArgs(arg ...string) error {
|
||||||
_, err := c.run("bash", arg...)
|
_, err := c.run("bash", arg...)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *CommandHelper) RunBashC(command string) error {
|
func (c *CommandHelper) RunBashC(command string) error {
|
||||||
std, err := c.run("bash", "-c", command)
|
std, err := c.run("bash", "-c", command)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -142,14 +145,15 @@ func (c *CommandHelper) run(name string, arg ...string) (string, error) {
|
||||||
return "", buserr.New("ErrCmdTimeout")
|
return "", buserr.New("ErrCmdTimeout")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return handleErr(stdout, stderr, err)
|
|
||||||
|
return handleErr(stdout, stderr, c.IgnoreExist1, err)
|
||||||
}
|
}
|
||||||
return stdout.String(), nil
|
return stdout.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err := cmd.Run()
|
err := cmd.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return handleErr(stdout, stderr, err)
|
return handleErr(stdout, stderr, c.IgnoreExist1, err)
|
||||||
}
|
}
|
||||||
return stdout.String(), nil
|
return stdout.String(), nil
|
||||||
}
|
}
|
||||||
|
|
@ -184,6 +188,11 @@ func WithScriptPath(scriptPath string) Option {
|
||||||
s.scriptPath = scriptPath
|
s.scriptPath = scriptPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func WithIgnoreExist1() Option {
|
||||||
|
return func(s *CommandHelper) {
|
||||||
|
s.IgnoreExist1 = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type CustomWriter struct {
|
type CustomWriter struct {
|
||||||
taskItem *task.Task
|
taskItem *task.Task
|
||||||
|
|
@ -209,7 +218,15 @@ func (cw *CustomWriter) Flush() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleErr(stdout, stderr bytes.Buffer, err error) (string, error) {
|
func handleErr(stdout, stderr bytes.Buffer, ignoreExist1 bool, err error) (string, error) {
|
||||||
|
var exitError *exec.ExitError
|
||||||
|
if ignoreExist1 && errors.As(err, &exitError) {
|
||||||
|
if status, ok := exitError.Sys().(syscall.WaitStatus); ok {
|
||||||
|
if status.ExitStatus() == 1 {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
errMsg := ""
|
errMsg := ""
|
||||||
if len(stderr.String()) != 0 {
|
if len(stderr.String()) != 0 {
|
||||||
errMsg = fmt.Sprintf("stderr: %s", stderr.String())
|
errMsg = fmt.Sprintf("stderr: %s", stderr.String())
|
||||||
|
|
|
||||||
|
|
@ -822,14 +822,13 @@ func (f FileOp) TarGzCompressPro(withDir bool, src, dst, secret, exclusionRules
|
||||||
itemPrefix = ""
|
itemPrefix = ""
|
||||||
}
|
}
|
||||||
if len(secret) != 0 {
|
if len(secret) != 0 {
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read %s --exclude-from=<(find %s -type s -printf '%s' | sed 's|^|%s/|') -zcf - %s | openssl enc -aes-256-cbc -salt -k '%s' -out %s", exStr, src, "%P\n", itemPrefix, srcItem, secret, dst)
|
commands = fmt.Sprintf("tar %s -zcf - %s | openssl enc -aes-256-cbc -salt -k '%s' -out %s", exStr, srcItem, secret, dst)
|
||||||
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
||||||
} else {
|
} else {
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read --exclude-from=<(find %s -type s -printf '%s' | sed 's|^|%s/|') -zcf %s %s %s", src, "%P\n", itemPrefix, dst, exStr, srcItem)
|
commands = fmt.Sprintf("tar -zcf %s %s %s", dst, exStr, srcItem)
|
||||||
global.LOG.Debug(commands)
|
global.LOG.Debug(commands)
|
||||||
}
|
}
|
||||||
|
cmdMgr := cmd.NewCommandMgr(cmd.WithWorkDir(workdir), cmd.WithIgnoreExist1())
|
||||||
cmdMgr := cmd.NewCommandMgr(cmd.WithWorkDir(workdir))
|
|
||||||
return cmdMgr.RunBashC(commands)
|
return cmdMgr.RunBashC(commands)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -846,13 +845,14 @@ func (f FileOp) TarGzFilesWithCompressPro(list []string, dst, secret string) err
|
||||||
}
|
}
|
||||||
commands := ""
|
commands := ""
|
||||||
if len(secret) != 0 {
|
if len(secret) != 0 {
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf - %s | openssl enc -aes-256-cbc -salt -k '%s' -out %s", strings.Join(filelist, " "), secret, dst)
|
commands = fmt.Sprintf("tar -zcf - %s | openssl enc -aes-256-cbc -salt -k '%s' -out %s", strings.Join(filelist, " "), secret, dst)
|
||||||
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
||||||
} else {
|
} else {
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf %s %s", dst, strings.Join(filelist, " "))
|
commands = fmt.Sprintf("tar -zcf %s %s", dst, strings.Join(filelist, " "))
|
||||||
global.LOG.Debug(commands)
|
global.LOG.Debug(commands)
|
||||||
}
|
}
|
||||||
return cmd.RunDefaultBashC(commands)
|
cmdMgr := cmd.NewCommandMgr(cmd.WithIgnoreExist1())
|
||||||
|
return cmdMgr.RunBashC(commands)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f FileOp) TarGzExtractPro(src, dst string, secret string) error {
|
func (f FileOp) TarGzExtractPro(src, dst string, secret string) error {
|
||||||
|
|
@ -870,7 +870,7 @@ func (f FileOp) TarGzExtractPro(src, dst string, secret string) error {
|
||||||
commands = fmt.Sprintf("tar zxvf %s", src)
|
commands = fmt.Sprintf("tar zxvf %s", src)
|
||||||
global.LOG.Debug(commands)
|
global.LOG.Debug(commands)
|
||||||
}
|
}
|
||||||
cmdMgr := cmd.NewCommandMgr(cmd.WithWorkDir(dst))
|
cmdMgr := cmd.NewCommandMgr(cmd.WithWorkDir(dst), cmd.WithIgnoreExist1())
|
||||||
return cmdMgr.RunBashC(commands)
|
return cmdMgr.RunBashC(commands)
|
||||||
}
|
}
|
||||||
func CopyCustomAppFile(srcPath, dstPath string) error {
|
func CopyCustomAppFile(srcPath, dstPath string) error {
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ import (
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/core/app/task"
|
"github.com/1Panel-dev/1Panel/core/app/task"
|
||||||
|
|
@ -17,12 +18,13 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type CommandHelper struct {
|
type CommandHelper struct {
|
||||||
workDir string
|
workDir string
|
||||||
outputFile string
|
outputFile string
|
||||||
scriptPath string
|
scriptPath string
|
||||||
timeout time.Duration
|
timeout time.Duration
|
||||||
taskItem *task.Task
|
taskItem *task.Task
|
||||||
logger *log.Logger
|
logger *log.Logger
|
||||||
|
IgnoreExist1 bool
|
||||||
}
|
}
|
||||||
|
|
||||||
type Option func(*CommandHelper)
|
type Option func(*CommandHelper)
|
||||||
|
|
@ -132,14 +134,14 @@ func (c *CommandHelper) run(name string, arg ...string) (string, error) {
|
||||||
return "", buserr.New("ErrCmdTimeout")
|
return "", buserr.New("ErrCmdTimeout")
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return handleErr(stdout, stderr, err)
|
return handleErr(stdout, stderr, c.IgnoreExist1, err)
|
||||||
}
|
}
|
||||||
return stdout.String(), nil
|
return stdout.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
err := cmd.Run()
|
err := cmd.Run()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return handleErr(stdout, stderr, err)
|
return handleErr(stdout, stderr, c.IgnoreExist1, err)
|
||||||
}
|
}
|
||||||
return stdout.String(), nil
|
return stdout.String(), nil
|
||||||
}
|
}
|
||||||
|
|
@ -174,6 +176,11 @@ func WithScriptPath(scriptPath string) Option {
|
||||||
s.scriptPath = scriptPath
|
s.scriptPath = scriptPath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func WithIgnoreExist1() Option {
|
||||||
|
return func(s *CommandHelper) {
|
||||||
|
s.IgnoreExist1 = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type CustomWriter struct {
|
type CustomWriter struct {
|
||||||
taskItem *task.Task
|
taskItem *task.Task
|
||||||
|
|
@ -199,7 +206,15 @@ func (cw *CustomWriter) Flush() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleErr(stdout, stderr bytes.Buffer, err error) (string, error) {
|
func handleErr(stdout, stderr bytes.Buffer, ignoreExist1 bool, err error) (string, error) {
|
||||||
|
var exitError *exec.ExitError
|
||||||
|
if ignoreExist1 && errors.As(err, &exitError) {
|
||||||
|
if status, ok := exitError.Sys().(syscall.WaitStatus); ok {
|
||||||
|
if status.ExitStatus() == 1 {
|
||||||
|
return "", nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
errMsg := ""
|
errMsg := ""
|
||||||
if len(stderr.String()) != 0 {
|
if len(stderr.String()) != 0 {
|
||||||
errMsg = fmt.Sprintf("stderr: %s", stderr.String())
|
errMsg = fmt.Sprintf("stderr: %s", stderr.String())
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,6 @@ func HandleTar(sourceDir, targetDir, name, exclusionRules string, secret string)
|
||||||
exMap := make(map[string]struct{})
|
exMap := make(map[string]struct{})
|
||||||
excludes := strings.Split(exclusionRules, ",")
|
excludes := strings.Split(exclusionRules, ",")
|
||||||
excludeRules := ""
|
excludeRules := ""
|
||||||
excludes = append(excludes, "*.sock")
|
|
||||||
for _, exclude := range excludes {
|
for _, exclude := range excludes {
|
||||||
if len(exclude) == 0 {
|
if len(exclude) == 0 {
|
||||||
continue
|
continue
|
||||||
|
|
@ -110,13 +109,13 @@ func HandleTar(sourceDir, targetDir, name, exclusionRules string, secret string)
|
||||||
|
|
||||||
if len(secret) != 0 {
|
if len(secret) != 0 {
|
||||||
extraCmd := "| openssl enc -aes-256-cbc -salt -k '" + secret + "' -out"
|
extraCmd := "| openssl enc -aes-256-cbc -salt -k '" + secret + "' -out"
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf %s %s %s %s", " -"+excludeRules, path, extraCmd, targetDir+"/"+name)
|
commands = fmt.Sprintf("tar -zcf %s %s %s %s", " -"+excludeRules, path, extraCmd, targetDir+"/"+name)
|
||||||
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
global.LOG.Debug(strings.ReplaceAll(commands, fmt.Sprintf(" %s ", secret), "******"))
|
||||||
} else {
|
} else {
|
||||||
commands = fmt.Sprintf("tar --warning=no-file-changed --ignore-failed-read -zcf %s %s %s", targetDir+"/"+name, excludeRules, path)
|
commands = fmt.Sprintf("tar -zcf %s %s %s", targetDir+"/"+name, excludeRules, path)
|
||||||
global.LOG.Debug(commands)
|
global.LOG.Debug(commands)
|
||||||
}
|
}
|
||||||
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(24 * time.Hour))
|
cmdMgr := cmd.NewCommandMgr(cmd.WithTimeout(24*time.Hour), cmd.WithIgnoreExist1())
|
||||||
stdout, err := cmdMgr.RunWithStdoutBashC(commands)
|
stdout, err := cmdMgr.RunWithStdoutBashC(commands)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if len(stdout) != 0 {
|
if len(stdout) != 0 {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue