github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/client/logmon/plugin.go (about)

     1  package logmon
     2  
     3  import (
     4  	"context"
     5  	"os"
     6  	"os/exec"
     7  
     8  	"github.com/hashicorp/go-hclog"
     9  	"github.com/hashicorp/go-plugin"
    10  	"github.com/hashicorp/nomad/client/logmon/proto"
    11  	"github.com/hashicorp/nomad/plugins/base"
    12  	"google.golang.org/grpc"
    13  )
    14  
    15  var bin = getBin()
    16  
    17  func getBin() string {
    18  	b, err := os.Executable()
    19  	if err != nil {
    20  		panic(err)
    21  	}
    22  	return b
    23  }
    24  
    25  // LaunchLogMon launches a new logmon or reattaches to an existing one.
    26  // TODO: Integrate with base plugin loader
    27  func LaunchLogMon(logger hclog.Logger, reattachConfig *plugin.ReattachConfig) (LogMon, *plugin.Client, error) {
    28  	logger = logger.Named("logmon")
    29  	conf := &plugin.ClientConfig{
    30  		HandshakeConfig: base.Handshake,
    31  		Plugins: map[string]plugin.Plugin{
    32  			"logmon": &Plugin{},
    33  		},
    34  		AllowedProtocols: []plugin.Protocol{
    35  			plugin.ProtocolGRPC,
    36  		},
    37  		Logger: logger,
    38  	}
    39  
    40  	// Only set one of Cmd or Reattach
    41  	if reattachConfig == nil {
    42  		conf.Cmd = exec.Command(bin, "logmon")
    43  	} else {
    44  		conf.Reattach = reattachConfig
    45  	}
    46  
    47  	client := plugin.NewClient(conf)
    48  
    49  	rpcClient, err := client.Client()
    50  	if err != nil {
    51  		return nil, nil, err
    52  	}
    53  
    54  	raw, err := rpcClient.Dispense("logmon")
    55  	if err != nil {
    56  		return nil, nil, err
    57  	}
    58  
    59  	l := raw.(LogMon)
    60  	return l, client, nil
    61  }
    62  
    63  type Plugin struct {
    64  	plugin.NetRPCUnsupportedPlugin
    65  	impl LogMon
    66  }
    67  
    68  func NewPlugin(i LogMon) plugin.Plugin {
    69  	return &Plugin{impl: i}
    70  }
    71  
    72  func (p *Plugin) GRPCServer(broker *plugin.GRPCBroker, s *grpc.Server) error {
    73  	proto.RegisterLogMonServer(s, &logmonServer{
    74  		impl:   p.impl,
    75  		broker: broker,
    76  	})
    77  	return nil
    78  }
    79  
    80  func (p *Plugin) GRPCClient(ctx context.Context, broker *plugin.GRPCBroker, c *grpc.ClientConn) (interface{}, error) {
    81  	return &logmonClient{
    82  		doneCtx: ctx,
    83  		client:  proto.NewLogMonClient(c),
    84  	}, nil
    85  }