portald/provision/prov.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()
})
}