You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
subgraph-oz/oz-init/client.go

73 lines
1.4 KiB

package ozinit
import (
"github.com/subgraph/oz/ipc"
"errors"
"fmt"
)
func clientConnect(addr string) (*ipc.MsgConn, error) {
c := ipc.NewMsgConn(messageFactory, addr)
if err := c.Connect(); err != nil {
return nil, err
}
return c, 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 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)
}
}