| // Copyright 2018 Google LLC |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| syntax = "proto3"; |
| |
| package waterfall; |
| |
| option java_package = "com.google.waterfall"; |
| option java_outer_classname = "WaterfallProto"; |
| |
| import "google/protobuf/empty.proto"; |
| |
| message Message { |
| bytes payload = 1; |
| } |
| |
| // Keep this as lean as possible. We only care about the payload during most |
| // of the duration of the session. All other fields are only useful during |
| // the beginning/end of the transfer |
| message Transfer { |
| // Remote path to for push/pull. Remote path lives in the server fs. |
| // There is no need to send local path, since client has this info. |
| string path = 1; |
| |
| // A stream of bytes. Encoded as a tarball. |
| bytes payload = 2; |
| |
| // status fields. |
| bool success = 3; |
| bytes err = 4; |
| } |
| |
| message Cmd { |
| // Path to the binary to execute. |
| // Path should be absolute. Otherwise behavior is not specified. |
| // use /system/bin/sh -c to run in a shell. |
| // Interactive shell is not supported. |
| string path = 1; |
| |
| // Args to pass to the command |
| repeated string args = 2; |
| |
| // Directory to execute the command |
| string dir = 3; |
| |
| // Whether to pipe stdin to the command |
| bool pipeIn = 4; |
| |
| // Environment to use |
| map<string, string> env = 5; |
| |
| } |
| |
| message CmdProgress { |
| |
| // Command to execute. Only valid for the initial message of the stream. |
| Cmd cmd = 5; |
| |
| // the exit code of the command. |
| // Only populated when the gRPC stream is done. |
| // I.e. the last message before the EOF. |
| uint32 exit_code = 1; |
| |
| bytes stdout = 2; |
| bytes stderr = 3; |
| bytes stdin = 4; |
| } |
| |
| message ForwardMessage { |
| enum Kind { |
| UNSET = 0; |
| TCP = 1; |
| UDP = 2; |
| UNIX = 3; |
| } |
| |
| enum Op { |
| OPEN = 0; |
| FWD = 1; |
| CLOSE = 2; |
| } |
| |
| // Kind of connection to start (tcp|udp|unix) |
| Kind kind = 1; |
| Op op = 2; |
| |
| // Address to open and redirect payload to. |
| string addr = 3; |
| // Data to be pushed to connection established on addr. |
| bytes payload = 4; |
| // Whether or not to rebind the port. |
| bool rebind = 5; |
| } |
| |
| message VersionMessage { |
| string version = 1; |
| } |
| |
| service Waterfall { |
| // Echo exists solely for test purposes. |
| rpc Echo(stream Message) returns (stream Message); |
| |
| // Push file/dir from host to device. |
| rpc Push(stream Transfer) returns (Transfer); |
| |
| // Pull file/dir from device to host. |
| rpc Pull(Transfer) returns (stream Transfer); |
| |
| // Exec executes cmd in the device and forward stdout and stderr to client |
| // Exec expects a single initial CmdProgress message if stdin is not |
| // being redirected. Otherwise Exec will read std from the stream. |
| rpc Exec(stream CmdProgress) returns (stream CmdProgress); |
| |
| // Forward forwards the stream payload to the requested socket |
| rpc Forward(stream ForwardMessage) returns (stream ForwardMessage); |
| |
| // Version gets the version of the server. |
| rpc Version(google.protobuf.Empty) returns (VersionMessage); |
| } |
| |
| message ForwardSession { |
| string src = 1; |
| string dst = 2; |
| } |
| |
| message PortForwardRequest { |
| bool rebind = 3; |
| ForwardSession session = 4; |
| } |
| |
| message ForwardedSessions { |
| repeated ForwardSession sessions = 1; |
| } |
| |
| // PortForwarder service runs a port forwarding session via waterfall. |
| // It allows start and stop forwarding connections when the waterfall client |
| // is unable to mantains any state (e.g. the waterfall adb binary). |
| service PortForwarder { |
| rpc ForwardPort(PortForwardRequest) returns (google.protobuf.Empty); |
| rpc Stop(PortForwardRequest) returns (google.protobuf.Empty); |
| rpc StopAll(google.protobuf.Empty) returns (google.protobuf.Empty); |
| rpc List(google.protobuf.Empty) returns (ForwardedSessions); |
| } |