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