package main import ( "crypto/rsa" "crypto/tls" "encoding/gob" "flag" "log" "net/rpc" ) var ( rpcserver = flag.String("server", ":http-alt", "RPC Server port") servername = flag.String("servername", "", "from") upstream = flag.String("upstream", "", "to") keyfile = flag.String("keyfile", "", "TLS Key file") crtfile = flag.String("crtfile", "", "TLC Crt file") remove = flag.Bool("remove", false, "remove entry") ) type Entry struct { ServerName string Upstream string Cert *tls.Certificate } func init() { gob.Register(rsa.PrivateKey{}) } func main() { flag.Parse() e := Entry{ ServerName: *servername, Upstream: *upstream, } if *keyfile != "" && *crtfile != "" { crt, err := tls.LoadX509KeyPair(*crtfile, *keyfile) if err != nil { log.Fatal(err) } e.Cert = &crt } 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 map[string]Entry err = client.Call("GoXY.List", struct{}{}, &r) for k, v := range r { log.Println(k, v) } } if err != nil { log.Fatal(err) } }