Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .golangci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,5 @@ linters:
- gofmt
- gosec
- gocritic
- deadcode

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is unused enabled by defaut?

For what it’s worth, this golangci-lint config is a v1 config while upstream has moved on to v2. Not sure it’s worth switching to v2 though…

- misspell
- revive
2 changes: 1 addition & 1 deletion drivers/fakedriver/fakedriver.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ func (d *Driver) DriverName() string {
return "Driver"
}

func (d *Driver) UpdateConfigRaw(rawData []byte) error {
func (d *Driver) UpdateConfigRaw(_ []byte) error {
return nil
}

Expand Down
2 changes: 1 addition & 1 deletion libmachine/drivers/base.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ func (d *BaseDriver) GetBundleName() (string, error) {
return d.BundleName, nil
}

func (d *BaseDriver) UpdateConfigRaw(rawData []byte) error {
func (d *BaseDriver) UpdateConfigRaw(_ []byte) error {
return ErrNotImplemented
}

Expand Down
29 changes: 28 additions & 1 deletion libmachine/drivers/plugin/register_driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,32 @@ var (
heartbeatTimeout = 10 * time.Second
)

type loggingListener struct {
net.Listener
}

func (l *loggingListener) Accept() (net.Conn, error) {
conn, err := l.Listener.Accept()
if err != nil {
return nil, err
}
log.WithField("remote", conn.RemoteAddr().String()).Info("RPC connection accepted")
return &loggingConn{Conn: conn, start: time.Now()}, nil
}

type loggingConn struct {
net.Conn
start time.Time
}

func (c *loggingConn) Close() error {
log.WithFields(log.Fields{
"remote": c.RemoteAddr().String(),
"duration": time.Since(c.start),
}).Info("RPC connection closed")
return c.Conn.Close()
}

func RegisterDriver(d drivers.Driver) {
if os.Getenv(localbinary.PluginEnvKey) != localbinary.PluginEnvVal {
fmt.Fprintf(os.Stderr, `This is a hypervisor plugin binary for CodeReady Containers.
Expand Down Expand Up @@ -51,7 +77,8 @@ Please use this plugin through the main 'crc' binary.
fmt.Println(listener.Addr())

go func() {
_ = http.Serve(listener, nil)
//nolint:gosec // localhost-only rpc server

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was the gosec error?
You can replace

//nolint:gosec // localhost-only rpc server

with

//#nosec G703 localhost-only RPC server

with G703 replaced with the actual gosec error would provide more details

_ = http.Serve(&loggingListener{Listener: listener}, nil)
}()

for {
Expand Down
36 changes: 36 additions & 0 deletions libmachine/drivers/rpc/server_driver.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
"github.com/crc-org/machine/libmachine/drivers"
"github.com/crc-org/machine/libmachine/state"
"github.com/crc-org/machine/libmachine/version"
log "github.com/sirupsen/logrus"
)

type Stacker interface {
Expand Down Expand Up @@ -38,12 +39,30 @@ func NewRPCServerDriver(d drivers.Driver) *RPCServerDriver {
}
}

func (r *RPCServerDriver) logRPC(op string, level log.Level, extra log.Fields) {
fields := log.Fields{"operation": op}
if r.ActualDriver != nil {
func() {
defer func() { _ = recover() }()
if name := r.ActualDriver.GetMachineName(); name != "" {
fields["machine"] = name
}
}()
}
for k, v := range extra {
fields[k] = v
}
log.WithFields(fields).Log(level, "RPC server invocation")
}

func (r *RPCServerDriver) Close(_, _ *struct{}) error {
r.logRPC("Close", log.InfoLevel, nil)
r.CloseCh <- true
return nil
}

func (r *RPCServerDriver) GetVersion(_ *struct{}, reply *int) error {
r.logRPC("GetVersion", log.DebugLevel, nil)
*reply = version.APIVersion
return nil
}
Expand All @@ -55,15 +74,18 @@ func (r *RPCServerDriver) GetConfigRaw(_ *struct{}, reply *[]byte) error {
}

*reply = driverData
r.logRPC("GetConfigRaw", log.DebugLevel, log.Fields{"config_bytes": len(driverData)})

return nil
}

func (r *RPCServerDriver) UpdateConfigRaw(data []byte, _ *struct{}) error {
r.logRPC("UpdateConfigRaw", log.WarnLevel, log.Fields{"config_bytes": len(data)})
return r.ActualDriver.UpdateConfigRaw(data)
}

func (r *RPCServerDriver) SetConfigRaw(data []byte, _ *struct{}) error {
r.logRPC("SetConfigRaw", log.WarnLevel, log.Fields{"config_bytes": len(data)})
return json.Unmarshal(data, &r.ActualDriver)
}

Expand All @@ -74,6 +96,7 @@ func trapPanic(err *error) {
}

func (r *RPCServerDriver) Create(_, _ *struct{}) (err error) {
r.logRPC("Create", log.WarnLevel, nil)
// In an ideal world, plugins wouldn't ever panic. However, panics
// have been known to happen and cause issues. Therefore, we recover
// and do not crash the RPC server completely in the case of a panic
Expand All @@ -86,50 +109,60 @@ func (r *RPCServerDriver) Create(_, _ *struct{}) (err error) {
}

func (r *RPCServerDriver) DriverName(_ *struct{}, reply *string) error {
r.logRPC("DriverName", log.DebugLevel, nil)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How did you decide between the various log levels?

*reply = r.ActualDriver.DriverName()
return nil
}

func (r *RPCServerDriver) GetIP(_ *struct{}, reply *string) error {
r.logRPC("GetIP", log.DebugLevel, nil)
ip, err := r.ActualDriver.GetIP()
*reply = ip
return err
}

func (r *RPCServerDriver) GetMachineName(_ *struct{}, reply *string) error {
r.logRPC("GetMachineName", log.DebugLevel, nil)
*reply = r.ActualDriver.GetMachineName()
return nil
}

func (r *RPCServerDriver) GetBundleName(_ *struct{}, reply *string) error {
r.logRPC("GetBundleName", log.DebugLevel, nil)
path, err := r.ActualDriver.GetBundleName()
*reply = path
return err
}

func (r *RPCServerDriver) GetState(_ *struct{}, reply *state.State) error {
r.logRPC("GetState", log.DebugLevel, nil)
s, err := r.ActualDriver.GetState()
*reply = s
return err
}

func (r *RPCServerDriver) Kill(_ *struct{}, _ *struct{}) error {
r.logRPC("Kill", log.WarnLevel, nil)
return r.ActualDriver.Kill()
}

func (r *RPCServerDriver) PreCreateCheck(_ *struct{}, _ *struct{}) error {
r.logRPC("PreCreateCheck", log.InfoLevel, nil)
return r.ActualDriver.PreCreateCheck()
}

func (r *RPCServerDriver) Remove(_ *struct{}, _ *struct{}) error {
r.logRPC("Remove", log.WarnLevel, nil)
return r.ActualDriver.Remove()
}

func (r *RPCServerDriver) Start(_ *struct{}, _ *struct{}) error {
r.logRPC("Start", log.InfoLevel, nil)
return r.ActualDriver.Start()
}

func (r *RPCServerDriver) Stop(_ *struct{}, _ *struct{}) error {
r.logRPC("Stop", log.InfoLevel, nil)
return r.ActualDriver.Stop()
}

Expand All @@ -141,5 +174,8 @@ func (r *RPCServerDriver) Heartbeat(_ *struct{}, _ *struct{}) error {
func (r *RPCServerDriver) GetSharedDirs(_ *struct{}, reply *[]drivers.SharedDir) error {
sharedDirs, err := r.ActualDriver.GetSharedDirs()
*reply = sharedDirs
if err == nil {
r.logRPC("GetSharedDirs", log.DebugLevel, log.Fields{"shared_dirs": len(sharedDirs)})
}
return err
}