package main import ( "flag" "io/ioutil" "log" "net/rpc" ) var ( rpcserver = flag.String("server", ":http-alt", "RPC Server port") servername = flag.String("host", "", "ServerName") upstream = flag.String("upstream", "", "Upstream URL") keyfile = flag.String("key", "", "TLS Key file") crtfile = flag.String("cert", "", "TLS Cert file") remove = flag.Bool("remove", false, "Remove Server") ) type Entry struct { ServerName string Upstream string Cert []byte Key []byte } func main() { flag.Parse() e := Entry{ ServerName: *servername, Upstream: *upstream, } if *keyfile != "" && *crtfile != "" { var err error if e.Cert, err = ioutil.ReadFile(*crtfile); err != nil { log.Fatal(err) } if e.Key, err = ioutil.ReadFile(*keyfile); err != nil { log.Fatal(err) } } client, err := rpc.DialHTTP("tcp", *rpcserver) if err != nil { log.Fatal(err) } defer client.Close() switch { case e.ServerName != "" && e.Upstream != "": err = client.Call("GoXY.Add", e, nil) case e.ServerName != "" && *remove: err = client.Call("GoXY.Del", e, nil) default: var r []Entry err = client.Call("GoXY.List", struct{}{}, &r) for _, v := range r { log.Println(v.ServerName, "->", v.Upstream) } } if err != nil { log.Fatal(err) } }