diff --git a/cmd/agent/main.go b/cmd/agent/main.go index 73ef869..843d626 100644 --- a/cmd/agent/main.go +++ b/cmd/agent/main.go @@ -21,7 +21,6 @@ import ( "github.com/blang/semver" "github.com/ebi-yade/altsvc-go" "github.com/go-ping/ping" - "github.com/gorilla/websocket" "github.com/nezhahq/go-github-selfupdate/selfupdate" "github.com/nezhahq/service" "github.com/quic-go/quic-go/http3" @@ -374,8 +373,6 @@ func doTask(task *pb.Task) { result.Id = task.GetId() result.Type = task.GetType() switch task.GetType() { - case model.TaskTypeTerminal: - handleTerminalTask(task) case model.TaskTypeHTTPGET: handleHttpGetTask(task, &result) case model.TaskTypeICMPPing: @@ -386,10 +383,14 @@ func doTask(task *pb.Task) { handleCommandTask(task, &result) case model.TaskTypeUpgrade: handleUpgradeTask(task, &result) + case model.TaskTypeTerminalGRPC: + handleTerminalTask(task) + return case model.TaskTypeKeepalive: return default: println("不支持的任务:", task) + return } client.ReportTask(context.Background(), &result) } @@ -438,7 +439,7 @@ func doSelfUpdate(useLocalVersion bool) { } } -func handleUpgradeTask(task *pb.Task, result *pb.TaskResult) { +func handleUpgradeTask(*pb.Task, *pb.TaskResult) { if agentCliParam.DisableForceUpdate { return } @@ -628,24 +629,20 @@ func handleTerminalTask(task *pb.Task) { println("Terminal 任务解析错误:", err) return } - protocol := "ws" - if terminal.UseSSL { - protocol += "s" - } - header := http.Header{} - header.Add("Secret", agentCliParam.ClientSecret) - // 目前只兼容Cloudflare验证 - // 后续可能需要兼容更多的Cookie验证情况 - if terminal.Cookie != "" { - cfCookie := fmt.Sprintf("CF_Authorization=%s", terminal.Cookie) - header.Add("Cookie", cfCookie) - } - conn, _, err := websocket.DefaultDialer.Dial(fmt.Sprintf("%s://%s/terminal/%s", protocol, terminal.Host, terminal.Session), header) + + remoteIO, err := client.IOStream(context.Background()) if err != nil { - println("Terminal 连接失败:", err) + println("Terminal IOStream失败:", err) + return + } + + // 发送 StreamID + if err := remoteIO.Send(&pb.IOStreamData{Data: append([]byte{ + 0xff, 0x05, 0xff, 0x05, + }, []byte(terminal.StreamID)...)}); err != nil { + println("Terminal 发送StreamID失败:", err) return } - defer conn.Close() tty, err := pty.Start() if err != nil { @@ -655,50 +652,37 @@ func handleTerminalTask(task *pb.Task) { defer func() { err := tty.Close() - conn.Close() - println("terminal exit", terminal.Session, err) + errCloseSend := remoteIO.CloseSend() + println("terminal exit", terminal.StreamID, err, errCloseSend) }() - println("terminal init", terminal.Session) + println("terminal init", terminal.StreamID) go func() { for { buf := make([]byte, 1024) read, err := tty.Read(buf) if err != nil { - conn.WriteMessage(websocket.TextMessage, []byte(err.Error())) - conn.Close() + remoteIO.Send(&pb.IOStreamData{Data: []byte(err.Error())}) + remoteIO.CloseSend() return } - conn.WriteMessage(websocket.BinaryMessage, buf[:read]) + remoteIO.Send(&pb.IOStreamData{Data: buf[:read]}) } }() for { - messageType, reader, err := conn.NextReader() - if err != nil { + var remoteData *pb.IOStreamData + if remoteData, err = remoteIO.Recv(); err != nil { return } - - if messageType == websocket.TextMessage { - continue - } - - dataTypeBuf := make([]byte, 1) - read, err := reader.Read(dataTypeBuf) - if err != nil { - conn.WriteMessage(websocket.TextMessage, []byte("Unable to read message type from reader")) + if remoteData.Data == nil || len(remoteData.Data) == 0 { return } - - if read != 1 { - return - } - - switch dataTypeBuf[0] { + switch remoteData.Data[0] { case 0: - io.Copy(tty, reader) + tty.Write(remoteData.Data[1:]) case 1: - decoder := util.Json.NewDecoder(reader) + decoder := util.Json.NewDecoder(strings.NewReader(string(remoteData.Data[1:]))) var resizeMessage WindowSize err := decoder.Decode(&resizeMessage) if err != nil { diff --git a/cmd/agent/service.go b/cmd/agent/service.go index d87c210..87bfacc 100644 --- a/cmd/agent/service.go +++ b/cmd/agent/service.go @@ -50,8 +50,6 @@ func (p *program) run() { }() run() - - return } func init() { diff --git a/go.mod b/go.mod index ceb9d49..65d6e57 100644 --- a/go.mod +++ b/go.mod @@ -12,7 +12,6 @@ require ( github.com/dean2021/goss v0.0.0-20230129073947-df90431348f1 github.com/ebi-yade/altsvc-go v0.1.1 github.com/go-ping/ping v1.1.0 - github.com/gorilla/websocket v1.5.1 github.com/iamacarpet/go-winpty v1.0.4 github.com/jaypipes/ghw v0.12.0 github.com/json-iterator/go v1.1.12 diff --git a/go.sum b/go.sum index e8533ea..d1bdfed 100644 --- a/go.sum +++ b/go.sum @@ -63,8 +63,6 @@ github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLe github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u7lxST/RaJw+cv273q79D81Xbog= diff --git a/model/task.go b/model/task.go index e731193..6c8e6a2 100644 --- a/model/task.go +++ b/model/task.go @@ -9,15 +9,9 @@ const ( TaskTypeTerminal TaskTypeUpgrade TaskTypeKeepalive + TaskTypeTerminalGRPC ) type TerminalTask struct { - // websocket 主机名 - Host string `json:"host,omitempty"` - // 是否启用 SSL - UseSSL bool `json:"use_ssl,omitempty"` - // 会话标识 - Session string `json:"session,omitempty"` - // Agent在连接Server时需要的额外Cookie信息 - Cookie string `json:"cookie,omitempty"` + StreamID string } diff --git a/proto/nezha.pb.go b/proto/nezha.pb.go index ad13b26..0d7720e 100644 --- a/proto/nezha.pb.go +++ b/proto/nezha.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 -// protoc v5.26.1 +// protoc-gen-go v1.34.2 +// protoc v5.27.1 // source: proto/nezha.proto package proto @@ -582,6 +582,53 @@ func (x *Receipt) GetProced() bool { return false } +type IOStreamData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *IOStreamData) Reset() { + *x = IOStreamData{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_nezha_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *IOStreamData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IOStreamData) ProtoMessage() {} + +func (x *IOStreamData) ProtoReflect() protoreflect.Message { + mi := &file_proto_nezha_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use IOStreamData.ProtoReflect.Descriptor instead. +func (*IOStreamData) Descriptor() ([]byte, []int) { + return file_proto_nezha_proto_rawDescGZIP(), []int{6} +} + +func (x *IOStreamData) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + var File_proto_nezha_proto protoreflect.FileDescriptor var file_proto_nezha_proto_rawDesc = []byte{ @@ -663,21 +710,27 @@ var file_proto_nezha_proto_rawDesc = []byte{ 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x22, 0x21, 0x0a, 0x07, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x32, 0xd6, 0x01, 0x0a, 0x0c, - 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x11, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x1a, - 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, - 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, - 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0b, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x64, 0x22, 0x22, 0x0a, 0x0c, 0x49, + 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x32, + 0x92, 0x02, 0x0a, 0x0c, 0x4e, 0x65, 0x7a, 0x68, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x33, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, + 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x10, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0a, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x1a, 0x0e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x22, 0x00, 0x12, 0x2b, 0x0a, 0x0b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0b, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0b, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x08, 0x49, 0x4f, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x12, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x49, 0x4f, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x2e, 0x49, 0x4f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x44, 0x61, 0x74, 0x61, 0x22, 0x00, + 0x28, 0x01, 0x30, 0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } @@ -693,14 +746,15 @@ func file_proto_nezha_proto_rawDescGZIP() []byte { return file_proto_nezha_proto_rawDescData } -var file_proto_nezha_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_proto_nezha_proto_goTypes = []interface{}{ +var file_proto_nezha_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_proto_nezha_proto_goTypes = []any{ (*Host)(nil), // 0: proto.Host (*State)(nil), // 1: proto.State (*State_SensorTemperature)(nil), // 2: proto.State_SensorTemperature (*Task)(nil), // 3: proto.Task (*TaskResult)(nil), // 4: proto.TaskResult (*Receipt)(nil), // 5: proto.Receipt + (*IOStreamData)(nil), // 6: proto.IOStreamData } var file_proto_nezha_proto_depIdxs = []int32{ 2, // 0: proto.State.temperatures:type_name -> proto.State_SensorTemperature @@ -708,12 +762,14 @@ var file_proto_nezha_proto_depIdxs = []int32{ 0, // 2: proto.NezhaService.ReportSystemInfo:input_type -> proto.Host 4, // 3: proto.NezhaService.ReportTask:input_type -> proto.TaskResult 0, // 4: proto.NezhaService.RequestTask:input_type -> proto.Host - 5, // 5: proto.NezhaService.ReportSystemState:output_type -> proto.Receipt - 5, // 6: proto.NezhaService.ReportSystemInfo:output_type -> proto.Receipt - 5, // 7: proto.NezhaService.ReportTask:output_type -> proto.Receipt - 3, // 8: proto.NezhaService.RequestTask:output_type -> proto.Task - 5, // [5:9] is the sub-list for method output_type - 1, // [1:5] is the sub-list for method input_type + 6, // 5: proto.NezhaService.IOStream:input_type -> proto.IOStreamData + 5, // 6: proto.NezhaService.ReportSystemState:output_type -> proto.Receipt + 5, // 7: proto.NezhaService.ReportSystemInfo:output_type -> proto.Receipt + 5, // 8: proto.NezhaService.ReportTask:output_type -> proto.Receipt + 3, // 9: proto.NezhaService.RequestTask:output_type -> proto.Task + 6, // 10: proto.NezhaService.IOStream:output_type -> proto.IOStreamData + 6, // [6:11] is the sub-list for method output_type + 1, // [1:6] is the sub-list for method input_type 1, // [1:1] is the sub-list for extension type_name 1, // [1:1] is the sub-list for extension extendee 0, // [0:1] is the sub-list for field type_name @@ -725,7 +781,7 @@ func file_proto_nezha_proto_init() { return } if !protoimpl.UnsafeEnabled { - file_proto_nezha_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[0].Exporter = func(v any, i int) any { switch v := v.(*Host); i { case 0: return &v.state @@ -737,7 +793,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[1].Exporter = func(v any, i int) any { switch v := v.(*State); i { case 0: return &v.state @@ -749,7 +805,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[2].Exporter = func(v any, i int) any { switch v := v.(*State_SensorTemperature); i { case 0: return &v.state @@ -761,7 +817,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[3].Exporter = func(v any, i int) any { switch v := v.(*Task); i { case 0: return &v.state @@ -773,7 +829,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[4].Exporter = func(v any, i int) any { switch v := v.(*TaskResult); i { case 0: return &v.state @@ -785,7 +841,7 @@ func file_proto_nezha_proto_init() { return nil } } - file_proto_nezha_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_proto_nezha_proto_msgTypes[5].Exporter = func(v any, i int) any { switch v := v.(*Receipt); i { case 0: return &v.state @@ -797,6 +853,18 @@ func file_proto_nezha_proto_init() { return nil } } + file_proto_nezha_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*IOStreamData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -804,7 +872,7 @@ func file_proto_nezha_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_nezha_proto_rawDesc, NumEnums: 0, - NumMessages: 6, + NumMessages: 7, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/nezha.proto b/proto/nezha.proto index c3ff79c..da62c9a 100644 --- a/proto/nezha.proto +++ b/proto/nezha.proto @@ -8,6 +8,7 @@ service NezhaService { rpc ReportSystemInfo(Host)returns(Receipt){} rpc ReportTask(TaskResult)returns(Receipt){} rpc RequestTask(Host)returns(stream Task){} + rpc IOStream(stream IOStreamData)returns(stream IOStreamData){} } message Host { @@ -68,3 +69,7 @@ message TaskResult { message Receipt{ bool proced = 1; } + +message IOStreamData { + bytes data = 1; +} diff --git a/proto/nezha_grpc.pb.go b/proto/nezha_grpc.pb.go index 34f45a2..2c59636 100644 --- a/proto/nezha_grpc.pb.go +++ b/proto/nezha_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v3.21.12 +// - protoc v5.27.1 // source: proto/nezha.proto package proto @@ -23,6 +23,7 @@ const ( NezhaService_ReportSystemInfo_FullMethodName = "/proto.NezhaService/ReportSystemInfo" NezhaService_ReportTask_FullMethodName = "/proto.NezhaService/ReportTask" NezhaService_RequestTask_FullMethodName = "/proto.NezhaService/RequestTask" + NezhaService_IOStream_FullMethodName = "/proto.NezhaService/IOStream" ) // NezhaServiceClient is the client API for NezhaService service. @@ -33,6 +34,7 @@ type NezhaServiceClient interface { ReportSystemInfo(ctx context.Context, in *Host, opts ...grpc.CallOption) (*Receipt, error) ReportTask(ctx context.Context, in *TaskResult, opts ...grpc.CallOption) (*Receipt, error) RequestTask(ctx context.Context, in *Host, opts ...grpc.CallOption) (NezhaService_RequestTaskClient, error) + IOStream(ctx context.Context, opts ...grpc.CallOption) (NezhaService_IOStreamClient, error) } type nezhaServiceClient struct { @@ -102,6 +104,37 @@ func (x *nezhaServiceRequestTaskClient) Recv() (*Task, error) { return m, nil } +func (c *nezhaServiceClient) IOStream(ctx context.Context, opts ...grpc.CallOption) (NezhaService_IOStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &NezhaService_ServiceDesc.Streams[1], NezhaService_IOStream_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &nezhaServiceIOStreamClient{stream} + return x, nil +} + +type NezhaService_IOStreamClient interface { + Send(*IOStreamData) error + Recv() (*IOStreamData, error) + grpc.ClientStream +} + +type nezhaServiceIOStreamClient struct { + grpc.ClientStream +} + +func (x *nezhaServiceIOStreamClient) Send(m *IOStreamData) error { + return x.ClientStream.SendMsg(m) +} + +func (x *nezhaServiceIOStreamClient) Recv() (*IOStreamData, error) { + m := new(IOStreamData) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // NezhaServiceServer is the server API for NezhaService service. // All implementations should embed UnimplementedNezhaServiceServer // for forward compatibility @@ -110,6 +143,7 @@ type NezhaServiceServer interface { ReportSystemInfo(context.Context, *Host) (*Receipt, error) ReportTask(context.Context, *TaskResult) (*Receipt, error) RequestTask(*Host, NezhaService_RequestTaskServer) error + IOStream(NezhaService_IOStreamServer) error } // UnimplementedNezhaServiceServer should be embedded to have forward compatible implementations. @@ -128,6 +162,9 @@ func (UnimplementedNezhaServiceServer) ReportTask(context.Context, *TaskResult) func (UnimplementedNezhaServiceServer) RequestTask(*Host, NezhaService_RequestTaskServer) error { return status.Errorf(codes.Unimplemented, "method RequestTask not implemented") } +func (UnimplementedNezhaServiceServer) IOStream(NezhaService_IOStreamServer) error { + return status.Errorf(codes.Unimplemented, "method IOStream not implemented") +} // UnsafeNezhaServiceServer may be embedded to opt out of forward compatibility for this service. // Use of this interface is not recommended, as added methods to NezhaServiceServer will @@ -215,6 +252,32 @@ func (x *nezhaServiceRequestTaskServer) Send(m *Task) error { return x.ServerStream.SendMsg(m) } +func _NezhaService_IOStream_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(NezhaServiceServer).IOStream(&nezhaServiceIOStreamServer{stream}) +} + +type NezhaService_IOStreamServer interface { + Send(*IOStreamData) error + Recv() (*IOStreamData, error) + grpc.ServerStream +} + +type nezhaServiceIOStreamServer struct { + grpc.ServerStream +} + +func (x *nezhaServiceIOStreamServer) Send(m *IOStreamData) error { + return x.ServerStream.SendMsg(m) +} + +func (x *nezhaServiceIOStreamServer) Recv() (*IOStreamData, error) { + m := new(IOStreamData) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + // NezhaService_ServiceDesc is the grpc.ServiceDesc for NezhaService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -241,6 +304,12 @@ var NezhaService_ServiceDesc = grpc.ServiceDesc{ Handler: _NezhaService_RequestTask_Handler, ServerStreams: true, }, + { + StreamName: "IOStream", + Handler: _NezhaService_IOStream_Handler, + ServerStreams: true, + ClientStreams: true, + }, }, Metadata: "proto/nezha.proto", }