Add executeCommandWithStdinStdoutStderr
This commit is contained in:
parent
853bf5fb10
commit
881965e257
131
cmd/utils.go
131
cmd/utils.go
@ -365,9 +365,83 @@ func executeCommandWithOutputToStdout(cmdline string) (error) {
|
|||||||
return fmt.Errorf("Unknown error: you shouldn't be here!\n")
|
return fmt.Errorf("Unknown error: you shouldn't be here!\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Execute command plugging stdin and stdout to those of the running command.
|
||||||
|
* Blocking while the command run
|
||||||
|
*/
|
||||||
|
func executeCommandWithStdinStdoutStderr(cmdline string) (error) {
|
||||||
|
var cmd []string
|
||||||
|
|
||||||
|
if gUseSudo {
|
||||||
|
cmd = append(cmd, "sudo")
|
||||||
|
}
|
||||||
|
|
||||||
|
var word string
|
||||||
|
var in_escaped bool
|
||||||
|
// Split by words, or " enclosed words
|
||||||
|
for i, c := range (cmdline) {
|
||||||
|
if string(c) == "\"" {
|
||||||
|
if in_escaped {
|
||||||
|
// This is the closing "
|
||||||
|
cmd = append(cmd, word)
|
||||||
|
in_escaped = false
|
||||||
|
} else {
|
||||||
|
in_escaped = true
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if string(c) == " " {
|
||||||
|
if in_escaped {
|
||||||
|
word = word + string(c)
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
cmd = append(cmd, word)
|
||||||
|
word = ""
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if i == (len(cmdline) - 1) {
|
||||||
|
word = word + string(c)
|
||||||
|
cmd = append(cmd, word)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// else
|
||||||
|
word = word + string(c)
|
||||||
|
}
|
||||||
|
|
||||||
|
var command *exec.Cmd
|
||||||
|
if len(cmd) > 1 {
|
||||||
|
command = exec.Command(cmd[0], cmd[1:]...)
|
||||||
|
} else {
|
||||||
|
command = exec.Command(cmd[0])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get environment
|
||||||
|
command.Env = os.Environ()
|
||||||
|
|
||||||
|
// Connect command to current stdin/out/err
|
||||||
|
command.Stdin = os.Stdin
|
||||||
|
command.Stdout = os.Stdout
|
||||||
|
command.Stderr = os.Stderr
|
||||||
|
|
||||||
|
if err := command.Start(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err := command.Wait()
|
||||||
|
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
|
func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
|
||||||
var cmd []string
|
var cmd []string
|
||||||
|
|
||||||
|
// We can't execute on non-running jail
|
||||||
|
if jail.Running == false {
|
||||||
|
return "", errors.New("Can't execute command on stopped jail")
|
||||||
|
}
|
||||||
|
|
||||||
if gUseSudo {
|
if gUseSudo {
|
||||||
cmd = append(cmd, "sudo")
|
cmd = append(cmd, "sudo")
|
||||||
}
|
}
|
||||||
@ -414,6 +488,10 @@ func executeCommandInJail(jail *Jail, cmdline string) (string, error) {
|
|||||||
// else
|
// else
|
||||||
word = word + string(c)
|
word = word + string(c)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if gDebug {
|
||||||
|
fmt.Printf("DEBUG: executeCommandInJail: prepare to execute \"%s\"\n", cmd)
|
||||||
|
}
|
||||||
|
|
||||||
out, err := exec.Command(cmd[0], cmd[1:]...).CombinedOutput()
|
out, err := exec.Command(cmd[0], cmd[1:]...).CombinedOutput()
|
||||||
|
|
||||||
@ -702,6 +780,33 @@ func copyDevfsRuleset(ruleset int, srcrs int) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/********************************************************************************
|
||||||
|
* Add a rule to specified ruleset
|
||||||
|
* Ex.: addDevfsRuleToRuleset("path bpf* unhide", 1002)
|
||||||
|
*******************************************************************************/
|
||||||
|
func addDevfsRuleToRuleset(rule string, ruleset int) error {
|
||||||
|
// TODO: Check if rule not already enabled. We will need to recurse into includes.
|
||||||
|
// Get last rule index
|
||||||
|
rules := getDevfsRuleset(ruleset)
|
||||||
|
if len(rules) == 0 {
|
||||||
|
fmt.Printf("Error listing ruleset %d\n", ruleset)
|
||||||
|
return errors.New(fmt.Sprintf("Error listing rueset %d\n", ruleset))
|
||||||
|
}
|
||||||
|
|
||||||
|
f := strings.Fields(rules[(len(rules)-1)])
|
||||||
|
//fmt.Printf("Dernier index du ruleset %d: %s\n", ruleset, f[0])
|
||||||
|
index, _ := strconv.Atoi(f[0])
|
||||||
|
index += 100
|
||||||
|
|
||||||
|
cmd := fmt.Sprintf("/sbin/devfs rule -s %d add %d %s", ruleset, index, rule)
|
||||||
|
out, err := executeCommand(cmd)
|
||||||
|
if err != nil {
|
||||||
|
return errors.New(fmt.Sprintf("Error adding rule \"%s\" to ruleset %d: %s", rule, ruleset, out))
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
/********************************************************************************
|
/********************************************************************************
|
||||||
* Returns value of parameter as read in /var/run/jail.$InternalName.conf
|
* Returns value of parameter as read in /var/run/jail.$InternalName.conf
|
||||||
* Directives without value will return "true" if found
|
* Directives without value will return "true" if found
|
||||||
@ -730,32 +835,6 @@ func getValueFromRunningConfig(jname string, param string) (string, error) {
|
|||||||
|
|
||||||
return "", fmt.Errorf("Parameter not found: %s", param)
|
return "", fmt.Errorf("Parameter not found: %s", param)
|
||||||
}
|
}
|
||||||
/********************************************************************************
|
|
||||||
* Add a rule to specified ruleset
|
|
||||||
* Ex.: addDevfsRuleToRuleset("path bpf* unhide", 1002)
|
|
||||||
*******************************************************************************/
|
|
||||||
func addDevfsRuleToRuleset(rule string, ruleset int) error {
|
|
||||||
// TODO: Check if rule not already enabled. We will need to recurse into includes.
|
|
||||||
// Get last rule index
|
|
||||||
rules := getDevfsRuleset(ruleset)
|
|
||||||
if len(rules) == 0 {
|
|
||||||
fmt.Printf("Error listing ruleset %d\n", ruleset)
|
|
||||||
return errors.New(fmt.Sprintf("Error listing rueset %d\n", ruleset))
|
|
||||||
}
|
|
||||||
|
|
||||||
f := strings.Fields(rules[(len(rules)-1)])
|
|
||||||
//fmt.Printf("Dernier index du ruleset %d: %s\n", ruleset, f[0])
|
|
||||||
index, _ := strconv.Atoi(f[0])
|
|
||||||
index += 100
|
|
||||||
|
|
||||||
cmd := fmt.Sprintf("/sbin/devfs rule -s %d add %d %s", ruleset, index, rule)
|
|
||||||
out, err := executeCommand(cmd)
|
|
||||||
if err != nil {
|
|
||||||
return errors.New(fmt.Sprintf("Error adding rule \"%s\" to ruleset %d: %s", rule, ruleset, out))
|
|
||||||
}
|
|
||||||
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user