package ozinit import ( "errors" "fmt" "github.com/subgraph/oz/ipc" ) func clientConnect(addr string) (*ipc.MsgConn, error) { return ipc.Connect(addr, messageFactory, nil) } func clientSend(addr string, msg interface{}) (*ipc.Message, error) { c, err := clientConnect(addr) if err != nil { return nil, err } defer c.Close() rr, err := c.ExchangeMsg(msg) if err != nil { return nil, err } resp := <-rr.Chan() rr.Done() return resp, nil } func Ping(addr string) error { resp, err := clientSend(addr, new(PingMsg)) if err != nil { return err } switch body := resp.Body.(type) { case *PingMsg: return nil case *ErrorMsg: return errors.New(body.Msg) default: return fmt.Errorf("Unexpected message received: %+v", body) } } func RunProgram(addr, pwd string, args []string) error { c, err := clientConnect(addr) if err != nil { return err } rr, err := c.ExchangeMsg(&RunProgramMsg{Args: args, Pwd: pwd}) resp := <-rr.Chan() rr.Done() c.Close() if err != nil { return err } switch body := resp.Body.(type) { case *ErrorMsg: return errors.New(body.Msg) case *OkMsg: return nil default: return fmt.Errorf("Unexpected message type received: %+v", body) } } func RunShell(addr, term string) (int, error) { c, err := clientConnect(addr) if err != nil { return 0, err } rr, err := c.ExchangeMsg(&RunShellMsg{Term: term}) resp := <-rr.Chan() rr.Done() c.Close() if err != nil { return 0, err } switch body := resp.Body.(type) { case *ErrorMsg: return 0, errors.New(body.Msg) case *OkMsg: if len(resp.Fds) == 0 { return 0, errors.New("RunShell message returned Ok, but no file descriptor received") } return resp.Fds[0], nil default: return 0, fmt.Errorf("Unexpected message type received: %+v", body) } }