diff --git a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go index f1103603824cf..e87f534e7c998 100644 --- a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service.pb.go @@ -296,8 +296,11 @@ type GetServiceInfoResponse struct { // ssh_configured is true if the user's SSH config file includes VNet's // generated SSH config necessary for SSH access. SshConfigured bool `protobuf:"varint,3,opt,name=ssh_configured,json=sshConfigured,proto3" json:"ssh_configured,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // vnet_ssh_config_path is the path of VNet's generated OpenSSH-compatible + // config file. + VnetSshConfigPath string `protobuf:"bytes,4,opt,name=vnet_ssh_config_path,json=vnetSshConfigPath,proto3" json:"vnet_ssh_config_path,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetServiceInfoResponse) Reset() { @@ -351,6 +354,13 @@ func (x *GetServiceInfoResponse) GetSshConfigured() bool { return false } +func (x *GetServiceInfoResponse) GetVnetSshConfigPath() string { + if x != nil { + return x.VnetSshConfigPath + } + return "" +} + // Request for GetBackgroundItemStatus. type GetBackgroundItemStatusRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -515,6 +525,80 @@ func (x *RunDiagnosticsResponse) GetReport() *v1.Report { return nil } +// Request for AutoConfigureSSH. +type AutoConfigureSSHRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AutoConfigureSSHRequest) Reset() { + *x = AutoConfigureSSHRequest{} + mi := &file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoConfigureSSHRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoConfigureSSHRequest) ProtoMessage() {} + +func (x *AutoConfigureSSHRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoConfigureSSHRequest.ProtoReflect.Descriptor instead. +func (*AutoConfigureSSHRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDescGZIP(), []int{10} +} + +// Response for AutoConfigureSSH. +type AutoConfigureSSHResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AutoConfigureSSHResponse) Reset() { + *x = AutoConfigureSSHResponse{} + mi := &file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoConfigureSSHResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoConfigureSSHResponse) ProtoMessage() {} + +func (x *AutoConfigureSSHResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoConfigureSSHResponse.ProtoReflect.Descriptor instead. +func (*AutoConfigureSSHResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDescGZIP(), []int{11} +} + var File_teleport_lib_teleterm_vnet_v1_vnet_service_proto protoreflect.FileDescriptor const file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc = "" + @@ -524,30 +608,34 @@ const file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc = "" + "\rStartResponse\"\r\n" + "\vStopRequest\"\x0e\n" + "\fStopResponse\"\x17\n" + - "\x15GetServiceInfoRequest\"\x7f\n" + + "\x15GetServiceInfoRequest\"\xb0\x01\n" + "\x16GetServiceInfoResponse\x12\"\n" + "\rapp_dns_zones\x18\x01 \x03(\tR\vappDnsZones\x12\x1a\n" + "\bclusters\x18\x02 \x03(\tR\bclusters\x12%\n" + - "\x0essh_configured\x18\x03 \x01(\bR\rsshConfigured\" \n" + + "\x0essh_configured\x18\x03 \x01(\bR\rsshConfigured\x12/\n" + + "\x14vnet_ssh_config_path\x18\x04 \x01(\tR\x11vnetSshConfigPath\" \n" + "\x1eGetBackgroundItemStatusRequest\"n\n" + "\x1fGetBackgroundItemStatusResponse\x12K\n" + "\x06status\x18\x01 \x01(\x0e23.teleport.lib.teleterm.vnet.v1.BackgroundItemStatusR\x06status\"\x17\n" + "\x15RunDiagnosticsRequest\"S\n" + "\x16RunDiagnosticsResponse\x129\n" + - "\x06report\x18\x01 \x01(\v2!.teleport.lib.vnet.diag.v1.ReportR\x06report*\x8b\x02\n" + + "\x06report\x18\x01 \x01(\v2!.teleport.lib.vnet.diag.v1.ReportR\x06report\"\x19\n" + + "\x17AutoConfigureSSHRequest\"\x1a\n" + + "\x18AutoConfigureSSHResponse*\x8b\x02\n" + "\x14BackgroundItemStatus\x12&\n" + "\"BACKGROUND_ITEM_STATUS_UNSPECIFIED\x10\x00\x12)\n" + "%BACKGROUND_ITEM_STATUS_NOT_REGISTERED\x10\x01\x12\"\n" + "\x1eBACKGROUND_ITEM_STATUS_ENABLED\x10\x02\x12,\n" + "(BACKGROUND_ITEM_STATUS_REQUIRES_APPROVAL\x10\x03\x12$\n" + " BACKGROUND_ITEM_STATUS_NOT_FOUND\x10\x04\x12(\n" + - "$BACKGROUND_ITEM_STATUS_NOT_SUPPORTED\x10\x052\xeb\x04\n" + + "$BACKGROUND_ITEM_STATUS_NOT_SUPPORTED\x10\x052\xf1\x05\n" + "\vVnetService\x12b\n" + "\x05Start\x12+.teleport.lib.teleterm.vnet.v1.StartRequest\x1a,.teleport.lib.teleterm.vnet.v1.StartResponse\x12_\n" + "\x04Stop\x12*.teleport.lib.teleterm.vnet.v1.StopRequest\x1a+.teleport.lib.teleterm.vnet.v1.StopResponse\x12}\n" + "\x0eGetServiceInfo\x124.teleport.lib.teleterm.vnet.v1.GetServiceInfoRequest\x1a5.teleport.lib.teleterm.vnet.v1.GetServiceInfoResponse\x12\x98\x01\n" + "\x17GetBackgroundItemStatus\x12=.teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusRequest\x1a>.teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusResponse\x12}\n" + - "\x0eRunDiagnostics\x124.teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest\x1a5.teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponseBUZSgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/vnet/v1;vnetv1b\x06proto3" + "\x0eRunDiagnostics\x124.teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest\x1a5.teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse\x12\x83\x01\n" + + "\x10AutoConfigureSSH\x126.teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest\x1a7.teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponseBUZSgithub.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/vnet/v1;vnetv1b\x06proto3" var ( file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDescOnce sync.Once @@ -562,7 +650,7 @@ func file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDescGZIP() []byte } var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_goTypes = []any{ (BackgroundItemStatus)(0), // 0: teleport.lib.teleterm.vnet.v1.BackgroundItemStatus (*StartRequest)(nil), // 1: teleport.lib.teleterm.vnet.v1.StartRequest @@ -575,23 +663,27 @@ var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_goTypes = []any{ (*GetBackgroundItemStatusResponse)(nil), // 8: teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusResponse (*RunDiagnosticsRequest)(nil), // 9: teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest (*RunDiagnosticsResponse)(nil), // 10: teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse - (*v1.Report)(nil), // 11: teleport.lib.vnet.diag.v1.Report + (*AutoConfigureSSHRequest)(nil), // 11: teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest + (*AutoConfigureSSHResponse)(nil), // 12: teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse + (*v1.Report)(nil), // 13: teleport.lib.vnet.diag.v1.Report } var file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_depIdxs = []int32{ 0, // 0: teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusResponse.status:type_name -> teleport.lib.teleterm.vnet.v1.BackgroundItemStatus - 11, // 1: teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse.report:type_name -> teleport.lib.vnet.diag.v1.Report + 13, // 1: teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse.report:type_name -> teleport.lib.vnet.diag.v1.Report 1, // 2: teleport.lib.teleterm.vnet.v1.VnetService.Start:input_type -> teleport.lib.teleterm.vnet.v1.StartRequest 3, // 3: teleport.lib.teleterm.vnet.v1.VnetService.Stop:input_type -> teleport.lib.teleterm.vnet.v1.StopRequest 5, // 4: teleport.lib.teleterm.vnet.v1.VnetService.GetServiceInfo:input_type -> teleport.lib.teleterm.vnet.v1.GetServiceInfoRequest 7, // 5: teleport.lib.teleterm.vnet.v1.VnetService.GetBackgroundItemStatus:input_type -> teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusRequest 9, // 6: teleport.lib.teleterm.vnet.v1.VnetService.RunDiagnostics:input_type -> teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest - 2, // 7: teleport.lib.teleterm.vnet.v1.VnetService.Start:output_type -> teleport.lib.teleterm.vnet.v1.StartResponse - 4, // 8: teleport.lib.teleterm.vnet.v1.VnetService.Stop:output_type -> teleport.lib.teleterm.vnet.v1.StopResponse - 6, // 9: teleport.lib.teleterm.vnet.v1.VnetService.GetServiceInfo:output_type -> teleport.lib.teleterm.vnet.v1.GetServiceInfoResponse - 8, // 10: teleport.lib.teleterm.vnet.v1.VnetService.GetBackgroundItemStatus:output_type -> teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusResponse - 10, // 11: teleport.lib.teleterm.vnet.v1.VnetService.RunDiagnostics:output_type -> teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse - 7, // [7:12] is the sub-list for method output_type - 2, // [2:7] is the sub-list for method input_type + 11, // 7: teleport.lib.teleterm.vnet.v1.VnetService.AutoConfigureSSH:input_type -> teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest + 2, // 8: teleport.lib.teleterm.vnet.v1.VnetService.Start:output_type -> teleport.lib.teleterm.vnet.v1.StartResponse + 4, // 9: teleport.lib.teleterm.vnet.v1.VnetService.Stop:output_type -> teleport.lib.teleterm.vnet.v1.StopResponse + 6, // 10: teleport.lib.teleterm.vnet.v1.VnetService.GetServiceInfo:output_type -> teleport.lib.teleterm.vnet.v1.GetServiceInfoResponse + 8, // 11: teleport.lib.teleterm.vnet.v1.VnetService.GetBackgroundItemStatus:output_type -> teleport.lib.teleterm.vnet.v1.GetBackgroundItemStatusResponse + 10, // 12: teleport.lib.teleterm.vnet.v1.VnetService.RunDiagnostics:output_type -> teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse + 12, // 13: teleport.lib.teleterm.vnet.v1.VnetService.AutoConfigureSSH:output_type -> teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse + 8, // [8:14] is the sub-list for method output_type + 2, // [2:8] is the sub-list for method input_type 2, // [2:2] is the sub-list for extension type_name 2, // [2:2] is the sub-list for extension extendee 0, // [0:2] is the sub-list for field type_name @@ -608,7 +700,7 @@ func file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc), len(file_teleport_lib_teleterm_vnet_v1_vnet_service_proto_rawDesc)), NumEnums: 1, - NumMessages: 10, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service_grpc.pb.go b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service_grpc.pb.go index dc680f3295f6b..074693d5c6c11 100644 --- a/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service_grpc.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/vnet/v1/vnet_service_grpc.pb.go @@ -40,6 +40,7 @@ const ( VnetService_GetServiceInfo_FullMethodName = "/teleport.lib.teleterm.vnet.v1.VnetService/GetServiceInfo" VnetService_GetBackgroundItemStatus_FullMethodName = "/teleport.lib.teleterm.vnet.v1.VnetService/GetBackgroundItemStatus" VnetService_RunDiagnostics_FullMethodName = "/teleport.lib.teleterm.vnet.v1.VnetService/RunDiagnostics" + VnetService_AutoConfigureSSH_FullMethodName = "/teleport.lib.teleterm.vnet.v1.VnetService/AutoConfigureSSH" ) // VnetServiceClient is the client API for VnetService service. @@ -60,6 +61,9 @@ type VnetServiceClient interface { // RunDiagnostics runs a set of heuristics to determine if VNet actually works on the device, that // is receives network traffic and DNS queries. RunDiagnostics requires VNet to be started. RunDiagnostics(ctx context.Context, in *RunDiagnosticsRequest, opts ...grpc.CallOption) (*RunDiagnosticsResponse, error) + // AutoConfigureSSH automatically configures OpenSSH-compatible clients for + // connections to Teleport SSH hosts. + AutoConfigureSSH(ctx context.Context, in *AutoConfigureSSHRequest, opts ...grpc.CallOption) (*AutoConfigureSSHResponse, error) } type vnetServiceClient struct { @@ -120,6 +124,16 @@ func (c *vnetServiceClient) RunDiagnostics(ctx context.Context, in *RunDiagnosti return out, nil } +func (c *vnetServiceClient) AutoConfigureSSH(ctx context.Context, in *AutoConfigureSSHRequest, opts ...grpc.CallOption) (*AutoConfigureSSHResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoConfigureSSHResponse) + err := c.cc.Invoke(ctx, VnetService_AutoConfigureSSH_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // VnetServiceServer is the server API for VnetService service. // All implementations must embed UnimplementedVnetServiceServer // for forward compatibility. @@ -138,6 +152,9 @@ type VnetServiceServer interface { // RunDiagnostics runs a set of heuristics to determine if VNet actually works on the device, that // is receives network traffic and DNS queries. RunDiagnostics requires VNet to be started. RunDiagnostics(context.Context, *RunDiagnosticsRequest) (*RunDiagnosticsResponse, error) + // AutoConfigureSSH automatically configures OpenSSH-compatible clients for + // connections to Teleport SSH hosts. + AutoConfigureSSH(context.Context, *AutoConfigureSSHRequest) (*AutoConfigureSSHResponse, error) mustEmbedUnimplementedVnetServiceServer() } @@ -163,6 +180,9 @@ func (UnimplementedVnetServiceServer) GetBackgroundItemStatus(context.Context, * func (UnimplementedVnetServiceServer) RunDiagnostics(context.Context, *RunDiagnosticsRequest) (*RunDiagnosticsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RunDiagnostics not implemented") } +func (UnimplementedVnetServiceServer) AutoConfigureSSH(context.Context, *AutoConfigureSSHRequest) (*AutoConfigureSSHResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method AutoConfigureSSH not implemented") +} func (UnimplementedVnetServiceServer) mustEmbedUnimplementedVnetServiceServer() {} func (UnimplementedVnetServiceServer) testEmbeddedByValue() {} @@ -274,6 +294,24 @@ func _VnetService_RunDiagnostics_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _VnetService_AutoConfigureSSH_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(AutoConfigureSSHRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(VnetServiceServer).AutoConfigureSSH(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: VnetService_AutoConfigureSSH_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(VnetServiceServer).AutoConfigureSSH(ctx, req.(*AutoConfigureSSHRequest)) + } + return interceptor(ctx, in, info, handler) +} + // VnetService_ServiceDesc is the grpc.ServiceDesc for VnetService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -301,6 +339,10 @@ var VnetService_ServiceDesc = grpc.ServiceDesc{ MethodName: "RunDiagnostics", Handler: _VnetService_RunDiagnostics_Handler, }, + { + MethodName: "AutoConfigureSSH", + Handler: _VnetService_AutoConfigureSSH_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teleport/lib/teleterm/vnet/v1/vnet_service.proto", diff --git a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client.ts b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client.ts index fdd21d783c4ff..6787923ba9de6 100644 --- a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client.ts +++ b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.client.ts @@ -23,6 +23,8 @@ import type { RpcTransport } from "@protobuf-ts/runtime-rpc"; import type { ServiceInfo } from "@protobuf-ts/runtime-rpc"; import { VnetService } from "./vnet_service_pb"; +import type { AutoConfigureSSHResponse } from "./vnet_service_pb"; +import type { AutoConfigureSSHRequest } from "./vnet_service_pb"; import type { RunDiagnosticsResponse } from "./vnet_service_pb"; import type { RunDiagnosticsRequest } from "./vnet_service_pb"; import type { GetBackgroundItemStatusResponse } from "./vnet_service_pb"; @@ -74,6 +76,13 @@ export interface IVnetServiceClient { * @generated from protobuf rpc: RunDiagnostics(teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest) returns (teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse); */ runDiagnostics(input: RunDiagnosticsRequest, options?: RpcOptions): UnaryCall; + /** + * AutoConfigureSSH automatically configures OpenSSH-compatible clients for + * connections to Teleport SSH hosts. + * + * @generated from protobuf rpc: AutoConfigureSSH(teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest) returns (teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse); + */ + autoConfigureSSH(input: AutoConfigureSSHRequest, options?: RpcOptions): UnaryCall; } /** * VnetService provides methods to manage a VNet instance. @@ -133,4 +142,14 @@ export class VnetServiceClient implements IVnetServiceClient, ServiceInfo { const method = this.methods[4], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } + /** + * AutoConfigureSSH automatically configures OpenSSH-compatible clients for + * connections to Teleport SSH hosts. + * + * @generated from protobuf rpc: AutoConfigureSSH(teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest) returns (teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse); + */ + autoConfigureSSH(input: AutoConfigureSSHRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[5], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } } diff --git a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.grpc-server.ts b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.grpc-server.ts index 1457c1913f871..15198d3f54bdb 100644 --- a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.grpc-server.ts +++ b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.grpc-server.ts @@ -20,6 +20,8 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . // +import { AutoConfigureSSHResponse } from "./vnet_service_pb"; +import { AutoConfigureSSHRequest } from "./vnet_service_pb"; import { RunDiagnosticsResponse } from "./vnet_service_pb"; import { RunDiagnosticsRequest } from "./vnet_service_pb"; import { GetBackgroundItemStatusResponse } from "./vnet_service_pb"; @@ -69,6 +71,13 @@ export interface IVnetService extends grpc.UntypedServiceImplementation { * @generated from protobuf rpc: RunDiagnostics(teleport.lib.teleterm.vnet.v1.RunDiagnosticsRequest) returns (teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse); */ runDiagnostics: grpc.handleUnaryCall; + /** + * AutoConfigureSSH automatically configures OpenSSH-compatible clients for + * connections to Teleport SSH hosts. + * + * @generated from protobuf rpc: AutoConfigureSSH(teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest) returns (teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse); + */ + autoConfigureSSH: grpc.handleUnaryCall; } /** * @grpc/grpc-js definition for the protobuf service teleport.lib.teleterm.vnet.v1.VnetService. @@ -131,5 +140,15 @@ export const vnetServiceDefinition: grpc.ServiceDefinition = { requestDeserialize: bytes => RunDiagnosticsRequest.fromBinary(bytes), responseSerialize: value => Buffer.from(RunDiagnosticsResponse.toBinary(value)), requestSerialize: value => Buffer.from(RunDiagnosticsRequest.toBinary(value)) + }, + autoConfigureSSH: { + path: "/teleport.lib.teleterm.vnet.v1.VnetService/AutoConfigureSSH", + originalName: "AutoConfigureSSH", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => AutoConfigureSSHResponse.fromBinary(bytes), + requestDeserialize: bytes => AutoConfigureSSHRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(AutoConfigureSSHResponse.toBinary(value)), + requestSerialize: value => Buffer.from(AutoConfigureSSHRequest.toBinary(value)) } }; diff --git a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts index 772371fc2f714..500e0d2931bf4 100644 --- a/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/vnet/v1/vnet_service_pb.ts @@ -92,6 +92,13 @@ export interface GetServiceInfoResponse { * @generated from protobuf field: bool ssh_configured = 3; */ sshConfigured: boolean; + /** + * vnet_ssh_config_path is the path of VNet's generated OpenSSH-compatible + * config file. + * + * @generated from protobuf field: string vnet_ssh_config_path = 4; + */ + vnetSshConfigPath: string; } /** * Request for GetBackgroundItemStatus. @@ -129,6 +136,20 @@ export interface RunDiagnosticsResponse { */ report?: Report; } +/** + * Request for AutoConfigureSSH. + * + * @generated from protobuf message teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest + */ +export interface AutoConfigureSSHRequest { +} +/** + * Response for AutoConfigureSSH. + * + * @generated from protobuf message teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse + */ +export interface AutoConfigureSSHResponse { +} /** * BackgroundItemStatus maps to SMAppServiceStatus of the Service Management framework in macOS. * https://developer.apple.com/documentation/servicemanagement/smappservice/status-swift.enum?language=objc @@ -295,7 +316,8 @@ class GetServiceInfoResponse$Type extends MessageType { super("teleport.lib.teleterm.vnet.v1.GetServiceInfoResponse", [ { no: 1, name: "app_dns_zones", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, { no: 2, name: "clusters", kind: "scalar", repeat: 2 /*RepeatType.UNPACKED*/, T: 9 /*ScalarType.STRING*/ }, - { no: 3, name: "ssh_configured", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + { no: 3, name: "ssh_configured", kind: "scalar", T: 8 /*ScalarType.BOOL*/ }, + { no: 4, name: "vnet_ssh_config_path", kind: "scalar", T: 9 /*ScalarType.STRING*/ } ]); } create(value?: PartialMessage): GetServiceInfoResponse { @@ -303,6 +325,7 @@ class GetServiceInfoResponse$Type extends MessageType { message.appDnsZones = []; message.clusters = []; message.sshConfigured = false; + message.vnetSshConfigPath = ""; if (value !== undefined) reflectionMergePartial(this, message, value); return message; @@ -321,6 +344,9 @@ class GetServiceInfoResponse$Type extends MessageType { case /* bool ssh_configured */ 3: message.sshConfigured = reader.bool(); break; + case /* string vnet_ssh_config_path */ 4: + message.vnetSshConfigPath = reader.string(); + break; default: let u = options.readUnknownField; if (u === "throw") @@ -342,6 +368,9 @@ class GetServiceInfoResponse$Type extends MessageType { /* bool ssh_configured = 3; */ if (message.sshConfigured !== false) writer.tag(3, WireType.Varint).bool(message.sshConfigured); + /* string vnet_ssh_config_path = 4; */ + if (message.vnetSshConfigPath !== "") + writer.tag(4, WireType.LengthDelimited).string(message.vnetSshConfigPath); let u = options.writeUnknownFields; if (u !== false) (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); @@ -495,6 +524,56 @@ class RunDiagnosticsResponse$Type extends MessageType { * @generated MessageType for protobuf message teleport.lib.teleterm.vnet.v1.RunDiagnosticsResponse */ export const RunDiagnosticsResponse = new RunDiagnosticsResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AutoConfigureSSHRequest$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest", []); + } + create(value?: PartialMessage): AutoConfigureSSHRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AutoConfigureSSHRequest): AutoConfigureSSHRequest { + return target ?? this.create(); + } + internalBinaryWrite(message: AutoConfigureSSHRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.vnet.v1.AutoConfigureSSHRequest + */ +export const AutoConfigureSSHRequest = new AutoConfigureSSHRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class AutoConfigureSSHResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse", []); + } + create(value?: PartialMessage): AutoConfigureSSHResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: AutoConfigureSSHResponse): AutoConfigureSSHResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: AutoConfigureSSHResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.vnet.v1.AutoConfigureSSHResponse + */ +export const AutoConfigureSSHResponse = new AutoConfigureSSHResponse$Type(); /** * @generated ServiceType for protobuf service teleport.lib.teleterm.vnet.v1.VnetService */ @@ -503,5 +582,6 @@ export const VnetService = new ServiceType("teleport.lib.teleterm.vnet.v1.VnetSe { name: "Stop", options: {}, I: StopRequest, O: StopResponse }, { name: "GetServiceInfo", options: {}, I: GetServiceInfoRequest, O: GetServiceInfoResponse }, { name: "GetBackgroundItemStatus", options: {}, I: GetBackgroundItemStatusRequest, O: GetBackgroundItemStatusResponse }, - { name: "RunDiagnostics", options: {}, I: RunDiagnosticsRequest, O: RunDiagnosticsResponse } + { name: "RunDiagnostics", options: {}, I: RunDiagnosticsRequest, O: RunDiagnosticsResponse }, + { name: "AutoConfigureSSH", options: {}, I: AutoConfigureSSHRequest, O: AutoConfigureSSHResponse } ]); diff --git a/lib/teleterm/vnet/service.go b/lib/teleterm/vnet/service.go index e92f981187ff6..748ef53224511 100644 --- a/lib/teleterm/vnet/service.go +++ b/lib/teleterm/vnet/service.go @@ -248,9 +248,10 @@ func (s *Service) GetServiceInfo(ctx context.Context, _ *api.GetServiceInfoReque } return &api.GetServiceInfoResponse{ - AppDnsZones: unifiedClusterConfig.AppDNSZones(), - Clusters: unifiedClusterConfig.ClusterNames, - SshConfigured: sshConfigured, + AppDnsZones: unifiedClusterConfig.AppDNSZones(), + Clusters: unifiedClusterConfig.ClusterNames, + SshConfigured: sshConfigured, + VnetSshConfigPath: sshConfigChecker.VNetSSHConfigPath, }, nil } @@ -313,6 +314,13 @@ func (s *Service) getNetworkStack(ctx context.Context) (*diagv1.NetworkStack, er }, nil } +// AutoConfigureSSH automatically configures OpenSSH-compatible clients for +// connections to Teleport SSH servers through VNet. +func (s *Service) AutoConfigureSSH(ctx context.Context, _ *api.AutoConfigureSSHRequest) (*api.AutoConfigureSSHResponse, error) { + err := vnet.AutoConfigureOpenSSH(ctx, s.cfg.profilePath) + return nil, trace.Wrap(err) +} + func (s *Service) stopLocked() error { if s.status == statusClosed { return trace.CompareFailed("VNet service has been closed") diff --git a/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto b/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto index d63a140678c62..0336e122b523a 100644 --- a/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto +++ b/proto/teleport/lib/teleterm/vnet/v1/vnet_service.proto @@ -40,6 +40,10 @@ service VnetService { // RunDiagnostics runs a set of heuristics to determine if VNet actually works on the device, that // is receives network traffic and DNS queries. RunDiagnostics requires VNet to be started. rpc RunDiagnostics(RunDiagnosticsRequest) returns (RunDiagnosticsResponse); + + // AutoConfigureSSH automatically configures OpenSSH-compatible clients for + // connections to Teleport SSH hosts. + rpc AutoConfigureSSH(AutoConfigureSSHRequest) returns (AutoConfigureSSHResponse); } // Request for Start. @@ -67,6 +71,9 @@ message GetServiceInfoResponse { // ssh_configured is true if the user's SSH config file includes VNet's // generated SSH config necessary for SSH access. bool ssh_configured = 3; + // vnet_ssh_config_path is the path of VNet's generated OpenSSH-compatible + // config file. + string vnet_ssh_config_path = 4; } // Request for GetBackgroundItemStatus. @@ -97,3 +104,9 @@ message RunDiagnosticsRequest {} message RunDiagnosticsResponse { teleport.lib.vnet.diag.v1.Report report = 1; } + +// Request for AutoConfigureSSH. +message AutoConfigureSSHRequest {} + +// Response for AutoConfigureSSH. +message AutoConfigureSSHResponse {} diff --git a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts index 3520508111585..9f2a80fae0196 100644 --- a/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts +++ b/web/packages/teleterm/src/services/tshd/fixtures/mocks.ts @@ -123,9 +123,10 @@ export class MockVnetClient implements VnetClient { appDnsZones: [], clusters: [], sshConfigured: false, + vnetSshConfigPath: + '/Users/user/Library/Application Support/Teleport Connect/tsh/vnet_ssh_config', }); getBackgroundItemStatus = () => new MockedUnaryCall({ status: 0 }); - runDiagnostics() { return new MockedUnaryCall({ report: { @@ -134,4 +135,5 @@ export class MockVnetClient implements VnetClient { }, }); } + autoConfigureSSH = () => new MockedUnaryCall({}); } diff --git a/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx b/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx index e5fd1b58b97ef..77cc1037883a1 100644 --- a/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx +++ b/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx @@ -27,6 +27,7 @@ import { Dialog } from 'teleterm/ui/services/modals'; import { ClusterLogout } from '../ClusterLogout'; import { ResourceSearchErrors } from '../Search/ResourceSearchErrors'; import { assertUnreachable } from '../utils'; +import { ConfigureSSHClients } from '../Vnet/ConfigureSSHClients'; import { ChangeAccessRequestKind } from './modals/ChangeAccessRequestKind'; import { AskPin, ChangePin, OverwriteSlot, Touch } from './modals/HardwareKeys'; import { ReAuthenticate } from './modals/ReAuthenticate'; @@ -281,6 +282,17 @@ function renderDialog({ /> ); } + case 'configure-ssh-clients': { + return ( +