summaryrefslogtreecommitdiff
path: root/exec.go
blob: 16f496792031eff0f65c12208669a9d8219a94b9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package shell

import (
	"errors"
	"fmt"
	"os"
	"os/exec"
	"syscall"

	"go.wit.com/log"
)

func Exec(args []string) error {
	if len(args) == 0 {
		return errors.New("Error: Command slice is empty.")
	}

	// Start a long-running process, capture stdout and stderr
	a, b := RemoveFirstElement(args)

	process := exec.Command(a, b...)
	process.Stderr = os.Stderr
	process.Stdin = os.Stdin
	process.Stdout = os.Stdout
	process.Start()
	err := process.Wait()
	log.Log(INFO, "shell.Exec() err =", err)
	return nil
}

func ExecCheck(args []string) error {
	if len(args) == 0 {
		return errors.New("Error: Command slice is empty.")
	}

	// Start a long-running process, capture stdout and stderr
	a, b := RemoveFirstElement(args)

	process := exec.Command(a, b...)
	process.Stderr = os.Stderr
	process.Stdin = os.Stdin
	process.Stdout = os.Stdout
	err := process.Run()
	if err != nil {
		log.Info("ExecCheck() err", err)
		return err
	}
	// log.Info("ExecCheck() nil")
	return nil
}

func PathExecVerbose(path string, args []string) error {
	if len(args) == 0 {
		return errors.New("Error: Command slice is empty.")
	}

	// Start a long-running process, capture stdout and stderr
	a, b := RemoveFirstElement(args)

	process := exec.Command(a, b...)
	process.Dir = path
	process.Stderr = os.Stderr
	process.Stdin = os.Stdin
	process.Stdout = os.Stdout
	err := process.Run()
	log.Info("Exec() cmd:", args)
	if err != nil {
		log.Info("ExecCheck() err", err)
		return err
	}
	// log.Info("ExecCheck() nil")
	return nil
}

func SudoRaw(c []string) {
	args := []string{"-S"}
	args = append(args, c...)
	cmd := exec.Command("sudo", args...)

	// Assign the current process's standard input, output, and error
	cmd.Stderr = os.Stderr
	cmd.Stdout = os.Stdout
	cmd.Stdin = os.Stdin

	// Ensure the process has a terminal session
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Setsid: true, // Start a new session
	}

	err := cmd.Run()
	if err != nil {
		fmt.Println("Command execution failed:", err)
	}
}

func Sudo(c []string) error {
	args := []string{"-S"}
	// args := []string{}
	args = append(args, c...)
	cmd := exec.Command("sudo", args...)

	// Open the terminal device directly to preserve input/output control
	tty, err := os.OpenFile("/dev/tty", os.O_RDWR, 0)
	if err != nil {
		fmt.Println("Failed to open /dev/tty:", err)
		return err
	}
	defer tty.Close()

	// Assign the TTY explicitly
	cmd.Stdin = tty
	cmd.Stdout = tty
	cmd.Stderr = tty

	// Ensure the new process gets its own session
	cmd.SysProcAttr = &syscall.SysProcAttr{
		Setsid: true, // Start a new session
	}

	// Run the command
	if err := cmd.Run(); err != nil {
		fmt.Println("Command execution failed:", err)
	}

	fmt.Println("\nProcess finished. TTY restored.")
	return nil
}