package cmd import ( "bytes" "context" "fmt" "os/exec" "time" "github.com/1Panel-dev/1Panel/backend/buserr" "github.com/1Panel-dev/1Panel/backend/constant" ) func Exec(cmdStr string) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) defer cancel() cmd := exec.Command("bash", "-c", cmdStr) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if ctx.Err() == context.DeadlineExceeded { return "", buserr.New(constant.ErrCmdTimeout) } if err != nil { errMsg := "" if len(stderr.String()) != 0 { errMsg = fmt.Sprintf("stderr: %s", stderr.String()) } if len(stdout.String()) != 0 { if len(errMsg) != 0 { errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) } else { errMsg = fmt.Sprintf("stdout: %s", stdout.String()) } } return errMsg, err } return stdout.String(), nil } func ExecWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() cmd := exec.Command("bash", "-c", cmdStr) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if ctx.Err() == context.DeadlineExceeded { return "", buserr.New(constant.ErrCmdTimeout) } if err != nil { errMsg := "" if len(stderr.String()) != 0 { errMsg = fmt.Sprintf("stderr: %s", stderr.String()) } if len(stdout.String()) != 0 { if len(errMsg) != 0 { errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) } else { errMsg = fmt.Sprintf("stdout: %s", stdout.String()) } } return errMsg, err } return stdout.String(), nil } func ExecCronjobWithTimeOut(cmdStr string, timeout time.Duration) (string, error) { ctx, cancel := context.WithTimeout(context.Background(), timeout) defer cancel() cmd := exec.Command("bash", "-c", cmdStr) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if ctx.Err() == context.DeadlineExceeded { return "", buserr.New(constant.ErrCmdTimeout) } errMsg := "" if len(stderr.String()) != 0 { errMsg = fmt.Sprintf("stderr:\n %s", stderr.String()) } if len(stdout.String()) != 0 { if len(errMsg) != 0 { errMsg = fmt.Sprintf("%s \n\n; stdout:\n %s", errMsg, stdout.String()) } else { errMsg = fmt.Sprintf("stdout:\n %s", stdout.String()) } } return errMsg, err } func Execf(cmdStr string, a ...interface{}) (string, error) { cmd := exec.Command("bash", "-c", fmt.Sprintf(cmdStr, a...)) var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if err != nil { errMsg := "" if len(stderr.String()) != 0 { errMsg = fmt.Sprintf("stderr: %s", stderr.String()) } if len(stdout.String()) != 0 { if len(errMsg) != 0 { errMsg = fmt.Sprintf("%s; stdout: %s", errMsg, stdout.String()) } else { errMsg = fmt.Sprintf("stdout: %s", stdout.String()) } } return errMsg, err } return stdout.String(), nil } func HasNoPasswordSudo() bool { cmd2 := exec.Command("sudo", "-n", "ls") err2 := cmd2.Run() return err2 == nil } func SudoHandleCmd() string { cmd := exec.Command("sudo", "-n", "ls") if err := cmd.Run(); err == nil { return "sudo " } return "" }