@@ -3,7 +3,9 @@ use std::path::PathBuf;
33use clap:: Parser ;
44use pcap:: { Capture , ConnectionStatus , Device , IfFlags } ;
55
6- // cargo run --release --bin sniffer -- --interface auto --port 443 --path target/test.pcap
6+ use p2p:: identity:: SecretKey ;
7+
8+ // cargo run --release --bin sniffer -- --interface auto --path target/test.pcap
79
810#[ derive( Parser ) ]
911struct Cli {
@@ -12,14 +14,26 @@ struct Cli {
1214 help = "name of the interface, use `auto` to determine automatically"
1315 ) ]
1416 interface : Option < String > ,
15- #[ arg( long, help = "filter by the port" ) ]
16- port : u16 ,
1717 #[ arg(
1818 long,
1919 help = "if `interface` is set, the packets will be written to the `pcap` file, \
2020 otherwise the file will be a source of packets"
2121 ) ]
2222 path : PathBuf ,
23+
24+ /// Peer secret key
25+ #[ arg( long, short = 's' , env = "OPENMINA_P2P_SEC_KEY" ) ]
26+ pub p2p_secret_key : Option < SecretKey > ,
27+
28+ // warning, this overrides `OPENMINA_P2P_SEC_KEY`
29+ /// Compatibility with OCaml Mina node
30+ #[ arg( long) ]
31+ pub libp2p_keypair : Option < String > ,
32+
33+ // warning, this overrides `OPENMINA_P2P_SEC_KEY`
34+ /// Compatibility with OCaml Mina node
35+ #[ arg( env = "MINA_LIBP2P_PASS" ) ]
36+ pub libp2p_password : Option < String > ,
2337}
2438
2539fn init_logger_std ( ) -> Box < dyn log:: Log > {
@@ -36,9 +50,30 @@ fn main() {
3650
3751 let Cli {
3852 interface,
39- port,
4053 path,
54+ p2p_secret_key,
55+ libp2p_keypair,
56+ libp2p_password,
4157 } = Cli :: parse ( ) ;
58+
59+ let secret_key = if let Some ( v) = p2p_secret_key {
60+ v
61+ } else {
62+ let ( Some ( libp2p_keypair) , Some ( libp2p_password) ) = ( libp2p_keypair, libp2p_password)
63+ else {
64+ log:: error!( "no secret key specified" ) ;
65+ return ;
66+ } ;
67+
68+ match SecretKey :: from_encrypted_file ( libp2p_keypair, & libp2p_password) {
69+ Ok ( v) => v,
70+ Err ( err) => {
71+ log:: error!( "cannot read secret key {err}" ) ;
72+ return ;
73+ }
74+ }
75+ } ;
76+
4277 if let Some ( name) = interface {
4378 sudo:: escalate_if_needed ( ) . unwrap ( ) ;
4479
@@ -70,13 +105,12 @@ fn main() {
70105 log:: info!( "will use: {device:?}" ) ;
71106 let res = Ok ( ( ) ) . and_then ( |( ) | {
72107 let mut capture = Capture :: from_device ( device) ?. open ( ) ?;
73- let filter = format ! ( "udp port {port}" ) ;
74108 capture
75- . filter ( & filter , true )
109+ . filter ( "udp and not port 443" , true )
76110 . expect ( "Failed to apply filter" ) ;
77111 let savefile = capture. savefile ( & path) ?;
78112
79- webrtc_sniffer:: run ( capture, Some ( savefile) )
113+ webrtc_sniffer:: run ( capture, Some ( savefile) , secret_key )
80114 } ) ;
81115 if let Err ( err) = res {
82116 log:: error!( "{err}" ) ;
@@ -88,7 +122,7 @@ fn main() {
88122 log:: info!( "use file" ) ;
89123 let res = Ok ( ( ) ) . and_then ( |( ) | {
90124 let capture = Capture :: from_file ( & path) ?;
91- webrtc_sniffer:: run ( capture, None )
125+ webrtc_sniffer:: run ( capture, None , secret_key )
92126 } ) ;
93127 if let Err ( err) = res {
94128 log:: error!( "{err}" ) ;
0 commit comments