pass caller context by metadata to daemon

This commit is contained in:
shatoboar
2022-05-20 16:59:53 +02:00
parent 77e58295e7
commit 252f92c029
17 changed files with 209 additions and 147 deletions

View File

@@ -3,10 +3,12 @@ package cmd
import (
"context"
"fmt"
"time"
"github.com/skratchdot/open-golang/open"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
gstatus "google.golang.org/grpc/status"
"time"
"github.com/netbirdio/netbird/util"
@@ -66,6 +68,10 @@ var loginCmd = &cobra.Command{
err = WithBackOff(func() error {
var backOffErr error
md := metadata.New(map[string]string{"caller": "cli"})
ctx = metadata.NewOutgoingContext(ctx, md)
loginResp, backOffErr = client.Login(ctx, &loginRequest)
if s, ok := gstatus.FromError(backOffErr); ok && (s.Code() == codes.InvalidArgument ||
s.Code() == codes.PermissionDenied ||

View File

@@ -114,7 +114,7 @@ func FlagNameToEnvVar(f string) string {
return prefix + upper
}
// DialClientGRPCServer returns client connection to the dameno server.
// DialClientGRPCServer returns client connection to the daemon server.
func DialClientGRPCServer(ctx context.Context, addr string) (*grpc.ClientConn, error) {
ctx, cancel := context.WithTimeout(ctx, time.Second*3)
defer cancel()

View File

@@ -4,6 +4,7 @@ import (
"context"
"time"
"github.com/netbirdio/netbird/client/system"
"github.com/netbirdio/netbird/iface"
mgm "github.com/netbirdio/netbird/management/client"
mgmProto "github.com/netbirdio/netbird/management/proto"
@@ -193,7 +194,7 @@ func connectToManagement(ctx context.Context, managementAddr string, ourPrivateK
return nil, nil, status.Errorf(codes.FailedPrecondition, "failed while getting Management Service public key: %s", err)
}
loginResp, err := client.Login(*serverPublicKey)
loginResp, err := client.Login(*serverPublicKey, system.GetInfo(ctx))
if err != nil {
if s, ok := status.FromError(err); ok && s.Code() == codes.PermissionDenied {
log.Error("peer registration required. Please run wiretrustee login command first")

View File

@@ -390,7 +390,8 @@ func createEngine(ctx context.Context, cancel context.CancelFunc, setupKey strin
return nil, err
}
info := system.GetInfo()
//todo
info := system.GetInfo(ctx)
resp, err := mgmtClient.Register(*publicKey, setupKey, "", info)
if err != nil {
return nil, err

View File

@@ -2,6 +2,7 @@ package internal
import (
"context"
"github.com/google/uuid"
"github.com/netbirdio/netbird/client/system"
mgm "github.com/netbirdio/netbird/management/client"
@@ -39,7 +40,7 @@ func Login(ctx context.Context, config *Config, setupKey string, jwtToken string
return err
}
_, err = loginPeer(*serverKey, mgmClient, setupKey, jwtToken)
_, err = loginPeer(*serverKey, mgmClient, setupKey, jwtToken, ctx)
if err != nil {
log.Errorf("failed logging-in peer on Management Service : %v", err)
return err
@@ -55,12 +56,12 @@ func Login(ctx context.Context, config *Config, setupKey string, jwtToken string
}
// loginPeer attempts to login to Management Service. If peer wasn't registered, tries the registration flow.
func loginPeer(serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string) (*mgmProto.LoginResponse, error) {
loginResp, err := client.Login(serverPublicKey)
func loginPeer(serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string, ctx context.Context) (*mgmProto.LoginResponse, error) {
loginResp, err := client.Login(serverPublicKey, system.GetInfo(ctx))
if err != nil {
if s, ok := status.FromError(err); ok && s.Code() == codes.PermissionDenied {
log.Debugf("peer registration required")
return registerPeer(serverPublicKey, client, setupKey, jwtToken)
return registerPeer(serverPublicKey, client, setupKey, jwtToken, ctx)
} else {
return nil, err
}
@@ -73,14 +74,14 @@ func loginPeer(serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey str
// registerPeer checks whether setupKey was provided via cmd line and if not then it prompts user to enter a key.
// Otherwise tries to register with the provided setupKey via command line.
func registerPeer(serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string) (*mgmProto.LoginResponse, error) {
func registerPeer(serverPublicKey wgtypes.Key, client *mgm.GrpcClient, setupKey string, jwtToken string, ctx context.Context) (*mgmProto.LoginResponse, error) {
validSetupKey, err := uuid.Parse(setupKey)
if err != nil && jwtToken == "" {
return nil, status.Errorf(codes.InvalidArgument, "invalid setup-key or no sso information provided, err: %v", err)
}
log.Debugf("sending peer registration request to Management Service")
info := system.GetInfo()
info := system.GetInfo(ctx)
loginResp, err := client.Register(serverPublicKey, validSetupKey.String(), jwtToken, info)
if err != nil {
log.Errorf("failed registering peer %v,%s", err, validSetupKey.String())

View File

@@ -3,11 +3,12 @@ package server
import (
"context"
"fmt"
"google.golang.org/grpc/codes"
gstatus "google.golang.org/grpc/status"
"sync"
"time"
"google.golang.org/grpc/codes"
gstatus "google.golang.org/grpc/status"
log "github.com/sirupsen/logrus"
"github.com/netbirdio/netbird/client/internal"
@@ -91,7 +92,7 @@ func (s *Server) Start() error {
}
// Login uses setup key to prepare configuration for the daemon.
func (s *Server) Login(_ context.Context, msg *proto.LoginRequest) (*proto.LoginResponse, error) {
func (s *Server) Login(ctx context.Context, msg *proto.LoginRequest) (*proto.LoginResponse, error) {
s.mutex.Lock()
if s.actCancel != nil {
s.actCancel()

View File

@@ -16,6 +16,8 @@ type Info struct {
Hostname string
CPUs int
WiretrusteeVersion string
Caller string
CallerVersion string
}
func WiretrusteeVersion() string {

View File

@@ -2,15 +2,18 @@ package system
import (
"bytes"
"context"
"fmt"
"os"
"os/exec"
"runtime"
"strings"
"time"
"google.golang.org/grpc/metadata"
)
func GetInfo() *Info {
func GetInfo(ctx context.Context) *Info {
info := _getInfo()
for strings.Contains(info, "broken pipe") {
info = _getInfo()
@@ -46,6 +49,13 @@ func GetInfo() *Info {
gio.Hostname, _ = os.Hostname()
gio.WiretrusteeVersion = WiretrusteeVersion()
metadata, ok := metadata.FromIncomingContext(ctx)
if ok {
gio.Caller = metadata["caller"][0]
gio.CallerVersion = metadata["callerVersion"][0]
}
return gio
}

View File

@@ -7,7 +7,7 @@ import (
)
func Test_LocalVersion(t *testing.T) {
got := GetInfo()
got := GetInfo(nil)
want := "development"
assert.Equal(t, want, got.WiretrusteeVersion)
}

View File

@@ -4,7 +4,6 @@ import (
"context"
"flag"
"fmt"
"github.com/cenkalti/backoff/v4"
"io/ioutil"
"os"
"os/exec"
@@ -15,6 +14,8 @@ import (
"syscall"
"time"
"github.com/cenkalti/backoff/v4"
_ "embed"
"github.com/getlantern/systray"
@@ -25,6 +26,7 @@ import (
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/app"
@@ -195,6 +197,8 @@ func (s *serviceClient) getSettingsForm() *widget.Form {
return
}
md := metadata.New(map[string]string{"caller": "ui"})
s.ctx = metadata.NewOutgoingContext(s.ctx, md)
_, err = client.Login(s.ctx, &proto.LoginRequest{
ManagementUrl: s.iMngURL.Text,
AdminURL: s.iAdminURL.Text,