Skip to content

Commit a92da93

Browse files
authored
Merge pull request #28 from buty4649/improve-warn-message
Refactor command execution to separate stdout and stderr
2 parents 9256567 + 165c9f2 commit a92da93

File tree

4 files changed

+35
-12
lines changed

4 files changed

+35
-12
lines changed

cmd/apply.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -253,7 +253,7 @@ func SetupVethDevices(netns string, devices map[string]config.VethDevice) error
253253
peerNetns := values.Peer.Netns
254254

255255
slog.Debug("setup veth device", "netns", netns, "name", name, "addresses", values.Addresses, "routes", values.Routes,
256-
"peer name", peerName, "peer netns", peerNetns, "peer addresses", values.Peer.Addresses, "peer routes", values.Peer.Routes)
256+
"peer name", peerName, "peer netns", peerNetns, "peer addresses", values.Peer.Addresses, "peer routes", values.Peer.Routes)
257257

258258
// check if device is already exists in netns
259259
_, err := n.ShowLink(name)
@@ -332,7 +332,7 @@ func RunPostScript(netns string, script string) error {
332332
if err != nil {
333333
return err
334334
}
335-
slog.Debug("post script output", "netns", netns, "script", script, "output", out)
335+
slog.Debug("post script output", "netns", netns, "script", script, "stdout", out.Stdout, "stderr", out.Stderr)
336336

337337
return nil
338338
}

iproute2/base.go

+23-9
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,10 @@ SOFTWARE.
2222
package iproute2
2323

2424
import (
25+
"bytes"
2526
"encoding/json"
2627
"io"
28+
"log/slog"
2729
"os/exec"
2830
"strings"
2931
"syscall"
@@ -34,6 +36,11 @@ type BaseCommand struct {
3436
prepend []string
3537
}
3638

39+
type CommandOut struct {
40+
Stdout string
41+
Stderr string
42+
}
43+
3744
func (b *BaseCommand) run(args ...string) error {
3845
_, err := b.runIpCommand(args...)
3946
return err
@@ -43,7 +50,11 @@ func (b *BaseCommand) runIpCommand(args ...string) (string, error) {
4350
cmd := append([]string{b.path}, args...)
4451
out, err := b.runCommand(cmd, nil)
4552
if err == nil {
46-
return out, nil
53+
if out.Stderr != "" {
54+
slog.Warn("ip command warning", "msg", out.Stderr)
55+
}
56+
57+
return out.Stdout, nil
4758
}
4859

4960
msg := err.Error()
@@ -58,7 +69,7 @@ func (b *BaseCommand) runIpCommand(args ...string) (string, error) {
5869
return "", &UnknownError{Msg: err.Error()}
5970
}
6071

61-
func (b *BaseCommand) runCommand(cmd []string, input *string) (string, error) {
72+
func (b *BaseCommand) runCommand(cmd []string, input *string) (*CommandOut, error) {
6273
if b.prepend != nil {
6374
cmd = append(b.prepend, cmd...)
6475
}
@@ -73,24 +84,27 @@ func (b *BaseCommand) runCommand(cmd []string, input *string) (string, error) {
7384
if input != nil {
7485
stdin, err := c.StdinPipe()
7586
if err != nil {
76-
return "", err
87+
return nil, err
7788
}
7889
go func() {
7990
defer stdin.Close()
8091
io.WriteString(stdin, *input)
8192
}()
8293
}
8394

84-
out, err := c.CombinedOutput()
85-
if err != nil {
95+
var stdout, stderr bytes.Buffer
96+
c.Stdout = &stdout
97+
c.Stderr = &stderr
98+
99+
if err := c.Run(); err != nil {
86100
exitErr, _ := err.(*exec.ExitError)
87101
status, _ := exitErr.Sys().(syscall.WaitStatus)
88-
return "", &CommandError{
102+
return nil, &CommandError{
89103
ExitStatus: status.ExitStatus(),
90-
Msg: string(out),
104+
Msg: stderr.String(),
91105
}
92106
}
93-
return string(out), nil
107+
return &CommandOut{Stdout: stdout.String(), Stderr: stderr.String()}, nil
94108
}
95109

96110
func (b *BaseCommand) AddLink(name string, linkType string, options ...string) error {
@@ -200,7 +214,7 @@ func unmarshalInterfacesData(data string) (Interfaces, error) {
200214
var addresses Interfaces
201215
err := json.Unmarshal([]byte(data), &addresses)
202216
if err != nil {
203-
return nil, err
217+
return nil, &UnmarshalError{Msg: err.Error(), Content: data}
204218
}
205219

206220
return addresses, nil

iproute2/error.go

+9
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,15 @@ func (e *OperationNotPermittedError) Error() string {
4242
return e.Msg
4343
}
4444

45+
type UnmarshalError struct {
46+
Msg string
47+
Content string
48+
}
49+
50+
func (e *UnmarshalError) Error() string {
51+
return fmt.Sprint(e.Msg, ": ", e.Content)
52+
}
53+
4554
type UnknownError struct {
4655
Msg string
4756
}

iproute2/iproute2.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (i *IpCmdWithNetns) Netns() string {
136136
return i.netns
137137
}
138138

139-
func (i *IpCmdWithNetns) ExecuteCommand(cmd string) (string, error) {
139+
func (i *IpCmdWithNetns) ExecuteCommand(cmd string) (*CommandOut, error) {
140140
shell := []string{"/bin/bash"}
141141
return i.runCommand(shell, &cmd)
142142
}

0 commit comments

Comments
 (0)