diff options
author | evuez <julien@mulga.net> | 2022-11-26 15:38:06 -0500 |
---|---|---|
committer | evuez <julien@mulga.net> | 2024-04-03 22:44:12 +0200 |
commit | 86098797034cbc7eb6db0cee54e17f8dcaedbc5d (patch) | |
tree | 29b6225ead843eb9022296a54657bbadfa1c4da0 /src/query.rs | |
download | blom-main.tar.gz |
Diffstat (limited to 'src/query.rs')
-rw-r--r-- | src/query.rs | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/query.rs b/src/query.rs new file mode 100644 index 0000000..1f3b4c8 --- /dev/null +++ b/src/query.rs @@ -0,0 +1,97 @@ +use crate::common::expr::Expr; +use std::io::Read; +use std::io::Write; +use std::net::TcpStream; +use std::process::ExitCode; +use std::str; + +pub const USAGE: &str = " +Usage: blom query <query> + + Sends <query> to the blom server and prints the response + to stdout. + +Examples: + + $ blom query 'CHILDREN 1.2.3.0/24' + 1.2.3.4/26 + 1.2.3.4/32 + + $ blom query --raw 'CHILDREN 1.2.3.0/24' + +1.2.3.4/26\n + +1.2.3.4/32\n + + $ blom query 'INFO 1.2.3.0/24' + Start: 1.2.3.0 + End: 1.2.3.255 + Size: 256 + Parents: 3 + Children: 364 + Meta: \"{\\\"owner\\\": \\\"acme\\\"}\" + +Options: + + -r, --raw Do not parse the response and prints the raw + output from the server instead. + + -v, --verbose Print the request send to the server in addition + to the response. + + -b, --bind Bind to the given ADDRESS:PORT. Default is + 0.0.0.0:4902 + +"; + +pub fn cmd(args: &[String]) -> ExitCode { + let mut addr = "0.0.0.0:4902"; + let mut query: Option<&str> = None; + + let mut arg_index: usize = 0; + while arg_index < args.len() { + match args[arg_index].as_str() { + "--bind" | "-b" => { + addr = args + .get(arg_index + 1) + .expect("Missing address after --bind.") + .as_str(); + arg_index += 1; + } + q => { + if query.is_some() { + println!("Too many arguments."); + return ExitCode::FAILURE; + } + query = Some(q); + } + } + + arg_index += 1; + } + + if let Some(q) = query { + handle_query(addr, q); + return ExitCode::SUCCESS; + } + + println!("Missing query."); + ExitCode::FAILURE +} + +fn handle_query(addr: &str, query: &str) { + let expr = Expr::from_query(query).encode(); + + match TcpStream::connect(addr) { + Ok(mut stream) => { + let _ = stream.write(&expr).unwrap(); + let mut data = [0u8; 64]; + match stream.read(&mut data) { + Ok(_) => { + let resp = str::from_utf8(&data).unwrap(); + println!("{resp:?}"); + } + Err(e) => println!("Read failure: {e:?}"), + } + } + Err(e) => println!("Connection failure: {e:?}"), + } +} |