shell/main.go

178 lines
3.2 KiB
Go
Raw Permalink Normal View History

2024-07-04 21:29:39 +02:00
package shell
import (
"bytes"
"errors"
"fmt"
"io/fs"
"os"
"os/exec"
"strings"
"golang.org/x/sys/unix"
)
var LinuxType string
var ErrCommandDoesNotExist = errors.New("command Doesn't Exist")
var ErrSourceDoesNotExist = errors.New("source Doesn't Exist")
func RunCommand(command string, args ...string) error {
if !DoesCommandExist(command) {
return ErrCommandDoesNotExist
}
var stderr bytes.Buffer
var mainCommand string
mainCommand = "/bin/bash"
bashCommand := exec.Command(mainCommand, "-c", command)
bashCommand.Args = append(bashCommand.Args, args...)
bashCommand.Stderr = &stderr
if err := bashCommand.Start(); err != nil {
return errors.New(stderr.String() + " " + err.Error())
}
if err := bashCommand.Wait(); err != nil {
return errors.New(stderr.String() + " " + err.Error())
}
return nil
}
func RunCommandWithSource(source string, command string, args ...string) error {
if !DoesSourceExist(source) {
return ErrSourceDoesNotExist
}
if !DoesCommandExistWithSource(source, command) {
return ErrCommandDoesNotExist
}
var stderr bytes.Buffer
var mainCommand string
mainCommand = "/bin/bash"
bashCommand := exec.Command(mainCommand, "-c", fmt.Sprintf("source %s; %s", source, command))
bashCommand.Args = append(bashCommand.Args, args...)
bashCommand.Stderr = &stderr
if err := bashCommand.Start(); err != nil {
return errors.New(stderr.String())
}
if err := bashCommand.Wait(); err != nil {
return errors.New(stderr.String())
}
return nil
}
func DoesCommandExist(command string) bool {
var stderr bytes.Buffer
var mainCommand string
mainCommand = "/bin/bash"
bashCommand := exec.Command(mainCommand, "-c", fmt.Sprintf("command -v %s", command))
bashCommand.Stderr = &stderr
if err := bashCommand.Start(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
if err := bashCommand.Wait(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
return true
}
func DoesSourceExist(source string) bool {
var stderr bytes.Buffer
var mainCommand string
mainCommand = "/bin/bash"
bashCommand := exec.Command(mainCommand, "-c", fmt.Sprintf("source %s", source))
bashCommand.Stderr = &stderr
if err := bashCommand.Start(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
if err := bashCommand.Wait(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
return true
}
func DoesCommandExistWithSource(source string, command string) bool {
if sourceCheck := DoesSourceExist(source); !sourceCheck {
return false
}
var stderr bytes.Buffer
var mainCommand string
mainCommand = "/bin/bash"
bashCommand := exec.Command(mainCommand, "-c", fmt.Sprintf("source %s && command -v %s", source, command))
bashCommand.Stderr = &stderr
if err := bashCommand.Start(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
if err := bashCommand.Wait(); err != nil {
if strings.Contains(err.Error(), "1") {
return false
}
}
return true
}
func CanExecute(script string) bool {
if _, err := os.Stat(script); errors.Is(err, fs.ErrNotExist) {
return false
}
if err := unix.Access(script, unix.X_OK); err != nil {
return err == unix.EACCES
}
return true
}