Guest User

Untitled

a guest
Jun 19th, 2018
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 KB | None | 0 0
  1. // client.go
  2. package main
  3.  
  4. import (
  5. "log"
  6. "io"
  7. "net"
  8. "os"
  9. "github.com/docker/libchan"
  10. "github.com/docker/libchan/spdy"
  11. )
  12.  
  13. type RemoteCommand struct {
  14. Cmd string
  15. Args []string
  16. Stdin io.Writer
  17. Stdout io.Reader
  18. Stderr io.Reader
  19. StatusChan libchan.Sender
  20. }
  21.  
  22. type CommandResponse struct {
  23. Status int
  24. }
  25.  
  26. func main() {
  27. var client net.Conn
  28. client, err := net.Dial("tcp", "127.0.0.1:9323")
  29. if err != nil {
  30. log.Fatal(err)
  31. }
  32.  
  33. p, err := spdy.NewSpdyStreamProvider(client, false)
  34. transport := spdy.NewTransport(p)
  35. sender, err := transport.NewSendChannel()
  36. if err != nil {
  37. log.Fatal(err)
  38. }
  39.  
  40. receiver, remoteSender := libchan.Pipe()
  41.  
  42. command := &RemoteCommand{
  43. Cmd: os.Args[1],
  44. Args: os.Args[2:],
  45. Stdin: os.Stdin,
  46. Stdout: os.Stdout,
  47. Stderr: os.Stderr,
  48. StatusChan: remoteSender,
  49. }
  50.  
  51. err = sender.Send(command)
  52. if err != nil {
  53. log.Fatal(err)
  54. }
  55.  
  56. response := &CommandResponse{}
  57. err = receiver.Receive(response)
  58. if err != nil {
  59. log.Fatal(err)
  60. }
  61.  
  62. os.Exit(response.Status)
  63. }
  64.  
  65. // server.go
  66. package main
  67.  
  68. import (
  69. "log"
  70. "net"
  71. "io"
  72. "os/exec"
  73. "syscall"
  74. "github.com/docker/libchan"
  75. "github.com/docker/libchan/spdy"
  76. )
  77.  
  78. type RemoteReceivedCommand struct {
  79. Cmd string
  80. Args []string
  81. Stdin io.Reader
  82. Stdout io.WriteCloser
  83. Stderr io.WriteCloser
  84. StatusChan libchan.Sender
  85. }
  86.  
  87. type CommandResponse struct {
  88. Status int
  89. }
  90.  
  91. func main() {
  92. var listener net.Listener
  93. var err error
  94. listener, err = net.Listen("tcp", "localhost:9323")
  95. if err != nil {
  96. log.Fatal(err)
  97. }
  98.  
  99. for {
  100. c, err := listener.Accept()
  101. if err != nil {
  102. log.Print("listener accept error")
  103. log.Print(err)
  104. break
  105. }
  106.  
  107. p, err := spdy.NewSpdyStreamProvider(c, true)
  108. if err != nil {
  109. log.Print("spdy stream error")
  110. log.Print(err)
  111. break
  112. }
  113. t := spdy.NewTransport(p)
  114.  
  115. go func() {
  116. for {
  117. receiver, err := t.WaitReceiveChannel()
  118. if err != nil {
  119. log.Print("receiver error")
  120. log.Print(err)
  121. break
  122. }
  123. log.Print("about to spawn receive proc")
  124. go func() {
  125. for {
  126. command := &RemoteReceivedCommand{}
  127. err := receiver.Receive(command)
  128. log.Print("received command")
  129. log.Print(command)
  130. if err != nil {
  131. log.Print("command error")
  132. log.Print(err)
  133. break
  134. }
  135.  
  136. cmd := exec.Command(command.Cmd, command.Args...)
  137. cmd.Stdout = command.Stdout
  138. cmd.Stderr = command.Stderr
  139.  
  140. stdin, err := cmd.StdinPipe()
  141. if err != nil {
  142. log.Print("stdin error")
  143. log.Print(err)
  144. break
  145. }
  146. go func() {
  147. io.Copy(stdin, command.Stdin)
  148. stdin.Close()
  149. }()
  150.  
  151. log.Print("about to run the command")
  152. res := cmd.Run()
  153. command.Stdout.Close()
  154. command.Stderr.Close()
  155. returnResult := &CommandResponse{}
  156. if res != nil {
  157. if exiterr, ok := res.(*exec.ExitError); ok {
  158. returnResult.Status = exiterr.Sys().(syscall.WaitStatus).ExitStatus()
  159. } else {
  160. log.Print("res")
  161. log.Print(res)
  162. returnResult.Status = 10
  163. }
  164. }
  165. err = command.StatusChan.Send(returnResult)
  166. if err != nil {
  167. log.Print(err)
  168. }
  169. }
  170. }()
  171. }
  172. }()
  173.  
  174.  
  175. }
  176. }
  177.  
  178. $ ./client /bin/echo "hello"
  179.  
  180. 2018/06/18 23:13:56 about to spawn receive proc
  181. 2018/06/18 23:13:56 received command
  182. 2018/06/18 23:13:56 &{/bin/echo [hello] 0xc4201201b0 0xc42023c030 0xc42023c090 0xc420186080}
  183. 2018/06/18 23:13:56 about to run the command
  184. 2018/06/18 23:13:56 received command
  185. 2018/06/18 23:13:56 &{ [] <nil> <nil> <nil> <nil>}
  186. 2018/06/18 23:13:56 command error
  187. 2018/06/18 23:13:56 EOF
Add Comment
Please, Sign In to add comment