@@ -22,8 +22,10 @@ SOFTWARE.
22
22
package iproute2
23
23
24
24
import (
25
+ "bytes"
25
26
"encoding/json"
26
27
"io"
28
+ "log/slog"
27
29
"os/exec"
28
30
"strings"
29
31
"syscall"
@@ -34,6 +36,11 @@ type BaseCommand struct {
34
36
prepend []string
35
37
}
36
38
39
+ type CommandOut struct {
40
+ Stdout string
41
+ Stderr string
42
+ }
43
+
37
44
func (b * BaseCommand ) run (args ... string ) error {
38
45
_ , err := b .runIpCommand (args ... )
39
46
return err
@@ -43,7 +50,11 @@ func (b *BaseCommand) runIpCommand(args ...string) (string, error) {
43
50
cmd := append ([]string {b .path }, args ... )
44
51
out , err := b .runCommand (cmd , nil )
45
52
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
47
58
}
48
59
49
60
msg := err .Error ()
@@ -58,7 +69,7 @@ func (b *BaseCommand) runIpCommand(args ...string) (string, error) {
58
69
return "" , & UnknownError {Msg : err .Error ()}
59
70
}
60
71
61
- func (b * BaseCommand ) runCommand (cmd []string , input * string ) (string , error ) {
72
+ func (b * BaseCommand ) runCommand (cmd []string , input * string ) (* CommandOut , error ) {
62
73
if b .prepend != nil {
63
74
cmd = append (b .prepend , cmd ... )
64
75
}
@@ -73,24 +84,27 @@ func (b *BaseCommand) runCommand(cmd []string, input *string) (string, error) {
73
84
if input != nil {
74
85
stdin , err := c .StdinPipe ()
75
86
if err != nil {
76
- return "" , err
87
+ return nil , err
77
88
}
78
89
go func () {
79
90
defer stdin .Close ()
80
91
io .WriteString (stdin , * input )
81
92
}()
82
93
}
83
94
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 {
86
100
exitErr , _ := err .(* exec.ExitError )
87
101
status , _ := exitErr .Sys ().(syscall.WaitStatus )
88
- return "" , & CommandError {
102
+ return nil , & CommandError {
89
103
ExitStatus : status .ExitStatus (),
90
- Msg : string ( out ),
104
+ Msg : stderr . String ( ),
91
105
}
92
106
}
93
- return string ( out ) , nil
107
+ return & CommandOut { Stdout : stdout . String (), Stderr : stderr . String ()} , nil
94
108
}
95
109
96
110
func (b * BaseCommand ) AddLink (name string , linkType string , options ... string ) error {
@@ -200,7 +214,7 @@ func unmarshalInterfacesData(data string) (Interfaces, error) {
200
214
var addresses Interfaces
201
215
err := json .Unmarshal ([]byte (data ), & addresses )
202
216
if err != nil {
203
- return nil , err
217
+ return nil , & UnmarshalError { Msg : err . Error (), Content : data }
204
218
}
205
219
206
220
return addresses , nil
0 commit comments