package main import ( "flag" "io/ioutil" "log" "net/rpc" ) var ( rpcserver = flag.String("server", ":http-alt", "RPC Server port") servername = flag.String("host", "", "ServerName (required)") upstream = flag.String("upstream", "", "Upstream URL (removes route if emty)") keyfile = flag.String("key", "", "TLS Key file (requires cert flag)") certfile = flag.String("cert", "", "TLS Cert file (requires key flag)") ) // Entry contains routing settings type Entry struct { ServerName string Upstream string Cert []byte Key []byte } func (e Entry) String() string { ret := e.ServerName + " → " + e.Upstream if e.Cert != nil && e.Key != nil { ret += " with TLS" } return ret } 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 Entry) 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 != "" && e.Upstream == "": log.Println("Del", e) return client.Call("GoXY.Del", e, nil) default: var r []Entry err = client.Call("GoXY.List", struct{}{}, &r) if err != nil { return err } for _, e := range r { log.Println(e) } } return nil } func main() { var e Entry flag.Parse() e.ServerName, e.Upstream = *servername, *upstream e.Cert, e.Key = loadCert(*certfile, *keyfile) if err := send(*rpcserver, e); err != nil { log.Fatal(err) } }