74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"log"
|
|
"os"
|
|
"os/exec"
|
|
)
|
|
|
|
func Execute(output_buffer *bytes.Buffer, stack ...*exec.Cmd) (err error) {
|
|
var error_buffer bytes.Buffer
|
|
pipe_stack := make([]*io.PipeWriter, len(stack)-1)
|
|
idx := 0
|
|
for ; idx < len(stack)-1; idx++ {
|
|
stdin_pipe, stdout_pipe := io.Pipe()
|
|
stack[idx].Stdout = stdout_pipe
|
|
stack[idx].Stderr = &error_buffer
|
|
stack[idx+1].Stdin = stdin_pipe
|
|
pipe_stack[idx] = stdout_pipe
|
|
}
|
|
stack[idx].Stdout = output_buffer
|
|
stack[idx].Stderr = &error_buffer
|
|
|
|
if err := call(stack, pipe_stack); err != nil {
|
|
log.Fatalln(error_buffer.String(), err)
|
|
}
|
|
return err
|
|
}
|
|
|
|
func call(stack []*exec.Cmd, pipes []*io.PipeWriter) (err error) {
|
|
if stack[0].Process == nil {
|
|
if err = stack[0].Start(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if len(stack) > 1 {
|
|
if err = stack[1].Start(); err != nil {
|
|
return err
|
|
}
|
|
defer func() {
|
|
if err == nil {
|
|
pipes[0].Close()
|
|
err = call(stack[1:], pipes[1:])
|
|
}
|
|
}()
|
|
}
|
|
return stack[0].Wait()
|
|
}
|
|
|
|
func main() {
|
|
var b1 bytes.Buffer
|
|
if err := Execute(&b1,
|
|
exec.Command("qubes-pass-client", "list", "-f"),
|
|
exec.Command("tail", "-n", "+2"),
|
|
exec.Command("zenity", "--list", "--title", "Select a Password", "--column", "Password"),
|
|
); err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
selection := b1.String()
|
|
//io.Copy(os.Stdout, &b1)
|
|
|
|
var b2 bytes.Buffer
|
|
if err := Execute(&b2,
|
|
exec.Command("qubes-pass-client", "show", selection),
|
|
exec.Command("sed", "2q;d"),
|
|
exec.Command("timeout", "--preserve-status", "9", "xclip", "-quiet", "-loops", "1"),
|
|
); err != nil {
|
|
log.Fatalln(err)
|
|
}
|
|
b2.WriteString("pass paste complete")
|
|
io.Copy(os.Stdout, &b2)
|
|
}
|