@@ -11,49 +11,20 @@ import (
11
11
"github.com/spf13/cobra"
12
12
)
13
13
14
- const (
15
- Name = "ifdata"
16
- FlagExists = "e"
17
- FlagPrint = "p"
18
- FlagPrintExists = "pe"
19
- FlagAddress = "pa"
20
- FlagNetmask = "pn"
21
- FlagNetworkAddress = "pN"
22
- FlagBroadcastAddress = "pb"
23
- FlagMTU = "pm"
24
- FlagFlags = "pf"
25
- FlagHardwareAddress = "ph"
26
-
27
- FlagInputStatistics = "si"
28
- FlagInputPackets = "sip"
29
- FlagInputBytes = "sib"
30
- FlagInputErrors = "sie"
31
- FlagInputDropped = "sid"
32
- FlagInputFIFO = "sif"
33
- FlagInputCompressed = "sic"
34
- FlagInputMulticast = "sim"
35
- FlagInputBytesSecond = "bips"
36
-
37
- FlagOutputStatistics = "so"
38
- FlagOutputPackets = "sop"
39
- FlagOutputBytes = "sob"
40
- FlagOutputErrors = "soe"
41
- FlagOutputDropped = "sod"
42
- FlagOutputFIFO = "sof"
43
- FlagOutputCollisions = "sox"
44
- FlagOutputCarrierLosses = "soc"
45
- FlagOutputMulticast = "som"
46
- FlagOutputBytesSecond = "bops"
47
- )
14
+ const Name = "ifdata"
48
15
49
16
func New (opts ... cmdutil.Option ) * cobra.Command {
50
17
cmd := & cobra.Command {
51
18
Use : Name + " [flags] interface" ,
52
19
Short : "Get network interface info without parsing ifconfig output" ,
53
20
RunE : run ,
54
21
GroupID : cmdutil .Applet ,
22
+
23
+ ValidArgsFunction : validArgs ,
55
24
}
56
25
26
+ cmd .InitDefaultHelpFlag ()
27
+
57
28
cmd .SetUsageFunc (usageFunc )
58
29
cmd .DisableFlagsInUseLine = true
59
30
cmd .DisableFlagParsing = true
@@ -64,6 +35,41 @@ func New(opts ...cmdutil.Option) *cobra.Command {
64
35
return cmd
65
36
}
66
37
38
+ func validArgs (_ * cobra.Command , args []string , _ string ) ([]string , cobra.ShellCompDirective ) {
39
+ if len (args ) == 0 {
40
+ vals := formatterValues ()
41
+ strs := make ([]string , 0 , len (vals ))
42
+ for _ , val := range vals {
43
+ if val == fmtNone {
44
+ continue
45
+ }
46
+
47
+ if val .supported () {
48
+ strs = append (strs , val .String ()+ "\t " + val .description ())
49
+ }
50
+ }
51
+ return strs , cobra .ShellCompDirectiveNoFileComp
52
+ }
53
+
54
+ ifaces , err := net .Interfaces ()
55
+ if err != nil {
56
+ return nil , cobra .ShellCompDirectiveError
57
+ }
58
+
59
+ names := make ([]string , 0 , len (ifaces ))
60
+ for _ , iface := range ifaces {
61
+ addrs , _ := iface .Addrs ()
62
+ desc := make ([]string , 0 , len (addrs ))
63
+ for _ , addr := range addrs {
64
+ if addr , ok := addr .(* net.IPNet ); ok && addr .IP .To4 () != nil {
65
+ desc = append (desc , addr .String ())
66
+ }
67
+ }
68
+ names = append (names , iface .Name + "\t " + strings .Join (desc , "," ))
69
+ }
70
+ return names , cobra .ShellCompDirectiveNoFileComp
71
+ }
72
+
67
73
var (
68
74
ErrNoFormatter = errors .New ("no formatter was provided" )
69
75
ErrUnknownFormatter = errors .New ("unknown formatter" )
@@ -77,7 +83,8 @@ func run(cmd *cobra.Command, args []string) error {
77
83
return cmd .Usage ()
78
84
}
79
85
80
- var op , name string
86
+ var op formatter
87
+ var name string
81
88
for _ , arg := range args {
82
89
switch {
83
90
case arg == "-h" , arg == "--help" :
@@ -92,14 +99,16 @@ func run(cmd *cobra.Command, args []string) error {
92
99
return tmpl .Execute (cmd .OutOrStdout (), cmd )
93
100
}
94
101
case strings .HasPrefix (arg , "-" ):
95
- op = strings .TrimPrefix (arg , "-" )
102
+ if err := op .UnmarshalText ([]byte (arg )); err != nil {
103
+ return err
104
+ }
96
105
default :
97
106
name = arg
98
107
}
99
108
}
100
109
101
110
switch {
102
- case op == "" :
111
+ case op == fmtNone :
103
112
return ErrNoFormatter
104
113
case name == "" :
105
114
return ErrNoInterface
@@ -108,7 +117,7 @@ func run(cmd *cobra.Command, args []string) error {
108
117
109
118
iface , err := net .InterfaceByName (name )
110
119
111
- if op == FlagPrintExists {
120
+ if op == fmtPrintExists {
112
121
if err != nil {
113
122
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), "no" )
114
123
} else {
@@ -121,20 +130,20 @@ func run(cmd *cobra.Command, args []string) error {
121
130
return fmt .Errorf ("%w: %s" , err , name )
122
131
}
123
132
124
- if op == FlagExists {
133
+ if op == fmtExists {
125
134
return nil
126
135
}
127
136
128
137
switch op {
129
- case FlagMTU :
138
+ case fmtMTU :
130
139
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), iface .MTU )
131
- case FlagFlags :
140
+ case fmtFlags :
132
141
for _ , flag := range strings .Split (iface .Flags .String (), "|" ) {
133
142
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), flag )
134
143
}
135
- case FlagHardwareAddress :
144
+ case fmtHardwareAddress :
136
145
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), strings .ToUpper (iface .HardwareAddr .String ()))
137
- case FlagAddress , FlagNetmask , FlagNetworkAddress , FlagBroadcastAddress , FlagPrint :
146
+ case fmtAddress , fmtNetmask , fmtNetworkAddress , fmtBroadcastAddress , fmtPrint :
138
147
addrs , err := iface .Addrs ()
139
148
if err != nil {
140
149
return err
@@ -143,15 +152,15 @@ func run(cmd *cobra.Command, args []string) error {
143
152
for _ , addr := range addrs {
144
153
if addr , ok := addr .(* net.IPNet ); ok && addr .IP .To4 () != nil {
145
154
switch op {
146
- case FlagAddress :
155
+ case fmtAddress :
147
156
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), addr .IP )
148
- case FlagNetmask :
157
+ case fmtNetmask :
149
158
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), net .IP (addr .Mask ))
150
- case FlagNetworkAddress :
159
+ case fmtNetworkAddress :
151
160
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), addr .IP .Mask (addr .Mask ))
152
- case FlagBroadcastAddress :
161
+ case fmtBroadcastAddress :
153
162
_ , _ = fmt .Fprintln (cmd .OutOrStdout (), getBroadcastAddr (addr ))
154
- case FlagPrint :
163
+ case fmtPrint :
155
164
_ , _ = fmt .Fprintf (cmd .OutOrStdout (),
156
165
"%s %s %s %d\n " ,
157
166
addr .IP ,
@@ -168,7 +177,7 @@ func run(cmd *cobra.Command, args []string) error {
168
177
}
169
178
170
179
cmd .SilenceUsage = false
171
- return fmt .Errorf ("%w: - %s" , ErrUnknownFormatter , op )
180
+ return fmt .Errorf ("%w: %s" , ErrUnknownFormatter , op )
172
181
}
173
182
174
183
return nil
0 commit comments