Allow bgp lookups from CLI
authorMatt Corallo <git@bluematt.me>
Fri, 23 Aug 2019 01:22:56 +0000 (21:22 -0400)
committerMatt Corallo <git@bluematt.me>
Fri, 23 Aug 2019 03:42:07 +0000 (23:42 -0400)
src/main.rs
src/printer.rs
src/reader.rs

index ba206d60de29e42484cb84c0e0ddf5be6d6346dd..13053b5ce7effa16ef8c907bd5d70e03e22a3c31 100644 (file)
@@ -437,9 +437,9 @@ fn main() {
                        unsafe { PRINTER = Some(Box::new(Printer::new(store))) };
 
                        let bgp_client = BGPClient::new(bgp_sockaddr, Duration::from_secs(600), unsafe { PRINTER.as_ref().unwrap() });
-                       make_trusted_conn(trusted_sockaddr, bgp_client);
+                       make_trusted_conn(trusted_sockaddr, Arc::clone(&bgp_client));
 
-                       reader::read(store, unsafe { PRINTER.as_ref().unwrap() });
+                       reader::read(store, unsafe { PRINTER.as_ref().unwrap() }, bgp_client);
 
                        future::ok(())
                }).or_else(|_| {
index 352dc7e4d895852f8d293561c8c98a65358e3884..0bea277e8d4f688bb345580ca398a52b5e0083f7 100644 (file)
@@ -93,6 +93,7 @@ impl Printer {
                                                store.get_u64(U64Setting::WasGoodTimeout)
                                                ).as_bytes()).expect("stdout broken?");
                                out.write_all(b"a x: Scan node x\n").expect("stdout broken?");
+                               out.write_all(b"b x: BGP Lookup IP x\n").expect("stdout broken?");
                                out.write_all(b"\x1b[s").expect("stdout broken?"); // Save cursor position and provide a blank line before cursor
                                out.write_all(b"\x1b[;H\x1b[2K").expect("stdout broken?");
                                out.write_all(b"Most recent log:\n").expect("stdout broken?");
index fda65ba6f1426f9dda1bb4b45b8d3c1d71261f86..08dc5f06cb3914cfa3006f4ce0588415be9eb7cb 100644 (file)
@@ -1,6 +1,7 @@
+use std::sync::Arc;
 use std::sync::atomic::Ordering;
 use std::io::BufReader;
-use std::net::SocketAddr;
+use std::net::{IpAddr, SocketAddr};
 use std::time::Instant;
 
 use tokio::prelude::*;
@@ -8,12 +9,13 @@ use tokio::io::{stdin, lines};
 
 use crate::printer::Printer;
 use crate::datastore::{Store, AddressState, U64Setting, RegexSetting};
+use crate::bgp_client::BGPClient;
 
 use crate::{START_SHUTDOWN, scan_node};
 
 use regex::Regex;
 
-pub fn read(store: &'static Store, printer: &'static Printer) {
+pub fn read(store: &'static Store, printer: &'static Printer, bgp_client: Arc<BGPClient>) {
        tokio::spawn(lines(BufReader::new(stdin())).for_each(move |line| {
                macro_rules! err {
                        () => { {
@@ -53,6 +55,10 @@ pub fn read(store: &'static Store, printer: &'static Printer) {
                                });
                        },
                        "a" => scan_node(Instant::now(), try_parse_next_chunk!(SocketAddr), true),
+                       "b" => {
+                               let ip = try_parse_next_chunk!(IpAddr);
+                               printer.add_line(format!("ASN for {} is {}", ip, bgp_client.get_asn(ip)), false);
+                       },
                        "r" => {
                                match AddressState::from_num(try_parse_next_chunk!(u8)) {
                                        Some(state) => store.set_u64(U64Setting::RescanInterval(state), try_parse_next_chunk!(u64)),