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(|_| {
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?");
+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::*;
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 {
() => { {
});
},
"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)),