Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 1 | package core |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
| 5 | "io" |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 6 | "os" |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 7 | "time" |
| 8 | |
Matt Rosencrantz | d599e38 | 2015-01-12 11:13:32 -0800 | [diff] [blame] | 9 | "v.io/core/veyron2" |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 10 | "v.io/core/veyron2/naming" |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 11 | |
Jiri Simsa | 764efb7 | 2014-12-25 20:57:03 -0800 | [diff] [blame] | 12 | "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 Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 15 | ) |
| 16 | |
| 17 | func init() { |
| 18 | modules.RegisterChild(ProxyServerCommand, `<name>`, proxyServer) |
| 19 | } |
| 20 | |
| 21 | func proxyServer(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error { |
Suharsh Sivakumar | 19fbf99 | 2015-01-23 11:02:27 -0800 | [diff] [blame^] | 22 | ctx, shutdown := veyron2.Init() |
| 23 | defer shutdown() |
Matt Rosencrantz | f1c3b44 | 2015-01-12 17:53:08 -0800 | [diff] [blame] | 24 | |
Cosmos Nicolaou | d811b07 | 2014-10-28 17:46:27 -0700 | [diff] [blame] | 25 | fl, args, err := parseListenFlags(args) |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 26 | if err != nil { |
Adam Sadovsky | d21d95a | 2014-10-29 09:56:59 -0700 | [diff] [blame] | 27 | return fmt.Errorf("failed to parse args: %s", err) |
| 28 | } |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 29 | expected := len(args) |
| 30 | rid, err := naming.NewRoutingID() |
| 31 | if err != nil { |
| 32 | return err |
| 33 | } |
Cosmos Nicolaou | d811b07 | 2014-10-28 17:46:27 -0700 | [diff] [blame] | 34 | lf := fl.ListenFlags() |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 35 | |
Matt Rosencrantz | f1c3b44 | 2015-01-12 17:53:08 -0800 | [diff] [blame] | 36 | proxy, err := proxy.New(rid, veyron2.GetPrincipal(ctx), lf.Addrs[0].Protocol, lf.Addrs[0].Address, "") |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 37 | if err != nil { |
| 38 | return err |
| 39 | } |
| 40 | defer proxy.Shutdown() |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 41 | |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 42 | fmt.Fprintf(stdout, "PID=%d\n", os.Getpid()) |
Cosmos Nicolaou | 8bd8e10 | 2015-01-13 21:52:53 -0800 | [diff] [blame] | 43 | fmt.Fprintf(stdout, "PROXY_NAME=%s\n", proxy.Endpoint().Name()) |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 44 | if expected > 0 { |
Matt Rosencrantz | d599e38 | 2015-01-12 11:13:32 -0800 | [diff] [blame] | 45 | pub := publisher.New(ctx, veyron2.GetNamespace(ctx), time.Minute) |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 46 | defer pub.WaitForStop() |
| 47 | defer pub.Stop() |
Cosmos Nicolaou | 8bd8e10 | 2015-01-13 21:52:53 -0800 | [diff] [blame] | 48 | pub.AddServer(proxy.Endpoint().String(), false) |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 49 | 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 Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 54 | } |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 55 | // 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 Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 69 | } |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 70 | modules.WaitForEOF(stdin) |
Cosmos Nicolaou | ae8dd21 | 2014-12-13 23:43:08 -0800 | [diff] [blame] | 71 | fmt.Fprintf(stdout, "DONE\n") |
Cosmos Nicolaou | 4e213d7 | 2014-10-26 22:21:52 -0700 | [diff] [blame] | 72 | return nil |
| 73 | } |