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 }