client/logmon: acquire executable in init block

This PR causes the logmon task runner to acquire the binary of the
Nomad executable in an 'init' block, so as to almost certainly get
the name while the nomad file still exists.

This is an attempt at fixing the case where a deleted Nomad file
(e.g. during upgrade) may be getting renamed with a mysterious
suffix first.

If this doesn't work, as a last resort we can literally just trim
the mystery string.

Fixes: #14079
This commit is contained in:
Seth Hoenig 2022-08-24 13:07:31 -05:00
parent 7077d1f9aa
commit 423ea1a5c4
2 changed files with 15 additions and 7 deletions

3
.changelog/14297.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
client/logmon: fixed a bug where logmon cannot find nomad executable
```

View File

@ -5,22 +5,27 @@ import (
"os" "os"
"os/exec" "os/exec"
hclog "github.com/hashicorp/go-hclog" "github.com/hashicorp/go-hclog"
plugin "github.com/hashicorp/go-plugin" "github.com/hashicorp/go-plugin"
"github.com/hashicorp/nomad/client/logmon/proto" "github.com/hashicorp/nomad/client/logmon/proto"
"github.com/hashicorp/nomad/plugins/base" "github.com/hashicorp/nomad/plugins/base"
"google.golang.org/grpc" "google.golang.org/grpc"
) )
var bin = getBin()
func getBin() string {
b, err := os.Executable()
if err != nil {
panic(err)
}
return b
}
// LaunchLogMon launches a new logmon or reattaches to an existing one. // LaunchLogMon launches a new logmon or reattaches to an existing one.
// TODO: Integrate with base plugin loader // TODO: Integrate with base plugin loader
func LaunchLogMon(logger hclog.Logger, reattachConfig *plugin.ReattachConfig) (LogMon, *plugin.Client, error) { func LaunchLogMon(logger hclog.Logger, reattachConfig *plugin.ReattachConfig) (LogMon, *plugin.Client, error) {
logger = logger.Named("logmon") logger = logger.Named("logmon")
bin, err := os.Executable()
if err != nil {
return nil, nil, err
}
conf := &plugin.ClientConfig{ conf := &plugin.ClientConfig{
HandshakeConfig: base.Handshake, HandshakeConfig: base.Handshake,
Plugins: map[string]plugin.Plugin{ Plugins: map[string]plugin.Plugin{