exec.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import * as grpc from "@grpc/grpc-js";
  2. import * as readline from "readline";
  3. import * as google_protobuf_any_pb from "google-protobuf/google/protobuf/any_pb.js";
  4. import * as continersPb from "./grpc/containers_grpc_pb";
  5. import { IContainersClient } from "./grpc/containers_grpc_pb";
  6. import { ExecRequest, ExecResponse, LogsRequest } from "./grpc/containers_pb";
  7. import * as streamsPb from "./grpc/streams_grpc_pb";
  8. import { IStreamingClient } from "./grpc/streams_grpc_pb";
  9. import { BytesMessage } from "./grpc/streams_pb";
  10. let address = process.argv[3] || "unix:///tmp/backend.sock";
  11. const ContainersServiceClient = grpc.makeClientConstructor(
  12. continersPb["com.docker.api.protos.containers.v1.Containers"],
  13. "ContainersClient"
  14. );
  15. const client = (new ContainersServiceClient(
  16. address,
  17. grpc.credentials.createInsecure()
  18. ) as unknown) as IContainersClient;
  19. const StreamsServiceClient = grpc.makeClientConstructor(
  20. streamsPb["com.docker.api.protos.streams.v1.Streaming"],
  21. "StreamsClient"
  22. );
  23. let streamClient = (new StreamsServiceClient(
  24. address,
  25. grpc.credentials.createInsecure()
  26. ) as unknown) as IStreamingClient;
  27. let backend = process.argv[2] || "moby";
  28. let containerId = process.argv[3];
  29. const meta = new grpc.Metadata();
  30. meta.set("CONTEXT_KEY", backend);
  31. // Get the stream
  32. const stream = streamClient.newStream();
  33. stream.on("metadata", (m: grpc.Metadata) => {
  34. let req = new ExecRequest();
  35. req.setCommand("/bin/bash");
  36. req.setStreamId(m.get("id")[0] as string);
  37. req.setId(containerId);
  38. req.setTty(true);
  39. client.exec(req, meta, (err: any, _: ExecResponse) => {
  40. if (err != null) {
  41. console.error(err);
  42. return;
  43. }
  44. process.exit();
  45. });
  46. });
  47. readline.emitKeypressEvents(process.stdin);
  48. process.stdin.setRawMode(true);
  49. process.stdin.on("keypress", (str, key) => {
  50. const mess = new BytesMessage();
  51. const a = new Uint8Array(key.sequence.length);
  52. for (let i = 0; i <= key.sequence.length; i++) {
  53. a[i] = key.sequence.charCodeAt(i);
  54. }
  55. mess.setValue(a);
  56. const any = new google_protobuf_any_pb.Any();
  57. any.pack(
  58. mess.serializeBinary(),
  59. "type.googleapis.com/com.docker.api.protos.streams.v1.BytesMessage"
  60. );
  61. stream.write(any);
  62. });
  63. stream.on("data", (chunk: any) => {
  64. const m = chunk.unpack(
  65. BytesMessage.deserializeBinary,
  66. "com.docker.api.protos.streams.v1.BytesMessage"
  67. ) as BytesMessage;
  68. process.stdout.write(m.getValue());
  69. });