84 lines
1.5 KiB
Go
84 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os"
|
|
"os/exec"
|
|
"os/user"
|
|
"runtime"
|
|
"strings"
|
|
)
|
|
|
|
// runShell executes a command through the system shell and returns output.
|
|
func runShell(shell, command string) (string, int, error) {
|
|
var stdout, stderr bytes.Buffer
|
|
|
|
cmd := exec.Command(shell)
|
|
cmd.Stdin = strings.NewReader(command)
|
|
cmd.Stdout = &stdout
|
|
cmd.Stderr = &stderr
|
|
|
|
if err := cmd.Run(); err != nil {
|
|
exitCode := 1
|
|
if exitErr, ok := err.(*exec.ExitError); ok {
|
|
exitCode = exitErr.ExitCode()
|
|
}
|
|
output := stdout.String()
|
|
if errMsg := stderr.String(); errMsg != "" {
|
|
if output != "" {
|
|
output += "\n"
|
|
}
|
|
output += errMsg
|
|
}
|
|
return output, exitCode, err
|
|
}
|
|
|
|
output := stdout.String()
|
|
if errMsg := stderr.String(); errMsg != "" {
|
|
if output != "" {
|
|
output += "\n"
|
|
}
|
|
output += errMsg
|
|
}
|
|
|
|
return output, cmd.ProcessState.ExitCode(), nil
|
|
}
|
|
|
|
func getHostname() string {
|
|
hostname, err := os.Hostname()
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
return hostname
|
|
}
|
|
|
|
func getCWD() string {
|
|
cwd, err := os.Getwd()
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
return cwd
|
|
}
|
|
|
|
func getCurrentUser() string {
|
|
u, err := user.Current()
|
|
if err != nil {
|
|
return "unknown"
|
|
}
|
|
|
|
info := fmt.Sprintf("Username: %s\nUID: %s\nGID: %s\nHome: %s",
|
|
u.Username, u.Uid, u.Gid, u.HomeDir)
|
|
|
|
// Check for elevated privileges
|
|
if runtime.GOOS != "windows" {
|
|
if os.Geteuid() == 0 {
|
|
info += "\nPrivilege: root"
|
|
} else {
|
|
info += "\nPrivilege: user"
|
|
}
|
|
}
|
|
|
|
return info
|
|
}
|