mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-10-09 23:17:21 +08:00
58 lines
1.2 KiB
Go
58 lines
1.2 KiB
Go
package cmd
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"io"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
func SudoHandleCmd() string {
|
|
cmd := exec.Command("sudo", "-n", "ls")
|
|
if err := cmd.Run(); err == nil {
|
|
return "sudo "
|
|
}
|
|
return ""
|
|
}
|
|
|
|
func Which(name string) bool {
|
|
stdout, err := RunDefaultWithStdoutBashCf("which %s", name)
|
|
if err != nil || (len(strings.ReplaceAll(stdout, "\n", "")) == 0) {
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func ExecWithStreamOutput(command string, outputCallback func(string)) error {
|
|
cmd := exec.Command("bash", "-c", command)
|
|
|
|
stdout, err := cmd.StdoutPipe()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get stdout: %w", err)
|
|
}
|
|
|
|
stderr, err := cmd.StderrPipe()
|
|
if err != nil {
|
|
return fmt.Errorf("failed to get stderr: %w", err)
|
|
}
|
|
|
|
if err := cmd.Start(); err != nil {
|
|
return fmt.Errorf("failed to start command: %w", err)
|
|
}
|
|
|
|
go streamReader(stdout, outputCallback)
|
|
go streamReader(stderr, outputCallback)
|
|
|
|
if err := cmd.Wait(); err != nil {
|
|
return fmt.Errorf("command finished with error: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func streamReader(reader io.ReadCloser, callback func(string)) {
|
|
scanner := bufio.NewScanner(reader)
|
|
for scanner.Scan() {
|
|
callback(scanner.Text())
|
|
}
|
|
}
|