| package main |
| |
| import ( |
| "flag" |
| "fmt" |
| |
| "code.hackerspace.pl/hscloud/go/mirko" |
| "github.com/golang/glog" |
| "github.com/q3k/cursedjsonrpc" |
| |
| pb "code.hackerspace.pl/hscloud/dc/arista-proxy/proto" |
| ) |
| |
| var ( |
| flagAristaAPI string |
| ) |
| |
| type aristaClient struct { |
| rpc cursedjsonrpc.RPCClient |
| } |
| |
| func (c *aristaClient) structuredCall(res interface{}, command ...string) error { |
| cmd := struct { |
| Version int `json:"version"` |
| Cmds []string `json:"cmds"` |
| Format string `json:"format"` |
| }{ |
| Version: 1, |
| Cmds: command, |
| Format: "json", |
| } |
| |
| err := c.rpc.CallFor(res, "runCmds", cmd) |
| if err != nil { |
| return fmt.Errorf("could not execute structured call: %v", err) |
| } |
| return nil |
| } |
| |
| type server struct { |
| arista *aristaClient |
| } |
| |
| func main() { |
| flag.StringVar(&flagAristaAPI, "arista_api", "http://admin:password@1.2.3.4:80/command-api", "Arista remote endpoint") |
| flag.Parse() |
| |
| arista := &aristaClient{ |
| rpc: cursedjsonrpc.NewClient(flagAristaAPI), |
| } |
| |
| m := mirko.New() |
| if err := m.Listen(); err != nil { |
| glog.Exitf("Listen(): %v", err) |
| } |
| |
| s := &server{ |
| arista: arista, |
| } |
| pb.RegisterAristaProxyServer(m.GRPC(), s) |
| |
| if err := m.Serve(); err != nil { |
| glog.Exitf("Serve(): %v", err) |
| } |
| |
| select {} |
| } |