73 lines
1.6 KiB
Go
73 lines
1.6 KiB
Go
package provision
|
|
|
|
import (
|
|
"bufio"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"io"
|
|
"os/exec"
|
|
|
|
"github.com/portal-co/portald/warp"
|
|
)
|
|
|
|
type ProcessInputs struct {
|
|
Inps map[string][]byte
|
|
OutFiles []string
|
|
Cmd string
|
|
}
|
|
type ProcessOutputs struct {
|
|
Outs map[string][]byte
|
|
}
|
|
|
|
func Run(bash io.ReadWriter, i ProcessInputs) (ProcessOutputs, error) {
|
|
for n, b := range i.Inps {
|
|
_, err := fmt.Fprintf(bash, "echo ")
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
e := base64.NewEncoder(base64.StdEncoding, bash)
|
|
_, err = e.Write(b)
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
err = e.Close()
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
_, err = fmt.Fprintf(bash, " | base64 -d > %s;chmod a+rwx %s\n", n, n)
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
}
|
|
_, err := fmt.Fprintf(bash, "(%s) </dev/tty >/dev/tty 2>/dev/tty\n", i.Cmd)
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
m := make(map[string][]byte)
|
|
b := bufio.NewReadWriter(bufio.NewReader(bash), bufio.NewWriter(bash))
|
|
for _, o := range i.OutFiles {
|
|
_, err := fmt.Fprintf(b, "cat %s | base64 -n 1;echo $\n", o)
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
x, err := b.ReadString('$')
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
m[o], err = base64.StdEncoding.DecodeString(x)
|
|
if err != nil {
|
|
return ProcessOutputs{}, err
|
|
}
|
|
}
|
|
return ProcessOutputs{Outs: m}, nil
|
|
}
|
|
func NewLocalBash(dir string) io.ReadWriter {
|
|
return warp.XF2X(func(rw io.ReadWriter) error {
|
|
e := exec.Command("/bin/bash")
|
|
e.Stdin = rw
|
|
e.Stdout = rw
|
|
e.Dir = dir
|
|
return e.Run()
|
|
})
|
|
}
|