@@ -10,7 +10,7 @@ mod bindings {
1010 pub mod cwnd;
1111}
1212
13- use argparse:: { ArgumentParser , Store } ;
13+ use argparse:: { ArgumentParser , Store , StoreOption , StoreTrue } ;
1414use bindings:: { sock:: sock_trace_entry, cwnd:: cwnd_trace_entry, tcp_packet:: TcpPacket , tcp_probe:: TcpProbe } ;
1515use db_writer:: { DBOperation , DBWriter } ;
1616use flow_tracker:: { EventIndexer , EventType , FlowTracker , TsTracker } ;
@@ -24,6 +24,7 @@ use tokio::{
2424 task:: { self , JoinHandle } ,
2525} ;
2626use tokio_util:: sync:: CancellationToken ;
27+ use ts_storage:: DBBackend ;
2728
2829use core:: num;
2930use std:: {
@@ -95,17 +96,60 @@ async fn start_file_reader<
9596async fn main ( ) -> Result < ( ) , Box < dyn Error > > {
9697 env_logger:: init ( ) ;
9798
98- let mut dir: String = "/tmp/" . to_string ( ) ;
99+ let mut source: String = "/tmp/" . to_string ( ) ;
100+ let mut output: String = "" . to_string ( ) ;
101+ let mut sqlite: bool = false ;
102+ let mut duckdb: bool = false ;
103+
99104 {
100105 let mut argparser = ArgumentParser :: new ( ) ;
101- argparser. refer ( & mut dir) . add_option (
102- & [ "-d" , "--dir" ] ,
106+ argparser. refer ( & mut source) . add_option (
107+ & [ "-s" , "--source" ] ,
108+ Store ,
109+ "Directory to search for TCBee recording *.tcp files!" ,
110+ ) ;
111+ argparser. refer ( & mut output) . add_option (
112+ & [ "-o" , "--output" ] ,
103113 Store ,
104- "Directory to read recording results from. Defaults to /tmp/" ,
114+ "Path for outoput database file" ,
115+ ) ;
116+ argparser. refer ( & mut sqlite) . add_option (
117+ & [ "-q" , "--sqlite" ] ,
118+ StoreTrue ,
119+ "Store result to SQLITE" ,
105120 ) ;
121+ argparser. refer ( & mut duckdb) . add_option (
122+ & [ "-d" , "--duckdb" ] ,
123+ StoreTrue ,
124+ "Store result to DuckDB, better performance" ,
125+ ) ;
126+
106127 argparser. parse_args_or_exit ( ) ;
107128 }
108129
130+ if !sqlite && !duckdb {
131+ print ! ( "Please select either --sqlite or --duckdb" ) ;
132+ return Ok ( ( ) ) ;
133+ }
134+ if sqlite && duckdb {
135+ print ! ( "Please select either --sqlite or --duckdb" ) ;
136+ return Ok ( ( ) ) ;
137+ }
138+
139+ if output. is_empty ( ) {
140+ if sqlite {
141+ output = "/tmp/db.sqlite" . to_string ( ) ;
142+ }
143+ if duckdb {
144+ output = "/tmp/db.duck" . to_string ( ) ;
145+ }
146+ }
147+
148+ let mut backend = DBBackend :: SQLite ( output. clone ( ) ) ;
149+ if duckdb {
150+ backend = DBBackend :: DuckDB ( output) ;
151+ }
152+
109153 let progress_bars = MultiProgress :: new ( ) ;
110154
111155 let status = progress_bars. add ( ProgressBar :: new ( 5 ) ) ;
@@ -123,7 +167,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
123167 println ! ( "Starting readers, initial processing may be slow due to setup of streams!" ) ;
124168
125169 // Create DB Backend handler
126- let db_res = DBWriter :: new ( "db.sqlite" , rx, status) ;
170+ let db_res = DBWriter :: new ( backend , rx, status) ;
127171 if db_res. is_err ( ) {
128172 panic ! ( "Could not open Database! Error: {}" , db_res. err( ) . unwrap( ) )
129173 }
@@ -146,49 +190,49 @@ async fn main() -> Result<(), Box<dyn Error>> {
146190
147191 let threads = vec ! [
148192 start_file_reader:: <TcpPacket >(
149- prepend_string( "xdp.tcp" . to_string( ) , & dir ) ,
193+ prepend_string( "xdp.tcp" . to_string( ) , & source ) ,
150194 tx. clone( ) ,
151195 stop_token. clone( ) ,
152196 & progress_bars,
153197 )
154198 . await ,
155199 start_file_reader:: <TcpPacket >(
156- prepend_string( "tc.tcp" . to_string( ) , & dir ) ,
200+ prepend_string( "tc.tcp" . to_string( ) , & source ) ,
157201 tx. clone( ) ,
158202 stop_token. clone( ) ,
159203 & progress_bars,
160204 )
161205 . await ,
162206 start_file_reader:: <TcpProbe >(
163- prepend_string( "probe.tcp" . to_string( ) , & dir ) ,
207+ prepend_string( "probe.tcp" . to_string( ) , & source ) ,
164208 tx. clone( ) ,
165209 stop_token. clone( ) ,
166210 & progress_bars,
167211 )
168212 . await ,
169213 start_file_reader:: <sock_trace_entry>(
170- prepend_string( "sock_send .tcp" . to_string( ) , & dir ) ,
214+ prepend_string( "send_sock .tcp" . to_string( ) , & source ) ,
171215 tx. clone( ) ,
172216 stop_token. clone( ) ,
173217 & progress_bars,
174218 )
175219 . await ,
176220 start_file_reader:: <sock_trace_entry>(
177- prepend_string( "sock_recv .tcp" . to_string( ) , & dir ) ,
221+ prepend_string( "recv_sock .tcp" . to_string( ) , & source ) ,
178222 tx. clone( ) ,
179223 stop_token. clone( ) ,
180224 & progress_bars,
181225 )
182226 . await ,
183227 start_file_reader:: <cwnd_trace_entry>(
184- prepend_string( "recv_cwnd.tcp" . to_string( ) , & dir ) ,
228+ prepend_string( "recv_cwnd.tcp" . to_string( ) , & source ) ,
185229 tx. clone( ) ,
186230 stop_token. clone( ) ,
187231 & progress_bars,
188232 )
189233 . await ,
190234 start_file_reader:: <cwnd_trace_entry>(
191- prepend_string( "send_cwnd.tcp" . to_string( ) , & dir ) ,
235+ prepend_string( "send_cwnd.tcp" . to_string( ) , & source ) ,
192236 tx. clone( ) ,
193237 stop_token. clone( ) ,
194238 & progress_bars,
0 commit comments