diff --git a/api/bifrost/v1/web_server_bin_cmd.go b/api/bifrost/v1/web_server_bin_cmd.go new file mode 100644 index 0000000..297e05f --- /dev/null +++ b/api/bifrost/v1/web_server_bin_cmd.go @@ -0,0 +1,11 @@ +package v1 + +type ExecuteRequest struct { + ServerName string `json:"server_name"` + Args []string `json:"args"` +} +type ExecuteResponse struct { + Successful bool `json:"successful"` + StandardOutput []byte `json:"stdout"` + StandardError []byte `json:"stderr"` +} diff --git a/api/protobuf-spec/bifrostpb/v1/bifrost.pb.go b/api/protobuf-spec/bifrostpb/v1/bifrost.pb.go index 0f4e0c1..e5ca373 100644 --- a/api/protobuf-spec/bifrostpb/v1/bifrost.pb.go +++ b/api/protobuf-spec/bifrostpb/v1/bifrost.pb.go @@ -420,6 +420,124 @@ func (x *LogWatchRequest) GetFilterRule() string { return "" } +type ExecuteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ServerName string `protobuf:"bytes,1,opt,name=ServerName,proto3" json:"ServerName,omitempty"` + Args []string `protobuf:"bytes,2,rep,name=Args,proto3" json:"Args,omitempty"` +} + +func (x *ExecuteRequest) Reset() { + *x = ExecuteRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteRequest) ProtoMessage() {} + +func (x *ExecuteRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[8] + 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 ExecuteRequest.ProtoReflect.Descriptor instead. +func (*ExecuteRequest) Descriptor() ([]byte, []int) { + return file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDescGZIP(), []int{8} +} + +func (x *ExecuteRequest) GetServerName() string { + if x != nil { + return x.ServerName + } + return "" +} + +func (x *ExecuteRequest) GetArgs() []string { + if x != nil { + return x.Args + } + return nil +} + +type ExecuteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Successful bool `protobuf:"varint,1,opt,name=Successful,proto3" json:"Successful,omitempty"` + Stdout []byte `protobuf:"bytes,2,opt,name=Stdout,proto3" json:"Stdout,omitempty"` + Stderr []byte `protobuf:"bytes,3,opt,name=Stderr,proto3" json:"Stderr,omitempty"` +} + +func (x *ExecuteResponse) Reset() { + *x = ExecuteResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExecuteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExecuteResponse) ProtoMessage() {} + +func (x *ExecuteResponse) ProtoReflect() protoreflect.Message { + mi := &file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[9] + 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 ExecuteResponse.ProtoReflect.Descriptor instead. +func (*ExecuteResponse) Descriptor() ([]byte, []int) { + return file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDescGZIP(), []int{9} +} + +func (x *ExecuteResponse) GetSuccessful() bool { + if x != nil { + return x.Successful + } + return false +} + +func (x *ExecuteResponse) GetStdout() []byte { + if x != nil { + return x.Stdout + } + return nil +} + +func (x *ExecuteResponse) GetStderr() []byte { + if x != nil { + return x.Stderr + } + return nil +} + var File_api_protobuf_spec_bifrostpb_v1_bifrost_proto protoreflect.FileDescriptor var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDesc = []byte{ @@ -451,37 +569,52 @@ var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDesc = []byte{ 0x07, 0x4c, 0x6f, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4c, 0x6f, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x32, 0xc5, 0x01, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x0e, 0x47, - 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x0f, 0x2e, - 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x1a, 0x16, - 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, - 0x15, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x17, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x06, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, - 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x13, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x32, - 0x4e, 0x0a, 0x13, 0x57, 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x37, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x15, 0x2e, - 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x15, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x22, 0x00, 0x30, 0x01, 0x32, - 0x41, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x0f, 0x2e, 0x62, 0x69, 0x66, 0x72, - 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x1a, 0x12, 0x2e, 0x62, 0x69, 0x66, - 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x00, - 0x30, 0x01, 0x32, 0x53, 0x0a, 0x13, 0x57, 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, - 0x6f, 0x67, 0x57, 0x61, 0x74, 0x63, 0x68, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x05, 0x57, 0x61, 0x74, - 0x63, 0x68, 0x12, 0x1a, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x67, 0x57, 0x61, 0x74, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, - 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x42, 0x20, 0x5a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x62, 0x69, 0x66, - 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x74, 0x65, 0x72, 0x52, 0x75, 0x6c, 0x65, 0x22, 0x44, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x67, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x67, 0x73, 0x22, 0x61, 0x0a, + 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x65, + 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x74, 0x64, 0x65, 0x72, 0x72, + 0x32, 0xc5, 0x01, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3b, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, + 0x70, 0x62, 0x2e, 0x4e, 0x75, 0x6c, 0x6c, 0x1a, 0x16, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, + 0x00, 0x12, 0x39, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, + 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, + 0x17, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3a, 0x0a, 0x06, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, + 0x13, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x32, 0x4e, 0x0a, 0x13, 0x57, 0x65, 0x62, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, + 0x37, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x15, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x15, 0x2e, + 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x73, + 0x74, 0x69, 0x63, 0x73, 0x22, 0x00, 0x30, 0x01, 0x32, 0x41, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x03, 0x47, + 0x65, 0x74, 0x12, 0x0f, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4e, + 0x75, 0x6c, 0x6c, 0x1a, 0x12, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x00, 0x30, 0x01, 0x32, 0x53, 0x0a, 0x13, 0x57, + 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x05, 0x57, 0x61, 0x74, 0x63, 0x68, 0x12, 0x1a, 0x2e, 0x62, 0x69, + 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x57, 0x61, 0x74, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, + 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x32, 0x52, 0x0a, 0x0f, 0x57, 0x65, 0x62, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x69, 0x6e, + 0x43, 0x4d, 0x44, 0x12, 0x3f, 0x0a, 0x04, 0x45, 0x78, 0x65, 0x63, 0x12, 0x19, 0x2e, 0x62, 0x69, + 0x66, 0x72, 0x6f, 0x73, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x42, 0x20, 0x5a, 0x1e, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2d, 0x73, 0x70, 0x65, 0x63, 0x2f, 0x62, 0x69, 0x66, 0x72, 0x6f, 0x73, + 0x74, 0x70, 0x62, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -496,7 +629,7 @@ func file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDescGZIP() []byte { return file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDescData } -var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes = make([]protoimpl.MessageInfo, 8) +var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes = make([]protoimpl.MessageInfo, 10) var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_goTypes = []interface{}{ (*Null)(nil), // 0: bifrostpb.Null (*ServerNames)(nil), // 1: bifrostpb.ServerNames @@ -506,6 +639,8 @@ var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_goTypes = []interface{}{ (*Statistics)(nil), // 5: bifrostpb.Statistics (*Metrics)(nil), // 6: bifrostpb.Metrics (*LogWatchRequest)(nil), // 7: bifrostpb.LogWatchRequest + (*ExecuteRequest)(nil), // 8: bifrostpb.ExecuteRequest + (*ExecuteResponse)(nil), // 9: bifrostpb.ExecuteResponse } var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_depIdxs = []int32{ 2, // 0: bifrostpb.ServerNames.Names:type_name -> bifrostpb.ServerName @@ -515,14 +650,16 @@ var file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_depIdxs = []int32{ 2, // 4: bifrostpb.WebServerStatistics.Get:input_type -> bifrostpb.ServerName 0, // 5: bifrostpb.WebServerStatus.Get:input_type -> bifrostpb.Null 7, // 6: bifrostpb.WebServerLogWatcher.Watch:input_type -> bifrostpb.LogWatchRequest - 1, // 7: bifrostpb.WebServerConfig.GetServerNames:output_type -> bifrostpb.ServerNames - 3, // 8: bifrostpb.WebServerConfig.Get:output_type -> bifrostpb.ServerConfig - 4, // 9: bifrostpb.WebServerConfig.Update:output_type -> bifrostpb.Response - 5, // 10: bifrostpb.WebServerStatistics.Get:output_type -> bifrostpb.Statistics - 6, // 11: bifrostpb.WebServerStatus.Get:output_type -> bifrostpb.Metrics - 4, // 12: bifrostpb.WebServerLogWatcher.Watch:output_type -> bifrostpb.Response - 7, // [7:13] is the sub-list for method output_type - 1, // [1:7] is the sub-list for method input_type + 8, // 7: bifrostpb.WebServerBinCMD.Exec:input_type -> bifrostpb.ExecuteRequest + 1, // 8: bifrostpb.WebServerConfig.GetServerNames:output_type -> bifrostpb.ServerNames + 3, // 9: bifrostpb.WebServerConfig.Get:output_type -> bifrostpb.ServerConfig + 4, // 10: bifrostpb.WebServerConfig.Update:output_type -> bifrostpb.Response + 5, // 11: bifrostpb.WebServerStatistics.Get:output_type -> bifrostpb.Statistics + 6, // 12: bifrostpb.WebServerStatus.Get:output_type -> bifrostpb.Metrics + 4, // 13: bifrostpb.WebServerLogWatcher.Watch:output_type -> bifrostpb.Response + 9, // 14: bifrostpb.WebServerBinCMD.Exec:output_type -> bifrostpb.ExecuteResponse + 8, // [8:15] is the sub-list for method output_type + 1, // [1:8] 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 @@ -630,6 +767,30 @@ func file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_init() { return nil } } + file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteResponse); 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{ @@ -637,9 +798,9 @@ func file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_rawDesc, NumEnums: 0, - NumMessages: 8, + NumMessages: 10, NumExtensions: 0, - NumServices: 4, + NumServices: 5, }, GoTypes: file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_goTypes, DependencyIndexes: file_api_protobuf_spec_bifrostpb_v1_bifrost_proto_depIdxs, @@ -1161,3 +1322,75 @@ var _WebServerLogWatcher_serviceDesc = grpc.ServiceDesc{ }, Metadata: "api/protobuf-spec/bifrostpb/v1/bifrost.proto", } + +// WebServerBinCMDClient is the client API for WebServerBinCMD service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. +type WebServerBinCMDClient interface { + Exec(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (*ExecuteResponse, error) +} + +type webServerBinCMDClient struct { + cc grpc.ClientConnInterface +} + +func NewWebServerBinCMDClient(cc grpc.ClientConnInterface) WebServerBinCMDClient { + return &webServerBinCMDClient{cc} +} + +func (c *webServerBinCMDClient) Exec(ctx context.Context, in *ExecuteRequest, opts ...grpc.CallOption) (*ExecuteResponse, error) { + out := new(ExecuteResponse) + err := c.cc.Invoke(ctx, "/bifrostpb.WebServerBinCMD/Exec", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// WebServerBinCMDServer is the server API for WebServerBinCMD service. +type WebServerBinCMDServer interface { + Exec(context.Context, *ExecuteRequest) (*ExecuteResponse, error) +} + +// UnimplementedWebServerBinCMDServer can be embedded to have forward compatible implementations. +type UnimplementedWebServerBinCMDServer struct { +} + +func (*UnimplementedWebServerBinCMDServer) Exec(context.Context, *ExecuteRequest) (*ExecuteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method Exec not implemented") +} + +func RegisterWebServerBinCMDServer(s *grpc.Server, srv WebServerBinCMDServer) { + s.RegisterService(&_WebServerBinCMD_serviceDesc, srv) +} + +func _WebServerBinCMD_Exec_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ExecuteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(WebServerBinCMDServer).Exec(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/bifrostpb.WebServerBinCMD/Exec", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(WebServerBinCMDServer).Exec(ctx, req.(*ExecuteRequest)) + } + return interceptor(ctx, in, info, handler) +} + +var _WebServerBinCMD_serviceDesc = grpc.ServiceDesc{ + ServiceName: "bifrostpb.WebServerBinCMD", + HandlerType: (*WebServerBinCMDServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "Exec", + Handler: _WebServerBinCMD_Exec_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "api/protobuf-spec/bifrostpb/v1/bifrost.proto", +} diff --git a/api/protobuf-spec/bifrostpb/v1/bifrost.proto b/api/protobuf-spec/bifrostpb/v1/bifrost.proto index 4fd3be0..aba0453 100644 --- a/api/protobuf-spec/bifrostpb/v1/bifrost.proto +++ b/api/protobuf-spec/bifrostpb/v1/bifrost.proto @@ -21,6 +21,10 @@ service WebServerLogWatcher { rpc Watch(LogWatchRequest) returns (stream Response) {} } +service WebServerBinCMD { + rpc Exec(ExecuteRequest) returns (ExecuteResponse) {} +} + message Null {} message ServerNames { @@ -52,4 +56,15 @@ message LogWatchRequest { string ServerName = 1; string LogName = 2; string FilterRule =3; +} + +message ExecuteRequest { + string ServerName = 1; + repeated string Args = 2; +} + +message ExecuteResponse { + bool Successful = 1; + bytes Stdout = 2; + bytes Stderr = 3; } \ No newline at end of file diff --git a/docs/devel/zh-CN/scope.md b/docs/devel/zh-CN/scope.md index 0a0c2d9..90bdaca 100644 --- a/docs/devel/zh-CN/scope.md +++ b/docs/devel/zh-CN/scope.md @@ -7,6 +7,8 @@ | web_server_status | bifrost 中 WebServerStatus 模块相关的变更 | | web_server_statistics | bifrost 中 WebServerStatistics 模块相关的变更 | | web_server_log_watcher | bifrost 中 WebServerLogWatcher 模块相关的变更 | +| web_server_bin_cmd | bifrost 中 WebServerBinCMD 模块相关的变更 | +| resolv | bifrost 中 web服务配置解析库相关的变更 | | client | 组件gRPC客户端相关的变更 | | pkg | pkg 包的变更 | | docs | 文档类变更 | diff --git a/docs/guide/zh-CN/api/error_code_generated.md b/docs/guide/zh-CN/api/error_code_generated.md index a86b11d..f069f70 100644 --- a/docs/guide/zh-CN/api/error_code_generated.md +++ b/docs/guide/zh-CN/api/error_code_generated.md @@ -46,18 +46,20 @@ Bifrost 系统支持的错误码列表如下: | ErrSameConfigFingerprints | 110003 | 500 | Same config fingerprint between files and configuration | | ErrConfigManagerIsRunning | 110004 | 500 | Config manager is running | | ErrConfigManagerIsNotRunning | 110005 | 500 | Config manager is not running | -| ErrConfigurationNotFound | 110006 | 400 | Web server configuration not found | -| ErrParserNotFound | 110007 | 500 | Parser not found | -| ErrUnknownKeywordString | 110008 | 500 | Unknown keyword string | -| ErrInvalidConfig | 110009 | 500 | Invalid parser.Config | -| ErrParseFailed | 110010 | 500 | Config parse failed | -| ErrV3ContextIndexOutOfRange | 110011 | 500 | Index of the Context's children is out of range | -| ErrV3NullContextPosition | 110012 | 500 | Null Context position | -| ErrV3SetFatherContextFailed | 110013 | 500 | Set father Context failed | -| ErrV3OperationOnErrorContext | 110014 | 500 | Performing operations on Error Context | -| ErrV3InvalidContext | 110015 | 500 | Invalid Context | -| ErrV3InvalidOperation | 110016 | 500 | Invalid operation | -| ErrV3ContextNotFound | 110017 | 500 | Queried context not found | +| ErrWebServerNotFound | 110006 | 400 | Web server not found | +| ErrConfigurationNotFound | 110007 | 400 | Web server configuration not found | +| ErrParserNotFound | 110008 | 500 | Parser not found | +| ErrUnknownKeywordString | 110009 | 500 | Unknown keyword string | +| ErrInvalidConfig | 110010 | 500 | Invalid parser.Config | +| ErrParseFailed | 110011 | 500 | Config parse failed | +| ErrV3ContextIndexOutOfRange | 110012 | 500 | Index of the Context's children is out of range | +| ErrV3NullContextPosition | 110013 | 500 | Null Context position | +| ErrV3SetFatherContextFailed | 110014 | 500 | Set father Context failed | +| ErrV3OperationOnErrorContext | 110015 | 500 | Performing operations on Error Context | +| ErrV3InvalidContext | 110016 | 500 | Invalid Context | +| ErrV3InvalidOperation | 110017 | 500 | Invalid operation | +| ErrV3ContextNotFound | 110018 | 500 | Queried context not found | +| ErrV3ConversionToContextFailed | 110019 | 500 | Conversion to context failed | | ErrStopMonitoringTimeout | 110201 | 500 | Stop monitoring timeout | | ErrMonitoringServiceSuspension | 110202 | 500 | Monitoring service suspension | | ErrMonitoringStarted | 110203 | 500 | Monitoring is already started | diff --git a/internal/bifrost/endpoint/v1/endpoints.go b/internal/bifrost/endpoint/v1/endpoints.go index a34dae6..5e62f92 100644 --- a/internal/bifrost/endpoint/v1/endpoints.go +++ b/internal/bifrost/endpoint/v1/endpoints.go @@ -1,6 +1,7 @@ package v1 import ( + "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1/web_server_bin_cmd" "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1/web_server_config" "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1/web_server_log_watcher" "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1/web_server_statistics" @@ -13,6 +14,7 @@ type EndpointsFactory interface { WebServerStatistics() WebServerStatisticsEndpoints WebServerStatus() WebServerStatusEndpoints WebServerLogWatcher() WebServerLogWatcherEndpoints + WebServerBinCMD() WebServerBinCMDEndpoints } var _ EndpointsFactory = &endpoints{} @@ -40,3 +42,7 @@ func (e *endpoints) WebServerStatus() WebServerStatusEndpoints { func (e *endpoints) WebServerLogWatcher() WebServerLogWatcherEndpoints { return web_server_log_watcher.NewWebServerLogWatcherEndpoints(e.svc) } + +func (e *endpoints) WebServerBinCMD() WebServerBinCMDEndpoints { + return web_server_bin_cmd.NewWebServerBinCMDEndpoints(e.svc) +} diff --git a/internal/bifrost/endpoint/v1/web_server_bin_cmd.go b/internal/bifrost/endpoint/v1/web_server_bin_cmd.go new file mode 100644 index 0000000..04c0d9a --- /dev/null +++ b/internal/bifrost/endpoint/v1/web_server_bin_cmd.go @@ -0,0 +1,7 @@ +package v1 + +import "github.com/go-kit/kit/endpoint" + +type WebServerBinCMDEndpoints interface { + EndpointExec() endpoint.Endpoint +} diff --git a/internal/bifrost/endpoint/v1/web_server_bin_cmd/exec.go b/internal/bifrost/endpoint/v1/web_server_bin_cmd/exec.go new file mode 100644 index 0000000..9bb6a3d --- /dev/null +++ b/internal/bifrost/endpoint/v1/web_server_bin_cmd/exec.go @@ -0,0 +1,19 @@ +package web_server_bin_cmd + +import ( + "context" + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + + "github.com/go-kit/kit/endpoint" + "github.com/marmotedu/errors" +) + +func (w *webServerBinCMDEndpoints) EndpointExec() endpoint.Endpoint { + return func(ctx context.Context, request interface{}) (response interface{}, err error) { + if req, ok := request.(*v1.ExecuteRequest); ok { + return w.svc.WebServerBinCMD().Exec(ctx, req) + } + + return nil, errors.Errorf("invalid get request, need *pbv1.ExecuteRequest, not %T", request) + } +} diff --git a/internal/bifrost/endpoint/v1/web_server_bin_cmd/web_server_status.go b/internal/bifrost/endpoint/v1/web_server_bin_cmd/web_server_status.go new file mode 100644 index 0000000..f529726 --- /dev/null +++ b/internal/bifrost/endpoint/v1/web_server_bin_cmd/web_server_status.go @@ -0,0 +1,11 @@ +package web_server_bin_cmd + +import svcv1 "github.com/ClessLi/bifrost/internal/bifrost/service/v1" + +type webServerBinCMDEndpoints struct { + svc svcv1.ServiceFactory +} + +func NewWebServerBinCMDEndpoints(svc svcv1.ServiceFactory) *webServerBinCMDEndpoints { + return &webServerBinCMDEndpoints{svc: svc} +} diff --git a/internal/bifrost/middleware/logging/logging.go b/internal/bifrost/middleware/logging/logging.go index 67f536f..e35f96f 100644 --- a/internal/bifrost/middleware/logging/logging.go +++ b/internal/bifrost/middleware/logging/logging.go @@ -35,6 +35,10 @@ func (l *loggingService) WebServerLogWatcher() svcv1.WebServerLogWatcherService return newWebServerLogWatcherMiddleware(l.svc) } +func (l *loggingService) WebServerBinCMD() svcv1.WebServerBinCMDService { + return newWebServerBinCMDMiddleware(l.svc) +} + func New(svc svcv1.ServiceFactory) svcv1.ServiceFactory { once.Do(func() { logger = logV1.K() diff --git a/internal/bifrost/middleware/logging/web_server_bin_cmd.go b/internal/bifrost/middleware/logging/web_server_bin_cmd.go new file mode 100644 index 0000000..da19911 --- /dev/null +++ b/internal/bifrost/middleware/logging/web_server_bin_cmd.go @@ -0,0 +1,33 @@ +package logging + +import ( + "context" + "encoding/json" + "time" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + svcv1 "github.com/ClessLi/bifrost/internal/bifrost/service/v1" +) + +type loggingWebServerBinCMDService struct { + svc svcv1.WebServerBinCMDService +} + +func (l *loggingWebServerBinCMDService) Exec(ctx context.Context, request *v1.ExecuteRequest) (response *v1.ExecuteResponse, err error) { + defer func(begin time.Time) { + logF := newLogFormatter(ctx, l.svc.Exec) + logF.SetBeginTime(begin) + defer logF.Result() + if response != nil { + result, _ := json.Marshal(response) + logF.SetResult(getLimitResult(result)) + } + logF.SetErr(err) + }(time.Now().Local()) + + return l.svc.Exec(ctx, request) +} + +func newWebServerBinCMDMiddleware(svc svcv1.ServiceFactory) svcv1.WebServerBinCMDService { + return &loggingWebServerBinCMDService{svc: svc.WebServerBinCMD()} +} diff --git a/internal/bifrost/service/v1/service.go b/internal/bifrost/service/v1/service.go index 834fd71..3a71c56 100644 --- a/internal/bifrost/service/v1/service.go +++ b/internal/bifrost/service/v1/service.go @@ -1,6 +1,7 @@ package v1 import ( + "github.com/ClessLi/bifrost/internal/bifrost/service/v1/web_server_bin_cmd" "github.com/ClessLi/bifrost/internal/bifrost/service/v1/web_server_config" "github.com/ClessLi/bifrost/internal/bifrost/service/v1/web_server_log_watcher" "github.com/ClessLi/bifrost/internal/bifrost/service/v1/web_server_statistics" @@ -13,6 +14,7 @@ type ServiceFactory interface { WebServerStatistics() WebServerStatisticsService WebServerStatus() WebServerStatusService WebServerLogWatcher() WebServerLogWatcherService + WebServerBinCMD() WebServerBinCMDService } var _ ServiceFactory = &serviceFactory{} @@ -37,6 +39,10 @@ func (s *serviceFactory) WebServerLogWatcher() WebServerLogWatcherService { return web_server_log_watcher.NewWebServerLogWatcherService(s.store) } +func (s *serviceFactory) WebServerBinCMD() WebServerBinCMDService { + return web_server_bin_cmd.NewWebServerBinCMDService(s.store) +} + func NewServiceFactory(store storev1.StoreFactory) ServiceFactory { return &serviceFactory{store: store} } diff --git a/internal/bifrost/service/v1/web_server_bin_cmd.go b/internal/bifrost/service/v1/web_server_bin_cmd.go new file mode 100644 index 0000000..b3e7303 --- /dev/null +++ b/internal/bifrost/service/v1/web_server_bin_cmd.go @@ -0,0 +1,11 @@ +package v1 + +import ( + "context" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" +) + +type WebServerBinCMDService interface { + Exec(ctx context.Context, request *v1.ExecuteRequest) (*v1.ExecuteResponse, error) +} diff --git a/internal/bifrost/service/v1/web_server_bin_cmd/exec.go b/internal/bifrost/service/v1/web_server_bin_cmd/exec.go new file mode 100644 index 0000000..f2fd20d --- /dev/null +++ b/internal/bifrost/service/v1/web_server_bin_cmd/exec.go @@ -0,0 +1,11 @@ +package web_server_bin_cmd + +import ( + "context" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" +) + +func (w *webServerBinCMDService) Exec(ctx context.Context, req *v1.ExecuteRequest) (*v1.ExecuteResponse, error) { + return w.store.WebServerBinCMD().Exec(ctx, req) +} diff --git a/internal/bifrost/service/v1/web_server_bin_cmd/web_server_status.go b/internal/bifrost/service/v1/web_server_bin_cmd/web_server_status.go new file mode 100644 index 0000000..f0460f1 --- /dev/null +++ b/internal/bifrost/service/v1/web_server_bin_cmd/web_server_status.go @@ -0,0 +1,11 @@ +package web_server_bin_cmd + +import storev1 "github.com/ClessLi/bifrost/internal/bifrost/store/v1" + +type webServerBinCMDService struct { + store storev1.StoreFactory +} + +func NewWebServerBinCMDService(store storev1.StoreFactory) *webServerBinCMDService { + return &webServerBinCMDService{store: store} +} diff --git a/internal/bifrost/store/v1/nginx/nginx.go b/internal/bifrost/store/v1/nginx/nginx.go index a084c6f..7d683c8 100644 --- a/internal/bifrost/store/v1/nginx/nginx.go +++ b/internal/bifrost/store/v1/nginx/nginx.go @@ -38,10 +38,14 @@ func (w *webServerStore) WebServerStatistics() storev1.WebServerStatisticsStore return newNginxStatisticsStore(w) } -func (w *webServerStore) WebServerLogWatcher() storev1.WebServerLogWatcher { +func (w *webServerStore) WebServerLogWatcher() storev1.WebServerLogWatcherStore { return newWebServerLogWatcherStore(w) } +func (w *webServerStore) WebServerBinCMD() storev1.WebServerBinCMDStore { + return newNginxBinCMDStore(w) +} + func (w *webServerStore) Close() error { return errors.NewAggregate([]error{ w.configsManger.Stop(5 * time.Minute), diff --git a/internal/bifrost/store/v1/nginx/web_server_bin_cmd.go b/internal/bifrost/store/v1/nginx/web_server_bin_cmd.go new file mode 100644 index 0000000..ef02c38 --- /dev/null +++ b/internal/bifrost/store/v1/nginx/web_server_bin_cmd.go @@ -0,0 +1,41 @@ +package nginx + +import ( + "bytes" + "context" + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + storev1 "github.com/ClessLi/bifrost/internal/bifrost/store/v1" + "github.com/ClessLi/bifrost/internal/pkg/code" + "github.com/marmotedu/errors" + "os/exec" +) + +type webServerBinCMDStore struct { + serversBinCMD map[string]func(arg ...string) *exec.Cmd +} + +func (w webServerBinCMDStore) Exec(ctx context.Context, request *v1.ExecuteRequest) (*v1.ExecuteResponse, error) { + if f, has := w.serversBinCMD[request.ServerName]; has { + cmd := f(request.Args...) + + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + var isSuccessful = cmd.Run() == nil + + return &v1.ExecuteResponse{ + Successful: isSuccessful, + StandardOutput: stdout.Bytes(), + StandardError: stderr.Bytes(), + }, nil + } + + return nil, errors.WithCode(code.ErrWebServerNotFound, "nginx server '%s' not found", request.ServerName) +} + +var _ storev1.WebServerBinCMDStore = &webServerBinCMDStore{} + +func newNginxBinCMDStore(store *webServerStore) storev1.WebServerBinCMDStore { + return &webServerBinCMDStore{serversBinCMD: store.configsManger.GetServersBinCMD()} +} diff --git a/internal/bifrost/store/v1/store.go b/internal/bifrost/store/v1/store.go index 9f63da7..f6d2cb4 100644 --- a/internal/bifrost/store/v1/store.go +++ b/internal/bifrost/store/v1/store.go @@ -6,7 +6,8 @@ type StoreFactory interface { WebServerConfig() WebServerConfigStore WebServerStatistics() WebServerStatisticsStore WebServerStatus() WebServerStatusStore - WebServerLogWatcher() WebServerLogWatcher + WebServerLogWatcher() WebServerLogWatcherStore + WebServerBinCMD() WebServerBinCMDStore Close() error } diff --git a/internal/bifrost/store/v1/web_server_bin_cmd.go b/internal/bifrost/store/v1/web_server_bin_cmd.go new file mode 100644 index 0000000..4f2a947 --- /dev/null +++ b/internal/bifrost/store/v1/web_server_bin_cmd.go @@ -0,0 +1,11 @@ +package v1 + +import ( + "context" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" +) + +type WebServerBinCMDStore interface { + Exec(ctx context.Context, request *v1.ExecuteRequest) (*v1.ExecuteResponse, error) +} diff --git a/internal/bifrost/store/v1/web_server_log_watcher.go b/internal/bifrost/store/v1/web_server_log_watcher.go index b2e9740..c89717f 100644 --- a/internal/bifrost/store/v1/web_server_log_watcher.go +++ b/internal/bifrost/store/v1/web_server_log_watcher.go @@ -6,6 +6,6 @@ import ( v1 "github.com/ClessLi/bifrost/api/bifrost/v1" ) -type WebServerLogWatcher interface { +type WebServerLogWatcherStore interface { Watch(ctx context.Context, request *v1.WebServerLogWatchRequest) (*v1.WebServerLog, error) } diff --git a/internal/bifrost/transport/v1/decoder/web_server_bin_cmd.go b/internal/bifrost/transport/v1/decoder/web_server_bin_cmd.go new file mode 100644 index 0000000..5ea2ea8 --- /dev/null +++ b/internal/bifrost/transport/v1/decoder/web_server_bin_cmd.go @@ -0,0 +1,31 @@ +package decoder + +import ( + "context" + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + + "github.com/marmotedu/errors" + + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" + "github.com/ClessLi/bifrost/internal/pkg/code" +) + +type webServerBinCMD struct{} + +var _ Decoder = webServerBinCMD{} + +func (w webServerBinCMD) DecodeRequest(ctx context.Context, r interface{}) (interface{}, error) { + switch r := r.(type) { + case *pbv1.ExecuteRequest: + return &v1.ExecuteRequest{ + ServerName: r.ServerName, + Args: r.Args, + }, nil + default: + return nil, errors.WithCode(code.ErrDecodingFailed, "invalid execute request: %v", r) + } +} + +func NewWebServerBinCMDDecoder() Decoder { + return new(webServerBinCMD) +} diff --git a/internal/bifrost/transport/v1/encoder/web_server_bin_cmd.go b/internal/bifrost/transport/v1/encoder/web_server_bin_cmd.go new file mode 100644 index 0000000..5b200ad --- /dev/null +++ b/internal/bifrost/transport/v1/encoder/web_server_bin_cmd.go @@ -0,0 +1,31 @@ +package encoder + +import ( + "context" + "github.com/marmotedu/errors" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" + "github.com/ClessLi/bifrost/internal/pkg/code" +) + +type webServerBinCMD struct{} + +var _ Encoder = &webServerBinCMD{} + +func (w webServerBinCMD) EncodeResponse(ctx context.Context, r interface{}) (interface{}, error) { + switch r := r.(type) { + case *v1.ExecuteResponse: + return &pbv1.ExecuteResponse{ + Successful: r.Successful, + Stdout: r.StandardOutput, + Stderr: r.StandardError, + }, nil + default: + return nil, errors.WithCode(code.ErrEncodingFailed, "invalid web server binary command executed response: %v", r) + } +} + +func NewWebServerBinCMDEncoder() Encoder { + return new(webServerBinCMD) +} diff --git a/internal/bifrost/transport/v1/fake/web_server_bin_cmd.go b/internal/bifrost/transport/v1/fake/web_server_bin_cmd.go new file mode 100644 index 0000000..aff988a --- /dev/null +++ b/internal/bifrost/transport/v1/fake/web_server_bin_cmd.go @@ -0,0 +1,17 @@ +package fake + +import ( + "context" + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" + logV1 "github.com/ClessLi/component-base/pkg/log/v1" +) + +type webServerBinCMD struct{} + +func (w webServerBinCMD) Exec(ctx context.Context, request *pbv1.ExecuteRequest) (*pbv1.ExecuteResponse, error) { + logV1.Infof("web server binary command excuting...") + return &pbv1.ExecuteResponse{ + Successful: true, + Msg: []byte("success\n"), + }, nil +} diff --git a/internal/bifrost/transport/v1/handler/handler.go b/internal/bifrost/transport/v1/handler/handler.go index 69677af..8ef27dc 100644 --- a/internal/bifrost/transport/v1/handler/handler.go +++ b/internal/bifrost/transport/v1/handler/handler.go @@ -14,6 +14,7 @@ type HandlersFactory interface { WebServerStatistics() WebServerStatisticsHandlers WebServerStatus() WebServerStatusHandlers WebServerLogWatcher() WebServerLogWatcherHandlers + WebServerBinCMD() WebServerBinCMDHandlers } type handlersFactory struct { @@ -42,6 +43,10 @@ func (h *handlersFactory) WebServerLogWatcher() WebServerLogWatcherHandlers { return NewWebServerLogWatcherHandlers(h.eps) } +func (h *handlersFactory) WebServerBinCMD() WebServerBinCMDHandlers { + return NewWebServerBinCMDHandlers(h.eps) +} + func NewHandler(ep endpoint.Endpoint, decoder decoder.Decoder, encoder encoder.Encoder) grpc.Handler { return grpc.NewServer(ep, decoder.DecodeRequest, encoder.EncodeResponse) } diff --git a/internal/bifrost/transport/v1/handler/web_server_bin_cmd.go b/internal/bifrost/transport/v1/handler/web_server_bin_cmd.go new file mode 100644 index 0000000..7acf881 --- /dev/null +++ b/internal/bifrost/transport/v1/handler/web_server_bin_cmd.go @@ -0,0 +1,50 @@ +package handler //nolint:dupl + +import ( + logV1 "github.com/ClessLi/component-base/pkg/log/v1" + "sync" + + "github.com/go-kit/kit/transport/grpc" + + epv1 "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1" + "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/decoder" + "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/encoder" +) + +type WebServerBinCMDHandlers interface { + HandlerExec() grpc.Handler +} + +var _ WebServerBinCMDHandlers = &webServerBinCMDHandlers{} + +type webServerBinCMDHandlers struct { + onceExec sync.Once + singletonHandlerExec grpc.Handler + eps epv1.WebServerBinCMDEndpoints + decoder decoder.Decoder + encoder encoder.Encoder +} + +func (w *webServerBinCMDHandlers) HandlerExec() grpc.Handler { + w.onceExec.Do(func() { + if w.singletonHandlerExec == nil { + w.singletonHandlerExec = NewHandler(w.eps.EndpointExec(), w.decoder, w.encoder) + } + }) + if w.singletonHandlerExec == nil { + logV1.Fatal("web server binary command handler `Exec` is nil") + + return nil + } + + return w.singletonHandlerExec +} + +func NewWebServerBinCMDHandlers(eps epv1.EndpointsFactory) WebServerBinCMDHandlers { + return &webServerBinCMDHandlers{ + onceExec: sync.Once{}, + eps: eps.WebServerBinCMD(), + decoder: decoder.NewWebServerBinCMDDecoder(), + encoder: encoder.NewWebServerBinCMDEncoder(), + } +} diff --git a/internal/bifrost/transport/v1/register_generator.go b/internal/bifrost/transport/v1/register_generator.go index 731c2df..7ddb794 100644 --- a/internal/bifrost/transport/v1/register_generator.go +++ b/internal/bifrost/transport/v1/register_generator.go @@ -57,6 +57,15 @@ func (b *bifrostServiceRegister) Generate() map[string]service_register.ServiceR } pbv1.RegisterWebServerLogWatcherServer(server, b.factory.WebServerLogWatcher()) }, + b.instancePrefixName + ".bifrostpb.WebServerBinCMD": func(server *grpc.Server, healthzSvr *health.Server) { + if healthzSvr != nil { + healthzSvr.SetServingStatus( + b.instancePrefixName+".bifrostpb.WebServerBinCMD", + grpc_health_v1.HealthCheckResponse_NOT_SERVING, + ) + } + pbv1.RegisterWebServerBinCMDServer(server, b.factory.WebServerBinCMD()) + }, } } diff --git a/internal/bifrost/transport/v1/transport.go b/internal/bifrost/transport/v1/transport.go index e473161..0b6c9c6 100644 --- a/internal/bifrost/transport/v1/transport.go +++ b/internal/bifrost/transport/v1/transport.go @@ -4,6 +4,7 @@ import ( pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/handler" "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/options" + "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/web_server_bin_cmd" "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/web_server_config" "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/web_server_log_watcher" "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/web_server_statistics" @@ -15,6 +16,7 @@ type Factory interface { WebServerStatistics() pbv1.WebServerStatisticsServer WebServerStatus() pbv1.WebServerStatusServer WebServerLogWatcher() pbv1.WebServerLogWatcherServer + WebServerBinCMD() pbv1.WebServerBinCMDServer } type transport struct { @@ -38,6 +40,10 @@ func (t *transport) WebServerLogWatcher() pbv1.WebServerLogWatcherServer { return web_server_log_watcher.NewWebServerLogWatcherServer(t.handlers.WebServerLogWatcher(), t.opts) } +func (t *transport) WebServerBinCMD() pbv1.WebServerBinCMDServer { + return web_server_bin_cmd.NewWebServerBinCMDServer(t.handlers.WebServerBinCMD(), t.opts) +} + func New(handlers handler.HandlersFactory, opts *options.Options) Factory { return &transport{ handlers: handlers, diff --git a/internal/bifrost/transport/v1/web_server_bin_cmd/exec.go b/internal/bifrost/transport/v1/web_server_bin_cmd/exec.go new file mode 100644 index 0000000..ef5c399 --- /dev/null +++ b/internal/bifrost/transport/v1/web_server_bin_cmd/exec.go @@ -0,0 +1,16 @@ +package web_server_bin_cmd + +import ( + "context" + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" +) + +func (w webServerBinCMDServer) Exec(ctx context.Context, request *pbv1.ExecuteRequest) (*pbv1.ExecuteResponse, error) { + _, resp, err := w.handler.HandlerExec().ServeGRPC(ctx, request) + if err != nil { + return nil, err + } + response := resp.(*pbv1.ExecuteResponse) + + return response, nil +} diff --git a/internal/bifrost/transport/v1/web_server_bin_cmd/web_server_bin_cmd.go b/internal/bifrost/transport/v1/web_server_bin_cmd/web_server_bin_cmd.go new file mode 100644 index 0000000..8c21302 --- /dev/null +++ b/internal/bifrost/transport/v1/web_server_bin_cmd/web_server_bin_cmd.go @@ -0,0 +1,21 @@ +package web_server_bin_cmd + +import ( + "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/handler" + "github.com/ClessLi/bifrost/internal/bifrost/transport/v1/options" +) + +type webServerBinCMDServer struct { + handler handler.WebServerBinCMDHandlers + options *options.Options +} + +func NewWebServerBinCMDServer( + handler handler.WebServerBinCMDHandlers, + options *options.Options, +) *webServerBinCMDServer { + return &webServerBinCMDServer{ + handler: handler, + options: options, + } +} diff --git a/internal/pkg/code/bifrost.go b/internal/pkg/code/bifrost.go index 00d917b..2d24898 100644 --- a/internal/pkg/code/bifrost.go +++ b/internal/pkg/code/bifrost.go @@ -19,6 +19,9 @@ const ( // ErrConfigManagerIsNotRunning - 500: Config manager is not running. ErrConfigManagerIsNotRunning + // ErrWebServerNotFound - 400: Web server not found. + ErrWebServerNotFound + // ErrConfigurationNotFound - 400: Web server configuration not found. ErrConfigurationNotFound diff --git a/internal/pkg/code/code_generated.go b/internal/pkg/code/code_generated.go index 17cad0d..ccc98c5 100644 --- a/internal/pkg/code/code_generated.go +++ b/internal/pkg/code/code_generated.go @@ -40,6 +40,7 @@ func init() { register(ErrSameConfigFingerprints, 500, "Same config fingerprint between files and configuration") register(ErrConfigManagerIsRunning, 500, "Config manager is running") register(ErrConfigManagerIsNotRunning, 500, "Config manager is not running") + register(ErrWebServerNotFound, 400, "Web server not found") register(ErrConfigurationNotFound, 400, "Web server configuration not found") register(ErrParserNotFound, 500, "Parser not found") register(ErrUnknownKeywordString, 500, "Unknown keyword string") diff --git a/pkg/client/bifrost/v1/endpoint/endpoint.go b/pkg/client/bifrost/v1/endpoint/endpoint.go index 8c5161e..50f627a 100644 --- a/pkg/client/bifrost/v1/endpoint/endpoint.go +++ b/pkg/client/bifrost/v1/endpoint/endpoint.go @@ -10,6 +10,7 @@ type Factory interface { WebServerStatistics() epv1.WebServerStatisticsEndpoints WebServerStatus() epv1.WebServerStatusEndpoints WebServerLogWatcher() epv1.WebServerLogWatcherEndpoints + WebServerBinCMD() epv1.WebServerBinCMDEndpoints } type factory struct { @@ -32,6 +33,10 @@ func (f *factory) WebServerLogWatcher() epv1.WebServerLogWatcherEndpoints { return newWebServerLogWatcherEndpoints(f) } +func (f *factory) WebServerBinCMD() epv1.WebServerBinCMDEndpoints { + return newWebServerBinCMDEndpoints(f) +} + func New(transport txpclient.Factory) Factory { return &factory{transport: transport} } diff --git a/pkg/client/bifrost/v1/endpoint/web_server_bin_cmd.go b/pkg/client/bifrost/v1/endpoint/web_server_bin_cmd.go new file mode 100644 index 0000000..abbebb8 --- /dev/null +++ b/pkg/client/bifrost/v1/endpoint/web_server_bin_cmd.go @@ -0,0 +1,20 @@ +package endpoint + +import ( + "github.com/go-kit/kit/endpoint" + + epv1 "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1" + txpclient "github.com/ClessLi/bifrost/pkg/client/bifrost/v1/transport" +) + +type webServerBinCMDEndpoints struct { + transport txpclient.WebServerBinCMDTransport +} + +func (w *webServerBinCMDEndpoints) EndpointExec() endpoint.Endpoint { + return w.transport.Exec().Endpoint() +} + +func newWebServerBinCMDEndpoints(factory *factory) epv1.WebServerBinCMDEndpoints { + return &webServerBinCMDEndpoints{transport: factory.transport.WebServerBinCMD()} +} diff --git a/pkg/client/bifrost/v1/service/service.go b/pkg/client/bifrost/v1/service/service.go index 84d39e6..d0b0b63 100644 --- a/pkg/client/bifrost/v1/service/service.go +++ b/pkg/client/bifrost/v1/service/service.go @@ -13,6 +13,7 @@ type Factory interface { WebServerStatistics() WebServerStatisticsService WebServerStatus() WebServerStatusService WebServerLogWatcher() WebServerLogWatcherService + WebServerBinCMD() WebServerBinCMDService } type factory struct { @@ -35,6 +36,10 @@ func (f *factory) WebServerLogWatcher() WebServerLogWatcherService { return newWebServerLogWatcherService(f) } +func (f *factory) WebServerBinCMD() WebServerBinCMDService { + return newWebServerBinCMDService(f) +} + func New(endpoint epclient.Factory) Factory { return &factory{eps: endpoint} } diff --git a/pkg/client/bifrost/v1/service/web_server_bin_cmd.go b/pkg/client/bifrost/v1/service/web_server_bin_cmd.go new file mode 100644 index 0000000..42e01cf --- /dev/null +++ b/pkg/client/bifrost/v1/service/web_server_bin_cmd.go @@ -0,0 +1,30 @@ +package service + +import ( + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + epv1 "github.com/ClessLi/bifrost/internal/bifrost/endpoint/v1" +) + +type WebServerBinCMDService interface { + Exec(servername string, arg ...string) (isSuccessful bool, stdout, stderr string, err error) +} + +type webServerBinCMDService struct { + eps epv1.WebServerBinCMDEndpoints +} + +func (w *webServerBinCMDService) Exec(servername string, arg ...string) (bool, string, string, error) { + resp, err := w.eps.EndpointExec()(GetContext(), &v1.ExecuteRequest{ + ServerName: servername, + Args: arg, + }) + if resp != nil { + response := resp.(*v1.ExecuteResponse) + return response.Successful, string(response.StandardOutput), string(response.StandardError), err + } + return false, "", "", err +} + +func newWebServerBinCMDService(factory *factory) WebServerBinCMDService { + return &webServerBinCMDService{eps: factory.eps.WebServerBinCMD()} +} diff --git a/pkg/client/bifrost/v1/transport/decoder/decoder.go b/pkg/client/bifrost/v1/transport/decoder/decoder.go index 78d762b..15c9c31 100644 --- a/pkg/client/bifrost/v1/transport/decoder/decoder.go +++ b/pkg/client/bifrost/v1/transport/decoder/decoder.go @@ -12,6 +12,7 @@ type Factory interface { WebServerStatistics() Decoder WebServerStatus() Decoder WebServerLogWatcher() Decoder + WebServerBinCMD() Decoder } type factory struct{} @@ -32,6 +33,10 @@ func (f factory) WebServerLogWatcher() Decoder { return new(webServerLogWatcher) } +func (f factory) WebServerBinCMD() Decoder { + return new(webServerBinCMD) +} + var _ Factory = factory{} func New() Factory { diff --git a/pkg/client/bifrost/v1/transport/decoder/web_server_bin_cmd.go b/pkg/client/bifrost/v1/transport/decoder/web_server_bin_cmd.go new file mode 100644 index 0000000..8e25588 --- /dev/null +++ b/pkg/client/bifrost/v1/transport/decoder/web_server_bin_cmd.go @@ -0,0 +1,26 @@ +package decoder + +import ( + "context" + "github.com/marmotedu/errors" + + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" +) + +type webServerBinCMD struct{} + +func (w webServerBinCMD) DecodeResponse(ctx context.Context, resp interface{}) (interface{}, error) { + switch resp := resp.(type) { + case *pbv1.ExecuteResponse: // encode `Exec` response + return &v1.ExecuteResponse{ + Successful: resp.Successful, + StandardOutput: resp.Stdout, + StandardError: resp.Stderr, + }, nil + default: + return nil, errors.Errorf("invalid web server binary command response: %v", resp) + } +} + +var _ Decoder = webServerBinCMD{} diff --git a/pkg/client/bifrost/v1/transport/encoder/encoder.go b/pkg/client/bifrost/v1/transport/encoder/encoder.go index 0639a7c..78131e1 100644 --- a/pkg/client/bifrost/v1/transport/encoder/encoder.go +++ b/pkg/client/bifrost/v1/transport/encoder/encoder.go @@ -12,6 +12,7 @@ type Factory interface { WebServerStatistics() Encoder WebServerStatus() Encoder WebServerLogWatcher() Encoder + WebServerBinCMD() Encoder } type factory struct{} @@ -32,6 +33,10 @@ func (f factory) WebServerLogWatcher() Encoder { return new(webServerLogWatcher) } +func (f factory) WebServerBinCMD() Encoder { + return new(webServerBinCMD) +} + var _ Factory = factory{} func New() Factory { diff --git a/pkg/client/bifrost/v1/transport/encoder/web_server_bin_cmd.go b/pkg/client/bifrost/v1/transport/encoder/web_server_bin_cmd.go new file mode 100644 index 0000000..f378932 --- /dev/null +++ b/pkg/client/bifrost/v1/transport/encoder/web_server_bin_cmd.go @@ -0,0 +1,25 @@ +package encoder + +import ( + "context" + v1 "github.com/ClessLi/bifrost/api/bifrost/v1" + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" + + "github.com/marmotedu/errors" +) + +type webServerBinCMD struct{} + +func (w webServerBinCMD) EncodeRequest(ctx context.Context, req interface{}) (interface{}, error) { + switch req := req.(type) { + case *v1.ExecuteRequest: // encode `Exec` request + return &pbv1.ExecuteRequest{ + ServerName: req.ServerName, + Args: req.Args, + }, nil + default: + return nil, errors.Errorf("invalid web server binary command request: %v", req) + } +} + +var _ Encoder = webServerBinCMD{} diff --git a/pkg/client/bifrost/v1/transport/transport.go b/pkg/client/bifrost/v1/transport/transport.go index 02b3a07..17c407d 100644 --- a/pkg/client/bifrost/v1/transport/transport.go +++ b/pkg/client/bifrost/v1/transport/transport.go @@ -34,6 +34,7 @@ type Factory interface { WebServerStatistics() WebServerStatisticsTransport WebServerStatus() WebServerStatusTransport WebServerLogWatcher() WebServerLogWatcherTransport + WebServerBinCMD() WebServerBinCMDTransport } var _ Factory = &transport{} @@ -43,14 +44,16 @@ type transport struct { decoderFactory decoder.Factory encoderFactory encoder.Factory - onceWebServerConfig sync.Once - onceWebServerStatistics sync.Once - onceWebServerStatus sync.Once - onceWebServerLogWatcher sync.Once - singletonWSCTXP WebServerConfigTransport - singletonWSSTXP WebServerStatisticsTransport - singletonWSStatusTXP WebServerStatusTransport - singletonWSLWTXP WebServerLogWatcherTransport + onceWebServerConfig sync.Once + onceWebServerStatistics sync.Once + onceWebServerStatus sync.Once + onceWebServerLogWatcher sync.Once + onceWebServerBinCMDWatcher sync.Once + singletonWSCTXP WebServerConfigTransport + singletonWSSTXP WebServerStatisticsTransport + singletonWSStatusTXP WebServerStatusTransport + singletonWSLWTXP WebServerLogWatcherTransport + singletonWSBCTXP WebServerBinCMDTransport } func (t *transport) WebServerConfig() WebServerConfigTransport { @@ -113,14 +116,30 @@ func (t *transport) WebServerLogWatcher() WebServerLogWatcherTransport { return t.singletonWSLWTXP } +func (t *transport) WebServerBinCMD() WebServerBinCMDTransport { + t.onceWebServerBinCMDWatcher.Do(func() { + if t.singletonWSBCTXP == nil { + t.singletonWSBCTXP = newWebServerBinCMDTransport(t) + } + }) + if t.singletonWSBCTXP == nil { + logV1.Fatal("web server binary command transport client is nil") + + return nil + } + + return t.singletonWSBCTXP +} + func New(conn *grpc.ClientConn) Factory { return &transport{ - conn: conn, - decoderFactory: decoder.New(), - encoderFactory: encoder.New(), - onceWebServerConfig: sync.Once{}, - onceWebServerStatistics: sync.Once{}, - onceWebServerStatus: sync.Once{}, - onceWebServerLogWatcher: sync.Once{}, + conn: conn, + decoderFactory: decoder.New(), + encoderFactory: encoder.New(), + onceWebServerConfig: sync.Once{}, + onceWebServerStatistics: sync.Once{}, + onceWebServerStatus: sync.Once{}, + onceWebServerLogWatcher: sync.Once{}, + onceWebServerBinCMDWatcher: sync.Once{}, } } diff --git a/pkg/client/bifrost/v1/transport/web_server_bin_cmd.go b/pkg/client/bifrost/v1/transport/web_server_bin_cmd.go new file mode 100644 index 0000000..b9e392a --- /dev/null +++ b/pkg/client/bifrost/v1/transport/web_server_bin_cmd.go @@ -0,0 +1,35 @@ +package transport //nolint:dupl + +import ( + pbv1 "github.com/ClessLi/bifrost/api/protobuf-spec/bifrostpb/v1" + grpctransport "github.com/go-kit/kit/transport/grpc" +) + +const ( + webServerBinCMDService = "bifrostpb.WebServerBinCMD" +) + +type WebServerBinCMDTransport interface { + Exec() Client +} + +type webServerBinCMDTransport struct { + execClient Client +} + +func (w *webServerBinCMDTransport) Exec() Client { + return w.execClient +} + +func newWebServerBinCMDTransport(transport *transport) WebServerBinCMDTransport { + return &webServerBinCMDTransport{ + execClient: grpctransport.NewClient( + transport.conn, + webServerBinCMDService, + "Exec", + transport.encoderFactory.WebServerBinCMD().EncodeRequest, + transport.decoderFactory.WebServerBinCMD().DecodeResponse, + new(pbv1.ExecuteResponse), + ), + } +} diff --git a/pkg/resolv/V3/nginx/configuration/context/local/json_unmarshaller.go b/pkg/resolv/V3/nginx/configuration/context/local/json_unmarshaller.go index fb8894e..b49bfe5 100644 --- a/pkg/resolv/V3/nginx/configuration/context/local/json_unmarshaller.go +++ b/pkg/resolv/V3/nginx/configuration/context/local/json_unmarshaller.go @@ -144,45 +144,3 @@ func (u *jsonUnmarshaller) unmarshalConfig(unmashalctx *jsonUnmarshalContext) er u.completedContext = cache return nil } - -//func (u *jsonUnmarshaller) unmarshalInclude(unmarshalctx *jsonUnmarshalContext) error { -// u.completedContext = NewContext(unmarshalctx.ContextType, unmarshalctx.Value) -// err := u.completedContext.Error() -// if err != nil { -// return err -// } -// if unmarshalctx.Enabled { -// u.completedContext.Enable() -// } else { -// u.completedContext.Disable() -// } -// -// // insert the Include context to be unmarshalled into its father -// if err = u.fatherContext.Insert(u.completedContext, u.fatherContext.Len()).Error(); err != nil { -// return err -// } -// -// // unmarshal included configs -// configs := make([]*Config, 0) -// for _, childRaw := range unmarshalctx.Children { -// var path string -// err := json.Unmarshal(*childRaw, &path) -// if err != nil { -// return err -// } -// configPath, err := newConfigPath(u.configGraph, path) -// if err != nil { -// return err -// } -// -// // get config cache -// cache, err := u.configGraph.GetConfig(strings.TrimSpace(configPath.FullPath())) -// if err != nil { -// return err -// } -// configs = append(configs, cache) -// -// } -// // include configs -// return u.completedContext.(*Include).InsertConfig(configs...) -//} diff --git a/pkg/resolv/V3/nginx/configuration/nginx_config_manager.go b/pkg/resolv/V3/nginx/configuration/nginx_config_manager.go index 328a436..f693eb4 100644 --- a/pkg/resolv/V3/nginx/configuration/nginx_config_manager.go +++ b/pkg/resolv/V3/nginx/configuration/nginx_config_manager.go @@ -25,6 +25,7 @@ type NginxConfigManager interface { NginxConfig() NginxConfig ServerStatus() v1.State ServerVersion() string + ServerBinCMD(arg ...string) *exec.Cmd } type nginxConfigManager struct { @@ -113,21 +114,19 @@ func (m *nginxConfigManager) ServerStatus() (state v1.State) { func (m *nginxConfigManager) ServerVersion() (version string) { version = "unknown" - cmd := m.serverBinCMD("-v") - stdoutPipe, err := cmd.StderrPipe() + cmd := m.ServerBinCMD("-v") + var stdout bytes.Buffer + cmd.Stdout = &stdout + err := cmd.Run() if err != nil { return } - err = cmd.Run() - if err != nil { - return - } - buff := bytes.NewBuffer([]byte{}) - _, err = buff.ReadFrom(stdoutPipe) - if err != nil { - return - } - return strings.TrimRight(buff.String(), "\n") + return strings.TrimRight(stdout.String(), "\n") +} + +func (m *nginxConfigManager) ServerBinCMD(arg ...string) *exec.Cmd { + arg = append(arg, "-c", m.configuration.Main().MainConfig().FullPath()) + return exec.Command(m.nginxBinFilePath, arg...) } func (m *nginxConfigManager) backup() error { @@ -270,11 +269,6 @@ func (m *nginxConfigManager) regularlyRefreshAndBackup(signalChan chan int) erro } } -func (m *nginxConfigManager) serverBinCMD(arg ...string) *exec.Cmd { - arg = append(arg, "-c", m.configuration.Main().MainConfig().FullPath()) - return exec.Command(m.nginxBinFilePath, arg...) -} - func (m *nginxConfigManager) save() error { dumps := m.configuration.Dump() for file, dumpbuff := range dumps { @@ -287,7 +281,7 @@ func (m *nginxConfigManager) save() error { } func (m *nginxConfigManager) check() error { - cmd := m.serverBinCMD("-t") + cmd := m.ServerBinCMD("-t") cmd.Stderr = os.Stderr return cmd.Run() diff --git a/pkg/resolv/V3/nginx/nginx.go b/pkg/resolv/V3/nginx/nginx.go index a5fddc6..e924209 100644 --- a/pkg/resolv/V3/nginx/nginx.go +++ b/pkg/resolv/V3/nginx/nginx.go @@ -4,6 +4,7 @@ import ( v1 "github.com/ClessLi/bifrost/api/bifrost/v1" "github.com/ClessLi/bifrost/pkg/resolv/V3/nginx/configuration" "github.com/marmotedu/errors" + "os/exec" "time" ) @@ -12,12 +13,15 @@ type ConfigsManager interface { Stop(timeout time.Duration) error GetConfigs() map[string]configuration.NginxConfig GetServerInfos() []*v1.WebServerInfo + GetServersBinCMD() map[string]func(arg ...string) *exec.Cmd } type configsManager struct { managerMap map[string]configuration.NginxConfigManager } +var _ ConfigsManager = &configsManager{} + func (m *configsManager) Start() error { var errs []error for _, manager := range m.managerMap { @@ -53,3 +57,13 @@ func (m *configsManager) GetServerInfos() (infos []*v1.WebServerInfo) { } return } + +func (m *configsManager) GetServersBinCMD() map[string]func(arg ...string) *exec.Cmd { + cmds := make(map[string]func(arg ...string) *exec.Cmd) + for svrname, manager := range m.managerMap { + cmds[svrname] = func(arg ...string) *exec.Cmd { + return manager.ServerBinCMD(arg...) + } + } + return cmds +} diff --git a/test/grpc_client/bifrost/client_test.go b/test/grpc_client/bifrost/client_test.go index 3a4b08c..d392c57 100644 --- a/test/grpc_client/bifrost/client_test.go +++ b/test/grpc_client/bifrost/client_test.go @@ -220,3 +220,40 @@ func TestBifrostClientOperation(t *testing.T) { } } } + +func TestBifrostClientExecServerBinCMD(t *testing.T) { + client, err := bifrost_cliv1.New(serverAddress(), grpc.WithInsecure(), grpc.WithTimeout(time.Second)) + if err != nil { + t.Fatal(err) + } + + defer client.Close() + + servernames, err := client.WebServerConfig().GetServerNames() + if err != nil { + t.Fatal(err) + } + + for _, servername := range servernames { + // nil args + s1, out1, err1, err := client.WebServerBinCMD().Exec(servername) + if err != nil { + t.Errorf("[nil args] server name: %s, error: %v", servername, err) + } + t.Logf("[nil args] server name: %s, exec successful: %v, result stdout: %s, result stderr: %s", servername, s1, out1, err1) + + // one arg + s2, out2, err2, err := client.WebServerBinCMD().Exec(servername, "-t") + if err != nil { + t.Errorf("[one arg] server name: %s, error: %v", servername, err) + } + t.Logf("[one arg] server name: %s, exec successful: %v, result stdout: %s, result stderr: %s", servername, s2, out2, err2) + + // two args + s3, out3, err3, err := client.WebServerBinCMD().Exec(servername, "-s", "reload") + if err != nil { + t.Errorf("[two args] server name: %s, error: %v", servername, err) + } + t.Logf("[two args] server name: %s, exec successful: %v, result stdout: %s, result stderr: %s", servername, s3, out3, err3) + } +} diff --git a/test/nginx/sbin/nginx.bat b/test/nginx/sbin/nginx.bat index 88d4717..517260e 100644 --- a/test/nginx/sbin/nginx.bat +++ b/test/nginx/sbin/nginx.bat @@ -1,3 +1,7 @@ -ECHO OFF +@ECHO OFF +IF "%~1"=="-t" ( + ECHO "check failure" 1>&2 + exit 1 +) ECHO "pass" exit 0 \ No newline at end of file diff --git a/test/nginx/sbin/nginx.sh b/test/nginx/sbin/nginx.sh index fcac10c..3101ddc 100644 --- a/test/nginx/sbin/nginx.sh +++ b/test/nginx/sbin/nginx.sh @@ -1,3 +1,7 @@ #!/usr/bin/env bash +if [ "$1" == '-t' ]; then + echo "check failure" >&2 + return 2 +fi echo pass \ No newline at end of file