From 76affeb6b2a9220adf41403d1f9790932580ca7d Mon Sep 17 00:00:00 2001 From: Pasha Sviderski Date: Sat, 10 Jan 2026 18:36:56 +1100 Subject: [PATCH] chore: minor formatting for 'wg show' command, enrich Unimplemented error with >=0.16 requirement --- cmd/uncloud/wg/wg.go | 44 ++-- internal/machine/api/pb/machine.pb.go | 240 +++++++++++---------- internal/machine/api/pb/machine.proto | 12 +- internal/machine/api/pb/machine_grpc.pb.go | 94 ++++---- internal/machine/machine.go | 101 ++++----- 5 files changed, 254 insertions(+), 237 deletions(-) diff --git a/cmd/uncloud/wg/wg.go b/cmd/uncloud/wg/wg.go index 64cbb69d..86baa003 100644 --- a/cmd/uncloud/wg/wg.go +++ b/cmd/uncloud/wg/wg.go @@ -2,7 +2,6 @@ package wg import ( "context" - "encoding/base64" "fmt" "os" "strings" @@ -11,8 +10,10 @@ import ( "github.com/docker/go-units" "github.com/psviderski/uncloud/internal/cli" - "github.com/psviderski/uncloud/internal/machine/api/pb" "github.com/spf13/cobra" + "golang.zx2c4.com/wireguard/wgctrl/wgtypes" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" ) func NewRootCommand() *cobra.Command { @@ -32,15 +33,17 @@ func newShowCommand() *cobra.Command { opts := showOptions{} cmd := &cobra.Command{ Use: "show", - Short: "Show WireGuard configuration for the current machine", - Long: "Shows the WireGuard configuration for the machine currently connected to (or specified by the global --connect flag).", - Args: cobra.NoArgs, + Short: "Show WireGuard network configuration for a machine.", + Long: "Show the WireGuard network configuration for the machine currently connected to " + + "(or specified by the global --connect flag).", + Args: cobra.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { uncli := cmd.Context().Value("cli").(*cli.CLI) return runShow(cmd.Context(), uncli, opts) }, } - cmd.Flags().StringVarP(&opts.machine, "machine", "m", "", "Name or ID of the machine to show configuration for") + cmd.Flags().StringVarP(&opts.machine, "machine", "m", "", + "Name or ID of the machine to show the configuration for. (default is connected machine)") return cmd } @@ -59,10 +62,12 @@ func runShow(ctx context.Context, uncli *cli.CLI, opts showOptions) error { } } - // Explicitly using the interface method to avoid ambiguity if any - var _ pb.MachineClient = client.MachineClient - resp, err := client.MachineClient.GetWireGuardDevice(ctx, nil) + resp, err := client.MachineClient.InspectWireGuardNetwork(ctx, nil) if err != nil { + if status.Code(err) == codes.Unimplemented { + return fmt.Errorf("inspect WireGuard network: "+ + "make sure the target machine is running uncloudd daemon version >= 0.16.0: %w", err) + } return err } @@ -72,28 +77,33 @@ func runShow(ctx context.Context, uncli *cli.CLI, opts showOptions) error { } machinesNamesByPublicKey := make(map[string]string) for _, m := range machines { - publicKey := base64.StdEncoding.EncodeToString(m.Machine.Network.PublicKey) + publicKey := wgtypes.Key(m.Machine.Network.PublicKey).String() machinesNamesByPublicKey[publicKey] = m.Machine.Name } // Fetch the machine's name for more descriptive output - inspectResp, err := client.Inspect(ctx, nil) + inspectResp, err := client.MachineClient.InspectMachine(ctx, nil) if err == nil { - fmt.Printf("Machine Name: %s\n", inspectResp.Name) + fmt.Printf("Machine name: %s\n", inspectResp.Machines[0].Machine.Name) } - fmt.Printf("WireGuard interface: %s\n", resp.Name) - fmt.Printf("WireGuard public key: %s\n", resp.PublicKey) + fmt.Printf("WireGuard interface: %s\n", resp.InterfaceName) + fmt.Printf("WireGuard public key: %s\n", wgtypes.Key(resp.PublicKey).String()) fmt.Printf("WireGuard port: %d\n", resp.ListenPort) fmt.Println() + if len(resp.Peers) == 0 { + fmt.Println("No WireGuard peers configured.") + return nil + } + tw := tabwriter.NewWriter(os.Stdout, 0, 0, 3, ' ', 0) - if _, err = fmt.Fprintln(tw, "MACHINE\tPUBLIC KEY\tENDPOINT\tHANDSHAKE\tRECEIVED\tSENT\tALLOWED IPS"); err != nil { + if _, err = fmt.Fprintln(tw, "PEER\tPUBLIC KEY\tENDPOINT\tHANDSHAKE\tRECEIVED\tSENT\tALLOWED IPS"); err != nil { return fmt.Errorf("write header: %w", err) } for _, peer := range resp.Peers { - machineName, ok := machinesNamesByPublicKey[peer.PublicKey] + machineName, ok := machinesNamesByPublicKey[wgtypes.Key(peer.PublicKey).String()] if !ok { machineName = "(unknown)" } @@ -107,7 +117,7 @@ func runShow(ctx context.Context, uncli *cli.CLI, opts showOptions) error { tw, "%s\t%s\t%s\t%s\t%s\t%s\t%s\n", machineName, - peer.PublicKey, + wgtypes.Key(peer.PublicKey).String(), peer.Endpoint, lastHandshake, units.HumanSize(float64(peer.ReceiveBytes)), diff --git a/internal/machine/api/pb/machine.pb.go b/internal/machine/api/pb/machine.pb.go index 4c48358e..5107ecff 100644 --- a/internal/machine/api/pb/machine.pb.go +++ b/internal/machine/api/pb/machine.pb.go @@ -791,19 +791,19 @@ func (x *InspectServiceResponse) GetService() *Service { return nil } -type GetWireGuardDeviceResponse struct { +type InspectWireGuardNetworkResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - PublicKey string `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` - ListenPort int32 `protobuf:"varint,3,opt,name=listen_port,json=listenPort,proto3" json:"listen_port,omitempty"` - Peers []*WireGuardPeer `protobuf:"bytes,4,rep,name=peers,proto3" json:"peers,omitempty"` + InterfaceName string `protobuf:"bytes,1,opt,name=interface_name,json=interfaceName,proto3" json:"interface_name,omitempty"` + PublicKey []byte `protobuf:"bytes,2,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + ListenPort int32 `protobuf:"varint,3,opt,name=listen_port,json=listenPort,proto3" json:"listen_port,omitempty"` + Peers []*WireGuardPeer `protobuf:"bytes,4,rep,name=peers,proto3" json:"peers,omitempty"` } -func (x *GetWireGuardDeviceResponse) Reset() { - *x = GetWireGuardDeviceResponse{} +func (x *InspectWireGuardNetworkResponse) Reset() { + *x = InspectWireGuardNetworkResponse{} if protoimpl.UnsafeEnabled { mi := &file_internal_machine_api_pb_machine_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -811,13 +811,13 @@ func (x *GetWireGuardDeviceResponse) Reset() { } } -func (x *GetWireGuardDeviceResponse) String() string { +func (x *InspectWireGuardNetworkResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetWireGuardDeviceResponse) ProtoMessage() {} +func (*InspectWireGuardNetworkResponse) ProtoMessage() {} -func (x *GetWireGuardDeviceResponse) ProtoReflect() protoreflect.Message { +func (x *InspectWireGuardNetworkResponse) ProtoReflect() protoreflect.Message { mi := &file_internal_machine_api_pb_machine_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -829,33 +829,33 @@ func (x *GetWireGuardDeviceResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetWireGuardDeviceResponse.ProtoReflect.Descriptor instead. -func (*GetWireGuardDeviceResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use InspectWireGuardNetworkResponse.ProtoReflect.Descriptor instead. +func (*InspectWireGuardNetworkResponse) Descriptor() ([]byte, []int) { return file_internal_machine_api_pb_machine_proto_rawDescGZIP(), []int{13} } -func (x *GetWireGuardDeviceResponse) GetName() string { +func (x *InspectWireGuardNetworkResponse) GetInterfaceName() string { if x != nil { - return x.Name + return x.InterfaceName } return "" } -func (x *GetWireGuardDeviceResponse) GetPublicKey() string { +func (x *InspectWireGuardNetworkResponse) GetPublicKey() []byte { if x != nil { return x.PublicKey } - return "" + return nil } -func (x *GetWireGuardDeviceResponse) GetListenPort() int32 { +func (x *InspectWireGuardNetworkResponse) GetListenPort() int32 { if x != nil { return x.ListenPort } return 0 } -func (x *GetWireGuardDeviceResponse) GetPeers() []*WireGuardPeer { +func (x *InspectWireGuardNetworkResponse) GetPeers() []*WireGuardPeer { if x != nil { return x.Peers } @@ -867,7 +867,7 @@ type WireGuardPeer struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - PublicKey string `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` + PublicKey []byte `protobuf:"bytes,1,opt,name=public_key,json=publicKey,proto3" json:"public_key,omitempty"` Endpoint string `protobuf:"bytes,2,opt,name=endpoint,proto3" json:"endpoint,omitempty"` LastHandshakeTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_handshake_time,json=lastHandshakeTime,proto3" json:"last_handshake_time,omitempty"` ReceiveBytes int64 `protobuf:"varint,4,opt,name=receive_bytes,json=receiveBytes,proto3" json:"receive_bytes,omitempty"` @@ -907,11 +907,11 @@ func (*WireGuardPeer) Descriptor() ([]byte, []int) { return file_internal_machine_api_pb_machine_proto_rawDescGZIP(), []int{14} } -func (x *WireGuardPeer) GetPublicKey() string { +func (x *WireGuardPeer) GetPublicKey() []byte { if x != nil { return x.PublicKey } - return "" + return nil } func (x *WireGuardPeer) GetEndpoint() string { @@ -1105,75 +1105,77 @@ var file_internal_machine_api_pb_machine_proto_rawDesc = []byte{ 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x70, - 0x65, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, - 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x83, 0x02, 0x0a, 0x0d, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, - 0x61, 0x72, 0x64, 0x50, 0x65, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, - 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, - 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x11, 0x6c, 0x61, 0x73, - 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, - 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x49, 0x70, 0x73, 0x32, 0xd9, 0x04, 0x0a, 0x07, - 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x69, 0x74, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, - 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, - 0x07, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x1f, 0x49, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, + 0x72, 0x64, 0x50, 0x65, 0x65, 0x72, 0x52, 0x05, 0x70, 0x65, 0x65, 0x72, 0x73, 0x22, 0x83, 0x02, + 0x0a, 0x0d, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x50, 0x65, 0x65, 0x72, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x13, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x68, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, 0x6b, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x73, 0x68, 0x61, + 0x6b, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6d, 0x69, 0x74, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x69, 0x70, + 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x49, 0x70, 0x73, 0x32, 0xe3, 0x04, 0x0a, 0x07, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, + 0x4d, 0x0a, 0x12, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, 0x69, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x72, 0x65, 0x72, 0x65, 0x71, 0x75, + 0x69, 0x73, 0x69, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, + 0x0a, 0x0b, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x17, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x69, + 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x0b, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x17, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x45, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x61, - 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x12, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x49, 0x0a, - 0x0e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, - 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, - 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x6b, 0x69, - 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x33, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x10, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x45, 0x0a, 0x0e, 0x49, 0x6e, + 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x57, 0x0a, 0x17, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x57, 0x69, 0x72, 0x65, + 0x47, 0x75, 0x61, 0x72, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x57, 0x69, 0x72, 0x65, 0x47, 0x75, 0x61, 0x72, 0x64, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x05, 0x52, 0x65, + 0x73, 0x65, 0x74, 0x12, 0x11, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x49, + 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x37, 0x5a, 0x35, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x73, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x6b, 0x69, 0x2f, 0x75, 0x6e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x2f, 0x6d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1190,28 +1192,28 @@ func file_internal_machine_api_pb_machine_proto_rawDescGZIP() []byte { var file_internal_machine_api_pb_machine_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_internal_machine_api_pb_machine_proto_goTypes = []any{ - (*MachineInfo)(nil), // 0: api.MachineInfo - (*NetworkConfig)(nil), // 1: api.NetworkConfig - (*CheckPrerequisitesResponse)(nil), // 2: api.CheckPrerequisitesResponse - (*InitClusterRequest)(nil), // 3: api.InitClusterRequest - (*InitClusterResponse)(nil), // 4: api.InitClusterResponse - (*JoinClusterRequest)(nil), // 5: api.JoinClusterRequest - (*InspectMachineResponse)(nil), // 6: api.InspectMachineResponse - (*MachineDetails)(nil), // 7: api.MachineDetails - (*TokenResponse)(nil), // 8: api.TokenResponse - (*ResetRequest)(nil), // 9: api.ResetRequest - (*Service)(nil), // 10: api.Service - (*InspectServiceRequest)(nil), // 11: api.InspectServiceRequest - (*InspectServiceResponse)(nil), // 12: api.InspectServiceResponse - (*GetWireGuardDeviceResponse)(nil), // 13: api.GetWireGuardDeviceResponse - (*WireGuardPeer)(nil), // 14: api.WireGuardPeer - (*Service_Container)(nil), // 15: api.Service.Container - (*IP)(nil), // 16: api.IP - (*IPPrefix)(nil), // 17: api.IPPrefix - (*IPPort)(nil), // 18: api.IPPort - (*Metadata)(nil), // 19: api.Metadata - (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp - (*emptypb.Empty)(nil), // 21: google.protobuf.Empty + (*MachineInfo)(nil), // 0: api.MachineInfo + (*NetworkConfig)(nil), // 1: api.NetworkConfig + (*CheckPrerequisitesResponse)(nil), // 2: api.CheckPrerequisitesResponse + (*InitClusterRequest)(nil), // 3: api.InitClusterRequest + (*InitClusterResponse)(nil), // 4: api.InitClusterResponse + (*JoinClusterRequest)(nil), // 5: api.JoinClusterRequest + (*InspectMachineResponse)(nil), // 6: api.InspectMachineResponse + (*MachineDetails)(nil), // 7: api.MachineDetails + (*TokenResponse)(nil), // 8: api.TokenResponse + (*ResetRequest)(nil), // 9: api.ResetRequest + (*Service)(nil), // 10: api.Service + (*InspectServiceRequest)(nil), // 11: api.InspectServiceRequest + (*InspectServiceResponse)(nil), // 12: api.InspectServiceResponse + (*InspectWireGuardNetworkResponse)(nil), // 13: api.InspectWireGuardNetworkResponse + (*WireGuardPeer)(nil), // 14: api.WireGuardPeer + (*Service_Container)(nil), // 15: api.Service.Container + (*IP)(nil), // 16: api.IP + (*IPPrefix)(nil), // 17: api.IPPrefix + (*IPPort)(nil), // 18: api.IPPort + (*Metadata)(nil), // 19: api.Metadata + (*timestamppb.Timestamp)(nil), // 20: google.protobuf.Timestamp + (*emptypb.Empty)(nil), // 21: google.protobuf.Empty } var file_internal_machine_api_pb_machine_proto_depIdxs = []int32{ 1, // 0: api.MachineInfo.network:type_name -> api.NetworkConfig @@ -1229,7 +1231,7 @@ var file_internal_machine_api_pb_machine_proto_depIdxs = []int32{ 0, // 12: api.MachineDetails.machine:type_name -> api.MachineInfo 15, // 13: api.Service.containers:type_name -> api.Service.Container 10, // 14: api.InspectServiceResponse.service:type_name -> api.Service - 14, // 15: api.GetWireGuardDeviceResponse.peers:type_name -> api.WireGuardPeer + 14, // 15: api.InspectWireGuardNetworkResponse.peers:type_name -> api.WireGuardPeer 20, // 16: api.WireGuardPeer.last_handshake_time:type_name -> google.protobuf.Timestamp 21, // 17: api.Machine.CheckPrerequisites:input_type -> google.protobuf.Empty 3, // 18: api.Machine.InitCluster:input_type -> api.InitClusterRequest @@ -1237,18 +1239,18 @@ var file_internal_machine_api_pb_machine_proto_depIdxs = []int32{ 21, // 20: api.Machine.Token:input_type -> google.protobuf.Empty 21, // 21: api.Machine.Inspect:input_type -> google.protobuf.Empty 21, // 22: api.Machine.InspectMachine:input_type -> google.protobuf.Empty - 9, // 23: api.Machine.Reset:input_type -> api.ResetRequest - 11, // 24: api.Machine.InspectService:input_type -> api.InspectServiceRequest - 21, // 25: api.Machine.GetWireGuardDevice:input_type -> google.protobuf.Empty + 21, // 23: api.Machine.InspectWireGuardNetwork:input_type -> google.protobuf.Empty + 9, // 24: api.Machine.Reset:input_type -> api.ResetRequest + 11, // 25: api.Machine.InspectService:input_type -> api.InspectServiceRequest 2, // 26: api.Machine.CheckPrerequisites:output_type -> api.CheckPrerequisitesResponse 4, // 27: api.Machine.InitCluster:output_type -> api.InitClusterResponse 21, // 28: api.Machine.JoinCluster:output_type -> google.protobuf.Empty 8, // 29: api.Machine.Token:output_type -> api.TokenResponse 0, // 30: api.Machine.Inspect:output_type -> api.MachineInfo 6, // 31: api.Machine.InspectMachine:output_type -> api.InspectMachineResponse - 21, // 32: api.Machine.Reset:output_type -> google.protobuf.Empty - 12, // 33: api.Machine.InspectService:output_type -> api.InspectServiceResponse - 13, // 34: api.Machine.GetWireGuardDevice:output_type -> api.GetWireGuardDeviceResponse + 13, // 32: api.Machine.InspectWireGuardNetwork:output_type -> api.InspectWireGuardNetworkResponse + 21, // 33: api.Machine.Reset:output_type -> google.protobuf.Empty + 12, // 34: api.Machine.InspectService:output_type -> api.InspectServiceResponse 26, // [26:35] is the sub-list for method output_type 17, // [17:26] is the sub-list for method input_type 17, // [17:17] is the sub-list for extension type_name @@ -1420,7 +1422,7 @@ func file_internal_machine_api_pb_machine_proto_init() { } } file_internal_machine_api_pb_machine_proto_msgTypes[13].Exporter = func(v any, i int) any { - switch v := v.(*GetWireGuardDeviceResponse); i { + switch v := v.(*InspectWireGuardNetworkResponse); i { case 0: return &v.state case 1: diff --git a/internal/machine/api/pb/machine.proto b/internal/machine/api/pb/machine.proto index 2519c38d..4f6451da 100644 --- a/internal/machine/api/pb/machine.proto +++ b/internal/machine/api/pb/machine.proto @@ -18,12 +18,12 @@ service Machine { rpc Inspect(google.protobuf.Empty) returns (MachineInfo); // InspectMachine retrieves detailed information about the machine. Supports broadcasting to multiple machines. rpc InspectMachine(google.protobuf.Empty) returns (InspectMachineResponse); + // InspectWireGuardNetwork retrieves the current WireGuard network configuration and peer status. + rpc InspectWireGuardNetwork(google.protobuf.Empty) returns (InspectWireGuardNetworkResponse); // Reset restores the machine to a clean state, removing all cluster-related configuration and data. rpc Reset(ResetRequest) returns (google.protobuf.Empty); rpc InspectService(InspectServiceRequest) returns (InspectServiceResponse); - - rpc GetWireGuardDevice(google.protobuf.Empty) returns (GetWireGuardDeviceResponse); } message MachineInfo { @@ -109,15 +109,15 @@ message InspectServiceResponse { Service service = 1; } -message GetWireGuardDeviceResponse { - string name = 1; - string public_key = 2; +message InspectWireGuardNetworkResponse { + string interface_name = 1; + bytes public_key = 2; int32 listen_port = 3; repeated WireGuardPeer peers = 4; } message WireGuardPeer { - string public_key = 1; + bytes public_key = 1; string endpoint = 2; google.protobuf.Timestamp last_handshake_time = 3; int64 receive_bytes = 4; diff --git a/internal/machine/api/pb/machine_grpc.pb.go b/internal/machine/api/pb/machine_grpc.pb.go index f673b828..3f9c19bd 100644 --- a/internal/machine/api/pb/machine_grpc.pb.go +++ b/internal/machine/api/pb/machine_grpc.pb.go @@ -20,15 +20,15 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Machine_CheckPrerequisites_FullMethodName = "/api.Machine/CheckPrerequisites" - Machine_InitCluster_FullMethodName = "/api.Machine/InitCluster" - Machine_JoinCluster_FullMethodName = "/api.Machine/JoinCluster" - Machine_Token_FullMethodName = "/api.Machine/Token" - Machine_Inspect_FullMethodName = "/api.Machine/Inspect" - Machine_InspectMachine_FullMethodName = "/api.Machine/InspectMachine" - Machine_Reset_FullMethodName = "/api.Machine/Reset" - Machine_InspectService_FullMethodName = "/api.Machine/InspectService" - Machine_GetWireGuardDevice_FullMethodName = "/api.Machine/GetWireGuardDevice" + Machine_CheckPrerequisites_FullMethodName = "/api.Machine/CheckPrerequisites" + Machine_InitCluster_FullMethodName = "/api.Machine/InitCluster" + Machine_JoinCluster_FullMethodName = "/api.Machine/JoinCluster" + Machine_Token_FullMethodName = "/api.Machine/Token" + Machine_Inspect_FullMethodName = "/api.Machine/Inspect" + Machine_InspectMachine_FullMethodName = "/api.Machine/InspectMachine" + Machine_InspectWireGuardNetwork_FullMethodName = "/api.Machine/InspectWireGuardNetwork" + Machine_Reset_FullMethodName = "/api.Machine/Reset" + Machine_InspectService_FullMethodName = "/api.Machine/InspectService" ) // MachineClient is the client API for Machine service. @@ -44,10 +44,11 @@ type MachineClient interface { Inspect(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*MachineInfo, error) // InspectMachine retrieves detailed information about the machine. Supports broadcasting to multiple machines. InspectMachine(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*InspectMachineResponse, error) + // InspectWireGuardNetwork retrieves the current WireGuard network configuration and peer status. + InspectWireGuardNetwork(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*InspectWireGuardNetworkResponse, error) // Reset restores the machine to a clean state, removing all cluster-related configuration and data. Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) InspectService(ctx context.Context, in *InspectServiceRequest, opts ...grpc.CallOption) (*InspectServiceResponse, error) - GetWireGuardDevice(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetWireGuardDeviceResponse, error) } type machineClient struct { @@ -118,6 +119,16 @@ func (c *machineClient) InspectMachine(ctx context.Context, in *emptypb.Empty, o return out, nil } +func (c *machineClient) InspectWireGuardNetwork(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*InspectWireGuardNetworkResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(InspectWireGuardNetworkResponse) + err := c.cc.Invoke(ctx, Machine_InspectWireGuardNetwork_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *machineClient) Reset(ctx context.Context, in *ResetRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(emptypb.Empty) @@ -138,16 +149,6 @@ func (c *machineClient) InspectService(ctx context.Context, in *InspectServiceRe return out, nil } -func (c *machineClient) GetWireGuardDevice(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*GetWireGuardDeviceResponse, error) { - cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(GetWireGuardDeviceResponse) - err := c.cc.Invoke(ctx, Machine_GetWireGuardDevice_FullMethodName, in, out, cOpts...) - if err != nil { - return nil, err - } - return out, nil -} - // MachineServer is the server API for Machine service. // All implementations must embed UnimplementedMachineServer // for forward compatibility. @@ -161,10 +162,11 @@ type MachineServer interface { Inspect(context.Context, *emptypb.Empty) (*MachineInfo, error) // InspectMachine retrieves detailed information about the machine. Supports broadcasting to multiple machines. InspectMachine(context.Context, *emptypb.Empty) (*InspectMachineResponse, error) + // InspectWireGuardNetwork retrieves the current WireGuard network configuration and peer status. + InspectWireGuardNetwork(context.Context, *emptypb.Empty) (*InspectWireGuardNetworkResponse, error) // Reset restores the machine to a clean state, removing all cluster-related configuration and data. Reset(context.Context, *ResetRequest) (*emptypb.Empty, error) InspectService(context.Context, *InspectServiceRequest) (*InspectServiceResponse, error) - GetWireGuardDevice(context.Context, *emptypb.Empty) (*GetWireGuardDeviceResponse, error) mustEmbedUnimplementedMachineServer() } @@ -193,15 +195,15 @@ func (UnimplementedMachineServer) Inspect(context.Context, *emptypb.Empty) (*Mac func (UnimplementedMachineServer) InspectMachine(context.Context, *emptypb.Empty) (*InspectMachineResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InspectMachine not implemented") } +func (UnimplementedMachineServer) InspectWireGuardNetwork(context.Context, *emptypb.Empty) (*InspectWireGuardNetworkResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method InspectWireGuardNetwork not implemented") +} func (UnimplementedMachineServer) Reset(context.Context, *ResetRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Reset not implemented") } func (UnimplementedMachineServer) InspectService(context.Context, *InspectServiceRequest) (*InspectServiceResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method InspectService not implemented") } -func (UnimplementedMachineServer) GetWireGuardDevice(context.Context, *emptypb.Empty) (*GetWireGuardDeviceResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWireGuardDevice not implemented") -} func (UnimplementedMachineServer) mustEmbedUnimplementedMachineServer() {} func (UnimplementedMachineServer) testEmbeddedByValue() {} @@ -331,6 +333,24 @@ func _Machine_InspectMachine_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } +func _Machine_InspectWireGuardNetwork_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(emptypb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MachineServer).InspectWireGuardNetwork(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Machine_InspectWireGuardNetwork_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MachineServer).InspectWireGuardNetwork(ctx, req.(*emptypb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _Machine_Reset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(ResetRequest) if err := dec(in); err != nil { @@ -367,24 +387,6 @@ func _Machine_InspectService_Handler(srv interface{}, ctx context.Context, dec f return interceptor(ctx, in, info, handler) } -func _Machine_GetWireGuardDevice_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(emptypb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(MachineServer).GetWireGuardDevice(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Machine_GetWireGuardDevice_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(MachineServer).GetWireGuardDevice(ctx, req.(*emptypb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - // Machine_ServiceDesc is the grpc.ServiceDesc for Machine service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -416,6 +418,10 @@ var Machine_ServiceDesc = grpc.ServiceDesc{ MethodName: "InspectMachine", Handler: _Machine_InspectMachine_Handler, }, + { + MethodName: "InspectWireGuardNetwork", + Handler: _Machine_InspectWireGuardNetwork_Handler, + }, { MethodName: "Reset", Handler: _Machine_Reset_Handler, @@ -424,10 +430,6 @@ var Machine_ServiceDesc = grpc.ServiceDesc{ MethodName: "InspectService", Handler: _Machine_InspectService_Handler, }, - { - MethodName: "GetWireGuardDevice", - Handler: _Machine_GetWireGuardDevice_Handler, - }, }, Streams: []grpc.StreamDesc{}, Metadata: "internal/machine/api/pb/machine.proto", diff --git a/internal/machine/machine.go b/internal/machine/machine.go index b93babcd..0f726dfc 100644 --- a/internal/machine/machine.go +++ b/internal/machine/machine.go @@ -50,55 +50,6 @@ const ( DefaultCaddyAdminSockPath = "/run/uncloud/caddy/admin.sock" ) -func (m *Machine) GetWireGuardDevice(ctx context.Context, req *emptypb.Empty) (*pb.GetWireGuardDeviceResponse, error) { - deviceName := network.WireGuardInterfaceName - - wg, err := wgctrl.New() - if err != nil { - return nil, fmt.Errorf("failed to create wireguard client: %w", err) - } - defer wg.Close() - - dev, err := wg.Device(deviceName) - if err != nil { - return nil, fmt.Errorf("failed to get wireguard device %q: %w", deviceName, err) - } - - peers := make([]*pb.WireGuardPeer, len(dev.Peers)) - for i, p := range dev.Peers { - var lastHandshake *timestamppb.Timestamp - if !p.LastHandshakeTime.IsZero() { - lastHandshake = timestamppb.New(p.LastHandshakeTime) - } - - allowedIPs := make([]string, len(p.AllowedIPs)) - for j, ip := range p.AllowedIPs { - allowedIPs[j] = ip.String() - } - - var endpoint string - if p.Endpoint != nil { - endpoint = p.Endpoint.String() - } - - peers[i] = &pb.WireGuardPeer{ - PublicKey: p.PublicKey.String(), - Endpoint: endpoint, - LastHandshakeTime: lastHandshake, - ReceiveBytes: p.ReceiveBytes, - TransmitBytes: p.TransmitBytes, - AllowedIps: allowedIPs, - } - } - - return &pb.GetWireGuardDeviceResponse{ - Name: dev.Name, - PublicKey: dev.PublicKey.String(), - ListenPort: int32(dev.ListenPort), - Peers: peers, - }, nil -} - type Config struct { // DataDir is the directory where the machine stores its persistent state. Default is /var/lib/uncloud. DataDir string @@ -995,6 +946,58 @@ func (m *Machine) WaitForNetworkReady(ctx context.Context) error { } } +// InspectWireGuardNetwork retrieves the current WireGuard network configuration and peer status. +func (m *Machine) InspectWireGuardNetwork( + _ context.Context, _ *emptypb.Empty, +) (*pb.InspectWireGuardNetworkResponse, error) { + deviceName := network.WireGuardInterfaceName + + wg, err := wgctrl.New() + if err != nil { + return nil, fmt.Errorf("create WireGuard client: %w", err) + } + defer wg.Close() + + dev, err := wg.Device(deviceName) + if err != nil { + return nil, fmt.Errorf("get WireGuard device '%s': %w", deviceName, err) + } + + peers := make([]*pb.WireGuardPeer, len(dev.Peers)) + for i, p := range dev.Peers { + var lastHandshake *timestamppb.Timestamp + if !p.LastHandshakeTime.IsZero() { + lastHandshake = timestamppb.New(p.LastHandshakeTime) + } + + allowedIPs := make([]string, len(p.AllowedIPs)) + for j, ip := range p.AllowedIPs { + allowedIPs[j] = ip.String() + } + + var endpoint string + if p.Endpoint != nil { + endpoint = p.Endpoint.String() + } + + peers[i] = &pb.WireGuardPeer{ + PublicKey: p.PublicKey[:], + Endpoint: endpoint, + LastHandshakeTime: lastHandshake, + ReceiveBytes: p.ReceiveBytes, + TransmitBytes: p.TransmitBytes, + AllowedIps: allowedIPs, + } + } + + return &pb.InspectWireGuardNetworkResponse{ + InterfaceName: dev.Name, + PublicKey: dev.PublicKey[:], + ListenPort: int32(dev.ListenPort), + Peers: peers, + }, nil +} + // Reset restores the machine to a clean state, scheduling a graceful shutdown and removing all cluster-related // configuration and resource. The uncloud daemon will restart the machine if managed by systemd. func (m *Machine) Reset(_ context.Context, _ *pb.ResetRequest) (*emptypb.Empty, error) {