kayos@tcp.direct 2024-06-19 14:04:10 -07:00
parent 7fddd4d073
commit ce15213009
No known key found for this signature in database
GPG key ID: 4B841471B4BEE979
3 changed files with 117 additions and 3 deletions

View file

@ -83,7 +83,7 @@ func Set_KernelStub(isRoot bool) {
// Run and log, check for errors // Run and log, check for errors
common.ErrorCheck(command.ExecAndLogSudo(isRoot, true, common.ErrorCheck(command.ExecAndLogSudo(isRoot, true,
"kernelstub -a "+fmt.Sprintf("\"%s\"", kernel_args), fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
), ),
"Error, kernelstub command returned exit code 1", "Error, kernelstub command returned exit code 1",
) )

View file

@ -112,6 +112,28 @@ func Clear() {
_ = c.Run() _ = c.Run()
} }
func processCmdString(cmd string) (string, []string) {
// handle quoted arguments
args := strings.Fields(cmd)
cmdBin := args[0]
args = args[1:]
for i, arg := range args {
if !strings.HasPrefix(arg, "\"") {
continue
}
// find the end of the quoted argument
for j, a := range args[i:] {
if strings.HasSuffix(a, "\"") {
args[i] = strings.Join(args[i:i+j+1], " ")
args = append(args[:i+1], args[i+j+1:]...)
break
}
}
}
return cmdBin, args
}
// ExecAndLogSudo executes an elevated command and logs the output. // ExecAndLogSudo executes an elevated command and logs the output.
// //
// * if we're root, the command is executed directly // * if we're root, the command is executed directly
@ -138,8 +160,8 @@ func ExecAndLogSudo(isRoot, noisy bool, cmd string) error {
return err return err
} }
cs := strings.Fields(cmd) cmdBin, args := processCmdString(cmd)
r := exec.Command(cs[0], cs[1:]...) r := exec.Command(cmdBin, args...)
r.Dir = wd r.Dir = wd
cmdCombinedOut, err := r.CombinedOutput() cmdCombinedOut, err := r.CombinedOutput()

View file

@ -0,0 +1,92 @@
package command
import (
"fmt"
"reflect"
"testing"
)
func Test_processCmdString(t *testing.T) {
type args struct {
cmd string
}
kernel_args := "intel_iommu=on iommu=pt vfio-pci.ids=10de:1c03,10de:10f1"
tests := []struct {
name string
args args
want string
want1 []string
}{
{
name: "ls -l",
args: args{
cmd: "ls -l",
},
want: "ls",
want1: []string{
"-l",
},
},
{
name: "ls -l -a",
args: args{
cmd: "ls -l -a",
},
want: "ls",
want1: []string{
"-l",
"-a",
},
},
{
name: "rm -v \"file.txt\"",
args: args{
cmd: "rm -v \"file.txt\"",
},
want: "rm",
want1: []string{
"-v",
"\"file.txt\"",
},
},
{
name: "rm -v \"file.txt\" -f",
args: args{
cmd: "rm -v \"file.txt\" -f",
},
want: "rm",
want1: []string{
"-v",
"\"file.txt\"",
"-f",
},
},
{
name: fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
args: args{
cmd: fmt.Sprintf("kernelstub -a \"%s\"", kernel_args),
},
want: "kernelstub",
want1: []string{
"-a",
fmt.Sprintf("\"%s\"", kernel_args),
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, got1 := processCmdString(tt.args.cmd)
if got != tt.want {
t.Errorf("processCmdString() got = %v, want %v", got, tt.want)
}
t.Logf("got: %v", got)
t.Logf("got1: %v", got1)
if !reflect.DeepEqual(got1, tt.want1) {
t.Errorf("processCmdString() got1 = %v, want %v", got1, tt.want1)
}
})
}
}