@@ -45,29 +45,46 @@ struct Build {
45
45
profile : Option < String > ,
46
46
#[ arg( long) ]
47
47
target : Option < String > ,
48
+ #[ command( flatten) ]
49
+ wireshark_version : WiresharkVersion ,
48
50
}
49
51
50
52
impl Build {
51
- fn run ( self , sh : & Shell ) -> Result {
53
+ fn run ( mut self , sh : & Shell ) -> Result {
54
+ self . wireshark_version . load ( sh) ;
55
+
52
56
let target = if let Some ( target) = self . target . as_ref ( ) {
53
57
let _ = cmd ! ( sh, "rustup target add {target}" ) . run ( ) ;
54
58
vec ! [ "--target" , target]
55
59
} else {
56
60
vec ! [ ]
57
61
} ;
58
62
let profile = self . profile . as_deref ( ) . unwrap_or ( "release" ) ;
63
+
64
+ let _env = sh. push_env (
65
+ "PLUGIN_MAJOR_VERSION" ,
66
+ self . wireshark_version . major_version ( ) ,
67
+ ) ;
68
+ let _env = sh. push_env (
69
+ "PLUGIN_MINOR_VERSION" ,
70
+ self . wireshark_version . minor_version ( ) ,
71
+ ) ;
72
+
59
73
cmd ! ( sh, "cargo build --profile {profile} {target...}" ) . run ( ) ?;
60
74
Ok ( ( ) )
61
75
}
62
76
}
63
77
64
78
#[ derive( Debug , Parser ) ]
65
- struct Test { }
79
+ struct Test {
80
+ #[ command( flatten) ]
81
+ wireshark_version : WiresharkVersion ,
82
+ }
66
83
67
84
impl Test {
68
- fn run ( self , sh : & Shell ) -> Result {
85
+ fn run ( mut self , sh : & Shell ) -> Result {
69
86
cmd ! ( sh, "cargo test" ) . run ( ) ?;
70
- let plugin_dir = plugin_dir ( ) ;
87
+ let plugin_dir = self . wireshark_version . plugin_dir ( sh ) ;
71
88
72
89
sh. create_dir ( format ! ( "target/wireshark/{plugin_dir}" ) ) ?;
73
90
sh. create_dir ( "target/pcaps" ) ?;
@@ -76,6 +93,14 @@ impl Test {
76
93
let plugin_name = "dcQUIC__DEV" ;
77
94
let plugin_name_lower = & plugin_name. to_lowercase ( ) ;
78
95
let _env = sh. push_env ( "PLUGIN_NAME" , plugin_name) ;
96
+ let _env = sh. push_env (
97
+ "PLUGIN_MAJOR_VERSION" ,
98
+ self . wireshark_version . major_version ( ) ,
99
+ ) ;
100
+ let _env = sh. push_env (
101
+ "PLUGIN_MINOR_VERSION" ,
102
+ self . wireshark_version . minor_version ( ) ,
103
+ ) ;
79
104
80
105
let profile = "release-test" ;
81
106
@@ -176,26 +201,27 @@ fn so() -> &'static str {
176
201
}
177
202
}
178
203
179
- fn plugin_dir ( ) -> & ' static str {
180
- if cfg ! ( target_os = "macos" ) {
181
- "plugins/4-2/epan"
182
- } else {
183
- "plugins/4.2/epan"
184
- }
185
- }
186
-
187
204
#[ derive( Debug , Parser ) ]
188
- struct Install { }
205
+ struct Install {
206
+ #[ command( flatten) ]
207
+ wireshark_version : WiresharkVersion ,
208
+ }
189
209
190
210
impl Install {
191
- fn run ( self , sh : & Shell ) -> Result {
192
- Build :: default ( ) . run ( sh) ?;
211
+ fn run ( mut self , sh : & Shell ) -> Result {
212
+ let plugin_dir = self . wireshark_version . plugin_dir ( sh) ;
213
+
214
+ Build {
215
+ wireshark_version : self . wireshark_version . clone ( ) ,
216
+ ..Default :: default ( )
217
+ }
218
+ . run ( sh) ?;
193
219
194
220
let dir = if cfg ! ( unix) {
195
221
homedir:: get_my_home ( ) ?
196
222
. expect ( "missing home dir" )
197
223
. join ( ".local/lib/wireshark" )
198
- . join ( plugin_dir ( ) )
224
+ . join ( plugin_dir)
199
225
} else {
200
226
todo ! ( "OS is currently unsupported" )
201
227
} ;
@@ -212,6 +238,62 @@ impl Install {
212
238
}
213
239
}
214
240
241
+ #[ derive( Clone , Debug , Default , Parser ) ]
242
+ struct WiresharkVersion {
243
+ #[ arg( long, default_value = "DYNAMIC" ) ]
244
+ wireshark_version : String ,
245
+ }
246
+
247
+ impl WiresharkVersion {
248
+ fn plugin_dir ( & mut self , sh : & Shell ) -> String {
249
+ self . load ( sh) ;
250
+
251
+ let value = & self . wireshark_version ;
252
+ if cfg ! ( target_os = "macos" ) {
253
+ format ! ( "plugins/{}/epan" , value. replace( '.' , "-" ) )
254
+ } else {
255
+ format ! ( "plugins/{value}/epan" )
256
+ }
257
+ }
258
+
259
+ fn load ( & mut self , sh : & Shell ) {
260
+ if !( self . wireshark_version . is_empty ( ) || self . wireshark_version == "DYNAMIC" ) {
261
+ return ;
262
+ }
263
+
264
+ let tshark = tshark ( sh) . unwrap ( ) ;
265
+ let output = cmd ! ( sh, "{tshark} --version" ) . read ( ) . unwrap ( ) ;
266
+ let version = output. lines ( ) . next ( ) . unwrap ( ) ;
267
+ let version = version. trim_start_matches ( |v : char | !v. is_digit ( 10 ) ) ;
268
+ let ( version, _) = version
269
+ . split_once ( char:: is_whitespace)
270
+ . unwrap_or ( ( version, "" ) ) ;
271
+
272
+ let version = version. trim_end_matches ( '.' ) ;
273
+
274
+ match version. split ( '.' ) . count ( ) {
275
+ 2 => {
276
+ self . wireshark_version = version. to_string ( ) ;
277
+ }
278
+ 3 => {
279
+ let ( version, _) = version. rsplit_once ( '.' ) . unwrap ( ) ;
280
+ self . wireshark_version = version. to_string ( ) ;
281
+ }
282
+ _ => panic ! ( "invalid tshark version: {version}" ) ,
283
+ }
284
+ }
285
+
286
+ fn major_version ( & self ) -> & str {
287
+ let ( version, _) = self . wireshark_version . split_once ( '.' ) . unwrap ( ) ;
288
+ version
289
+ }
290
+
291
+ fn minor_version ( & self ) -> & str {
292
+ let ( _, version) = self . wireshark_version . split_once ( '.' ) . unwrap ( ) ;
293
+ version
294
+ }
295
+ }
296
+
215
297
fn main ( ) {
216
298
Args :: parse ( ) . run ( ) ;
217
299
}
0 commit comments