blob: f137cf8dbded05d4ae61404b9e76cd5930afdb7c [file] [log] [blame]
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -07001package core
2
3import (
4 "fmt"
5 "io"
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -08006 "os"
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -07007 "time"
8
Matt Rosencrantzd599e382015-01-12 11:13:32 -08009 "v.io/core/veyron2"
Jiri Simsa764efb72014-12-25 20:57:03 -080010 "v.io/core/veyron2/naming"
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070011
Jiri Simsa764efb72014-12-25 20:57:03 -080012 "v.io/core/veyron/lib/modules"
13 "v.io/core/veyron/runtimes/google/ipc/stream/proxy"
14 "v.io/core/veyron/runtimes/google/lib/publisher"
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070015)
16
17func init() {
18 modules.RegisterChild(ProxyServerCommand, `<name>`, proxyServer)
19}
20
21func proxyServer(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080022 ctx, shutdown := veyron2.Init()
23 defer shutdown()
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -080024
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070025 fl, args, err := parseListenFlags(args)
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070026 if err != nil {
Adam Sadovskyd21d95a2014-10-29 09:56:59 -070027 return fmt.Errorf("failed to parse args: %s", err)
28 }
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070029 expected := len(args)
30 rid, err := naming.NewRoutingID()
31 if err != nil {
32 return err
33 }
Cosmos Nicolaoud811b072014-10-28 17:46:27 -070034 lf := fl.ListenFlags()
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080035
Matt Rosencrantzf1c3b442015-01-12 17:53:08 -080036 proxy, err := proxy.New(rid, veyron2.GetPrincipal(ctx), lf.Addrs[0].Protocol, lf.Addrs[0].Address, "")
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070037 if err != nil {
38 return err
39 }
40 defer proxy.Shutdown()
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080041
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080042 fmt.Fprintf(stdout, "PID=%d\n", os.Getpid())
Cosmos Nicolaou8bd8e102015-01-13 21:52:53 -080043 fmt.Fprintf(stdout, "PROXY_NAME=%s\n", proxy.Endpoint().Name())
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080044 if expected > 0 {
Matt Rosencrantzd599e382015-01-12 11:13:32 -080045 pub := publisher.New(ctx, veyron2.GetNamespace(ctx), time.Minute)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080046 defer pub.WaitForStop()
47 defer pub.Stop()
Cosmos Nicolaou8bd8e102015-01-13 21:52:53 -080048 pub.AddServer(proxy.Endpoint().String(), false)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080049 for _, name := range args {
50 if len(name) == 0 {
51 return fmt.Errorf("empty name specified on the command line")
52 }
53 pub.AddName(name)
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070054 }
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080055 // Wait for all the entries to be published.
56 for {
57 got := len(pub.Published())
58 if expected == got {
59 break
60 }
61 fmt.Fprintf(stderr, "%s\n", pub.DebugString())
62 delay := time.Second
63 fmt.Fprintf(stderr, "Sleeping: %s\n", delay)
64 time.Sleep(delay)
65 }
66 for _, p := range pub.Published() {
67 fmt.Fprintf(stdout, "PUBLISHED_PROXY_NAME=%s\n", p)
68 }
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070069 }
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070070 modules.WaitForEOF(stdin)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080071 fmt.Fprintf(stdout, "DONE\n")
Cosmos Nicolaou4e213d72014-10-26 22:21:52 -070072 return nil
73}