package main import ( "flag" "io/ioutil" "log" "net/rpc" "dim13.org/goxy" ) 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") certfile = flag.String("cert", "", "TLS Cert file") remove = flag.Bool("remove", false, "Remove route") ) func loadCert(certFile, keyFile string) ([]byte, []byte) { if certFile == "" || keyFile == "" { return nil, nil } cert, err := ioutil.ReadFile(certFile) if err != nil { log.Fatal(err) } key, err := ioutil.ReadFile(keyFile) if err != nil { log.Fatal(err) } return cert, key } func send(server string, e goxy.Entry, del bool) error { client, err := rpc.DialHTTP("tcp", server) if err != nil { return err } defer client.Close() switch { case e.ServerName != "" && e.Upstream != "": log.Println("Add", e) return client.Call("GoXY.Add", e, nil) case e.ServerName != "" && del: log.Println("Del", e) return client.Call("GoXY.Del", e, nil) default: var r goxy.Route err = client.Call("GoXY.List", struct{}{}, &r) if err != nil { return err } for k, v := range r { log.Println(k, v) } } return nil } func main() { var e goxy.Entry flag.Parse() e.ServerName, e.Upstream = *servername, *upstream e.Cert, e.Key = loadCert(*certfile, *keyfile) if err := send(*rpcserver, e, *remove); err != nil { log.Fatal(err) } }