blob: 71c2cfbca75dd5958424dc9d19384420b914cc3f [file] [log] [blame]
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -07001// Pipe To Browser client.
2// This executable pipes its sdtin to p2b service running in the browser
3package main
4
5import (
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -07006 "flag"
7 "fmt"
Ali Ghassemif88ee312014-06-13 14:26:37 -07008 "io"
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -07009 "os"
10
Ali Ghassemice692432014-07-15 13:08:07 -070011 "veyron2"
12 "veyron2/ipc"
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070013 "veyron2/rt"
14
15 "veyron/examples/pipetobrowser"
16)
17
18const usage = `
Ali Ghassemi5dcb6d32014-06-11 16:42:08 -070019%s is a Pipe To Browser client. It allows one to pipe any stdout stream from console to the browser.
20Data being piped to the browser then is displayed in a graphical and formatted way by a "viewer".
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070021
22Usage:
23
24 %s [<name>/<viewer>]
25
26 For example:
27
Ali Ghassemi6e6ec3a2014-06-20 10:23:14 -070028 ls -l | p2b google/p2b/jane/console
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070029
Ali Ghassemi6e6ec3a2014-06-20 10:23:14 -070030 or
31
32 cat cat.jpg | google/p2b/jane/image
33
Bogdan Capritad9281a32014-07-02 14:40:39 -070034 where <name> (google/p2b/jane) is the object name where p2b
Ali Ghassemi6e6ec3a2014-06-20 10:23:14 -070035 service is running in the browser. <viewer> (console, image) specifies what
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070036 viewer should be used to display the data.
37
Ali Ghassemi6e6ec3a2014-06-20 10:23:14 -070038 To redirect stderr of a process, in *nix system you can use 2>&1 before piping to P2B.
39
40 For example many daemons may write log lines to stderr instead of stdout:
41
42 serverd -alsologtostderr=true 2>&1 | google/p2b/jane/vlog
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070043`
44
45func Usage() {
Ali Ghassemi5dcb6d32014-06-11 16:42:08 -070046 fmt.Fprintf(os.Stdout, usage, os.Args[0], os.Args[0])
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070047}
48
Ali Ghassemif88ee312014-06-13 14:26:37 -070049// viewerPipeStreamWriter adapts ViewerPipeStream to io.Writer
50type viewerPipeStreamWriter struct {
51 pipetobrowser.ViewerPipeStream
52}
53
54func (w viewerPipeStreamWriter) Write(p []byte) (n int, err error) {
55 w.Send(p)
56 return len(p), nil
57}
58
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070059func main() {
60 flag.Usage = Usage
61 runtime := rt.Init()
62 log := runtime.Logger()
63
64 if flag.NArg() != 1 {
65 Usage()
66 return
67 }
68
69 name := flag.Arg(0)
70
71 // bind to the p2b service
72 s, err := pipetobrowser.BindViewer(name)
73 if err != nil {
74 log.Errorf("error binding to server: %v", err)
75 return
76 }
77
Ali Ghassemice692432014-07-15 13:08:07 -070078 stream, err := s.Pipe(runtime.NewContext(), veyron2.CallTimeout(ipc.NoTimeout))
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070079 if err != nil {
80 log.Errorf("failed to pipe to '%s' please ensure p2b service is running in the browser and name is correct.\nERR:%v", name, err)
81 return
82 }
83
Ali Ghassemif88ee312014-06-13 14:26:37 -070084 w := viewerPipeStreamWriter{
85 stream,
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070086 }
Ali Ghassemif88ee312014-06-13 14:26:37 -070087
Ali Ghassemice692432014-07-15 13:08:07 -070088 _, err = io.Copy(w, os.Stdin)
Ali Ghassemif88ee312014-06-13 14:26:37 -070089 if err != nil {
90 log.Errorf("failed to copy the stdin pipe to the outgoing stream\nERR:%v", err)
91 return
92 }
93
Ali Ghassemice692432014-07-15 13:08:07 -070094 _, err = stream.Finish()
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -070095 if err != nil {
96 log.Errorf("error finishing stream: %v", err)
97 return
98 }
99
Ali Ghassemi2ebd75b2014-06-02 15:16:34 -0700100 fmt.Println("Finished piping to browser! Thanks for using p2b.")
101}